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