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 &param;
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