f0fd0c436834126e3ffd2dcba7f639e058f56ddb
[repair.git] / Repair / RepairCompiler / MCC / IR / RelationInclusion.java
1 package MCC.IR;
2
3 import java.util.*;
4
5 public class RelationInclusion extends Inclusion {
6     
7     Expr leftelementexpr, rightelementexpr;
8     RelationDescriptor relation;
9
10     public RelationInclusion(Expr leftelementexpr, Expr rightelementexpr, RelationDescriptor relation) {
11         this.leftelementexpr = leftelementexpr;
12         this.rightelementexpr = rightelementexpr;
13         this.relation = relation;
14     }
15
16     public Set getTargetDescriptors() {
17         HashSet v = new HashSet();
18         v.add(relation);
19         return v;
20     }
21
22     public Set getRequiredDescriptors() {
23         Set v = leftelementexpr.getRequiredDescriptors();
24         v.addAll(rightelementexpr.getRequiredDescriptors());
25         return v;
26     }
27
28     public void generate(CodeWriter writer) {
29         VarDescriptor ld = VarDescriptor.makeNew("leftele");
30         leftelementexpr.generate(writer, ld);
31         VarDescriptor rd = VarDescriptor.makeNew("rightele");
32         rightelementexpr.generate(writer, rd);
33         writer.outputline(relation.getSafeSymbol() + "_hash->add((int)" + ld.getSafeSymbol() + ", (int)" + rd.getSafeSymbol() + ");");
34         //writer.outputline("printf(\"" + relation.getSafeSymbol() + " (add): <%d, %d>\\n\", " + ld.getSafeSymbol() + ", " + rd.getSafeSymbol() + ");");
35     }
36
37     public boolean typecheck(SemanticAnalyzer sa) {
38         TypeDescriptor ld = leftelementexpr.typecheck(sa);
39         TypeDescriptor rd = rightelementexpr.typecheck(sa);
40         
41         if (ld == null || rd == null) {
42             return false;
43         }
44
45         boolean ok = true;
46
47         if (ld != relation.getDomain().getType()) {
48             sa.getErrorReporter().report(null, "Type of left element '" + ld.getSymbol() + "' must match domain type '" + relation.getDomain().getType().getSymbol() + "'");
49             ok = false;
50         }
51
52         if (rd != relation.getRange().getType()) {
53             assert rd.getSymbol() != null;
54             assert relation.getRange().getType() != null : relation.getRange().getSymbol();
55             sa.getErrorReporter().report(null, "Type of right element '" + rd.getSymbol() + "' must match range type '" + relation.getRange().getType().getSymbol() + "'");
56             ok = false;
57         }
58
59         return ok;
60     }
61
62 }