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