Home | History | Annotate | Download | only in aidl
      1 #ifndef AIDL_AST_H
      2 #define AIDL_AST_H
      3 
      4 #include <string>
      5 #include <vector>
      6 #include <set>
      7 #include <stdarg.h>
      8 #include <stdio.h>
      9 
     10 using namespace std;
     11 
     12 class Type;
     13 
     14 enum {
     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 
     25     OVERRIDE        = 0x00000100,
     26 
     27     ALL_MODIFIERS   = 0xffffffff
     28 };
     29 
     30 // Write the modifiers that are set in both mod and mask
     31 void WriteModifiers(FILE* to, int mod, int mask);
     32 
     33 struct 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 
     42 struct Expression
     43 {
     44     virtual ~Expression();
     45     virtual void Write(FILE* to) = 0;
     46 };
     47 
     48 struct LiteralExpression : public Expression
     49 {
     50     string value;
     51 
     52     LiteralExpression(const string& value);
     53     virtual ~LiteralExpression();
     54     virtual void Write(FILE* to);
     55 };
     56 
     57 // TODO: also escape the contents.  not needed for now
     58 struct StringLiteralExpression : public Expression
     59 {
     60     string value;
     61 
     62     StringLiteralExpression(const string& value);
     63     virtual ~StringLiteralExpression();
     64     virtual void Write(FILE* to);
     65 };
     66 
     67 struct 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 
     83 struct 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 
     96 struct 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 
    111 struct Statement
    112 {
    113     virtual ~Statement();
    114     virtual void Write(FILE* to) = 0;
    115 };
    116 
    117 struct StatementBlock : public Statement
    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 
    129 struct ExpressionStatement : public Statement
    130 {
    131     Expression* expression;
    132 
    133     ExpressionStatement(Expression* expression);
    134     virtual ~ExpressionStatement();
    135     virtual void Write(FILE* to);
    136 };
    137 
    138 struct 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 
    150 struct 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);
    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);
    166 
    167 private:
    168     void init(int n, va_list args);
    169 };
    170 
    171 struct 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 
    182 struct NewExpression : public Expression
    183 {
    184     Type* type;
    185     vector<Expression*> arguments;
    186 
    187     NewExpression(Type* type);
    188     NewExpression(Type* type, int argc, ...);
    189     virtual ~NewExpression();
    190     virtual void Write(FILE* to);
    191 
    192 private:
    193     void init(int n, va_list args);
    194 };
    195 
    196 struct 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 
    206 struct 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 
    218 struct 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 
    229 struct 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 
    241 struct 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 
    252 struct ReturnStatement : public Statement
    253 {
    254     Expression* expression;
    255 
    256     ReturnStatement(Expression* expression);
    257     virtual ~ReturnStatement();
    258     virtual void Write(FILE* to);
    259 };
    260 
    261 struct TryStatement : public Statement
    262 {
    263     StatementBlock* statements;
    264 
    265     TryStatement();
    266     virtual ~TryStatement();
    267     virtual void Write(FILE* to);
    268 };
    269 
    270 struct 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 
    280 struct FinallyStatement : public Statement
    281 {
    282     StatementBlock* statements;
    283 
    284     FinallyStatement();
    285     virtual ~FinallyStatement();
    286     virtual void Write(FILE* to);
    287 };
    288 
    289 struct 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 
    300 struct 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 
    310 struct Break : public Statement
    311 {
    312     Break();
    313     virtual ~Break();
    314     virtual void Write(FILE* to);
    315 };
    316 
    317 struct Method : public ClassElement
    318 {
    319     string comment;
    320     int modifiers;
    321     Type* returnType;
    322     size_t returnTypeDimension;
    323     string name;
    324     vector<Variable*> parameters;
    325     vector<Type*> exceptions;
    326     StatementBlock* statements;
    327 
    328     Method();
    329     virtual ~Method();
    330 
    331     virtual void GatherTypes(set<Type*>* types) const;
    332     virtual void Write(FILE* to);
    333 };
    334 
    335 struct Class : public ClassElement
    336 {
    337     enum {
    338         CLASS,
    339         INTERFACE
    340     };
    341 
    342     string comment;
    343     int modifiers;
    344     int what;               // CLASS or INTERFACE
    345     Type* type;
    346     Type* extends;
    347     vector<Type*> interfaces;
    348     vector<ClassElement*> elements;
    349 
    350     Class();
    351     virtual ~Class();
    352 
    353     virtual void GatherTypes(set<Type*>* types) const;
    354     virtual void Write(FILE* to);
    355 };
    356 
    357 struct Document
    358 {
    359     string comment;
    360     string package;
    361     string originalSrc;
    362     set<Type*> imports;
    363     vector<Class*> classes;
    364 
    365     Document();
    366     virtual ~Document();
    367 
    368     virtual void Write(FILE* to);
    369 };
    370 
    371 #endif // AIDL_AST_H
    372