| #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 |