*** empty log message ***
[repair.git] / Repair / RepairCompiler / MCC / IR / InclusionPredicate.java
index 094432706bd2ebb527707a7bec6bff765c1e150c..c27bb443333a892ea706e7df02a418671d873b5a 100755 (executable)
@@ -4,11 +4,19 @@ import java.util.*;
 
 public class InclusionPredicate extends Predicate {
 
-    VarDescriptor var;
+    Expr expr;
     SetExpr setexpr;
 
-    public InclusionPredicate(VarDescriptor var, SetExpr setexpr) {
-        if (var == null) {
+    public boolean inverted() {
+       return setexpr.inverted();
+    }
+
+    public String name() {
+       return expr.name() + " in "+setexpr.name();
+    }
+    
+    public InclusionPredicate(Expr expr, SetExpr setexpr) {
+        if (expr == null) {
             throw new NullPointerException();
         }
 
@@ -16,13 +24,51 @@ public class InclusionPredicate extends Predicate {
             throw new NullPointerException();
         }
 
-        this.var = var;
+        this.expr = expr;
         this.setexpr = setexpr;
     }
 
     public Set getRequiredDescriptors() {
-        return setexpr.getRequiredDescriptors();
+        Set v = expr.getRequiredDescriptors();
+        v.addAll(setexpr.getRequiredDescriptors());
+        return v;
+    }
+
+    public void generate(CodeWriter writer, VarDescriptor dest) {
+        VarDescriptor var = VarDescriptor.makeNew("exprval");
+        expr.generate(writer, var);
+        setexpr.generate_inclusion(writer, dest, var);
+    }
+
+    public Set getInversedRelations() {
+
+        throw new IRException("unsupported");
+
+        //Set set = setexpr.getInversedRelations();
+        //set.addAll(expr.getInversedRelations());
+        //return set;
+    }
+
+    public Descriptor getDescriptor() {
+       if (setexpr instanceof ImageSetExpr) {
+           return ((ImageSetExpr)setexpr).getRelation();
+       } else
+           return setexpr.sd;
+    }
+
+    public int[] getRepairs(boolean negated) {
+       if (setexpr instanceof ImageSetExpr) {
+           if (negated)
+               return new int[] {AbstractRepair.REMOVEFROMRELATION};
+           else
+               return new int[] {AbstractRepair.ADDTORELATION};
+       } else {
+           if (negated)
+               return new int[] {AbstractRepair.REMOVEFROMSET};
+           else
+               return new int[] {AbstractRepair.ADDTOSET};
+       }
     }
-            
 }
     
+