001package daikon.inv.filter;
002
003import daikon.VarInfo;
004import daikon.inv.Invariant;
005import java.util.regex.Pattern;
006import org.checkerframework.checker.nullness.qual.Nullable;
007import org.checkerframework.checker.regex.qual.Regex;
008
009/**
010 * A filter that filters out invariants that contain derived variables of a specified derivation. If
011 * the derivation class name contains the regular expression in dkconfig_class_re, the invariant is
012 * filtered out. By default, no derived variables are matched.
013 */
014public class DerivedVariableFilter extends InvariantFilter {
015
016  @Override
017  public String getDescription() {
018    return "Derived Variable filter on '" + dkconfig_class_re + "'";
019  }
020
021  /**
022   * Regular expression to match against the class name of derived variables. Invariants that
023   * contain derived variables that match will be filtered out. If null, nothing will be filtered
024   * out.
025   */
026  // dkconfig_* means a configuration option, set from command line or file
027  public static @Nullable @Regex String dkconfig_class_re = null;
028
029  public static @Nullable Pattern class_re = null;
030
031  @SuppressWarnings("StaticAssignmentInConstructor")
032  public DerivedVariableFilter() {
033    isOn = dkconfig_class_re != null;
034    if (isOn) {
035      assert dkconfig_class_re != null
036          : "@AssumeAssertion(nullness): dependent: nullness is indicated by boolean variable isOn";
037      class_re = Pattern.compile(dkconfig_class_re);
038    }
039  }
040
041  public @Nullable @Regex String get_derivation_class_re() {
042    return dkconfig_class_re;
043  }
044
045  @Override
046  boolean shouldDiscardInvariant(Invariant invariant) {
047
048    assert class_re != null : "@AssumeAssertion(nullness):  only called when filter is active";
049
050    for (VarInfo vi : invariant.ppt.var_infos) {
051      if (vi.derived == null) {
052        continue;
053      }
054      // System.out.printf("Comparing %s to %s%n",
055      //                   vi.derived.getClass().getName(), class_re);
056      assert class_re != null
057          : "@AssumeAssertion(nullness): limited side effects don't affect this field";
058      if (class_re.matcher(vi.derived.getClass().getName()).find()) {
059        return true;
060      }
061    }
062    return false;
063  }
064}