optimized works
[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 Set getInversedRelations() {
16         return new HashSet();
17     }
18
19     public Set getRequiredDescriptors() {
20         return new HashSet();
21     }
22     
23     public VarDescriptor getVar() {
24         return vd;
25     }
26
27     public void generate(CodeWriter writer, VarDescriptor dest) {        
28
29         // #TBD#: bit of a hack, really should have been type checked properly 
30
31         vd = (VarDescriptor) writer.getSymbolTable().get(varname);        
32         assert vd != null;
33         assert vd.getType() != null;
34         this.td = vd.getType();
35
36         writer.outputline(vd.getType().getGenerateType().getSafeSymbol() + " " + dest.getSafeSymbol() + 
37                           " = (" + vd.getType().getGenerateType().getSafeSymbol() + ") " + vd.getSafeSymbol() + "; //varexpr");
38     }
39
40     public void prettyPrint(PrettyPrinter pp) {
41         pp.output(varname);
42     }
43
44     public TypeDescriptor typecheck(SemanticAnalyzer sa) {
45         typechecked = true;
46         vd = (VarDescriptor) sa.getSymbolTable().get(varname);
47
48         if (vd == null) {
49             System.out.println(varname);
50             sa.getErrorReporter().report(null, "Undefined variable '" + varname + "'");
51             return null;
52         }
53         
54         assert vd.getType() != null;
55
56         this.td = vd.getType();
57         return this.td;
58     }
59     
60 }