1
3 package jminusminus;
4
5 import java.util.ArrayList;
6
7
10
11 class JFieldDeclaration extends JAST implements JMember {
12
13
14 private ArrayList<String> mods;
15
16
17 private ArrayList<JVariableDeclarator> decls;
18
19
20 private ArrayList<JStatement> initializations;
21
22
34
35 public JFieldDeclaration(int line, ArrayList<String> mods,
36 ArrayList<JVariableDeclarator> decls) {
37 super(line);
38 this.mods = mods;
39 this.decls = decls;
40 initializations = new ArrayList<JStatement>();
41 }
42
43
48
49 public ArrayList<String> mods() {
50 return mods;
51 }
52
53
62
63 public void preAnalyze(Context context, CLEmitter partial) {
64 if (mods.contains("abstract")) {
66 JAST.compilationUnit.reportSemanticError(line(),
67 "Field cannot be declared abstract");
68 }
69
70 for (JVariableDeclarator decl : decls) {
71 decl.setType(decl.type().resolve(context));
73 partial.addField(mods, decl.name(), decl.type().toDescriptor(),
74 false);
75 }
76 }
77
78
86
87 public JFieldDeclaration analyze(Context context) {
88 for (JVariableDeclarator decl : decls) {
89 if (decl.initializer() != null) {
92 JAssignOp assignOp = new JAssignOp(decl.line(), new JVariable(
93 decl.line(), decl.name()), decl.initializer());
94 assignOp.isStatementExpression = true;
95 initializations.add(new JStatementExpression(decl.line(),
96 assignOp).analyze(context));
97 }
98 }
99 return this;
100 }
101
102
110
111 public void codegenInitializations(CLEmitter output) {
112 for (JStatement initialization : initializations) {
113 initialization.codegen(output);
114 }
115 }
116
117
124
125 public void codegen(CLEmitter output) {
126 for (JVariableDeclarator decl : decls) {
127 output.addField(mods, decl.name(), decl.type().toDescriptor(),
129 false);
130 }
131 }
132
133
136
137 public void writeToStdOut(PrettyPrinter p) {
138 p.printf("<JFieldDeclaration line=\"%d\"/>\n", line());
139 p.indentRight();
140 if (mods != null) {
141 p.println("<Modifiers>");
142 p.indentRight();
143 for (String mod : mods) {
144 p.printf("<Modifier name=\"%s\"/>\n", mod);
145 }
146 p.indentLeft();
147 p.println("</Modifiers>");
148 }
149 if (decls != null) {
150 p.println("<VariableDeclarators>");
151 for (JVariableDeclarator decl : decls) {
152 p.indentRight();
153 decl.writeToStdOut(p);
154 p.indentLeft();
155 }
156 p.println("<VariableDeclarators>");
157 }
158 p.indentLeft();
159 p.println("</JFieldDeclaration>");
160 }
161
162 }
163