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