• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 &param;
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