Adding changes to cvs...
[repair.git] / Repair / RepairCompiler / MCC / IR / ElementOfExpr.java
1 package MCC.IR;
2
3 import java.util.*;
4
5 public class ElementOfExpr extends Expr {
6
7     Expr element;
8     SetDescriptor set;
9
10     public ElementOfExpr(Expr element, SetDescriptor set) {
11         if (element == null || set == null) {
12             throw new NullPointerException();
13         }
14         this.element = element;
15         this.set = set;
16     }
17     public boolean usesDescriptor(Descriptor d) {
18         if (d==set)
19             return true;
20         return element.usesDescriptor(d);
21     }
22     public String name() {
23         return element.name()+" in "+set.toString();
24     }
25
26     public boolean equals(Map remap, Expr e) {
27         if (e==null||!(e instanceof ElementOfExpr))
28             return false;
29         ElementOfExpr eoe=(ElementOfExpr)e;
30         if (eoe.set!=set)
31             return false;
32         if (!element.equals(remap,eoe.element))
33             return false;
34         return true;
35     }
36
37     public Set getRequiredDescriptors() {
38         Set v = element.getRequiredDescriptors();
39         v.add(set);
40         return v;
41     }
42
43     public void generate(CodeWriter writer, VarDescriptor dest) {
44         VarDescriptor ed = VarDescriptor.makeNew("element");
45         element.generate(writer, ed);
46         writer.outputline("int " + dest.getSafeSymbol() + " = " + 
47                           set.getSafeSymbol() + "_hash->contains(" + ed.getSafeSymbol() + ");");
48     }
49     
50     public void prettyPrint(PrettyPrinter pp) {
51         element.prettyPrint(pp);
52         pp.output(" in? " + set.getSafeSymbol());
53     }
54
55     public TypeDescriptor typecheck(SemanticAnalyzer sa) {
56         TypeDescriptor td = element.typecheck(sa);
57         
58         if (td == null) {
59             return null;
60         }
61
62         TypeDescriptor settype = set.getType();
63
64         if (!td.equals(settype)) {
65             sa.getErrorReporter().report(null, "Type mismatch: attempting to test for types '" + td.getSymbol() + "' in set of type '" + settype.getSymbol() + "'");
66             return null;
67         }
68         
69         this.td = ReservedTypeDescriptor.INT;
70         return this.td;
71     }
72
73 }
74