1
3 package jminusminus;
4
5 import java.util.ArrayList;
6
7
12 class JVariableDeclaration extends JStatement {
13 private ArrayList<JVariableDeclarator> decls;
15
16 private ArrayList<JStatement> initializations;
18
19
25 public JVariableDeclaration(int line, ArrayList<JVariableDeclarator> decls) {
26 super(line);
27 this.decls = decls;
28 initializations = new ArrayList<JStatement>();
29 }
30
31
34 public JStatement analyze(Context context) {
35 for (JVariableDeclarator decl : decls) {
36 int offset = ((LocalContext) context).nextOffset();
38 LocalVariableDefn defn = new LocalVariableDefn(decl.type().resolve(context), offset);
39
40 IDefn previousDefn = context.lookup(decl.name());
42 if (previousDefn != null && previousDefn instanceof LocalVariableDefn) {
43 JAST.compilationUnit.reportSemanticError(decl.line(),
44 "The name " + decl.name() + " overshadows another local variable");
45 }
46
47 context.addEntry(decl.line(), decl.name(), defn);
49
50 if (decl.initializer() != null) {
52 defn.initialize();
53 JAssignOp assignOp = new JAssignOp(decl.line(), new JVariable(decl.line(),
54 decl.name()), decl.initializer());
55 assignOp.isStatementExpression = true;
56 initializations.add(new JStatementExpression(decl.line(),
57 assignOp).analyze(context));
58 }
59 }
60 return this;
61 }
62
63
66 public void codegen(CLEmitter output) {
67 for (JStatement initialization : initializations) {
68 initialization.codegen(output);
69 }
70 }
71
72
75 public void toJSON(JSONElement json) {
76 JSONElement e = new JSONElement();
77 json.addChild("JVariableDeclaration:" + line, e);
78 if (decls != null) {
79 for (JVariableDeclarator decl : decls) {
80 decl.toJSON(e);
81 }
82 }
83 }
84 }
85