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