4fda86c2b3ce6647b07cfbce24c463f06feee6a3
[repair.git] / Repair / RepairCompiler / MCC / IR / InclusionPredicate.java
1 package MCC.IR;
2
3 import java.util.*;
4
5 public class InclusionPredicate extends Predicate {
6
7     Expr expr;
8     SetExpr setexpr;
9
10     public TypeDescriptor typecheck(SemanticAnalyzer sa) {
11         TypeDescriptor t=expr.typecheck(sa);
12         TypeDescriptor ts=setexpr.typecheck(sa);
13         if (t!=ts)
14             return null;
15         
16         return ReservedTypeDescriptor.INT;
17     }
18
19     public boolean inverted() {
20         return setexpr.inverted();
21     }
22
23     public String name() {
24         return expr.name() + " in "+setexpr.name();
25     }
26     
27     public InclusionPredicate(Expr expr, SetExpr setexpr) {
28         if (expr == null) {
29             throw new NullPointerException();
30         }
31
32         if (setexpr == null) {
33             throw new NullPointerException();
34         }
35
36         this.expr = expr;
37         this.setexpr = setexpr;
38     }
39
40     public Set getRequiredDescriptors() {
41         Set v = expr.getRequiredDescriptors();
42         v.addAll(setexpr.getRequiredDescriptors());
43         return v;
44     }
45
46     public void generate(CodeWriter writer, VarDescriptor dest) {
47         VarDescriptor var = VarDescriptor.makeNew("exprval");
48         expr.generate(writer, var);
49         setexpr.generate_inclusion(writer, dest, var);
50     }
51
52     public Set getInversedRelations() {
53
54         throw new IRException("unsupported");
55
56         //Set set = setexpr.getInversedRelations();
57         //set.addAll(expr.getInversedRelations());
58         //return set;
59     }
60
61     public Descriptor getDescriptor() {
62         if (setexpr instanceof ImageSetExpr) {
63             return ((ImageSetExpr)setexpr).getRelation();
64         } else
65             return setexpr.sd;
66     }
67
68     public int[] getRepairs(boolean negated, Termination t) {
69         if (setexpr instanceof ImageSetExpr) {
70             if (negated)
71                 return new int[] {AbstractRepair.REMOVEFROMRELATION};
72             else
73                 return new int[] {AbstractRepair.ADDTORELATION};
74         } else {
75             if (negated)
76                 return new int[] {AbstractRepair.REMOVEFROMSET};
77             else
78                 return new int[] {AbstractRepair.ADDTOSET};
79         }
80     }
81 }
82     
83