blob: fe92a26e9802eb890f2779882a345c63a7574673 [file] [log] [blame]
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001#ifndef AIDL_AST_H
2#define AIDL_AST_H
3
4#include <string>
5#include <vector>
6#include <set>
7#include <stdarg.h>
Jack Palevichc7410f62009-06-24 19:27:30 -07008#include <stdio.h>
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08009
10using namespace std;
11
12class Type;
13
14enum {
15 PACKAGE_PRIVATE = 0x00000000,
16 PUBLIC = 0x00000001,
17 PRIVATE = 0x00000002,
18 PROTECTED = 0x00000003,
19 SCOPE_MASK = 0x00000003,
20
21 STATIC = 0x00000010,
22 FINAL = 0x00000020,
23 ABSTRACT = 0x00000040,
24
Xavier Ducrohet7ea9d792009-08-03 19:51:54 -070025 OVERRIDE = 0x00000100,
26
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080027 ALL_MODIFIERS = 0xffffffff
28};
29
30// Write the modifiers that are set in both mod and mask
31void WriteModifiers(FILE* to, int mod, int mask);
32
33struct ClassElement
34{
35 ClassElement();
36 virtual ~ClassElement();
37
38 virtual void GatherTypes(set<Type*>* types) const = 0;
39 virtual void Write(FILE* to) = 0;
40};
41
42struct Expression
43{
44 virtual ~Expression();
45 virtual void Write(FILE* to) = 0;
46};
47
48struct LiteralExpression : public Expression
49{
50 string value;
51
52 LiteralExpression(const string& value);
53 virtual ~LiteralExpression();
54 virtual void Write(FILE* to);
55};
56
Joe Onoratoae7f32e2011-08-30 17:24:17 -070057// TODO: also escape the contents. not needed for now
58struct StringLiteralExpression : public Expression
59{
60 string value;
61
62 StringLiteralExpression(const string& value);
63 virtual ~StringLiteralExpression();
64 virtual void Write(FILE* to);
65};
66
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080067struct Variable : public Expression
68{
69 Type* type;
70 string name;
71 int dimension;
72
73 Variable();
74 Variable(Type* type, const string& name);
75 Variable(Type* type, const string& name, int dimension);
76 virtual ~Variable();
77
78 virtual void GatherTypes(set<Type*>* types) const;
79 void WriteDeclaration(FILE* to);
80 void Write(FILE* to);
81};
82
83struct FieldVariable : public Expression
84{
85 Expression* object;
86 Type* clazz;
87 string name;
88
89 FieldVariable(Expression* object, const string& name);
90 FieldVariable(Type* clazz, const string& name);
91 virtual ~FieldVariable();
92
93 void Write(FILE* to);
94};
95
96struct Field : public ClassElement
97{
98 string comment;
99 int modifiers;
100 Variable *variable;
101 string value;
102
103 Field();
104 Field(int modifiers, Variable* variable);
105 virtual ~Field();
106
107 virtual void GatherTypes(set<Type*>* types) const;
108 virtual void Write(FILE* to);
109};
110
111struct Statement
112{
113 virtual ~Statement();
114 virtual void Write(FILE* to) = 0;
115};
116
117struct StatementBlock
118{
119 vector<Statement*> statements;
120
121 StatementBlock();
122 virtual ~StatementBlock();
123 virtual void Write(FILE* to);
124
125 void Add(Statement* statement);
126 void Add(Expression* expression);
127};
128
129struct ExpressionStatement : public Statement
130{
131 Expression* expression;
132
133 ExpressionStatement(Expression* expression);
134 virtual ~ExpressionStatement();
135 virtual void Write(FILE* to);
136};
137
138struct Assignment : public Expression
139{
140 Variable* lvalue;
141 Expression* rvalue;
142 Type* cast;
143
144 Assignment(Variable* lvalue, Expression* rvalue);
145 Assignment(Variable* lvalue, Expression* rvalue, Type* cast);
146 virtual ~Assignment();
147 virtual void Write(FILE* to);
148};
149
150struct MethodCall : public Expression
151{
152 Expression* obj;
153 Type* clazz;
154 string name;
155 vector<Expression*> arguments;
156 vector<string> exceptions;
157
158 MethodCall(const string& name);
Joe Onoratoae7f32e2011-08-30 17:24:17 -0700159 MethodCall(const string& name, int argc, ...);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800160 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);
166
167private:
168 void init(int n, va_list args);
169};
170
171struct Comparison : public Expression
172{
173 Expression* lvalue;
174 string op;
175 Expression* rvalue;
176
177 Comparison(Expression* lvalue, const string& op, Expression* rvalue);
178 virtual ~Comparison();
179 virtual void Write(FILE* to);
180};
181
182struct NewExpression : public Expression
183{
184 Type* type;
185 vector<Expression*> arguments;
186
187 NewExpression(Type* type);
Joe Onoratoae7f32e2011-08-30 17:24:17 -0700188 NewExpression(Type* type, int argc, ...);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800189 virtual ~NewExpression();
190 virtual void Write(FILE* to);
Joe Onoratoae7f32e2011-08-30 17:24:17 -0700191
192private:
193 void init(int n, va_list args);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800194};
195
196struct NewArrayExpression : public Expression
197{
198 Type* type;
199 Expression* size;
200
201 NewArrayExpression(Type* type, Expression* size);
202 virtual ~NewArrayExpression();
203 virtual void Write(FILE* to);
204};
205
206struct Ternary : public Expression
207{
208 Expression* condition;
209 Expression* ifpart;
210 Expression* elsepart;
211
212 Ternary();
213 Ternary(Expression* condition, Expression* ifpart, Expression* elsepart);
214 virtual ~Ternary();
215 virtual void Write(FILE* to);
216};
217
218struct Cast : public Expression
219{
220 Type* type;
221 Expression* expression;
222
223 Cast();
224 Cast(Type* type, Expression* expression);
225 virtual ~Cast();
226 virtual void Write(FILE* to);
227};
228
229struct VariableDeclaration : public Statement
230{
231 Variable* lvalue;
232 Type* cast;
233 Expression* rvalue;
234
235 VariableDeclaration(Variable* lvalue);
236 VariableDeclaration(Variable* lvalue, Expression* rvalue, Type* cast = NULL);
237 virtual ~VariableDeclaration();
238 virtual void Write(FILE* to);
239};
240
241struct IfStatement : public Statement
242{
243 Expression* expression;
244 StatementBlock* statements;
245 IfStatement* elseif;
246
247 IfStatement();
248 virtual ~IfStatement();
249 virtual void Write(FILE* to);
250};
251
252struct ReturnStatement : public Statement
253{
254 Expression* expression;
255
256 ReturnStatement(Expression* expression);
257 virtual ~ReturnStatement();
258 virtual void Write(FILE* to);
259};
260
261struct TryStatement : public Statement
262{
263 StatementBlock* statements;
264
265 TryStatement();
266 virtual ~TryStatement();
267 virtual void Write(FILE* to);
268};
269
270struct CatchStatement : public Statement
271{
272 StatementBlock* statements;
273 Variable* exception;
274
275 CatchStatement(Variable* exception);
276 virtual ~CatchStatement();
277 virtual void Write(FILE* to);
278};
279
280struct FinallyStatement : public Statement
281{
282 StatementBlock* statements;
283
284 FinallyStatement();
285 virtual ~FinallyStatement();
286 virtual void Write(FILE* to);
287};
288
289struct Case
290{
291 vector<string> cases;
292 StatementBlock* statements;
293
294 Case();
295 Case(const string& c);
296 virtual ~Case();
297 virtual void Write(FILE* to);
298};
299
300struct SwitchStatement : public Statement
301{
302 Expression* expression;
303 vector<Case*> cases;
304
305 SwitchStatement(Expression* expression);
306 virtual ~SwitchStatement();
307 virtual void Write(FILE* to);
308};
309
310struct Method : public ClassElement
311{
312 string comment;
313 int modifiers;
314 Type* returnType;
315 size_t returnTypeDimension;
316 string name;
317 vector<Variable*> parameters;
318 vector<Type*> exceptions;
319 StatementBlock* statements;
320
321 Method();
322 virtual ~Method();
323
324 virtual void GatherTypes(set<Type*>* types) const;
325 virtual void Write(FILE* to);
326};
327
328struct Class : public ClassElement
329{
330 enum {
331 CLASS,
332 INTERFACE
333 };
334
335 string comment;
336 int modifiers;
337 int what; // CLASS or INTERFACE
338 Type* type;
339 Type* extends;
340 vector<Type*> interfaces;
341 vector<ClassElement*> elements;
342
343 Class();
344 virtual ~Class();
345
346 virtual void GatherTypes(set<Type*>* types) const;
347 virtual void Write(FILE* to);
348};
349
350struct Document
351{
352 string comment;
353 string package;
354 string originalSrc;
355 set<Type*> imports;
356 vector<Class*> classes;
357
358 Document();
359 virtual ~Document();
360
361 virtual void Write(FILE* to);
362};
363
364#endif // AIDL_AST_H