| #ifndef AIDL_AST_H | 
 | #define AIDL_AST_H | 
 |  | 
 | #include <string> | 
 | #include <vector> | 
 | #include <set> | 
 | #include <stdarg.h> | 
 | #include <stdio.h> | 
 |  | 
 | using namespace std; | 
 |  | 
 | class Type; | 
 |  | 
 | enum { | 
 |     PACKAGE_PRIVATE = 0x00000000, | 
 |     PUBLIC          = 0x00000001, | 
 |     PRIVATE         = 0x00000002, | 
 |     PROTECTED       = 0x00000003, | 
 |     SCOPE_MASK      = 0x00000003, | 
 |  | 
 |     STATIC          = 0x00000010, | 
 |     FINAL           = 0x00000020, | 
 |     ABSTRACT        = 0x00000040, | 
 |  | 
 |     OVERRIDE        = 0x00000100, | 
 |  | 
 |     ALL_MODIFIERS   = 0xffffffff | 
 | }; | 
 |  | 
 | // Write the modifiers that are set in both mod and mask | 
 | void WriteModifiers(FILE* to, int mod, int mask); | 
 |  | 
 | struct ClassElement | 
 | { | 
 |     ClassElement(); | 
 |     virtual ~ClassElement(); | 
 |  | 
 |     virtual void GatherTypes(set<Type*>* types) const = 0; | 
 |     virtual void Write(FILE* to) = 0; | 
 | }; | 
 |  | 
 | struct Expression | 
 | { | 
 |     virtual ~Expression(); | 
 |     virtual void Write(FILE* to) = 0; | 
 | }; | 
 |  | 
 | struct LiteralExpression : public Expression | 
 | { | 
 |     string value; | 
 |  | 
 |     LiteralExpression(const string& value); | 
 |     virtual ~LiteralExpression(); | 
 |     virtual void Write(FILE* to); | 
 | }; | 
 |  | 
 | // TODO: also escape the contents.  not needed for now | 
 | struct StringLiteralExpression : public Expression | 
 | { | 
 |     string value; | 
 |  | 
 |     StringLiteralExpression(const string& value); | 
 |     virtual ~StringLiteralExpression(); | 
 |     virtual void Write(FILE* to); | 
 | }; | 
 |  | 
 | struct Variable : public Expression | 
 | { | 
 |     Type* type; | 
 |     string name; | 
 |     int dimension; | 
 |  | 
 |     Variable(); | 
 |     Variable(Type* type, const string& name); | 
 |     Variable(Type* type, const string& name, int dimension); | 
 |     virtual ~Variable(); | 
 |  | 
 |     virtual void GatherTypes(set<Type*>* types) const; | 
 |     void WriteDeclaration(FILE* to); | 
 |     void Write(FILE* to); | 
 | }; | 
 |  | 
 | struct FieldVariable : public Expression | 
 | { | 
 |     Expression* object; | 
 |     Type* clazz; | 
 |     string name; | 
 |  | 
 |     FieldVariable(Expression* object, const string& name); | 
 |     FieldVariable(Type* clazz, const string& name); | 
 |     virtual ~FieldVariable(); | 
 |  | 
 |     void Write(FILE* to); | 
 | }; | 
 |  | 
 | struct Field : public ClassElement | 
 | { | 
 |     string comment; | 
 |     int modifiers; | 
 |     Variable *variable; | 
 |     string value; | 
 |  | 
 |     Field(); | 
 |     Field(int modifiers, Variable* variable); | 
 |     virtual ~Field(); | 
 |  | 
 |     virtual void GatherTypes(set<Type*>* types) const; | 
 |     virtual void Write(FILE* to); | 
 | }; | 
 |  | 
 | struct Statement | 
 | { | 
 |     virtual ~Statement(); | 
 |     virtual void Write(FILE* to) = 0; | 
 | }; | 
 |  | 
 | struct StatementBlock : public Statement | 
 | { | 
 |     vector<Statement*> statements; | 
 |  | 
 |     StatementBlock(); | 
 |     virtual ~StatementBlock(); | 
 |     virtual void Write(FILE* to); | 
 |  | 
 |     void Add(Statement* statement); | 
 |     void Add(Expression* expression); | 
 | }; | 
 |  | 
 | struct ExpressionStatement : public Statement | 
 | { | 
 |     Expression* expression; | 
 |  | 
 |     ExpressionStatement(Expression* expression); | 
 |     virtual ~ExpressionStatement(); | 
 |     virtual void Write(FILE* to); | 
 | }; | 
 |  | 
 | struct Assignment : public Expression | 
 | { | 
 |     Variable* lvalue; | 
 |     Expression* rvalue; | 
 |     Type* cast; | 
 |  | 
 |     Assignment(Variable* lvalue, Expression* rvalue); | 
 |     Assignment(Variable* lvalue, Expression* rvalue, Type* cast); | 
 |     virtual ~Assignment(); | 
 |     virtual void Write(FILE* to); | 
 | }; | 
 |  | 
 | struct MethodCall : public Expression | 
 | { | 
 |     Expression* obj; | 
 |     Type* clazz; | 
 |     string name; | 
 |     vector<Expression*> arguments; | 
 |     vector<string> exceptions; | 
 |  | 
 |     MethodCall(const string& name); | 
 |     MethodCall(const string& name, int argc, ...); | 
 |     MethodCall(Expression* obj, const string& name); | 
 |     MethodCall(Type* clazz, const string& name); | 
 |     MethodCall(Expression* obj, const string& name, int argc, ...); | 
 |     MethodCall(Type* clazz, const string& name, int argc, ...); | 
 |     virtual ~MethodCall(); | 
 |     virtual void Write(FILE* to); | 
 |  | 
 | private: | 
 |     void init(int n, va_list args); | 
 | }; | 
 |  | 
 | struct Comparison : public Expression | 
 | { | 
 |     Expression* lvalue; | 
 |     string op; | 
 |     Expression* rvalue; | 
 |  | 
 |     Comparison(Expression* lvalue, const string& op, Expression* rvalue); | 
 |     virtual ~Comparison(); | 
 |     virtual void Write(FILE* to); | 
 | }; | 
 |  | 
 | struct NewExpression : public Expression | 
 | { | 
 |     Type* type; | 
 |     vector<Expression*> arguments; | 
 |  | 
 |     NewExpression(Type* type); | 
 |     NewExpression(Type* type, int argc, ...); | 
 |     virtual ~NewExpression(); | 
 |     virtual void Write(FILE* to); | 
 |  | 
 | private: | 
 |     void init(int n, va_list args); | 
 | }; | 
 |  | 
 | struct NewArrayExpression : public Expression | 
 | { | 
 |     Type* type; | 
 |     Expression* size; | 
 |  | 
 |     NewArrayExpression(Type* type, Expression* size); | 
 |     virtual ~NewArrayExpression(); | 
 |     virtual void Write(FILE* to); | 
 | }; | 
 |  | 
 | struct Ternary : public Expression | 
 | { | 
 |     Expression* condition; | 
 |     Expression* ifpart; | 
 |     Expression* elsepart; | 
 |  | 
 |     Ternary(); | 
 |     Ternary(Expression* condition, Expression* ifpart, Expression* elsepart); | 
 |     virtual ~Ternary(); | 
 |     virtual void Write(FILE* to); | 
 | }; | 
 |  | 
 | struct Cast : public Expression | 
 | { | 
 |     Type* type; | 
 |     Expression* expression; | 
 |  | 
 |     Cast(); | 
 |     Cast(Type* type, Expression* expression); | 
 |     virtual ~Cast(); | 
 |     virtual void Write(FILE* to); | 
 | }; | 
 |  | 
 | struct VariableDeclaration : public Statement | 
 | { | 
 |     Variable* lvalue; | 
 |     Type* cast; | 
 |     Expression* rvalue; | 
 |  | 
 |     VariableDeclaration(Variable* lvalue); | 
 |     VariableDeclaration(Variable* lvalue, Expression* rvalue, Type* cast = NULL); | 
 |     virtual ~VariableDeclaration(); | 
 |     virtual void Write(FILE* to); | 
 | }; | 
 |  | 
 | struct IfStatement : public Statement | 
 | { | 
 |     Expression* expression; | 
 |     StatementBlock* statements; | 
 |     IfStatement* elseif; | 
 |  | 
 |     IfStatement(); | 
 |     virtual ~IfStatement(); | 
 |     virtual void Write(FILE* to); | 
 | }; | 
 |  | 
 | struct ReturnStatement : public Statement | 
 | { | 
 |     Expression* expression; | 
 |  | 
 |     ReturnStatement(Expression* expression); | 
 |     virtual ~ReturnStatement(); | 
 |     virtual void Write(FILE* to); | 
 | }; | 
 |  | 
 | struct TryStatement : public Statement | 
 | { | 
 |     StatementBlock* statements; | 
 |  | 
 |     TryStatement(); | 
 |     virtual ~TryStatement(); | 
 |     virtual void Write(FILE* to); | 
 | }; | 
 |  | 
 | struct CatchStatement : public Statement | 
 | { | 
 |     StatementBlock* statements; | 
 |     Variable* exception; | 
 |  | 
 |     CatchStatement(Variable* exception); | 
 |     virtual ~CatchStatement(); | 
 |     virtual void Write(FILE* to); | 
 | }; | 
 |  | 
 | struct FinallyStatement : public Statement | 
 | { | 
 |     StatementBlock* statements; | 
 |  | 
 |     FinallyStatement(); | 
 |     virtual ~FinallyStatement(); | 
 |     virtual void Write(FILE* to); | 
 | }; | 
 |  | 
 | struct Case | 
 | { | 
 |     vector<string> cases; | 
 |     StatementBlock* statements; | 
 |  | 
 |     Case(); | 
 |     Case(const string& c); | 
 |     virtual ~Case(); | 
 |     virtual void Write(FILE* to); | 
 | }; | 
 |  | 
 | struct SwitchStatement : public Statement | 
 | { | 
 |     Expression* expression; | 
 |     vector<Case*> cases; | 
 |  | 
 |     SwitchStatement(Expression* expression); | 
 |     virtual ~SwitchStatement(); | 
 |     virtual void Write(FILE* to); | 
 | }; | 
 |  | 
 | struct Break : public Statement | 
 | { | 
 |     Break(); | 
 |     virtual ~Break(); | 
 |     virtual void Write(FILE* to); | 
 | }; | 
 |  | 
 | struct Method : public ClassElement | 
 | { | 
 |     string comment; | 
 |     int modifiers; | 
 |     Type* returnType; | 
 |     size_t returnTypeDimension; | 
 |     string name; | 
 |     vector<Variable*> parameters; | 
 |     vector<Type*> exceptions; | 
 |     StatementBlock* statements; | 
 |  | 
 |     Method(); | 
 |     virtual ~Method(); | 
 |  | 
 |     virtual void GatherTypes(set<Type*>* types) const; | 
 |     virtual void Write(FILE* to); | 
 | }; | 
 |  | 
 | struct Class : public ClassElement | 
 | { | 
 |     enum { | 
 |         CLASS, | 
 |         INTERFACE | 
 |     }; | 
 |  | 
 |     string comment; | 
 |     int modifiers; | 
 |     int what;               // CLASS or INTERFACE | 
 |     Type* type; | 
 |     Type* extends; | 
 |     vector<Type*> interfaces; | 
 |     vector<ClassElement*> elements; | 
 |  | 
 |     Class(); | 
 |     virtual ~Class(); | 
 |  | 
 |     virtual void GatherTypes(set<Type*>* types) const; | 
 |     virtual void Write(FILE* to); | 
 | }; | 
 |  | 
 | struct Document | 
 | { | 
 |     string comment; | 
 |     string package; | 
 |     string originalSrc; | 
 |     set<Type*> imports; | 
 |     vector<Class*> classes; | 
 |  | 
 |     Document(); | 
 |     virtual ~Document(); | 
 |  | 
 |     virtual void Write(FILE* to); | 
 | }; | 
 |  | 
 | #endif // AIDL_AST_H |