1282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#ifndef AIDL_AST_H
2282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#define AIDL_AST_H
3282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
4282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#include <string>
5282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#include <vector>
6282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#include <set>
7282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#include <stdarg.h>
8282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#include <stdio.h>
9282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
10282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiusing namespace std;
11282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
12282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiclass Type;
13282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
14282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskienum {
15282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    PACKAGE_PRIVATE = 0x00000000,
16282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    PUBLIC          = 0x00000001,
17282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    PRIVATE         = 0x00000002,
18282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    PROTECTED       = 0x00000003,
19282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    SCOPE_MASK      = 0x00000003,
20282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
21282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    STATIC          = 0x00000010,
22282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    FINAL           = 0x00000020,
23282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    ABSTRACT        = 0x00000040,
24282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
25282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    OVERRIDE        = 0x00000100,
26282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
27282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    ALL_MODIFIERS   = 0xffffffff
28282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski};
29282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
30282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski// Write the modifiers that are set in both mod and mask
31282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskivoid WriteModifiers(FILE* to, int mod, int mask);
32282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
33282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskistruct ClassElement
34282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
35282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    ClassElement();
36282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    virtual ~ClassElement();
37282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
38282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    virtual void GatherTypes(set<Type*>* types) const = 0;
39282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    virtual void Write(FILE* to) = 0;
40282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski};
41282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
42282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskistruct Expression
43282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
44282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    virtual ~Expression();
45282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    virtual void Write(FILE* to) = 0;
46282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski};
47282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
48282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskistruct LiteralExpression : public Expression
49282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
50282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    string value;
51282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
52282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    LiteralExpression(const string& value);
53282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    virtual ~LiteralExpression();
54282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    virtual void Write(FILE* to);
55282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski};
56282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
57282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski// TODO: also escape the contents.  not needed for now
58282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskistruct StringLiteralExpression : public Expression
59282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
60282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    string value;
61282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
62282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    StringLiteralExpression(const string& value);
63282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    virtual ~StringLiteralExpression();
64282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    virtual void Write(FILE* to);
65282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski};
66282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
67282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskistruct Variable : public Expression
68282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
69282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    Type* type;
70282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    string name;
71282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    int dimension;
72282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
73282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    Variable();
74282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    Variable(Type* type, const string& name);
75282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    Variable(Type* type, const string& name, int dimension);
76282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    virtual ~Variable();
77282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
78282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    virtual void GatherTypes(set<Type*>* types) const;
79282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    void WriteDeclaration(FILE* to);
80282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    void Write(FILE* to);
81282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski};
82282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
83282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskistruct FieldVariable : public Expression
84282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
85282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    Expression* object;
86282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    Type* clazz;
87282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    string name;
88282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
89282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    FieldVariable(Expression* object, const string& name);
90282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    FieldVariable(Type* clazz, const string& name);
91282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    virtual ~FieldVariable();
92282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
93282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    void Write(FILE* to);
94282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski};
95282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
96282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskistruct Field : public ClassElement
97282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
98282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    string comment;
99282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    int modifiers;
100282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    Variable *variable;
101282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    string value;
102282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
103282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    Field();
104282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    Field(int modifiers, Variable* variable);
105282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    virtual ~Field();
106282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
107282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    virtual void GatherTypes(set<Type*>* types) const;
108282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    virtual void Write(FILE* to);
109282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski};
110282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
111282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskistruct Statement
112282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
113282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    virtual ~Statement();
114282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    virtual void Write(FILE* to) = 0;
115282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski};
116282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
117282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskistruct StatementBlock : public Statement
118282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
119282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    vector<Statement*> statements;
120282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
121282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    StatementBlock();
122282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    virtual ~StatementBlock();
123282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    virtual void Write(FILE* to);
124282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
125282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    void Add(Statement* statement);
126282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    void Add(Expression* expression);
127282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski};
128282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
129282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskistruct ExpressionStatement : public Statement
130282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
131282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    Expression* expression;
132282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
133282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    ExpressionStatement(Expression* expression);
134282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    virtual ~ExpressionStatement();
135282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    virtual void Write(FILE* to);
136282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski};
137282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
138282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskistruct Assignment : public Expression
139282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
140282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    Variable* lvalue;
141282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    Expression* rvalue;
142282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    Type* cast;
143282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
144282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    Assignment(Variable* lvalue, Expression* rvalue);
145282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    Assignment(Variable* lvalue, Expression* rvalue, Type* cast);
146282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    virtual ~Assignment();
147282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    virtual void Write(FILE* to);
148282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski};
149282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
150282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskistruct MethodCall : public Expression
151282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
152282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    Expression* obj;
153282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    Type* clazz;
154282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    string name;
155282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    vector<Expression*> arguments;
156282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    vector<string> exceptions;
157282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
158282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    MethodCall(const string& name);
159282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    MethodCall(const string& name, int argc, ...);
160282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    MethodCall(Expression* obj, const string& name);
161282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    MethodCall(Type* clazz, const string& name);
162282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    MethodCall(Expression* obj, const string& name, int argc, ...);
163282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    MethodCall(Type* clazz, const string& name, int argc, ...);
164282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    virtual ~MethodCall();
165282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    virtual void Write(FILE* to);
166282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
167282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiprivate:
168282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    void init(int n, va_list args);
169282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski};
170282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
171282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskistruct Comparison : public Expression
172282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
173282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    Expression* lvalue;
174282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    string op;
175282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    Expression* rvalue;
176282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
177282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    Comparison(Expression* lvalue, const string& op, Expression* rvalue);
178282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    virtual ~Comparison();
179282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    virtual void Write(FILE* to);
180282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski};
181282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
182282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskistruct NewExpression : public Expression
183282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
184282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    Type* type;
185282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    vector<Expression*> arguments;
186282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
187282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    NewExpression(Type* type);
188282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    NewExpression(Type* type, int argc, ...);
189282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    virtual ~NewExpression();
190282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    virtual void Write(FILE* to);
191282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
192282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiprivate:
193282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    void init(int n, va_list args);
194282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski};
195282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
196282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskistruct NewArrayExpression : public Expression
197282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
198282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    Type* type;
199282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    Expression* size;
200282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
201282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    NewArrayExpression(Type* type, Expression* size);
202282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    virtual ~NewArrayExpression();
203282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    virtual void Write(FILE* to);
204282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski};
205282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
206282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskistruct Ternary : public Expression
207282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
208282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    Expression* condition;
209282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    Expression* ifpart;
210282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    Expression* elsepart;
211282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
212282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    Ternary();
213282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    Ternary(Expression* condition, Expression* ifpart, Expression* elsepart);
214282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    virtual ~Ternary();
215282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    virtual void Write(FILE* to);
216282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski};
217282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
218282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskistruct Cast : public Expression
219282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
220282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    Type* type;
221282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    Expression* expression;
222282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
223282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    Cast();
224282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    Cast(Type* type, Expression* expression);
225282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    virtual ~Cast();
226282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    virtual void Write(FILE* to);
227282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski};
228282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
229282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskistruct VariableDeclaration : public Statement
230282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
231282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    Variable* lvalue;
232282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    Type* cast;
233282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    Expression* rvalue;
234282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
235282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    VariableDeclaration(Variable* lvalue);
236282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    VariableDeclaration(Variable* lvalue, Expression* rvalue, Type* cast = NULL);
237282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    virtual ~VariableDeclaration();
238282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    virtual void Write(FILE* to);
239282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski};
240282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
241282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskistruct IfStatement : public Statement
242282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
243282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    Expression* expression;
244282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    StatementBlock* statements;
245282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    IfStatement* elseif;
246282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
247282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    IfStatement();
248282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    virtual ~IfStatement();
249282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    virtual void Write(FILE* to);
250282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski};
251282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
252282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskistruct ReturnStatement : public Statement
253282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
254282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    Expression* expression;
255282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
256282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    ReturnStatement(Expression* expression);
257282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    virtual ~ReturnStatement();
258282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    virtual void Write(FILE* to);
259282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski};
260282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
261282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskistruct TryStatement : public Statement
262282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
263282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    StatementBlock* statements;
264282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
265282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    TryStatement();
266282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    virtual ~TryStatement();
267282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    virtual void Write(FILE* to);
268282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski};
269282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
270282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskistruct CatchStatement : public Statement
271282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
272282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    StatementBlock* statements;
273282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    Variable* exception;
274282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
275282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    CatchStatement(Variable* exception);
276282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    virtual ~CatchStatement();
277282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    virtual void Write(FILE* to);
278282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski};
279282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
280282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskistruct FinallyStatement : public Statement
281282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
282282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    StatementBlock* statements;
283282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
284282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    FinallyStatement();
285282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    virtual ~FinallyStatement();
286282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    virtual void Write(FILE* to);
287282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski};
288282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
289282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskistruct Case
290282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
291282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    vector<string> cases;
292282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    StatementBlock* statements;
293282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
294282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    Case();
295282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    Case(const string& c);
296282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    virtual ~Case();
297282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    virtual void Write(FILE* to);
298282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski};
299282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
300282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskistruct SwitchStatement : public Statement
301282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
302282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    Expression* expression;
303282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    vector<Case*> cases;
304282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
305282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    SwitchStatement(Expression* expression);
306282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    virtual ~SwitchStatement();
307282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    virtual void Write(FILE* to);
308282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski};
309282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
310282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskistruct Break : public Statement
311282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
312282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    Break();
313282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    virtual ~Break();
314282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    virtual void Write(FILE* to);
315282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski};
316282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
317282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskistruct Method : public ClassElement
318282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
319282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    string comment;
320282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    int modifiers;
321282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    Type* returnType;
322282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    size_t returnTypeDimension;
323282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    string name;
324282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    vector<Variable*> parameters;
325282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    vector<Type*> exceptions;
326282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    StatementBlock* statements;
327282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
328282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    Method();
329282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    virtual ~Method();
330282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
331282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    virtual void GatherTypes(set<Type*>* types) const;
332282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    virtual void Write(FILE* to);
333282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski};
334282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
335282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskistruct Class : public ClassElement
336282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
337282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    enum {
338282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        CLASS,
339282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        INTERFACE
340282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    };
341282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
342282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    string comment;
343282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    int modifiers;
344282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    int what;               // CLASS or INTERFACE
345282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    Type* type;
346282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    Type* extends;
347282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    vector<Type*> interfaces;
348282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    vector<ClassElement*> elements;
349282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
350282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    Class();
351282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    virtual ~Class();
352282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
353282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    virtual void GatherTypes(set<Type*>* types) const;
354282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    virtual void Write(FILE* to);
355282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski};
356282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
357282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskistruct Document
358282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
359282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    string comment;
360282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    string package;
361282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    string originalSrc;
362282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    set<Type*> imports;
363282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    vector<Class*> classes;
364282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
365282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    Document();
366282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    virtual ~Document();
367282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
368282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    virtual void Write(FILE* to);
369282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski};
370282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
371282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#endif // AIDL_AST_H
372