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}