correct
[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 instanceof StructureTypeDescriptor) {
14             while(((StructureTypeDescriptor)t).getSuperType()!=null)
15                 t=((StructureTypeDescriptor)t).getSuperType();
16         }
17         if (ts instanceof StructureTypeDescriptor) {
18             while(((StructureTypeDescriptor)ts).getSuperType()!=null)
19                 ts=((StructureTypeDescriptor)ts).getSuperType();
20         }
21         if (t!=ts) {
22             return null;
23         }
24         return ReservedTypeDescriptor.INT;
25     }
26
27     public boolean inverted() {
28         return setexpr.inverted();
29     }
30
31     public String name() {
32         return expr.name() + " in "+setexpr.name();
33     }
34     
35     public InclusionPredicate(Expr expr, SetExpr setexpr) {
36         if (expr == null) {
37             throw new NullPointerException();
38         }
39
40         if (setexpr == null) {
41             throw new NullPointerException();
42         }
43
44         this.expr = expr;
45         this.setexpr = setexpr;
46     }
47
48     public Set getRequiredDescriptors() {
49         Set v = expr.getRequiredDescriptors();
50         v.addAll(setexpr.getRequiredDescriptors());
51         return v;
52     }
53
54     public void generate(CodeWriter writer, VarDescriptor dest) {
55         VarDescriptor var = VarDescriptor.makeNew("exprval");
56         expr.generate(writer, var);
57         setexpr.generate_inclusion(writer, dest, var);
58     }
59
60     public Set getInversedRelations() {
61
62         throw new IRException("unsupported");
63
64         //Set set = setexpr.getInversedRelations();
65         //set.addAll(expr.getInversedRelations());
66         //return set;
67     }
68
69     public Descriptor getDescriptor() {
70         if (setexpr instanceof ImageSetExpr) {
71             return ((ImageSetExpr)setexpr).getRelation();
72         } else
73             return setexpr.sd;
74     }
75
76     public int[] getRepairs(boolean negated, Termination t) {
77         if (setexpr instanceof ImageSetExpr) {
78             if (negated)
79                 return new int[] {AbstractRepair.REMOVEFROMRELATION};
80             else
81                 return new int[] {AbstractRepair.ADDTORELATION};
82         } else {
83             if (negated)
84                 return new int[] {AbstractRepair.REMOVEFROMSET};
85             else
86                 return new int[] {AbstractRepair.ADDTOSET};
87         }
88     }
89 }
90     
91