001package daikon.inv.filter;
002
003import daikon.PrintInvariants;
004import daikon.VarInfo;
005import daikon.inv.EqualityComparison;
006import daikon.inv.Invariant;
007import java.util.logging.Level;
008
009/**
010 * Suppress invariants that merely indicate that a variable was unmodified. Used only for ESC
011 * output.
012 */
013public class UnmodifiedVariableEqualityFilter extends InvariantFilter {
014  @Override
015  public String getDescription() {
016    return "Suppress invariants that merely indicate that a variable was unmodified";
017  }
018
019  /** Boolean. If true, UnmodifiedVariableEqualityFilter is initially turned on. */
020  public static boolean dkconfig_enabled = true;
021
022  public UnmodifiedVariableEqualityFilter() {
023    isOn = dkconfig_enabled;
024  }
025
026  @Override
027  boolean shouldDiscardInvariant(Invariant invariant) {
028    if (PrintInvariants.debugFiltering.isLoggable(Level.FINE)) {
029      PrintInvariants.debugFiltering.fine("\tEntering UmVEF.shouldDiscard");
030    }
031
032    if (!invariant.isEqualityComparison()) {
033      if (PrintInvariants.debugFiltering.isLoggable(Level.FINE)) {
034        PrintInvariants.debugFiltering.fine(
035            "\tUnmodVarEqF thinks this isn't an equality comparison");
036      }
037      return false;
038    }
039
040    EqualityComparison comp = (EqualityComparison) invariant;
041    VarInfo var1 = comp.var1();
042    VarInfo var2 = comp.var2();
043
044    if (PrintInvariants.debugFiltering.isLoggable(Level.FINE)) {
045      PrintInvariants.debugFiltering.fine(
046          "compared " + var1.prestate_name() + " to " + var2.name());
047    }
048
049    if (var1.is_prestate_version(var2) || var2.is_prestate_version(var1)) {
050      // System.err.printf("prestate: var1 (%s) = var2 (%s)%n", var1, var2);
051      return true;
052    }
053
054    return false;
055  }
056}