worklist version
[repair.git] / Repair / RepairCompiler / MCC / IR / SetInclusion.java
1 package MCC.IR;
2
3 import java.util.*;
4
5 public class SetInclusion extends Inclusion {
6     
7     Expr elementexpr;
8     SetDescriptor set;
9
10     static boolean worklist = true;
11
12     public SetInclusion(Expr elementexpr, SetDescriptor set) {
13         this.elementexpr = elementexpr;
14         this.set = set;
15     }
16
17     public Set getTargetDescriptors() {
18         HashSet v = new HashSet();
19         v.add(set);
20         return v;
21     }
22
23     public Set getRequiredDescriptors() {
24         return elementexpr.getRequiredDescriptors();
25     }
26
27     public void generate(CodeWriter writer) {
28         VarDescriptor vd = VarDescriptor.makeNew("element");
29         elementexpr.generate(writer, vd);
30
31         String addeditem = (VarDescriptor.makeNew("addeditem")).getSafeSymbol();
32         writer.outputline("int " + addeditem + ";");
33         
34         writer.outputline(addeditem + " = " + set.getSafeSymbol() + "_hash->add((int)" + vd.getSafeSymbol() 
35                           +  ", (int)" + vd.getSafeSymbol() + ");");
36
37         if (SetInclusion.worklist) {
38             writer.outputline("if (" + addeditem + ")");
39             writer.startblock(); {                
40                 WorkList.generate_dispatch(writer, set, vd.getSafeSymbol());
41             }
42             writer.endblock();
43         }
44         
45     }
46
47     public boolean typecheck(SemanticAnalyzer sa) {
48         TypeDescriptor td = elementexpr.typecheck(sa);
49         
50         if (td == null) {
51             return false;
52         }
53
54         TypeDescriptor settype = set.getType();
55
56         if (!td.equals(settype)) {
57             sa.getErrorReporter().report(null, "Type mismatch: attempting to test for types '" + td.getSymbol() + "' in set of type '" + settype.getSymbol() + "'");
58             return false;
59         }
60         
61         return true;
62     }
63
64 }