1 /* 2 * Copyright (C) 2019, 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 <regex> 21 #include <string> 22 #include <unordered_set> 23 #include <vector> 24 25 #include <android-base/strings.h> 26 27 #include "aidl_typenames.h" 28 #include "code_writer.h" 29 #include "comments.h" 30 #include "diagnostics.h" 31 #include "io_delegate.h" 32 #include "location.h" 33 #include "logging.h" 34 #include "options.h" 35 36 using android::aidl::AidlTypenames; 37 using android::aidl::CodeWriter; 38 using android::aidl::Comments; 39 using android::aidl::Options; 40 using std::shared_ptr; 41 using std::string; 42 using std::unique_ptr; 43 using std::vector; 44 class AidlNode; 45 46 // helper to see if T is the same to one of Args types. 47 template <typename T, typename... Args> 48 struct is_one_of : std::false_type {}; 49 50 template <typename T, typename S, typename... Args> 51 struct is_one_of<T, S, Args...> { 52 enum { value = std::is_same_v<T, S> || is_one_of<T, Args...>::value }; 53 }; 54 55 // helper to see if T is std::vector of something. 56 template <typename> 57 struct is_vector : std::false_type {}; 58 59 template <typename T> 60 struct is_vector<std::vector<T>> : std::true_type {}; 61 62 // helper for static_assert(false) 63 template <typename T> 64 struct unsupported_type : std::false_type {}; 65 66 namespace android { 67 namespace aidl { 68 namespace mappings { 69 std::string dump_location(const AidlNode& method); 70 } // namespace mappings 71 namespace java { 72 std::string dump_location(const AidlNode& method); 73 } // namespace java 74 } // namespace aidl 75 } // namespace android 76 77 bool ParseFloating(std::string_view sv, double* parsed); 78 bool ParseFloating(std::string_view sv, float* parsed); 79 80 class AidlDocument; 81 class AidlPackage; 82 class AidlImport; 83 class AidlInterface; 84 class AidlParcelable; 85 class AidlStructuredParcelable; 86 class AidlEnumDeclaration; 87 class AidlUnionDecl; 88 class AidlVariableDeclaration; 89 class AidlConstantDeclaration; 90 class AidlEnumerator; 91 class AidlMethod; 92 class AidlArgument; 93 class AidlConstantValue; 94 class AidlConstantReference; 95 class AidlUnaryConstExpression; 96 class AidlBinaryConstExpression; 97 class AidlAnnotation; 98 99 // Interface for visitors that can traverse AidlTraversable nodes. 100 class AidlVisitor { 101 public: 102 virtual ~AidlVisitor() = default; 103 virtual void Visit(const AidlDocument&) {} 104 virtual void Visit(const AidlInterface&) {} 105 virtual void Visit(const AidlParcelable&) {} 106 virtual void Visit(const AidlStructuredParcelable&) {} 107 virtual void Visit(const AidlUnionDecl&) {} 108 virtual void Visit(const AidlEnumDeclaration&) {} 109 virtual void Visit(const AidlEnumerator&) {} 110 virtual void Visit(const AidlMethod&) {} 111 virtual void Visit(const AidlVariableDeclaration&) {} 112 virtual void Visit(const AidlConstantDeclaration&) {} 113 virtual void Visit(const AidlArgument&) {} 114 virtual void Visit(const AidlTypeSpecifier&) {} 115 virtual void Visit(const AidlConstantValue&) {} 116 virtual void Visit(const AidlConstantReference&) {} 117 virtual void Visit(const AidlUnaryConstExpression&) {} 118 virtual void Visit(const AidlBinaryConstExpression&) {} 119 virtual void Visit(const AidlAnnotation&) {} 120 virtual void Visit(const AidlImport&) {} 121 virtual void Visit(const AidlPackage&) {} 122 }; 123 124 // Anything that is locatable in a .aidl file. 125 class AidlNode { 126 public: 127 AidlNode(const AidlLocation& location, const Comments& comments = {}); 128 129 AidlNode(const AidlNode&) = default; 130 virtual ~AidlNode() = default; 131 132 AidlNode(AidlNode&&) = delete; 133 AidlNode& operator=(AidlNode&&) = delete; 134 135 // To be able to print AidlLocation 136 friend class AidlErrorLog; 137 friend std::string android::aidl::mappings::dump_location(const AidlNode&); 138 friend std::string android::aidl::java::dump_location(const AidlNode&); 139 140 const AidlLocation& GetLocation() const { return location_; } 141 virtual void TraverseChildren(std::function<void(const AidlNode&)> traverse) const = 0; 142 virtual void DispatchVisit(AidlVisitor&) const = 0; 143 144 const Comments& GetComments() const { return comments_; } 145 void SetComments(const Comments& comments) { comments_ = comments; } 146 147 private: 148 std::string PrintLine() const; 149 std::string PrintLocation() const; 150 const AidlLocation location_; 151 Comments comments_; 152 }; 153 154 // unique_ptr<AidlTypeSpecifier> for type arugment, 155 // std::string for type parameter(T, U, and so on). 156 template <typename T> 157 class AidlParameterizable { 158 public: 159 AidlParameterizable(std::vector<T>* type_params) : type_params_(type_params) {} 160 virtual ~AidlParameterizable() = default; 161 bool IsGeneric() const { return type_params_ != nullptr; } 162 const std::vector<T>& GetTypeParameters() const { return *type_params_; } 163 bool CheckValid() const; 164 165 __attribute__((warn_unused_result)) bool SetTypeParameters(std::vector<T>* type_params) { 166 if (type_params_) return false; 167 type_params_.reset(type_params); 168 return true; 169 } 170 171 virtual const AidlNode& AsAidlNode() const = 0; 172 173 protected: 174 AidlParameterizable(const AidlParameterizable&); 175 176 private: 177 unique_ptr<std::vector<T>> type_params_; 178 static_assert(std::is_same<T, unique_ptr<AidlTypeSpecifier>>::value || 179 std::is_same<T, std::string>::value); 180 }; 181 template <> 182 bool AidlParameterizable<std::string>::CheckValid() const; 183 184 class AidlCommentable : public AidlNode { 185 public: 186 AidlCommentable(const AidlLocation& location, const Comments& comments) 187 : AidlNode(location, comments) {} 188 virtual ~AidlCommentable() = default; 189 190 bool IsHidden() const; 191 bool IsDeprecated() const; 192 }; 193 194 // Transforms a value string into a language specific form. Raw value as produced by 195 // AidlConstantValue. 196 using ConstantValueDecorator = 197 std::function<std::string(const AidlTypeSpecifier& type, const std::string& raw_value)>; 198 199 class AidlAnnotation : public AidlNode { 200 public: 201 enum class Type { 202 BACKING = 1, 203 HIDE, 204 JAVA_STABLE_PARCELABLE, 205 UNSUPPORTED_APP_USAGE, 206 VINTF_STABILITY, 207 NULLABLE, 208 UTF8_IN_CPP, 209 SENSITIVE_DATA, 210 JAVA_PASSTHROUGH, 211 JAVA_DERIVE, 212 JAVA_ONLY_IMMUTABLE, 213 FIXED_SIZE, 214 DESCRIPTOR, 215 RUST_DERIVE, 216 SUPPRESS_WARNINGS, 217 }; 218 219 using TargetContext = uint16_t; 220 static constexpr TargetContext CONTEXT_TYPE_INTERFACE = 0x1 << 0; 221 static constexpr TargetContext CONTEXT_TYPE_ENUM = 0x1 << 1; 222 static constexpr TargetContext CONTEXT_TYPE_STRUCTURED_PARCELABLE = 0x1 << 2; 223 static constexpr TargetContext CONTEXT_TYPE_UNION = 0x1 << 3; 224 static constexpr TargetContext CONTEXT_TYPE_UNSTRUCTURED_PARCELABLE = 0x1 << 4; 225 static constexpr TargetContext CONTEXT_TYPE = 226 CONTEXT_TYPE_INTERFACE | CONTEXT_TYPE_ENUM | CONTEXT_TYPE_STRUCTURED_PARCELABLE | 227 CONTEXT_TYPE_UNION | CONTEXT_TYPE_UNSTRUCTURED_PARCELABLE; 228 static constexpr TargetContext CONTEXT_CONST = 0x1 << 5; 229 static constexpr TargetContext CONTEXT_FIELD = 0x1 << 6; 230 static constexpr TargetContext CONTEXT_METHOD = 0x1 << 7; 231 static constexpr TargetContext CONTEXT_MEMBER = CONTEXT_CONST | CONTEXT_FIELD | CONTEXT_METHOD; 232 static constexpr TargetContext CONTEXT_TYPE_SPECIFIER = 0x1 << 8; 233 static constexpr TargetContext CONTEXT_ALL = 234 CONTEXT_TYPE | CONTEXT_MEMBER | CONTEXT_TYPE_SPECIFIER; 235 236 static std::string TypeToString(Type type); 237 238 static AidlAnnotation* Parse( 239 const AidlLocation& location, const string& name, 240 std::map<std::string, std::shared_ptr<AidlConstantValue>>* parameter_list, 241 const Comments& comments); 242 243 AidlAnnotation(const AidlAnnotation&) = default; 244 AidlAnnotation(AidlAnnotation&&) = default; 245 virtual ~AidlAnnotation() = default; 246 bool CheckValid() const; 247 bool CheckContext(TargetContext context) const; 248 const string& GetName() const { return schema_.name; } 249 const Type& GetType() const { return schema_.type; } 250 bool Repeatable() const { return schema_.repeatable; } 251 252 // ToString is for dumping AIDL. 253 // Returns string representation of this annotation. 254 // e.g) "@RustDerive(Clone=true, Copy=true)" 255 string ToString() const; 256 257 template <typename T> 258 std::optional<T> ParamValue(const std::string& param_name) const; 259 260 std::map<std::string, std::string> AnnotationParams( 261 const ConstantValueDecorator& decorator) const; 262 void TraverseChildren(std::function<void(const AidlNode&)> traverse) const override; 263 void DispatchVisit(AidlVisitor& v) const override { v.Visit(*this); } 264 265 private: 266 struct ParamType { 267 std::string name; 268 const AidlTypeSpecifier& type; 269 bool required = false; 270 }; 271 272 struct Schema { 273 AidlAnnotation::Type type; 274 std::string name; 275 TargetContext target_context; 276 std::vector<ParamType> parameters; 277 bool repeatable = false; 278 279 const ParamType* ParamType(const std::string& name) const { 280 for (const auto& param : parameters) { 281 if (param.name == name) { 282 return ¶m; 283 } 284 } 285 return nullptr; 286 } 287 }; 288 289 static const std::vector<Schema>& AllSchemas(); 290 291 AidlAnnotation(const AidlLocation& location, const Schema& schema, 292 std::map<std::string, std::shared_ptr<AidlConstantValue>>&& parameters, 293 const Comments& comments); 294 295 const Schema& schema_; 296 std::map<std::string, std::shared_ptr<AidlConstantValue>> parameters_; 297 }; 298 299 static inline bool operator<(const AidlAnnotation& lhs, const AidlAnnotation& rhs) { 300 return lhs.GetName() < rhs.GetName(); 301 } 302 static inline bool operator==(const AidlAnnotation& lhs, const AidlAnnotation& rhs) { 303 return lhs.GetName() == rhs.GetName(); 304 } 305 306 class AidlAnnotatable : public AidlCommentable { 307 public: 308 AidlAnnotatable(const AidlLocation& location, const Comments& comments); 309 310 AidlAnnotatable(const AidlAnnotatable&) = default; 311 AidlAnnotatable(AidlAnnotatable&&) = default; 312 virtual ~AidlAnnotatable() = default; 313 314 void Annotate(vector<AidlAnnotation>&& annotations) { 315 for (auto& annotation : annotations) { 316 annotations_.emplace_back(std::move(annotation)); 317 } 318 } 319 bool IsNullable() const; 320 bool IsUtf8InCpp() const; 321 bool IsSensitiveData() const; 322 bool IsVintfStability() const; 323 bool IsJavaOnlyImmutable() const; 324 bool IsFixedSize() const; 325 bool IsStableApiParcelable(Options::Language lang) const; 326 bool IsHide() const; 327 bool JavaDerive(const std::string& method) const; 328 std::string GetDescriptor() const; 329 330 const AidlAnnotation* UnsupportedAppUsage() const; 331 const AidlAnnotation* RustDerive() const; 332 const AidlAnnotation* BackingType() const; 333 std::vector<std::string> SuppressWarnings() const; 334 335 // ToString is for dumping AIDL. 336 // Returns string representation of annotations. 337 // e.g) "@JavaDerive(toString=true) @RustDerive(Clone=true, Copy=true)" 338 std::string ToString() const; 339 340 const vector<AidlAnnotation>& GetAnnotations() const { return annotations_; } 341 bool CheckValid(const AidlTypenames&) const; 342 void TraverseChildren(std::function<void(const AidlNode&)> traverse) const override { 343 for (const auto& annot : GetAnnotations()) { 344 traverse(annot); 345 } 346 } 347 348 private: 349 vector<AidlAnnotation> annotations_; 350 }; 351 352 // AidlTypeSpecifier represents a reference to either a built-in type, 353 // a defined type, or a variant (e.g., array of generic) of a type. 354 class AidlTypeSpecifier final : public AidlAnnotatable, 355 public AidlParameterizable<unique_ptr<AidlTypeSpecifier>> { 356 public: 357 AidlTypeSpecifier(const AidlLocation& location, const string& unresolved_name, bool is_array, 358 vector<unique_ptr<AidlTypeSpecifier>>* type_params, const Comments& comments); 359 virtual ~AidlTypeSpecifier() = default; 360 361 // Copy of this type which is not an array. 362 const AidlTypeSpecifier& ArrayBase() const; 363 364 // Returns the full-qualified name of the base type. 365 // int -> int 366 // int[] -> int 367 // List<String> -> List 368 // IFoo -> foo.bar.IFoo (if IFoo is in package foo.bar) 369 const string& GetName() const { 370 if (IsResolved()) { 371 return fully_qualified_name_; 372 } else { 373 return GetUnresolvedName(); 374 } 375 } 376 377 // ToString is for dumping AIDL. 378 // Returns string representation of this type specifier including annotations. 379 // This is "annotations type_name type_params? array_marker?". 380 // e.g) "@utf8InCpp String[]"; 381 std::string ToString() const; 382 383 // Signature is for comparing AIDL types. 384 // Returns string representation of this type specifier. 385 // This is "type_name type_params? array_marker?". 386 // e.g.) "String[]" (even if it is annotated with @utf8InCpp) 387 std::string Signature() const; 388 389 const string& GetUnresolvedName() const { return unresolved_name_; } 390 391 const std::vector<std::string> GetSplitName() const { return split_name_; } 392 393 bool IsResolved() const { return fully_qualified_name_ != ""; } 394 395 bool IsArray() const { return is_array_; } 396 397 __attribute__((warn_unused_result)) bool SetArray() { 398 if (is_array_) return false; 399 is_array_ = true; 400 return true; 401 } 402 403 // Resolve the base type name to a fully-qualified name. Return false if the 404 // resolution fails. 405 bool Resolve(const AidlTypenames& typenames); 406 407 bool CheckValid(const AidlTypenames& typenames) const; 408 bool LanguageSpecificCheckValid(const AidlTypenames& typenames, Options::Language lang) const; 409 const AidlNode& AsAidlNode() const override { return *this; } 410 411 const AidlDefinedType* GetDefinedType() const; 412 void TraverseChildren(std::function<void(const AidlNode&)> traverse) const override { 413 AidlAnnotatable::TraverseChildren(traverse); 414 if (IsGeneric()) { 415 for (const auto& tp : GetTypeParameters()) { 416 traverse(*tp); 417 } 418 } 419 } 420 void DispatchVisit(AidlVisitor& v) const override { v.Visit(*this); } 421 422 private: 423 AidlTypeSpecifier(const AidlTypeSpecifier&) = default; 424 425 const string unresolved_name_; 426 string fully_qualified_name_; 427 bool is_array_; 428 vector<string> split_name_; 429 const AidlDefinedType* defined_type_ = nullptr; // set when Resolve() for defined types 430 mutable shared_ptr<AidlTypeSpecifier> array_base_; 431 }; 432 433 // Returns the universal value unaltered. 434 std::string AidlConstantValueDecorator(const AidlTypeSpecifier& type, const std::string& raw_value); 435 436 class AidlMember : public AidlCommentable { 437 public: 438 AidlMember(const AidlLocation& location, const Comments& comments); 439 virtual ~AidlMember() = default; 440 441 // non-copyable, non-movable 442 AidlMember(const AidlMember&) = delete; 443 AidlMember(AidlMember&&) = delete; 444 AidlMember& operator=(const AidlMember&) = delete; 445 AidlMember& operator=(AidlMember&&) = delete; 446 447 virtual const AidlMethod* AsMethod() const { return nullptr; } 448 virtual const AidlConstantDeclaration* AsConstantDeclaration() const { return nullptr; } 449 virtual const AidlVariableDeclaration* AsVariableDeclaration() const { return nullptr; } 450 451 AidlMethod* AsMethod() { 452 return const_cast<AidlMethod*>(const_cast<const AidlMember*>(this)->AsMethod()); 453 } 454 AidlConstantDeclaration* AsConstantDeclaration() { 455 return const_cast<AidlConstantDeclaration*>( 456 const_cast<const AidlMember*>(this)->AsConstantDeclaration()); 457 } 458 AidlVariableDeclaration* AsVariableDeclaration() { 459 return const_cast<AidlVariableDeclaration*>( 460 const_cast<const AidlMember*>(this)->AsVariableDeclaration()); 461 } 462 }; 463 464 // TODO: This class is used for method arguments and also parcelable fields, 465 // and it should be split up since default values don't apply to method 466 // arguments 467 class AidlVariableDeclaration : public AidlMember { 468 public: 469 AidlVariableDeclaration(const AidlLocation& location, AidlTypeSpecifier* type, 470 const std::string& name); 471 AidlVariableDeclaration(const AidlLocation& location, AidlTypeSpecifier* type, 472 const std::string& name, AidlConstantValue* default_value); 473 virtual ~AidlVariableDeclaration() = default; 474 475 // non-copyable, non-movable 476 AidlVariableDeclaration(const AidlVariableDeclaration&) = delete; 477 AidlVariableDeclaration(AidlVariableDeclaration&&) = delete; 478 AidlVariableDeclaration& operator=(const AidlVariableDeclaration&) = delete; 479 AidlVariableDeclaration& operator=(AidlVariableDeclaration&&) = delete; 480 481 const AidlVariableDeclaration* AsVariableDeclaration() const override { return this; } 482 483 std::string GetName() const { return name_; } 484 std::string GetCapitalizedName() const; 485 const AidlTypeSpecifier& GetType() const { return *type_; } 486 // if this was constructed explicitly with a default value 487 bool IsDefaultUserSpecified() const { return default_user_specified_; } 488 // will return the default value this is constructed with or a default value 489 // if one is available 490 const AidlConstantValue* GetDefaultValue() const { return default_value_.get(); } 491 bool HasUsefulDefaultValue() const; 492 493 AidlTypeSpecifier* GetMutableType() { return type_.get(); } 494 495 bool CheckValid(const AidlTypenames& typenames) const; 496 497 // ToString is for dumping AIDL. 498 // Returns string representation of this variable decl including default value. 499 // This is "annotations type name default_value?". 500 // e.g) "@utf8InCpp String[] names = {"hello"}" 501 std::string ToString() const; 502 503 // Signature is for comparing AIDL types. 504 // Returns string representation of this variable decl. 505 // This is "type name". 506 // e.g) "String[] name" (even if it is annotated with @utf8InCpp and has a default value.) 507 std::string Signature() const; 508 509 std::string ValueString(const ConstantValueDecorator& decorator) const; 510 511 void TraverseChildren(std::function<void(const AidlNode&)> traverse) const override; 512 void DispatchVisit(AidlVisitor& v) const override { v.Visit(*this); } 513 514 private: 515 std::unique_ptr<AidlTypeSpecifier> type_; 516 std::string name_; 517 bool default_user_specified_; 518 std::unique_ptr<AidlConstantValue> default_value_; 519 }; 520 521 class AidlArgument : public AidlVariableDeclaration { 522 public: 523 enum Direction { IN_DIR = 1, OUT_DIR = 2, INOUT_DIR = 3 }; 524 525 AidlArgument(const AidlLocation& location, AidlArgument::Direction direction, 526 AidlTypeSpecifier* type, const std::string& name); 527 AidlArgument(const AidlLocation& location, AidlTypeSpecifier* type, const std::string& name); 528 virtual ~AidlArgument() = default; 529 530 // non-copyable, non-movable 531 AidlArgument(const AidlArgument&) = delete; 532 AidlArgument(AidlArgument&&) = delete; 533 AidlArgument& operator=(const AidlArgument&) = delete; 534 AidlArgument& operator=(AidlArgument&&) = delete; 535 536 Direction GetDirection() const { return direction_; } 537 bool IsOut() const { return direction_ & OUT_DIR; } 538 bool IsIn() const { return direction_ & IN_DIR; } 539 bool DirectionWasSpecified() const { return direction_specified_; } 540 string GetDirectionSpecifier() const; 541 bool CheckValid(const AidlTypenames& typenames) const; 542 543 // ToString is for dumping AIDL. 544 // Returns string representation of this argument including direction 545 // This is "direction annotations type name". 546 // e.g) "in @utf8InCpp String[] names" 547 std::string ToString() const; 548 549 void TraverseChildren(std::function<void(const AidlNode&)> traverse) const override { 550 traverse(GetType()); 551 } 552 void DispatchVisit(AidlVisitor& v) const override { v.Visit(*this); } 553 554 private: 555 Direction direction_; 556 bool direction_specified_; 557 }; 558 559 struct ArgumentAspect { 560 std::string name; 561 std::set<AidlArgument::Direction> possible_directions; 562 }; 563 564 class AidlUnaryConstExpression; 565 class AidlBinaryConstExpression; 566 class AidlConstantReference; 567 568 class AidlConstantValue : public AidlNode { 569 public: 570 enum class Type { 571 // WARNING: Don't change this order! The order is used to determine type 572 // promotion during a binary expression. 573 BOOLEAN, 574 INT8, 575 INT32, 576 INT64, 577 ARRAY, 578 CHARACTER, 579 STRING, 580 REF, 581 FLOATING, 582 UNARY, 583 BINARY, 584 ERROR, 585 }; 586 587 // Returns the evaluated value. T> should match to the actual type. 588 template <typename T> 589 T EvaluatedValue() const { 590 is_evaluated_ || (CheckValid() && evaluate()); 591 AIDL_FATAL_IF(!is_valid_, this); 592 593 if constexpr (is_vector<T>::value) { 594 AIDL_FATAL_IF(final_type_ != Type::ARRAY, this); 595 T result; 596 for (const auto& v : values_) { 597 result.push_back(v->EvaluatedValue<typename T::value_type>()); 598 } 599 return result; 600 } else if constexpr (is_one_of<T, float, double>::value) { 601 AIDL_FATAL_IF(final_type_ != Type::FLOATING, this); 602 T result; 603 AIDL_FATAL_IF(!ParseFloating(value_, &result), this); 604 return result; 605 } else if constexpr (std::is_same<T, std::string>::value) { 606 AIDL_FATAL_IF(final_type_ != Type::STRING, this); 607 return final_string_value_.substr(1, final_string_value_.size() - 2); // unquote " 608 } else if constexpr (is_one_of<T, int8_t, int32_t, int64_t>::value) { 609 AIDL_FATAL_IF(final_type_ < Type::INT8 && final_type_ > Type::INT64, this); 610 return static_cast<T>(final_value_); 611 } else if constexpr (std::is_same<T, char16_t>::value) { 612 AIDL_FATAL_IF(final_type_ != Type::CHARACTER, this); 613 return final_string_value_.at(1); // unquote ' 614 } else if constexpr (std::is_same<T, bool>::value) { 615 static_assert(std::is_same<T, bool>::value, ".."); 616 AIDL_FATAL_IF(final_type_ != Type::BOOLEAN, this); 617 return final_value_ != 0; 618 } else { 619 static_assert(unsupported_type<T>::value); 620 } 621 } 622 623 virtual ~AidlConstantValue() = default; 624 625 // non-copyable, non-movable 626 AidlConstantValue(const AidlConstantValue&) = delete; 627 AidlConstantValue(AidlConstantValue&&) = delete; 628 AidlConstantValue& operator=(const AidlConstantValue&) = delete; 629 AidlConstantValue& operator=(AidlConstantValue&&) = delete; 630 631 // creates default value, when one isn't specified 632 // nullptr if no default available 633 static AidlConstantValue* Default(const AidlTypeSpecifier& specifier); 634 635 static AidlConstantValue* Boolean(const AidlLocation& location, bool value); 636 static AidlConstantValue* Character(const AidlLocation& location, const std::string& value); 637 // example: 123, -5498, maybe any size 638 static AidlConstantValue* Integral(const AidlLocation& location, const std::string& value); 639 static AidlConstantValue* Floating(const AidlLocation& location, const std::string& value); 640 static AidlConstantValue* Array(const AidlLocation& location, 641 std::unique_ptr<vector<unique_ptr<AidlConstantValue>>> values); 642 // example: "\"asdf\"" 643 static AidlConstantValue* String(const AidlLocation& location, const string& value); 644 645 Type GetType() const { return final_type_; } 646 const std::string& Literal() const { return value_; } 647 648 virtual bool CheckValid() const; 649 650 // Raw value of type (currently valid in C++ and Java). Empty string on error. 651 string ValueString(const AidlTypeSpecifier& type, const ConstantValueDecorator& decorator) const; 652 653 void TraverseChildren(std::function<void(const AidlNode&)> traverse) const { 654 if (type_ == Type::ARRAY) { 655 for (const auto& v : values_) { 656 traverse(*v); 657 } 658 } 659 } 660 void DispatchVisit(AidlVisitor& visitor) const override { visitor.Visit(*this); } 661 662 private: 663 AidlConstantValue(const AidlLocation& location, Type parsed_type, int64_t parsed_value, 664 const string& checked_value); 665 AidlConstantValue(const AidlLocation& location, Type type, const string& checked_value); 666 AidlConstantValue(const AidlLocation& location, Type type, 667 std::unique_ptr<vector<unique_ptr<AidlConstantValue>>> values, 668 const std::string& value); 669 static string ToString(Type type); 670 static bool ParseIntegral(const string& value, int64_t* parsed_value, Type* parsed_type); 671 static bool IsHex(const string& value); 672 673 virtual bool evaluate() const; 674 675 const Type type_ = Type::ERROR; 676 const vector<unique_ptr<AidlConstantValue>> values_; // if type_ == ARRAY 677 const string value_; // otherwise 678 679 // State for tracking evaluation of expressions 680 mutable bool is_valid_ = false; // cache of CheckValid, but may be marked false in evaluate 681 mutable bool is_evaluated_ = false; // whether evaluate has been called 682 mutable Type final_type_; 683 mutable int64_t final_value_; 684 mutable string final_string_value_ = ""; 685 686 friend AidlUnaryConstExpression; 687 friend AidlBinaryConstExpression; 688 friend AidlConstantReference; 689 }; 690 691 // Represents "<type>.<field>" which resolves to a constant which is one of 692 // - constant declartion 693 // - enumerator 694 // When a <type> is missing, <field> is of the enclosing type. 695 class AidlConstantReference : public AidlConstantValue { 696 public: 697 AidlConstantReference(const AidlLocation& location, const std::string& value); 698 699 const std::unique_ptr<AidlTypeSpecifier>& GetRefType() const { return ref_type_; } 700 const std::string& GetFieldName() const { return field_name_; } 701 702 bool CheckValid() const override; 703 void TraverseChildren(std::function<void(const AidlNode&)>) const override { 704 // resolved_ is not my child. 705 } 706 void DispatchVisit(AidlVisitor& v) const override { v.Visit(*this); } 707 const AidlConstantValue* Resolve(const AidlDefinedType* scope) const; 708 709 private: 710 bool evaluate() const override; 711 712 std::unique_ptr<AidlTypeSpecifier> ref_type_; 713 std::string field_name_; 714 mutable const AidlConstantValue* resolved_ = nullptr; 715 }; 716 717 class AidlUnaryConstExpression : public AidlConstantValue { 718 public: 719 AidlUnaryConstExpression(const AidlLocation& location, const string& op, 720 std::unique_ptr<AidlConstantValue> rval); 721 722 static bool IsCompatibleType(Type type, const string& op); 723 bool CheckValid() const override; 724 void TraverseChildren(std::function<void(const AidlNode&)> traverse) const override { 725 traverse(*unary_); 726 } 727 void DispatchVisit(AidlVisitor& v) const override { v.Visit(*this); } 728 729 private: 730 bool evaluate() const override; 731 732 std::unique_ptr<AidlConstantValue> unary_; 733 const string op_; 734 }; 735 736 class AidlBinaryConstExpression : public AidlConstantValue { 737 public: 738 AidlBinaryConstExpression(const AidlLocation& location, std::unique_ptr<AidlConstantValue> lval, 739 const string& op, std::unique_ptr<AidlConstantValue> rval); 740 741 bool CheckValid() const override; 742 743 static bool AreCompatibleTypes(Type t1, Type t2); 744 // Returns the promoted kind for both operands 745 static Type UsualArithmeticConversion(Type left, Type right); 746 // Returns the promoted integral type where INT32 is the smallest type 747 static Type IntegralPromotion(Type in); 748 void TraverseChildren(std::function<void(const AidlNode&)> traverse) const override { 749 traverse(*left_val_); 750 traverse(*right_val_); 751 } 752 void DispatchVisit(AidlVisitor& v) const override { v.Visit(*this); } 753 754 private: 755 bool evaluate() const override; 756 757 std::unique_ptr<AidlConstantValue> left_val_; 758 std::unique_ptr<AidlConstantValue> right_val_; 759 const string op_; 760 }; 761 762 struct AidlAnnotationParameter { 763 std::string name; 764 std::unique_ptr<AidlConstantValue> value; 765 }; 766 767 class AidlConstantDeclaration : public AidlMember { 768 public: 769 AidlConstantDeclaration(const AidlLocation& location, AidlTypeSpecifier* specifier, 770 const string& name, AidlConstantValue* value); 771 virtual ~AidlConstantDeclaration() = default; 772 773 // non-copyable, non-movable 774 AidlConstantDeclaration(const AidlConstantDeclaration&) = delete; 775 AidlConstantDeclaration(AidlConstantDeclaration&&) = delete; 776 AidlConstantDeclaration& operator=(const AidlConstantDeclaration&) = delete; 777 AidlConstantDeclaration& operator=(AidlConstantDeclaration&&) = delete; 778 779 const AidlTypeSpecifier& GetType() const { return *type_; } 780 AidlTypeSpecifier* GetMutableType() { return type_.get(); } 781 const string& GetName() const { return name_; } 782 const AidlConstantValue& GetValue() const { return *value_; } 783 bool CheckValid(const AidlTypenames& typenames) const; 784 785 // ToString is for dumping AIDL. 786 // Returns string representation of this const decl including a const value. 787 // This is "`const` annotations type name value". 788 // e.g) "const @utf8InCpp String[] names = { "hello" }" 789 string ToString() const; 790 791 // Signature is for comparing types. 792 // Returns string representation of this const decl. 793 // This is "direction annotations type name". 794 // e.g) "String[] names" 795 string Signature() const; 796 797 string ValueString(const ConstantValueDecorator& decorator) const { 798 return value_->ValueString(GetType(), decorator); 799 } 800 801 const AidlConstantDeclaration* AsConstantDeclaration() const override { return this; } 802 803 void TraverseChildren(std::function<void(const AidlNode&)> traverse) const override { 804 traverse(GetType()); 805 traverse(GetValue()); 806 } 807 void DispatchVisit(AidlVisitor& v) const override { v.Visit(*this); } 808 809 private: 810 const unique_ptr<AidlTypeSpecifier> type_; 811 const string name_; 812 unique_ptr<AidlConstantValue> value_; 813 }; 814 815 class AidlMethod : public AidlMember { 816 public: 817 AidlMethod(const AidlLocation& location, bool oneway, AidlTypeSpecifier* type, const string& name, 818 vector<unique_ptr<AidlArgument>>* args, const Comments& comments); 819 AidlMethod(const AidlLocation& location, bool oneway, AidlTypeSpecifier* type, const string& name, 820 vector<unique_ptr<AidlArgument>>* args, const Comments& comments, int id, 821 bool is_user_defined = true); 822 virtual ~AidlMethod() = default; 823 824 // non-copyable, non-movable 825 AidlMethod(const AidlMethod&) = delete; 826 AidlMethod(AidlMethod&&) = delete; 827 AidlMethod& operator=(const AidlMethod&) = delete; 828 AidlMethod& operator=(AidlMethod&&) = delete; 829 830 const AidlMethod* AsMethod() const override { return this; } 831 const AidlTypeSpecifier& GetType() const { return *type_; } 832 AidlTypeSpecifier* GetMutableType() { return type_.get(); } 833 834 // set if this method is part of an interface that is marked oneway 835 void ApplyInterfaceOneway(bool oneway) { oneway_ = oneway_ || oneway; } 836 bool IsOneway() const { return oneway_; } 837 838 const std::string& GetName() const { return name_; } 839 bool HasId() const { return has_id_; } 840 int GetId() const { return id_; } 841 void SetId(unsigned id) { id_ = id; } 842 843 bool IsUserDefined() const { return is_user_defined_; } 844 845 const std::vector<std::unique_ptr<AidlArgument>>& GetArguments() const { 846 return arguments_; 847 } 848 // An inout parameter will appear in both GetInArguments() 849 // and GetOutArguments(). AidlMethod retains ownership of the argument 850 // pointers returned in this way. 851 const std::vector<const AidlArgument*>& GetInArguments() const { 852 return in_arguments_; 853 } 854 const std::vector<const AidlArgument*>& GetOutArguments() const { 855 return out_arguments_; 856 } 857 858 // ToString is for dumping AIDL. 859 // Returns string representation of this method including everything. 860 // This is "ret_type name ( arg_list ) = id". 861 // e.g) "boolean foo(int, @Nullable String) = 1" 862 std::string ToString() const; 863 864 // Signature is for comparing AIDL types. 865 // Returns string representation of this method's name & type. 866 // e.g) "foo(int, String)" 867 std::string Signature() const; 868 869 void TraverseChildren(std::function<void(const AidlNode&)> traverse) const override { 870 traverse(GetType()); 871 for (const auto& a : GetArguments()) { 872 traverse(*a); 873 } 874 } 875 void DispatchVisit(AidlVisitor& v) const override { v.Visit(*this); } 876 877 private: 878 bool oneway_; 879 std::unique_ptr<AidlTypeSpecifier> type_; 880 std::string name_; 881 const std::vector<std::unique_ptr<AidlArgument>> arguments_; 882 std::vector<const AidlArgument*> in_arguments_; 883 std::vector<const AidlArgument*> out_arguments_; 884 bool has_id_; 885 int id_; 886 bool is_user_defined_ = true; 887 }; 888 889 // AidlDefinedType represents either an interface, parcelable, or enum that is 890 // defined in the source file. 891 class AidlDefinedType : public AidlAnnotatable { 892 public: 893 AidlDefinedType(const AidlLocation& location, const std::string& name, const Comments& comments, 894 const std::string& package, std::vector<std::unique_ptr<AidlMember>>* members); 895 virtual ~AidlDefinedType() = default; 896 897 // non-copyable, non-movable 898 AidlDefinedType(const AidlDefinedType&) = delete; 899 AidlDefinedType(AidlDefinedType&&) = delete; 900 AidlDefinedType& operator=(const AidlDefinedType&) = delete; 901 AidlDefinedType& operator=(AidlDefinedType&&) = delete; 902 903 const std::string& GetName() const { return name_; }; 904 905 /* dot joined package, example: "android.package.foo" */ 906 std::string GetPackage() const { return package_; } 907 /* dot joined package and name, example: "android.package.foo.IBar" */ 908 std::string GetCanonicalName() const; 909 const std::vector<std::string>& GetSplitPackage() const { return split_package_; } 910 911 virtual std::string GetPreprocessDeclarationName() const = 0; 912 913 virtual const AidlStructuredParcelable* AsStructuredParcelable() const { return nullptr; } 914 virtual const AidlParcelable* AsParcelable() const { return nullptr; } 915 virtual const AidlEnumDeclaration* AsEnumDeclaration() const { return nullptr; } 916 virtual const AidlUnionDecl* AsUnionDeclaration() const { return nullptr; } 917 virtual const AidlInterface* AsInterface() const { return nullptr; } 918 virtual const AidlParameterizable<std::string>* AsParameterizable() const { return nullptr; } 919 virtual bool CheckValid(const AidlTypenames& typenames) const; 920 virtual bool LanguageSpecificCheckValid(const AidlTypenames& typenames, 921 Options::Language lang) const = 0; 922 AidlStructuredParcelable* AsStructuredParcelable() { 923 return const_cast<AidlStructuredParcelable*>( 924 const_cast<const AidlDefinedType*>(this)->AsStructuredParcelable()); 925 } 926 AidlParcelable* AsParcelable() { 927 return const_cast<AidlParcelable*>(const_cast<const AidlDefinedType*>(this)->AsParcelable()); 928 } 929 AidlEnumDeclaration* AsEnumDeclaration() { 930 return const_cast<AidlEnumDeclaration*>( 931 const_cast<const AidlDefinedType*>(this)->AsEnumDeclaration()); 932 } 933 AidlUnionDecl* AsUnionDeclaration() { 934 return const_cast<AidlUnionDecl*>( 935 const_cast<const AidlDefinedType*>(this)->AsUnionDeclaration()); 936 } 937 AidlInterface* AsInterface() { 938 return const_cast<AidlInterface*>(const_cast<const AidlDefinedType*>(this)->AsInterface()); 939 } 940 941 AidlParameterizable<std::string>* AsParameterizable() { 942 return const_cast<AidlParameterizable<std::string>*>( 943 const_cast<const AidlDefinedType*>(this)->AsParameterizable()); 944 } 945 946 const AidlParcelable* AsUnstructuredParcelable() const { 947 if (this->AsStructuredParcelable() != nullptr) return nullptr; 948 if (this->AsUnionDeclaration() != nullptr) return nullptr; 949 return this->AsParcelable(); 950 } 951 AidlParcelable* AsUnstructuredParcelable() { 952 return const_cast<AidlParcelable*>( 953 const_cast<const AidlDefinedType*>(this)->AsUnstructuredParcelable()); 954 } 955 956 const std::vector<std::unique_ptr<AidlVariableDeclaration>>& GetFields() const { 957 return variables_; 958 } 959 const std::vector<std::unique_ptr<AidlConstantDeclaration>>& GetConstantDeclarations() const { 960 return constants_; 961 } 962 const std::vector<std::unique_ptr<AidlMethod>>& GetMethods() const { return methods_; } 963 void AddMethod(std::unique_ptr<AidlMethod> method) { methods_.push_back(std::move(method)); } 964 const std::vector<const AidlMember*>& GetMembers() const { return members_; } 965 void TraverseChildren(std::function<void(const AidlNode&)> traverse) const override { 966 AidlAnnotatable::TraverseChildren(traverse); 967 for (const auto c : GetMembers()) { 968 traverse(*c); 969 } 970 } 971 972 protected: 973 // utility for subclasses with getter names 974 bool CheckValidForGetterNames() const; 975 976 private: 977 bool CheckValidWithMembers(const AidlTypenames& typenames) const; 978 979 std::string name_; 980 const std::string package_; 981 const std::vector<std::string> split_package_; 982 std::vector<std::unique_ptr<AidlVariableDeclaration>> variables_; 983 std::vector<std::unique_ptr<AidlConstantDeclaration>> constants_; 984 std::vector<std::unique_ptr<AidlMethod>> methods_; 985 std::vector<const AidlMember*> members_; // keep members in order of appearance. 986 }; 987 988 class AidlParcelable : public AidlDefinedType, public AidlParameterizable<std::string> { 989 public: 990 AidlParcelable(const AidlLocation& location, const std::string& name, const std::string& package, 991 const Comments& comments, const std::string& cpp_header = "", 992 std::vector<std::string>* type_params = nullptr, 993 std::vector<std::unique_ptr<AidlMember>>* members = nullptr); 994 virtual ~AidlParcelable() = default; 995 996 // non-copyable, non-movable 997 AidlParcelable(const AidlParcelable&) = delete; 998 AidlParcelable(AidlParcelable&&) = delete; 999 AidlParcelable& operator=(const AidlParcelable&) = delete; 1000 AidlParcelable& operator=(AidlParcelable&&) = delete; 1001 1002 std::string GetCppHeader() const { return cpp_header_; } 1003 1004 bool CheckValid(const AidlTypenames& typenames) const override; 1005 bool LanguageSpecificCheckValid(const AidlTypenames& typenames, 1006 Options::Language lang) const override; 1007 const AidlParcelable* AsParcelable() const override { return this; } 1008 const AidlParameterizable<std::string>* AsParameterizable() const override { return this; } 1009 const AidlNode& AsAidlNode() const override { return *this; } 1010 std::string GetPreprocessDeclarationName() const override { return "parcelable"; } 1011 1012 void DispatchVisit(AidlVisitor& v) const override { v.Visit(*this); } 1013 1014 private: 1015 std::string cpp_header_; 1016 }; 1017 1018 class AidlStructuredParcelable : public AidlParcelable { 1019 public: 1020 AidlStructuredParcelable(const AidlLocation& location, const std::string& name, 1021 const std::string& package, const Comments& comments, 1022 std::vector<std::string>* type_params, 1023 std::vector<std::unique_ptr<AidlMember>>* members); 1024 virtual ~AidlStructuredParcelable() = default; 1025 1026 // non-copyable, non-movable 1027 AidlStructuredParcelable(const AidlStructuredParcelable&) = delete; 1028 AidlStructuredParcelable(AidlStructuredParcelable&&) = delete; 1029 AidlStructuredParcelable& operator=(const AidlStructuredParcelable&) = delete; 1030 AidlStructuredParcelable& operator=(AidlStructuredParcelable&&) = delete; 1031 1032 const AidlStructuredParcelable* AsStructuredParcelable() const override { return this; } 1033 std::string GetPreprocessDeclarationName() const override { return "structured_parcelable"; } 1034 1035 bool CheckValid(const AidlTypenames& typenames) const override; 1036 bool LanguageSpecificCheckValid(const AidlTypenames& typenames, 1037 Options::Language lang) const override; 1038 1039 void DispatchVisit(AidlVisitor& v) const override { v.Visit(*this); } 1040 }; 1041 1042 class AidlEnumerator : public AidlCommentable { 1043 public: 1044 AidlEnumerator(const AidlLocation& location, const std::string& name, AidlConstantValue* value, 1045 const Comments& comments); 1046 virtual ~AidlEnumerator() = default; 1047 1048 // non-copyable, non-movable 1049 AidlEnumerator(const AidlEnumerator&) = delete; 1050 AidlEnumerator(AidlEnumerator&&) = delete; 1051 AidlEnumerator& operator=(const AidlEnumerator&) = delete; 1052 AidlEnumerator& operator=(AidlEnumerator&&) = delete; 1053 1054 const std::string& GetName() const { return name_; } 1055 AidlConstantValue* GetValue() const { return value_.get(); } 1056 bool CheckValid(const AidlTypeSpecifier& enum_backing_type) const; 1057 1058 string ValueString(const AidlTypeSpecifier& backing_type, 1059 const ConstantValueDecorator& decorator) const; 1060 1061 void SetValue(std::unique_ptr<AidlConstantValue> value) { value_ = std::move(value); } 1062 bool IsValueUserSpecified() const { return value_user_specified_; } 1063 1064 void TraverseChildren(std::function<void(const AidlNode&)> traverse) const override { 1065 traverse(*value_); 1066 } 1067 void DispatchVisit(AidlVisitor& v) const override { v.Visit(*this); } 1068 1069 private: 1070 const std::string name_; 1071 unique_ptr<AidlConstantValue> value_; 1072 const bool value_user_specified_; 1073 }; 1074 1075 class AidlEnumDeclaration : public AidlDefinedType { 1076 public: 1077 AidlEnumDeclaration(const AidlLocation& location, const string& name, 1078 std::vector<std::unique_ptr<AidlEnumerator>>* enumerators, 1079 const std::string& package, const Comments& comments); 1080 virtual ~AidlEnumDeclaration() = default; 1081 1082 // non-copyable, non-movable 1083 AidlEnumDeclaration(const AidlEnumDeclaration&) = delete; 1084 AidlEnumDeclaration(AidlEnumDeclaration&&) = delete; 1085 AidlEnumDeclaration& operator=(const AidlEnumDeclaration&) = delete; 1086 AidlEnumDeclaration& operator=(AidlEnumDeclaration&&) = delete; 1087 1088 bool Autofill(const AidlTypenames&); 1089 const AidlTypeSpecifier& GetBackingType() const { return *backing_type_; } 1090 const std::vector<std::unique_ptr<AidlEnumerator>>& GetEnumerators() const { 1091 return enumerators_; 1092 } 1093 bool CheckValid(const AidlTypenames& typenames) const override; 1094 bool LanguageSpecificCheckValid(const AidlTypenames& /*typenames*/, 1095 Options::Language) const override { 1096 return true; 1097 } 1098 std::string GetPreprocessDeclarationName() const override { return "enum"; } 1099 1100 const AidlEnumDeclaration* AsEnumDeclaration() const override { return this; } 1101 1102 void TraverseChildren(std::function<void(const AidlNode&)> traverse) const override { 1103 AidlDefinedType::TraverseChildren(traverse); 1104 for (const auto& c : GetEnumerators()) { 1105 traverse(*c); 1106 } 1107 } 1108 void DispatchVisit(AidlVisitor& v) const override { v.Visit(*this); } 1109 1110 private: 1111 1112 const std::string name_; 1113 const std::vector<std::unique_ptr<AidlEnumerator>> enumerators_; 1114 std::unique_ptr<AidlTypeSpecifier> backing_type_; 1115 }; 1116 1117 class AidlUnionDecl : public AidlParcelable { 1118 public: 1119 AidlUnionDecl(const AidlLocation& location, const std::string& name, const std::string& package, 1120 const Comments& comments, std::vector<std::string>* type_params, 1121 std::vector<std::unique_ptr<AidlMember>>* members); 1122 virtual ~AidlUnionDecl() = default; 1123 1124 // non-copyable, non-movable 1125 AidlUnionDecl(const AidlUnionDecl&) = delete; 1126 AidlUnionDecl(AidlUnionDecl&&) = delete; 1127 AidlUnionDecl& operator=(const AidlUnionDecl&) = delete; 1128 AidlUnionDecl& operator=(AidlUnionDecl&&) = delete; 1129 1130 1131 const AidlNode& AsAidlNode() const override { return *this; } 1132 bool CheckValid(const AidlTypenames& typenames) const override; 1133 bool LanguageSpecificCheckValid(const AidlTypenames& typenames, 1134 Options::Language lang) const override; 1135 std::string GetPreprocessDeclarationName() const override { return "union"; } 1136 1137 const AidlUnionDecl* AsUnionDeclaration() const override { return this; } 1138 void DispatchVisit(AidlVisitor& v) const override { v.Visit(*this); } 1139 }; 1140 1141 class AidlInterface final : public AidlDefinedType { 1142 public: 1143 AidlInterface(const AidlLocation& location, const std::string& name, const Comments& comments, 1144 bool oneway_, const std::string& package, 1145 std::vector<std::unique_ptr<AidlMember>>* members); 1146 virtual ~AidlInterface() = default; 1147 1148 // non-copyable, non-movable 1149 AidlInterface(const AidlInterface&) = delete; 1150 AidlInterface(AidlInterface&&) = delete; 1151 AidlInterface& operator=(const AidlInterface&) = delete; 1152 AidlInterface& operator=(AidlInterface&&) = delete; 1153 1154 const AidlInterface* AsInterface() const override { return this; } 1155 std::string GetPreprocessDeclarationName() const override { return "interface"; } 1156 1157 bool CheckValid(const AidlTypenames& typenames) const override; 1158 bool LanguageSpecificCheckValid(const AidlTypenames& typenames, 1159 Options::Language lang) const override; 1160 1161 std::string GetDescriptor() const; 1162 void DispatchVisit(AidlVisitor& v) const override { v.Visit(*this); } 1163 }; 1164 1165 class AidlPackage : public AidlNode { 1166 public: 1167 AidlPackage(const AidlLocation& location, const Comments& comments) 1168 : AidlNode(location, comments) {} 1169 virtual ~AidlPackage() = default; 1170 void TraverseChildren(std::function<void(const AidlNode&)>) const {} 1171 void DispatchVisit(AidlVisitor& v) const { v.Visit(*this); } 1172 }; 1173 1174 class AidlImport : public AidlNode { 1175 public: 1176 AidlImport(const AidlLocation& location, const std::string& needed_class, 1177 const Comments& comments); 1178 virtual ~AidlImport() = default; 1179 1180 // non-copyable, non-movable 1181 AidlImport(const AidlImport&) = delete; 1182 AidlImport(AidlImport&&) = delete; 1183 AidlImport& operator=(const AidlImport&) = delete; 1184 AidlImport& operator=(AidlImport&&) = delete; 1185 1186 const std::string& GetNeededClass() const { return needed_class_; } 1187 void TraverseChildren(std::function<void(const AidlNode&)>) const {} 1188 void DispatchVisit(AidlVisitor& v) const { v.Visit(*this); } 1189 1190 private: 1191 std::string needed_class_; 1192 }; 1193 1194 // AidlDocument models an AIDL file 1195 class AidlDocument : public AidlCommentable { 1196 public: 1197 AidlDocument(const AidlLocation& location, const Comments& comments, 1198 std::vector<std::unique_ptr<AidlImport>> imports, 1199 std::vector<std::unique_ptr<AidlDefinedType>> defined_types) 1200 : AidlCommentable(location, comments), 1201 imports_(std::move(imports)), 1202 defined_types_(std::move(defined_types)) {} 1203 ~AidlDocument() = default; 1204 1205 // non-copyable, non-movable 1206 AidlDocument(const AidlDocument&) = delete; 1207 AidlDocument(AidlDocument&&) = delete; 1208 AidlDocument& operator=(const AidlDocument&) = delete; 1209 AidlDocument& operator=(AidlDocument&&) = delete; 1210 1211 std::optional<std::string> ResolveName(const std::string& unresolved_type) const; 1212 const std::vector<std::unique_ptr<AidlImport>>& Imports() const { return imports_; } 1213 const std::vector<std::unique_ptr<AidlDefinedType>>& DefinedTypes() const { 1214 return defined_types_; 1215 } 1216 1217 void TraverseChildren(std::function<void(const AidlNode&)> traverse) const override { 1218 for (const auto& i : Imports()) { 1219 traverse(*i); 1220 } 1221 for (const auto& t : DefinedTypes()) { 1222 traverse(*t); 1223 } 1224 } 1225 void DispatchVisit(AidlVisitor& v) const override { v.Visit(*this); } 1226 1227 private: 1228 const std::vector<std::unique_ptr<AidlImport>> imports_; 1229 const std::vector<std::unique_ptr<AidlDefinedType>> defined_types_; 1230 }; 1231 1232 template <typename T> 1233 std::optional<T> AidlAnnotation::ParamValue(const std::string& param_name) const { 1234 auto it = parameters_.find(param_name); 1235 if (it == parameters_.end()) { 1236 return std::nullopt; 1237 } 1238 return it->second->EvaluatedValue<T>(); 1239 } 1240 1241 // Utility to make a visitor to visit AST tree in top-down order 1242 // Given: foo 1243 // / \ 1244 // bar baz 1245 // VisitTopDown(v, foo) makes v visit foo -> bar -> baz. 1246 inline void VisitTopDown(AidlVisitor& v, const AidlNode& node) { 1247 std::function<void(const AidlNode&)> top_down = [&](const AidlNode& n) { 1248 n.DispatchVisit(v); 1249 n.TraverseChildren(top_down); 1250 }; 1251 top_down(node); 1252 }