1038485e9c8a4d7c0d47720e5bb1b1086b7550de7Christopher Wiley/* 2038485e9c8a4d7c0d47720e5bb1b1086b7550de7Christopher Wiley * Copyright (C) 2015, The Android Open Source Project 3038485e9c8a4d7c0d47720e5bb1b1086b7550de7Christopher Wiley * 4038485e9c8a4d7c0d47720e5bb1b1086b7550de7Christopher Wiley * Licensed under the Apache License, Version 2.0 (the "License"); 5038485e9c8a4d7c0d47720e5bb1b1086b7550de7Christopher Wiley * you may not use this file except in compliance with the License. 6038485e9c8a4d7c0d47720e5bb1b1086b7550de7Christopher Wiley * You may obtain a copy of the License at 7038485e9c8a4d7c0d47720e5bb1b1086b7550de7Christopher Wiley * 8038485e9c8a4d7c0d47720e5bb1b1086b7550de7Christopher Wiley * http://www.apache.org/licenses/LICENSE-2.0 9038485e9c8a4d7c0d47720e5bb1b1086b7550de7Christopher Wiley * 10038485e9c8a4d7c0d47720e5bb1b1086b7550de7Christopher Wiley * Unless required by applicable law or agreed to in writing, software 11038485e9c8a4d7c0d47720e5bb1b1086b7550de7Christopher Wiley * distributed under the License is distributed on an "AS IS" BASIS, 12038485e9c8a4d7c0d47720e5bb1b1086b7550de7Christopher Wiley * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13038485e9c8a4d7c0d47720e5bb1b1086b7550de7Christopher Wiley * See the License for the specific language governing permissions and 14038485e9c8a4d7c0d47720e5bb1b1086b7550de7Christopher Wiley * limitations under the License. 15038485e9c8a4d7c0d47720e5bb1b1086b7550de7Christopher Wiley */ 16038485e9c8a4d7c0d47720e5bb1b1086b7550de7Christopher Wiley 17038485e9c8a4d7c0d47720e5bb1b1086b7550de7Christopher Wiley#ifndef AIDL_AST_JAVA_H_ 18038485e9c8a4d7c0d47720e5bb1b1086b7550de7Christopher Wiley#define AIDL_AST_JAVA_H_ 19ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski 20f76b59aeac2ce35e954c15c676e9102777ec8faaChristopher Wiley#include <memory> 21ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski#include <stdarg.h> 22ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski#include <stdio.h> 23ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley#include <string> 24ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley#include <vector> 25ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski 26ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinskienum { 27ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley PACKAGE_PRIVATE = 0x00000000, 28ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley PUBLIC = 0x00000001, 29ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley PRIVATE = 0x00000002, 30ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley PROTECTED = 0x00000003, 31ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley SCOPE_MASK = 0x00000003, 32ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski 33ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley STATIC = 0x00000010, 34ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley FINAL = 0x00000020, 35ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley ABSTRACT = 0x00000040, 36ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski 37ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley OVERRIDE = 0x00000100, 38ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski 39ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley ALL_MODIFIERS = 0xffffffff 40ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski}; 41ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski 42fdeb0f4b96b6c39b1b9ed3358634f180f9e6df06Christopher Wileynamespace android { 43fdeb0f4b96b6c39b1b9ed3358634f180f9e6df06Christopher Wileynamespace aidl { 44fdeb0f4b96b6c39b1b9ed3358634f180f9e6df06Christopher Wileyclass CodeWriter; 45db154a5f543ff697248df649a14f2ac4a70cbf0eChristopher Wiley} // namespace aidl 46db154a5f543ff697248df649a14f2ac4a70cbf0eChristopher Wiley} // namespace android 47db154a5f543ff697248df649a14f2ac4a70cbf0eChristopher Wiley 48db154a5f543ff697248df649a14f2ac4a70cbf0eChristopher Wileynamespace android { 49db154a5f543ff697248df649a14f2ac4a70cbf0eChristopher Wileynamespace aidl { 50db154a5f543ff697248df649a14f2ac4a70cbf0eChristopher Wileynamespace java { 51db154a5f543ff697248df649a14f2ac4a70cbf0eChristopher Wiley 52fdeb0f4b96b6c39b1b9ed3358634f180f9e6df06Christopher Wileyclass Type; 53fdeb0f4b96b6c39b1b9ed3358634f180f9e6df06Christopher Wiley 54ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski// Write the modifiers that are set in both mod and mask 55fdeb0f4b96b6c39b1b9ed3358634f180f9e6df06Christopher Wileyvoid WriteModifiers(CodeWriter* to, int mod, int mask); 56ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski 57ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wileystruct ClassElement { 58ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley ClassElement() = default; 59ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley virtual ~ClassElement() = default; 60ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski 61ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley virtual void Write(CodeWriter* to) const = 0; 62ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski}; 63ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski 64ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wileystruct Expression { 65ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley virtual ~Expression() = default; 66ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley virtual void Write(CodeWriter* to) const = 0; 67ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski}; 68ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski 69ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wileystruct LiteralExpression : public Expression { 7012e894a3b69f045f104a9026765ecbc60ec5967eChristopher Wiley std::string value; 71ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski 72156a57fef28ecb6943a85c3c39e4cf5306261397Chih-Hung Hsieh explicit LiteralExpression(const std::string& value); 73ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley virtual ~LiteralExpression() = default; 74ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley void Write(CodeWriter* to) const override; 75ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski}; 76ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski 77ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski// TODO: also escape the contents. not needed for now 78ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wileystruct StringLiteralExpression : public Expression { 7912e894a3b69f045f104a9026765ecbc60ec5967eChristopher Wiley std::string value; 80ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski 81156a57fef28ecb6943a85c3c39e4cf5306261397Chih-Hung Hsieh explicit StringLiteralExpression(const std::string& value); 82ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley virtual ~StringLiteralExpression() = default; 83ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley void Write(CodeWriter* to) const override; 84ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski}; 85ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski 86ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wileystruct Variable : public Expression { 87ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley const Type* type = nullptr; 8812e894a3b69f045f104a9026765ecbc60ec5967eChristopher Wiley std::string name; 89ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley int dimension = 0; 90ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski 91ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley Variable() = default; 9212e894a3b69f045f104a9026765ecbc60ec5967eChristopher Wiley Variable(const Type* type, const std::string& name); 9312e894a3b69f045f104a9026765ecbc60ec5967eChristopher Wiley Variable(const Type* type, const std::string& name, int dimension); 94ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley virtual ~Variable() = default; 95ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski 96ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley void WriteDeclaration(CodeWriter* to) const; 97ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley void Write(CodeWriter* to) const; 98ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski}; 99ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski 100ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wileystruct FieldVariable : public Expression { 101ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley Expression* object; 102ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley const Type* clazz; 10312e894a3b69f045f104a9026765ecbc60ec5967eChristopher Wiley std::string name; 104ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski 10512e894a3b69f045f104a9026765ecbc60ec5967eChristopher Wiley FieldVariable(Expression* object, const std::string& name); 10612e894a3b69f045f104a9026765ecbc60ec5967eChristopher Wiley FieldVariable(const Type* clazz, const std::string& name); 107ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley virtual ~FieldVariable() = default; 108ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski 109ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley void Write(CodeWriter* to) const; 110ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski}; 111ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski 112ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wileystruct Field : public ClassElement { 11312e894a3b69f045f104a9026765ecbc60ec5967eChristopher Wiley std::string comment; 114ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley int modifiers = 0; 115ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley Variable* variable = nullptr; 11612e894a3b69f045f104a9026765ecbc60ec5967eChristopher Wiley std::string value; 117ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski 118ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley Field() = default; 119ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley Field(int modifiers, Variable* variable); 120ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley virtual ~Field() = default; 121ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski 122ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley void Write(CodeWriter* to) const override; 123ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski}; 124ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski 125ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wileystruct Statement { 126ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley virtual ~Statement() = default; 127ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley virtual void Write(CodeWriter* to) const = 0; 128ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski}; 129ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski 130ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wileystruct StatementBlock : public Statement { 13112e894a3b69f045f104a9026765ecbc60ec5967eChristopher Wiley std::vector<Statement*> statements; 132ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski 133ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley StatementBlock() = default; 134ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley virtual ~StatementBlock() = default; 135ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley void Write(CodeWriter* to) const override; 136ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski 137ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley void Add(Statement* statement); 138ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley void Add(Expression* expression); 139ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski}; 140ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski 141ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wileystruct ExpressionStatement : public Statement { 142ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley Expression* expression; 143ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski 144156a57fef28ecb6943a85c3c39e4cf5306261397Chih-Hung Hsieh explicit ExpressionStatement(Expression* expression); 145ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley virtual ~ExpressionStatement() = default; 146ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley void Write(CodeWriter* to) const override; 147ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski}; 148ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski 149ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wileystruct Assignment : public Expression { 150ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley Variable* lvalue; 151ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley Expression* rvalue; 152ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley const Type* cast; 153ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski 154ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley Assignment(Variable* lvalue, Expression* rvalue); 155ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley Assignment(Variable* lvalue, Expression* rvalue, const Type* cast); 156ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley virtual ~Assignment() = default; 157ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley void Write(CodeWriter* to) const override; 158ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski}; 159ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski 160ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wileystruct MethodCall : public Expression { 161ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley Expression* obj = nullptr; 162ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley const Type* clazz = nullptr; 16312e894a3b69f045f104a9026765ecbc60ec5967eChristopher Wiley std::string name; 16412e894a3b69f045f104a9026765ecbc60ec5967eChristopher Wiley std::vector<Expression*> arguments; 16512e894a3b69f045f104a9026765ecbc60ec5967eChristopher Wiley std::vector<std::string> exceptions; 16612e894a3b69f045f104a9026765ecbc60ec5967eChristopher Wiley 167156a57fef28ecb6943a85c3c39e4cf5306261397Chih-Hung Hsieh explicit MethodCall(const std::string& name); 16812e894a3b69f045f104a9026765ecbc60ec5967eChristopher Wiley MethodCall(const std::string& name, int argc, ...); 16912e894a3b69f045f104a9026765ecbc60ec5967eChristopher Wiley MethodCall(Expression* obj, const std::string& name); 17012e894a3b69f045f104a9026765ecbc60ec5967eChristopher Wiley MethodCall(const Type* clazz, const std::string& name); 17112e894a3b69f045f104a9026765ecbc60ec5967eChristopher Wiley MethodCall(Expression* obj, const std::string& name, int argc, ...); 17212e894a3b69f045f104a9026765ecbc60ec5967eChristopher Wiley MethodCall(const Type* clazz, const std::string& name, int argc, ...); 173ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley virtual ~MethodCall() = default; 174ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley void Write(CodeWriter* to) const override; 175ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley 176ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley private: 177ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley void init(int n, va_list args); 178ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski}; 179ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski 180ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wileystruct Comparison : public Expression { 181ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley Expression* lvalue; 18212e894a3b69f045f104a9026765ecbc60ec5967eChristopher Wiley std::string op; 183ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley Expression* rvalue; 184ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski 18512e894a3b69f045f104a9026765ecbc60ec5967eChristopher Wiley Comparison(Expression* lvalue, const std::string& op, Expression* rvalue); 186ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley virtual ~Comparison() = default; 187ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley void Write(CodeWriter* to) const override; 188ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski}; 189ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski 190ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wileystruct NewExpression : public Expression { 191ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley const Type* type; 19212e894a3b69f045f104a9026765ecbc60ec5967eChristopher Wiley std::vector<Expression*> arguments; 193ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski 194156a57fef28ecb6943a85c3c39e4cf5306261397Chih-Hung Hsieh explicit NewExpression(const Type* type); 195ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley NewExpression(const Type* type, int argc, ...); 196ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley virtual ~NewExpression() = default; 197ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley void Write(CodeWriter* to) const override; 198ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski 199ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley private: 200ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley void init(int n, va_list args); 201ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski}; 202ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski 203ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wileystruct NewArrayExpression : public Expression { 204ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley const Type* type; 205ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley Expression* size; 206ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski 207ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley NewArrayExpression(const Type* type, Expression* size); 208ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley virtual ~NewArrayExpression() = default; 209ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley void Write(CodeWriter* to) const override; 210ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski}; 211ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski 212ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wileystruct Ternary : public Expression { 213ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley Expression* condition = nullptr; 214ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley Expression* ifpart = nullptr; 215ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley Expression* elsepart = nullptr; 216ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski 217ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley Ternary() = default; 218ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley Ternary(Expression* condition, Expression* ifpart, Expression* elsepart); 219ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley virtual ~Ternary() = default; 220ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley void Write(CodeWriter* to) const override; 221ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski}; 222ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski 223ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wileystruct Cast : public Expression { 224ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley const Type* type = nullptr; 225ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley Expression* expression = nullptr; 226ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski 227ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley Cast() = default; 228ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley Cast(const Type* type, Expression* expression); 229ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley virtual ~Cast() = default; 230ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley void Write(CodeWriter* to) const override; 231ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski}; 232ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski 233ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wileystruct VariableDeclaration : public Statement { 234ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley Variable* lvalue = nullptr; 235ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley const Type* cast = nullptr; 236ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley Expression* rvalue = nullptr; 237ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski 238156a57fef28ecb6943a85c3c39e4cf5306261397Chih-Hung Hsieh explicit VariableDeclaration(Variable* lvalue); 239ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley VariableDeclaration(Variable* lvalue, Expression* rvalue, 240ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley const Type* cast = NULL); 241ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley virtual ~VariableDeclaration() = default; 242ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley void Write(CodeWriter* to) const override; 243ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski}; 244ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski 245ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wileystruct IfStatement : public Statement { 246ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley Expression* expression = nullptr; 247ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley StatementBlock* statements = new StatementBlock; 248ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley IfStatement* elseif = nullptr; 249ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski 250ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley IfStatement() = default; 251ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley virtual ~IfStatement() = default; 252ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley void Write(CodeWriter* to) const override; 253ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski}; 254ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski 255ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wileystruct ReturnStatement : public Statement { 256ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley Expression* expression; 257ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski 258156a57fef28ecb6943a85c3c39e4cf5306261397Chih-Hung Hsieh explicit ReturnStatement(Expression* expression); 259ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley virtual ~ReturnStatement() = default; 260ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley void Write(CodeWriter* to) const override; 261ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski}; 262ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski 263ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wileystruct TryStatement : public Statement { 264ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley StatementBlock* statements = new StatementBlock; 265ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski 266ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley TryStatement() = default; 267ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley virtual ~TryStatement() = default; 268ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley void Write(CodeWriter* to) const override; 269ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski}; 270ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski 271ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wileystruct CatchStatement : public Statement { 272ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley StatementBlock* statements; 273ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley Variable* exception; 274ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski 275156a57fef28ecb6943a85c3c39e4cf5306261397Chih-Hung Hsieh explicit CatchStatement(Variable* exception); 276ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley virtual ~CatchStatement() = default; 277ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley void Write(CodeWriter* to) const override; 278ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski}; 279ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski 280ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wileystruct FinallyStatement : public Statement { 281ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley StatementBlock* statements = new StatementBlock; 282ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski 283ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley FinallyStatement() = default; 284ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley virtual ~FinallyStatement() = default; 285ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley void Write(CodeWriter* to) const override; 286ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski}; 287ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski 288ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wileystruct Case { 28912e894a3b69f045f104a9026765ecbc60ec5967eChristopher Wiley std::vector<std::string> cases; 290ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley StatementBlock* statements = new StatementBlock; 291ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski 292ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley Case() = default; 293156a57fef28ecb6943a85c3c39e4cf5306261397Chih-Hung Hsieh explicit Case(const std::string& c); 294ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley virtual ~Case() = default; 295ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley virtual void Write(CodeWriter* to) const; 296ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski}; 297ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski 298ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wileystruct SwitchStatement : public Statement { 299ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley Expression* expression; 30012e894a3b69f045f104a9026765ecbc60ec5967eChristopher Wiley std::vector<Case*> cases; 301ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski 302156a57fef28ecb6943a85c3c39e4cf5306261397Chih-Hung Hsieh explicit SwitchStatement(Expression* expression); 303ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley virtual ~SwitchStatement() = default; 304ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley void Write(CodeWriter* to) const override; 305ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski}; 306ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski 307ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wileystruct Break : public Statement { 308ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley Break() = default; 309ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley virtual ~Break() = default; 310ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley void Write(CodeWriter* to) const override; 311ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski}; 312ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski 313ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wileystruct Method : public ClassElement { 31412e894a3b69f045f104a9026765ecbc60ec5967eChristopher Wiley std::string comment; 315ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley int modifiers = 0; 316ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley const Type* returnType = nullptr; // nullptr means constructor 317ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley size_t returnTypeDimension = 0; 31812e894a3b69f045f104a9026765ecbc60ec5967eChristopher Wiley std::string name; 31912e894a3b69f045f104a9026765ecbc60ec5967eChristopher Wiley std::vector<Variable*> parameters; 32012e894a3b69f045f104a9026765ecbc60ec5967eChristopher Wiley std::vector<const Type*> exceptions; 321ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley StatementBlock* statements = nullptr; 322ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley 323ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley Method() = default; 324ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley virtual ~Method() = default; 325ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley 326ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley void Write(CodeWriter* to) const override; 327ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski}; 328ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski 32969b44cf003bd5bda9dcd97a6fe872630c1b2818fChristopher Wileystruct IntConstant : public ClassElement { 33069b44cf003bd5bda9dcd97a6fe872630c1b2818fChristopher Wiley const std::string name; 33169b44cf003bd5bda9dcd97a6fe872630c1b2818fChristopher Wiley const int value; 33269b44cf003bd5bda9dcd97a6fe872630c1b2818fChristopher Wiley 33369b44cf003bd5bda9dcd97a6fe872630c1b2818fChristopher Wiley IntConstant(std::string name, int value) 33469b44cf003bd5bda9dcd97a6fe872630c1b2818fChristopher Wiley : name(name), value(value) {} 33569b44cf003bd5bda9dcd97a6fe872630c1b2818fChristopher Wiley virtual ~IntConstant() = default; 33669b44cf003bd5bda9dcd97a6fe872630c1b2818fChristopher Wiley 33769b44cf003bd5bda9dcd97a6fe872630c1b2818fChristopher Wiley void Write(CodeWriter* to) const override; 33869b44cf003bd5bda9dcd97a6fe872630c1b2818fChristopher Wiley}; 33969b44cf003bd5bda9dcd97a6fe872630c1b2818fChristopher Wiley 34069b44cf003bd5bda9dcd97a6fe872630c1b2818fChristopher Wileystruct StringConstant : public ClassElement { 34169b44cf003bd5bda9dcd97a6fe872630c1b2818fChristopher Wiley const std::string name; 34269b44cf003bd5bda9dcd97a6fe872630c1b2818fChristopher Wiley const std::string value; 343d40e2fed2c19850d53f1620322ac5cbca2c0e245Casey Dahlin 34469b44cf003bd5bda9dcd97a6fe872630c1b2818fChristopher Wiley StringConstant(std::string name, std::string value) 34569b44cf003bd5bda9dcd97a6fe872630c1b2818fChristopher Wiley : name(name), value(value) {} 34669b44cf003bd5bda9dcd97a6fe872630c1b2818fChristopher Wiley ~StringConstant() override = default; 347d40e2fed2c19850d53f1620322ac5cbca2c0e245Casey Dahlin 348ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley void Write(CodeWriter* to) const override; 349d40e2fed2c19850d53f1620322ac5cbca2c0e245Casey Dahlin}; 350d40e2fed2c19850d53f1620322ac5cbca2c0e245Casey Dahlin 351ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wileystruct Class : public ClassElement { 352ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley enum { CLASS, INTERFACE }; 353ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley 35412e894a3b69f045f104a9026765ecbc60ec5967eChristopher Wiley std::string comment; 355ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley int modifiers = 0; 356ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley int what = CLASS; // CLASS or INTERFACE 357ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley const Type* type = nullptr; 358ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley const Type* extends = nullptr; 35912e894a3b69f045f104a9026765ecbc60ec5967eChristopher Wiley std::vector<const Type*> interfaces; 36012e894a3b69f045f104a9026765ecbc60ec5967eChristopher Wiley std::vector<ClassElement*> elements; 361ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley 362ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley Class() = default; 363ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley virtual ~Class() = default; 364ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley 365ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley void Write(CodeWriter* to) const override; 366ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski}; 367ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski 368f76b59aeac2ce35e954c15c676e9102777ec8faaChristopher Wileyclass Document { 369f76b59aeac2ce35e954c15c676e9102777ec8faaChristopher Wiley public: 370f76b59aeac2ce35e954c15c676e9102777ec8faaChristopher Wiley Document(const std::string& comment, 371f76b59aeac2ce35e954c15c676e9102777ec8faaChristopher Wiley const std::string& package, 372f76b59aeac2ce35e954c15c676e9102777ec8faaChristopher Wiley const std::string& original_src, 373f76b59aeac2ce35e954c15c676e9102777ec8faaChristopher Wiley std::unique_ptr<Class> clazz); 374ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley virtual ~Document() = default; 375ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley virtual void Write(CodeWriter* to) const; 376f76b59aeac2ce35e954c15c676e9102777ec8faaChristopher Wiley 377f76b59aeac2ce35e954c15c676e9102777ec8faaChristopher Wiley private: 378f76b59aeac2ce35e954c15c676e9102777ec8faaChristopher Wiley std::string comment_; 379f76b59aeac2ce35e954c15c676e9102777ec8faaChristopher Wiley std::string package_; 380f76b59aeac2ce35e954c15c676e9102777ec8faaChristopher Wiley std::string original_src_; 381f76b59aeac2ce35e954c15c676e9102777ec8faaChristopher Wiley std::unique_ptr<Class> clazz_; 382ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski}; 383ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski 384db154a5f543ff697248df649a14f2ac4a70cbf0eChristopher Wiley} // namespace java 385fdeb0f4b96b6c39b1b9ed3358634f180f9e6df06Christopher Wiley} // namespace aidl 386fdeb0f4b96b6c39b1b9ed3358634f180f9e6df06Christopher Wiley} // namespace android 387fdeb0f4b96b6c39b1b9ed3358634f180f9e6df06Christopher Wiley 388ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley#endif // AIDL_AST_JAVA_H_ 389