1 /* 2 * Copyright (C) 2015, The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #ifndef AIDL_AST_CPP_H_ 18 #define AIDL_AST_CPP_H_ 19 20 #include <memory> 21 #include <string> 22 #include <vector> 23 24 #include <android-base/macros.h> 25 26 namespace android { 27 namespace aidl { 28 class CodeWriter; 29 } // namespace aidl 30 } // namespace android 31 32 namespace android { 33 namespace aidl { 34 namespace cpp { 35 36 class AstNode { 37 public: 38 AstNode() = default; 39 virtual ~AstNode() = default; 40 virtual void Write(CodeWriter* to) const = 0; 41 }; // class AstNode 42 43 class Declaration : public AstNode { 44 public: 45 Declaration() = default; 46 virtual ~Declaration() = default; 47 48 private: 49 DISALLOW_COPY_AND_ASSIGN(Declaration); 50 }; // class Declaration 51 52 class ClassDecl : public Declaration { 53 public: 54 ClassDecl(const std::string& name, 55 const std::string& parent); 56 ClassDecl(const std::string& name, 57 const std::string& parent, 58 std::vector<std::unique_ptr<Declaration>> public_members, 59 std::vector<std::unique_ptr<Declaration>> private_members); 60 virtual ~ClassDecl() = default; 61 62 void Write(CodeWriter* to) const override; 63 64 void AddPublic(std::unique_ptr<Declaration> member); 65 void AddPrivate(std::unique_ptr<Declaration> member); 66 67 private: 68 std::string name_; 69 std::string parent_; 70 std::vector<std::unique_ptr<Declaration>> public_members_; 71 std::vector<std::unique_ptr<Declaration>> private_members_; 72 73 DISALLOW_COPY_AND_ASSIGN(ClassDecl); 74 }; // class ClassDecl 75 76 class Enum : public Declaration { 77 public: 78 Enum(const std::string& name, const std::string& base_type); 79 explicit Enum(const std::string& name); 80 virtual ~Enum() = default; 81 82 bool HasValues() const { return !fields_.empty(); } 83 void Write(CodeWriter* to) const override; 84 85 void AddValue(const std::string& key, const std::string& value); 86 87 private: 88 struct EnumField { 89 EnumField(const std::string& k, const std::string& v); 90 const std::string key; 91 const std::string value; 92 }; 93 94 std::string enum_name_; 95 std::string underlying_type_; 96 std::vector<EnumField> fields_; 97 98 DISALLOW_COPY_AND_ASSIGN(Enum); 99 }; // class Enum 100 101 class ArgList : public AstNode { 102 public: 103 ArgList() = default; 104 explicit ArgList(const std::string& single_argument); 105 explicit ArgList(const std::vector<std::string>& arg_list); 106 explicit ArgList(std::vector<std::unique_ptr<AstNode>> arg_list); 107 ArgList(ArgList&& arg_list); 108 virtual ~ArgList() = default; 109 110 void Write(CodeWriter* to) const override; 111 112 private: 113 std::vector<std::unique_ptr<AstNode>> arguments_; 114 115 DISALLOW_COPY_AND_ASSIGN(ArgList); 116 }; // class ArgList 117 118 class ConstructorDecl : public Declaration { 119 public: 120 enum Modifiers { 121 IS_VIRTUAL = 1 << 0, 122 IS_DEFAULT = 1 << 1, 123 IS_EXPLICIT = 1 << 2, 124 }; 125 126 ConstructorDecl(const std::string& name, 127 ArgList&& arg_list); 128 ConstructorDecl(const std::string& name, 129 ArgList&& arg_list, 130 uint32_t modifiers); 131 132 virtual ~ConstructorDecl() = default; 133 134 void Write(CodeWriter* to) const override; 135 136 private: 137 const std::string name_; 138 const ArgList arguments_; 139 const uint32_t modifiers_; 140 141 DISALLOW_COPY_AND_ASSIGN(ConstructorDecl); 142 }; // class ConstructorDecl 143 144 class MethodDecl : public Declaration { 145 public: 146 enum Modifiers { 147 IS_CONST = 1 << 0, 148 IS_VIRTUAL = 1 << 1, 149 IS_OVERRIDE = 1 << 2, 150 IS_PURE_VIRTUAL = 1 << 3, 151 }; 152 153 MethodDecl(const std::string& return_type, 154 const std::string& name, 155 ArgList&& arg_list); 156 MethodDecl(const std::string& return_type, 157 const std::string& name, 158 ArgList&& arg_list, 159 uint32_t modifiers); 160 virtual ~MethodDecl() = default; 161 162 void Write(CodeWriter* to) const override; 163 164 private: 165 const std::string return_type_; 166 const std::string name_; 167 const ArgList arguments_; 168 bool is_const_ = false; 169 bool is_virtual_ = false; 170 bool is_override_ = false; 171 bool is_pure_virtual_ = false; 172 173 DISALLOW_COPY_AND_ASSIGN(MethodDecl); 174 }; // class MethodDecl 175 176 class StatementBlock : public Declaration { 177 public: 178 StatementBlock() = default; 179 virtual ~StatementBlock() = default; 180 181 void AddStatement(std::unique_ptr<AstNode> statement); 182 void AddStatement(AstNode* statement); // Takes ownership 183 void AddLiteral(const std::string& expression, bool add_semicolon = true); 184 bool Empty() const { return statements_.empty(); } 185 186 void Write(CodeWriter* to) const override; 187 188 private: 189 std::vector<std::unique_ptr<AstNode>> statements_; 190 191 DISALLOW_COPY_AND_ASSIGN(StatementBlock); 192 }; // class StatementBlock 193 194 class ConstructorImpl : public Declaration { 195 public: 196 ConstructorImpl(const std::string& class_name, 197 ArgList&& arg_list, 198 const std::vector<std::string>& initializer_list); 199 virtual ~ConstructorImpl() = default; 200 201 void Write(CodeWriter* to) const override; 202 203 private: 204 std::string class_name_; 205 ArgList arguments_; 206 std::vector<std::string> initializer_list_; 207 StatementBlock body_; 208 209 DISALLOW_COPY_AND_ASSIGN(ConstructorImpl); 210 }; // class ConstructorImpl 211 212 class MethodImpl : public Declaration { 213 public: 214 // Passing an empty class name causes the method to be declared as a normal 215 // function (ie. no ClassName:: qualifier). 216 MethodImpl(const std::string& return_type, 217 const std::string& class_name, 218 const std::string& method_name, 219 ArgList&& arg_list, 220 bool is_const_method = false); 221 virtual ~MethodImpl() = default; 222 223 // MethodImpl retains ownership of the statement block. 224 StatementBlock* GetStatementBlock(); 225 226 void Write(CodeWriter* to) const override; 227 228 private: 229 std::string return_type_; 230 std::string method_name_; 231 const ArgList arguments_; 232 StatementBlock statements_; 233 bool is_const_method_ = false; 234 235 DISALLOW_COPY_AND_ASSIGN(MethodImpl); 236 }; // class MethodImpl 237 238 class SwitchStatement : public AstNode { 239 public: 240 explicit SwitchStatement(const std::string& expression); 241 virtual ~SwitchStatement() = default; 242 243 // Add a case statement and return a pointer code block corresponding 244 // to the case. The switch statement will add a break statement 245 // after the code block by default to prevent accidental fall-through. 246 // Returns nullptr on duplicate value expressions (by strcmp, not value 247 // equivalence). 248 StatementBlock* AddCase(const std::string& value_expression); 249 void Write(CodeWriter* to) const override; 250 251 private: 252 const std::string switch_expression_; 253 std::vector<std::string> case_values_; 254 std::vector<std::unique_ptr<StatementBlock>> case_logic_; 255 256 DISALLOW_COPY_AND_ASSIGN(SwitchStatement); 257 }; // class SwitchStatement 258 259 class Assignment : public AstNode { 260 public: 261 Assignment(const std::string& left, const std::string& right); 262 Assignment(const std::string& left, AstNode* right); 263 ~Assignment() = default; 264 void Write(CodeWriter* to) const override; 265 266 private: 267 const std::string lhs_; 268 std::unique_ptr<AstNode> rhs_; 269 270 DISALLOW_COPY_AND_ASSIGN(Assignment); 271 }; // class Assignment 272 273 class MethodCall : public AstNode { 274 public: 275 MethodCall(const std::string& method_name, 276 const std::string& single_argument); 277 MethodCall(const std::string& method_name, ArgList&& arg_list); 278 ~MethodCall() = default; 279 void Write(CodeWriter* to) const override; 280 281 private: 282 const std::string method_name_; 283 const ArgList arguments_; 284 285 DISALLOW_COPY_AND_ASSIGN(MethodCall); 286 }; // class MethodCall 287 288 class IfStatement : public AstNode { 289 public: 290 IfStatement(AstNode* expression, 291 bool invert_expression = false); 292 virtual ~IfStatement() = default; 293 StatementBlock* OnTrue() { return &on_true_; } 294 StatementBlock* OnFalse() { return &on_false_; } 295 void Write(CodeWriter* to) const override; 296 297 private: 298 std::unique_ptr<AstNode> expression_; 299 bool invert_expression_ = false; 300 StatementBlock on_true_; 301 StatementBlock on_false_; 302 303 DISALLOW_COPY_AND_ASSIGN(IfStatement); 304 }; // class IfStatement 305 306 class Statement : public AstNode { 307 public: 308 explicit Statement(std::unique_ptr<AstNode> expression); 309 explicit Statement(AstNode* expression); // Takes possession. 310 explicit Statement(const std::string& expression); 311 ~Statement() = default; 312 void Write(CodeWriter* to) const override; 313 314 private: 315 std::unique_ptr<AstNode> expression_; 316 317 DISALLOW_COPY_AND_ASSIGN(Statement); 318 }; // class Statement 319 320 class Comparison : public AstNode { 321 public: 322 Comparison(AstNode* lhs, const std::string& comparison, AstNode* rhs); 323 ~Comparison() = default; 324 void Write(CodeWriter* to) const override; 325 326 private: 327 std::unique_ptr<AstNode> left_; 328 std::unique_ptr<AstNode> right_; 329 const std::string operator_; 330 331 DISALLOW_COPY_AND_ASSIGN(Comparison); 332 }; // class Comparison 333 334 class LiteralExpression : public AstNode { 335 public: 336 explicit LiteralExpression(const std::string& expression); 337 ~LiteralExpression() = default; 338 void Write(CodeWriter* to) const override; 339 340 private: 341 const std::string expression_; 342 343 DISALLOW_COPY_AND_ASSIGN(LiteralExpression); 344 }; // class LiteralExpression 345 346 class CppNamespace : public Declaration { 347 public: 348 CppNamespace(const std::string& name, 349 std::vector<std::unique_ptr<Declaration>> declarations); 350 CppNamespace(const std::string& name, 351 std::unique_ptr<Declaration> declaration); 352 CppNamespace(const std::string& name); 353 virtual ~CppNamespace() = default; 354 355 void Write(CodeWriter* to) const override; 356 357 private: 358 std::vector<std::unique_ptr<Declaration>> declarations_; 359 std::string name_; 360 361 DISALLOW_COPY_AND_ASSIGN(CppNamespace); 362 }; // class CppNamespace 363 364 class Document : public AstNode { 365 public: 366 Document(const std::vector<std::string>& include_list, 367 std::unique_ptr<CppNamespace> a_namespace); 368 369 void Write(CodeWriter* to) const override; 370 371 private: 372 std::vector<std::string> include_list_; 373 std::unique_ptr<CppNamespace> namespace_; 374 375 DISALLOW_COPY_AND_ASSIGN(Document); 376 }; // class Document 377 378 class CppHeader final : public Document { 379 public: 380 CppHeader(const std::string& include_guard, 381 const std::vector<std::string>& include_list, 382 std::unique_ptr<CppNamespace> a_namespace); 383 void Write(CodeWriter* to) const override; 384 385 private: 386 const std::string include_guard_; 387 388 DISALLOW_COPY_AND_ASSIGN(CppHeader); 389 }; // class CppHeader 390 391 class CppSource final : public Document { 392 public: 393 CppSource(const std::vector<std::string>& include_list, 394 std::unique_ptr<CppNamespace> a_namespace); 395 396 private: 397 DISALLOW_COPY_AND_ASSIGN(CppSource); 398 }; // class CppSource 399 400 } // namespace cpp 401 } // namespace aidl 402 } // namespace android 403 404 #endif // AIDL_AST_CPP_H_ 405