15 PACKAGE_PRIVATE = 0x00000000,
18 PROTECTED = 0x00000003,
19 SCOPE_MASK = 0x00000003,
23 ABSTRACT = 0x00000040,
25 OVERRIDE = 0x00000100,
27 ALL_MODIFIERS = 0xffffffff
30 // Write the modifiers that are set in both mod and mask
31 void WriteModifiers(FILE* to, int mod, int mask);
36 virtual ~ClassElement();
38 virtual void GatherTypes(set<Type*>* types) const = 0;
39 virtual void Write(FILE* to) = 0;
44 virtual ~Expression();
45 virtual void Write(FILE* to) = 0;
48 struct LiteralExpression : public Expression
52 LiteralExpression(const string& value);
53 virtual ~LiteralExpression();
54 virtual void Write(FILE* to);
57 // TODO: also escape the contents. not needed for now
58 struct StringLiteralExpression : public Expression
62 StringLiteralExpression(const string& value);
63 virtual ~StringLiteralExpression();
64 virtual void Write(FILE* to);
67 struct Variable : public Expression
74 Variable(Type* type, const string& name);
75 Variable(Type* type, const string& name, int dimension);
78 virtual void GatherTypes(set<Type*>* types) const;
79 void WriteDeclaration(FILE* to);
83 struct FieldVariable : public Expression
89 FieldVariable(Expression* object, const string& name);
90 FieldVariable(Type* clazz, const string& name);
91 virtual ~FieldVariable();
96 struct Field : public ClassElement
104 Field(int modifiers, Variable* variable);
107 virtual void GatherTypes(set<Type*>* types) const;
108 virtual void Write(FILE* to);
113 virtual ~Statement();
114 virtual void Write(FILE* to) = 0;
117 struct StatementBlock : public Statement
119 vector<Statement*> statements;
122 virtual ~StatementBlock();
123 virtual void Write(FILE* to);
125 void Add(Statement* statement);
126 void Add(Expression* expression);
129 struct ExpressionStatement : public Statement
131 Expression* expression;
133 ExpressionStatement(Expression* expression);
134 virtual ~ExpressionStatement();
135 virtual void Write(FILE* to);
138 struct Assignment : public Expression
144 Assignment(Variable* lvalue, Expression* rvalue);
145 Assignment(Variable* lvalue, Expression* rvalue, Type* cast);
146 virtual ~Assignment();
147 virtual void Write(FILE* to);
150 struct MethodCall : public Expression
155 vector<Expression*> arguments;
156 vector<string> exceptions;
158 MethodCall(const string& name);
159 MethodCall(const string& name, int argc, ...);
160 MethodCall(Expression* obj, const string& name);
161 MethodCall(Type* clazz, const string& name);
162 MethodCall(Expression* obj, const string& name, int argc, ...);
163 MethodCall(Type* clazz, const string& name, int argc, ...);
164 virtual ~MethodCall();
165 virtual void Write(FILE* to);
168 void init(int n, va_list args);
171 struct Comparison : public Expression
177 Comparison(Expression* lvalue, const string& op, Expression* rvalue);
178 virtual ~Comparison();
179 virtual void Write(FILE* to);
182 struct NewExpression : public Expression
185 vector<Expression*> arguments;
187 NewExpression(Type* type);
188 NewExpression(Type* type, int argc, ...);
189 virtual ~NewExpression();
190 virtual void Write(FILE* to);
193 void init(int n, va_list args);
196 struct NewArrayExpression : public Expression
201 NewArrayExpression(Type* type, Expression* size);
202 virtual ~NewArrayExpression();
203 virtual void Write(FILE* to);
206 struct Ternary : public Expression
208 Expression* condition;
210 Expression* elsepart;
213 Ternary(Expression* condition, Expression* ifpart, Expression* elsepart);
215 virtual void Write(FILE* to);
218 struct Cast : public Expression
221 Expression* expression;
224 Cast(Type* type, Expression* expression);
226 virtual void Write(FILE* to);
229 struct VariableDeclaration : public Statement
235 VariableDeclaration(Variable* lvalue);
236 VariableDeclaration(Variable* lvalue, Expression* rvalue, Type* cast = NULL);
237 virtual ~VariableDeclaration();
238 virtual void Write(FILE* to);
241 struct IfStatement : public Statement
243 Expression* expression;
244 StatementBlock* statements;
248 virtual ~IfStatement();
249 virtual void Write(FILE* to);
252 struct ReturnStatement : public Statement
254 Expression* expression;
256 ReturnStatement(Expression* expression);
257 virtual ~ReturnStatement();
258 virtual void Write(FILE* to);
261 struct TryStatement : public Statement
263 StatementBlock* statements;
266 virtual ~TryStatement();
267 virtual void Write(FILE* to);
270 struct CatchStatement : public Statement
272 StatementBlock* statements;
275 CatchStatement(Variable* exception);
276 virtual ~CatchStatement();
277 virtual void Write(FILE* to);
280 struct FinallyStatement : public Statement
282 StatementBlock* statements;
285 virtual ~FinallyStatement();
286 virtual void Write(FILE* to);
291 vector<string> cases;
292 StatementBlock* statements;
295 Case(const string& c);
297 virtual void Write(FILE* to);
300 struct SwitchStatement : public Statement
302 Expression* expression;
305 SwitchStatement(Expression* expression);
306 virtual ~SwitchStatement();
307 virtual void Write(FILE* to);
310 struct Break : public Statement
314 virtual void Write(FILE* to);
317 struct Method : public ClassElement
322 size_t returnTypeDimension;
324 vector<Variable*> parameters;
325 vector<Type*> exceptions;
326 StatementBlock* statements;
331 virtual void GatherTypes(set<Type*>* types) const;
332 virtual void Write(FILE* to);
335 struct Class : public ClassElement
344 int what; // CLASS or INTERFACE
347 vector<Type*> interfaces;
348 vector<ClassElement*> elements;
353 virtual void GatherTypes(set<Type*>* types) const;
354 virtual void Write(FILE* to);
363 vector<Class*> classes;
368 virtual void Write(FILE* to);