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 struct Variable : public Expression
     58 {
     59     Type* type;
     60     string name;
     61     int dimension;
     62 
     63     Variable();
     64     Variable(Type* type, const string& name);
     65     Variable(Type* type, const string& name, int dimension);
     66     virtual ~Variable();
     67 
     68     virtual void GatherTypes(set<Type*>* types) const;
     69     void WriteDeclaration(FILE* to);
     70     void Write(FILE* to);
     71 };
     72 
     73 struct FieldVariable : public Expression
     74 {
     75     Expression* object;
     76     Type* clazz;
     77     string name;
     78 
     79     FieldVariable(Expression* object, const string& name);
     80     FieldVariable(Type* clazz, const string& name);
     81     virtual ~FieldVariable();
     82 
     83     void Write(FILE* to);
     84 };
     85 
     86 struct Field : public ClassElement
     87 {
     88     string comment;
     89     int modifiers;
     90     Variable *variable;
     91     string value;
     92 
     93     Field();
     94     Field(int modifiers, Variable* variable);
     95     virtual ~Field();
     96 
     97     virtual void GatherTypes(set<Type*>* types) const;
     98     virtual void Write(FILE* to);
     99 };
    100 
    101 struct Statement
    102 {
    103     virtual ~Statement();
    104     virtual void Write(FILE* to) = 0;
    105 };
    106 
    107 struct StatementBlock
    108 {
    109     vector<Statement*> statements;
    110 
    111     StatementBlock();
    112     virtual ~StatementBlock();
    113     virtual void Write(FILE* to);
    114 
    115     void Add(Statement* statement);
    116     void Add(Expression* expression);
    117 };
    118 
    119 struct ExpressionStatement : public Statement
    120 {
    121     Expression* expression;
    122 
    123     ExpressionStatement(Expression* expression);
    124     virtual ~ExpressionStatement();
    125     virtual void Write(FILE* to);
    126 };
    127 
    128 struct Assignment : public Expression
    129 {
    130     Variable* lvalue;
    131     Expression* rvalue;
    132     Type* cast;
    133 
    134     Assignment(Variable* lvalue, Expression* rvalue);
    135     Assignment(Variable* lvalue, Expression* rvalue, Type* cast);
    136     virtual ~Assignment();
    137     virtual void Write(FILE* to);
    138 };
    139 
    140 struct MethodCall : public Expression
    141 {
    142     Expression* obj;
    143     Type* clazz;
    144     string name;
    145     vector<Expression*> arguments;
    146     vector<string> exceptions;
    147 
    148     MethodCall(const string& name);
    149     MethodCall(Expression* obj, const string& name);
    150     MethodCall(Type* clazz, const string& name);
    151     MethodCall(Expression* obj, const string& name, int argc, ...);
    152     MethodCall(Type* clazz, const string& name, int argc, ...);
    153     virtual ~MethodCall();
    154     virtual void Write(FILE* to);
    155 
    156 private:
    157     void init(int n, va_list args);
    158 };
    159 
    160 struct Comparison : public Expression
    161 {
    162     Expression* lvalue;
    163     string op;
    164     Expression* rvalue;
    165 
    166     Comparison(Expression* lvalue, const string& op, Expression* rvalue);
    167     virtual ~Comparison();
    168     virtual void Write(FILE* to);
    169 };
    170 
    171 struct NewExpression : public Expression
    172 {
    173     Type* type;
    174     vector<Expression*> arguments;
    175 
    176     NewExpression(Type* type);
    177     virtual ~NewExpression();
    178     virtual void Write(FILE* to);
    179 };
    180 
    181 struct NewArrayExpression : public Expression
    182 {
    183     Type* type;
    184     Expression* size;
    185 
    186     NewArrayExpression(Type* type, Expression* size);
    187     virtual ~NewArrayExpression();
    188     virtual void Write(FILE* to);
    189 };
    190 
    191 struct Ternary : public Expression
    192 {
    193     Expression* condition;
    194     Expression* ifpart;
    195     Expression* elsepart;
    196 
    197     Ternary();
    198     Ternary(Expression* condition, Expression* ifpart, Expression* elsepart);
    199     virtual ~Ternary();
    200     virtual void Write(FILE* to);
    201 };
    202 
    203 struct Cast : public Expression
    204 {
    205     Type* type;
    206     Expression* expression;
    207 
    208     Cast();
    209     Cast(Type* type, Expression* expression);
    210     virtual ~Cast();
    211     virtual void Write(FILE* to);
    212 };
    213 
    214 struct VariableDeclaration : public Statement
    215 {
    216     Variable* lvalue;
    217     Type* cast;
    218     Expression* rvalue;
    219 
    220     VariableDeclaration(Variable* lvalue);
    221     VariableDeclaration(Variable* lvalue, Expression* rvalue, Type* cast = NULL);
    222     virtual ~VariableDeclaration();
    223     virtual void Write(FILE* to);
    224 };
    225 
    226 struct IfStatement : public Statement
    227 {
    228     Expression* expression;
    229     StatementBlock* statements;
    230     IfStatement* elseif;
    231 
    232     IfStatement();
    233     virtual ~IfStatement();
    234     virtual void Write(FILE* to);
    235 };
    236 
    237 struct ReturnStatement : public Statement
    238 {
    239     Expression* expression;
    240 
    241     ReturnStatement(Expression* expression);
    242     virtual ~ReturnStatement();
    243     virtual void Write(FILE* to);
    244 };
    245 
    246 struct TryStatement : public Statement
    247 {
    248     StatementBlock* statements;
    249 
    250     TryStatement();
    251     virtual ~TryStatement();
    252     virtual void Write(FILE* to);
    253 };
    254 
    255 struct CatchStatement : public Statement
    256 {
    257     StatementBlock* statements;
    258     Variable* exception;
    259 
    260     CatchStatement(Variable* exception);
    261     virtual ~CatchStatement();
    262     virtual void Write(FILE* to);
    263 };
    264 
    265 struct FinallyStatement : public Statement
    266 {
    267     StatementBlock* statements;
    268 
    269     FinallyStatement();
    270     virtual ~FinallyStatement();
    271     virtual void Write(FILE* to);
    272 };
    273 
    274 struct Case
    275 {
    276     vector<string> cases;
    277     StatementBlock* statements;
    278 
    279     Case();
    280     Case(const string& c);
    281     virtual ~Case();
    282     virtual void Write(FILE* to);
    283 };
    284 
    285 struct SwitchStatement : public Statement
    286 {
    287     Expression* expression;
    288     vector<Case*> cases;
    289 
    290     SwitchStatement(Expression* expression);
    291     virtual ~SwitchStatement();
    292     virtual void Write(FILE* to);
    293 };
    294 
    295 struct Method : public ClassElement
    296 {
    297     string comment;
    298     int modifiers;
    299     Type* returnType;
    300     size_t returnTypeDimension;
    301     string name;
    302     vector<Variable*> parameters;
    303     vector<Type*> exceptions;
    304     StatementBlock* statements;
    305 
    306     Method();
    307     virtual ~Method();
    308 
    309     virtual void GatherTypes(set<Type*>* types) const;
    310     virtual void Write(FILE* to);
    311 };
    312 
    313 struct Class : public ClassElement
    314 {
    315     enum {
    316         CLASS,
    317         INTERFACE
    318     };
    319 
    320     string comment;
    321     int modifiers;
    322     int what;               // CLASS or INTERFACE
    323     Type* type;
    324     Type* extends;
    325     vector<Type*> interfaces;
    326     vector<ClassElement*> elements;
    327 
    328     Class();
    329     virtual ~Class();
    330 
    331     virtual void GatherTypes(set<Type*>* types) const;
    332     virtual void Write(FILE* to);
    333 };
    334 
    335 struct Document
    336 {
    337     string comment;
    338     string package;
    339     string originalSrc;
    340     set<Type*> imports;
    341     vector<Class*> classes;
    342 
    343     Document();
    344     virtual ~Document();
    345 
    346     virtual void Write(FILE* to);
    347 };
    348 
    349 #endif // AIDL_AST_H
    350