1
3 package jminusminus;
4
5 import java.util.ArrayList;
6
7
10 class JFieldDeclaration extends JAST implements JMember {
11 private ArrayList<String> mods;
13
14 private ArrayList<JVariableDeclarator> decls;
16
17 private ArrayList<JStatement> initializations;
19
20
27 public JFieldDeclaration(int line, ArrayList<String> mods,
28 ArrayList<JVariableDeclarator> decls) {
29 super(line);
30 this.mods = mods;
31 this.decls = decls;
32 initializations = new ArrayList<JStatement>();
33 }
34
35
40 public ArrayList<String> mods() {
41 return mods;
42 }
43
44
47 public void preAnalyze(Context context, CLEmitter partial) {
48 if (mods.contains("abstract")) {
49 JAST.compilationUnit.reportSemanticError(line(), "Field cannot be declared abstract");
50 }
51 for (JVariableDeclarator decl : decls) {
52 decl.setType(decl.type().resolve(context));
53 partial.addField(mods, decl.name(), decl.type().toDescriptor(), false);
54 }
55 }
56
57
60 public JFieldDeclaration analyze(Context context) {
61 for (JVariableDeclarator decl : decls) {
62 if (decl.initializer() != null) {
63 JAssignOp assignOp = new JAssignOp(decl.line(), new JVariable(decl.line(),
64 decl.name()), decl.initializer());
65 assignOp.isStatementExpression = true;
66 initializations.add(new JStatementExpression(decl.line(),
67 assignOp).analyze(context));
68 }
69 }
70 return this;
71 }
72
73
76 public void codegen(CLEmitter output) {
77 for (JVariableDeclarator decl : decls) {
78 output.addField(mods, decl.name(), decl.type().toDescriptor(), false);
79 }
80 }
81
82
87 public void codegenInitializations(CLEmitter output) {
88 for (JStatement initialization : initializations) {
89 initialization.codegen(output);
90 }
91 }
92
93
96 public void toJSON(JSONElement json) {
97 JSONElement e = new JSONElement();
98 json.addChild("JFieldDeclaration", e);
99 e.addAttribute("line", String.valueOf(line()));
100 if (mods != null) {
101 ArrayList<String> value = new ArrayList<String>();
102 for (String mod : mods) {
103 value.add(String.format("\"%s\"", mod));
104 }
105 e.addAttribute("modifiers", value);
106 }
107 if (decls != null) {
108 JSONElement e1 = new JSONElement();
109 e.addChild("VariableDeclarators", e1);
110 for (JVariableDeclarator decl : decls) {
111 decl.toJSON(e1);
112 }
113 }
114 }
115 }
116