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