support const in parcelable/union

const values are now available in parcelable/union as well as interface.

Bug: 173225412
Test: CtsNdkBinderTestCases
Test: aidl_unittests
Test: aidl_integration_test
Change-Id: Ifab53c6b0e6674710f1206b7d2e2ca677d5430c6
diff --git a/aidl_language.h b/aidl_language.h
index 5b0ecc3..9e41bbb 100644
--- a/aidl_language.h
+++ b/aidl_language.h
@@ -361,10 +361,30 @@
 std::string AidlConstantValueDecorator(const AidlTypeSpecifier& type, const std::string& raw_value);
 
 class AidlConstantValue;
+class AidlMethod;
+class AidlConstantDeclaration;
+class AidlVariableDeclaration;
+
+class AidlMember : public AidlNode {
+ public:
+  AidlMember(const AidlLocation& location);
+  virtual ~AidlMember() = default;
+
+  // non-copyable, non-movable
+  AidlMember(const AidlMember&) = delete;
+  AidlMember(AidlMember&&) = delete;
+  AidlMember& operator=(const AidlMember&) = delete;
+  AidlMember& operator=(AidlMember&&) = delete;
+
+  virtual AidlMethod* AsMethod() { return nullptr; }
+  virtual AidlConstantDeclaration* AsConstantDeclaration() { return nullptr; }
+  virtual AidlVariableDeclaration* AsVariableDeclaration() { return nullptr; }
+};
+
 // TODO: This class is used for method arguments and also parcelable fields,
 // and it should be split up since default values don't apply to method
 // arguments
-class AidlVariableDeclaration : public AidlNode {
+class AidlVariableDeclaration : public AidlMember {
  public:
   AidlVariableDeclaration(const AidlLocation& location, AidlTypeSpecifier* type,
                           const std::string& name);
@@ -378,6 +398,8 @@
   AidlVariableDeclaration& operator=(const AidlVariableDeclaration&) = delete;
   AidlVariableDeclaration& operator=(AidlVariableDeclaration&&) = delete;
 
+  AidlVariableDeclaration* AsVariableDeclaration() override { return this; }
+
   std::string GetName() const { return name_; }
   std::string GetCapitalizedName() const;
   const AidlTypeSpecifier& GetType() const { return *type_; }
@@ -444,24 +466,6 @@
   bool direction_specified_;
 };
 
-class AidlMethod;
-class AidlConstantDeclaration;
-class AidlEnumDeclaration;
-class AidlMember : public AidlNode {
- public:
-  AidlMember(const AidlLocation& location);
-  virtual ~AidlMember() = default;
-
-  // non-copyable, non-movable
-  AidlMember(const AidlMember&) = delete;
-  AidlMember(AidlMember&&) = delete;
-  AidlMember& operator=(const AidlMember&) = delete;
-  AidlMember& operator=(AidlMember&&) = delete;
-
-  virtual AidlMethod* AsMethod() { return nullptr; }
-  virtual AidlConstantDeclaration* AsConstantDeclaration() { return nullptr; }
-};
-
 class AidlUnaryConstExpression;
 class AidlBinaryConstExpression;
 
@@ -705,12 +709,8 @@
 class AidlInterface;
 class AidlParcelable;
 class AidlStructuredParcelable;
-
-class AidlInterface;
-class AidlParcelable;
-class AidlStructuredParcelable;
-
 class AidlUnionDecl;
+
 // AidlDefinedType represents either an interface, parcelable, or enum that is
 // defined in the source file.
 class AidlDefinedType : public AidlAnnotatable {
@@ -821,28 +821,31 @@
   std::string cpp_header_;
 };
 
-class AidlWithFields {
+class AidlWithMembers {
  public:
-  AidlWithFields(std::vector<std::unique_ptr<AidlVariableDeclaration>>* variables)
-      : variables_(std::move(*variables)) {}
+  AidlWithMembers(std::vector<std::unique_ptr<AidlMember>>* members);
 
   const std::vector<std::unique_ptr<AidlVariableDeclaration>>& GetFields() const {
     return variables_;
   }
+  const std::vector<std::unique_ptr<AidlConstantDeclaration>>& GetConstantDeclarations() const {
+    return constants_;
+  }
 
  protected:
   bool CheckValid(const AidlParcelable& parcel, const AidlTypenames& typenames) const;
   bool CheckValidForGetterNames(const AidlParcelable& parcel) const;
 
  private:
-  const std::vector<std::unique_ptr<AidlVariableDeclaration>> variables_;
+  std::vector<std::unique_ptr<AidlVariableDeclaration>> variables_;
+  std::vector<std::unique_ptr<AidlConstantDeclaration>> constants_;
 };
 
-class AidlStructuredParcelable : public AidlParcelable, public AidlWithFields {
+class AidlStructuredParcelable : public AidlParcelable, public AidlWithMembers {
  public:
   AidlStructuredParcelable(const AidlLocation& location, const std::string& name,
                            const std::string& package, const std::string& comments,
-                           std::vector<std::unique_ptr<AidlVariableDeclaration>>* variables,
+                           std::vector<std::unique_ptr<AidlMember>>* members,
                            std::vector<std::string>* type_params);
   virtual ~AidlStructuredParcelable() = default;
 
@@ -927,11 +930,10 @@
   std::unique_ptr<const AidlTypeSpecifier> backing_type_;
 };
 
-class AidlUnionDecl : public AidlParcelable, public AidlWithFields {
+class AidlUnionDecl : public AidlParcelable, public AidlWithMembers {
  public:
   AidlUnionDecl(const AidlLocation& location, const std::string& name, const std::string& package,
-                const std::string& comments,
-                std::vector<std::unique_ptr<AidlVariableDeclaration>>* variables,
+                const std::string& comments, std::vector<std::unique_ptr<AidlMember>>* members,
                 std::vector<std::string>* type_params);
   virtual ~AidlUnionDecl() = default;
 
@@ -967,13 +969,13 @@
   AidlInterface& operator=(const AidlInterface&) = delete;
   AidlInterface& operator=(AidlInterface&&) = delete;
 
-  const std::vector<std::unique_ptr<AidlMethod>>& GetMethods() const
-      { return methods_; }
-  std::vector<std::unique_ptr<AidlMethod>>& GetMutableMethods() { return methods_; }
+  const std::vector<std::unique_ptr<AidlMethod>>& GetMethods() const { return methods_; }
   const std::vector<std::unique_ptr<AidlConstantDeclaration>>& GetConstantDeclarations() const {
     return constants_;
   }
 
+  void AddMethod(std::unique_ptr<AidlMethod> method) { methods_.push_back(std::move(method)); }
+
   const AidlInterface* AsInterface() const override { return this; }
   std::string GetPreprocessDeclarationName() const override { return "interface"; }