Fixed lot of random bugs. Added code generate strings for expr's.
[repair.git] / Repair / RepairCompiler / MCC / IR / VarExpr.java
1 package MCC.IR;
2
3 import java.util.*;
4
5 public class VarExpr extends Expr {
6
7     String varname;
8     VarDescriptor vd = null;
9     boolean typechecked = false;
10
11     public VarExpr(String varname) {
12         this.varname = varname; 
13     }
14
15     public VarExpr(VarDescriptor vd) {
16         this.vd=vd;
17         varname=vd.getSymbol();
18         this.td = vd.getType(); 
19     }
20
21     public String name() {
22         return varname;
23     }
24
25     public boolean usesDescriptor(Descriptor d) {
26         if (d==vd)
27             return true;
28         return false;
29     }
30
31     public boolean equals(Map remap, Expr e) {
32         if (e==null||!(e instanceof VarExpr))
33             return false;
34         VarExpr ve=(VarExpr)e;
35         if (vd==null)
36             throw new Error("Uninitialized VarDescriptor");
37         if (ve.vd==null)
38             throw new Error("e has uninitialized VarDescriptor");
39         VarDescriptor nvd=vd;
40         if (remap.containsKey(nvd))
41             nvd=(VarDescriptor)remap.get(nvd);
42         if (nvd!=ve.vd)
43             return false;
44         return true;
45     }
46
47     public Set getInversedRelations() {
48         return new HashSet();
49     }
50
51     public Set getRequiredDescriptors() {
52         return new HashSet();
53     }
54     
55     public VarDescriptor getVar() {
56         return vd;
57     }
58
59     public void generate(CodeWriter writer, VarDescriptor dest) {        
60
61         // #TBD#: bit of a hack, really should have been type checked properly 
62
63         vd = (VarDescriptor) writer.getSymbolTable().get(varname);        
64         assert vd != null;
65         assert vd.getType() != null;
66         this.td = vd.getType();
67
68         writer.outputline(vd.getType().getGenerateType().getSafeSymbol() + " " + dest.getSafeSymbol() + 
69                           " = (" + vd.getType().getGenerateType().getSafeSymbol() + ") " + vd.getSafeSymbol() + "; //varexpr");
70     }
71
72     public void prettyPrint(PrettyPrinter pp) {
73         pp.output(varname);
74     }
75
76     public TypeDescriptor typecheck(SemanticAnalyzer sa) {
77         typechecked = true;
78         vd = (VarDescriptor) sa.getSymbolTable().get(varname);
79
80         if (vd == null) {
81             System.out.println(varname);
82             sa.getErrorReporter().report(null, "Undefined variable '" + varname + "'");
83             return null;
84         }
85         
86         assert vd.getType() != null;
87
88         this.td = vd.getType();
89         return this.td;
90     }
91     
92 }