refactor: move members into AidlDefinedType

AidlDefinedType now handles members(constants, methods, variables).
We don't need to use template functions like:

  template <typename TypeWithConstants>
  ...

Bug: n/a
Test: aidl_integration_test
Test: aidl_unittests
Change-Id: If92cd5146c7d1d9efb128eeb162994d42e23f9d8
diff --git a/aidl_language.h b/aidl_language.h
index 9e41bbb..0fccfaa 100644
--- a/aidl_language.h
+++ b/aidl_language.h
@@ -253,7 +253,7 @@
   bool IsFixedSize() const;
   bool IsStableApiParcelable(Options::Language lang) const;
   bool IsHide() const;
-  const AidlAnnotation* JavaDerive() const;
+  bool JavaDerive(const std::string& method) const;
   std::string GetDescriptor() const;
 
   void DumpAnnotations(CodeWriter* writer) const;
@@ -376,9 +376,21 @@
   AidlMember& operator=(const AidlMember&) = delete;
   AidlMember& operator=(AidlMember&&) = delete;
 
-  virtual AidlMethod* AsMethod() { return nullptr; }
-  virtual AidlConstantDeclaration* AsConstantDeclaration() { return nullptr; }
-  virtual AidlVariableDeclaration* AsVariableDeclaration() { return nullptr; }
+  virtual const AidlMethod* AsMethod() const { return nullptr; }
+  virtual const AidlConstantDeclaration* AsConstantDeclaration() const { return nullptr; }
+  virtual const AidlVariableDeclaration* AsVariableDeclaration() const { return nullptr; }
+
+  AidlMethod* AsMethod() {
+    return const_cast<AidlMethod*>(const_cast<const AidlMember*>(this)->AsMethod());
+  }
+  AidlConstantDeclaration* AsConstantDeclaration() {
+    return const_cast<AidlConstantDeclaration*>(
+        const_cast<const AidlMember*>(this)->AsConstantDeclaration());
+  }
+  AidlVariableDeclaration* AsVariableDeclaration() {
+    return const_cast<AidlVariableDeclaration*>(
+        const_cast<const AidlMember*>(this)->AsVariableDeclaration());
+  }
 };
 
 // TODO: This class is used for method arguments and also parcelable fields,
@@ -398,7 +410,7 @@
   AidlVariableDeclaration& operator=(const AidlVariableDeclaration&) = delete;
   AidlVariableDeclaration& operator=(AidlVariableDeclaration&&) = delete;
 
-  AidlVariableDeclaration* AsVariableDeclaration() override { return this; }
+  const AidlVariableDeclaration* AsVariableDeclaration() const override { return this; }
 
   std::string GetName() const { return name_; }
   std::string GetCapitalizedName() const;
@@ -628,7 +640,7 @@
     return value_->ValueString(GetType(), decorator);
   }
 
-  AidlConstantDeclaration* AsConstantDeclaration() override { return this; }
+  const AidlConstantDeclaration* AsConstantDeclaration() const override { return this; }
 
  private:
   const unique_ptr<AidlTypeSpecifier> type_;
@@ -651,7 +663,7 @@
   AidlMethod& operator=(const AidlMethod&) = delete;
   AidlMethod& operator=(AidlMethod&&) = delete;
 
-  AidlMethod* AsMethod() override { return this; }
+  const AidlMethod* AsMethod() const override { return this; }
   bool IsHidden() const;
   const string& GetComments() const { return comments_; }
   const AidlTypeSpecifier& GetType() const { return *type_; }
@@ -716,7 +728,8 @@
 class AidlDefinedType : public AidlAnnotatable {
  public:
   AidlDefinedType(const AidlLocation& location, const std::string& name,
-                  const std::string& comments, const std::string& package);
+                  const std::string& comments, const std::string& package,
+                  std::vector<std::unique_ptr<AidlMember>>* members);
   virtual ~AidlDefinedType() = default;
 
   // non-copyable, non-movable
@@ -784,18 +797,39 @@
   virtual void Dump(CodeWriter* writer) const = 0;
   void DumpHeader(CodeWriter* writer) const;
 
+  const std::vector<std::unique_ptr<AidlVariableDeclaration>>& GetFields() const {
+    return variables_;
+  }
+  const std::vector<std::unique_ptr<AidlConstantDeclaration>>& GetConstantDeclarations() const {
+    return constants_;
+  }
+  const std::vector<std::unique_ptr<AidlMethod>>& GetMethods() const { return methods_; }
+  void AddMethod(std::unique_ptr<AidlMethod> method) { methods_.push_back(std::move(method)); }
+  const std::vector<const AidlMember*>& GetMembers() const { return members_; }
+
+ protected:
+  // utility for subclasses with getter names
+  bool CheckValidForGetterNames() const;
+
  private:
+  bool CheckValidWithMembers(const AidlTypenames& typenames) const;
+
   std::string name_;
   std::string comments_;
   const std::string package_;
   const std::vector<std::string> split_package_;
+  std::vector<std::unique_ptr<AidlVariableDeclaration>> variables_;
+  std::vector<std::unique_ptr<AidlConstantDeclaration>> constants_;
+  std::vector<std::unique_ptr<AidlMethod>> methods_;
+  std::vector<const AidlMember*> members_;  // keep members in order of appearance.
 };
 
 class AidlParcelable : public AidlDefinedType, public AidlParameterizable<std::string> {
  public:
   AidlParcelable(const AidlLocation& location, const std::string& name, const std::string& package,
                  const std::string& comments, const std::string& cpp_header = "",
-                 std::vector<std::string>* type_params = nullptr);
+                 std::vector<std::string>* type_params = nullptr,
+                 std::vector<std::unique_ptr<AidlMember>>* members = nullptr);
   virtual ~AidlParcelable() = default;
 
   // non-copyable, non-movable
@@ -821,32 +855,12 @@
   std::string cpp_header_;
 };
 
-class AidlWithMembers {
- public:
-  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:
-  std::vector<std::unique_ptr<AidlVariableDeclaration>> variables_;
-  std::vector<std::unique_ptr<AidlConstantDeclaration>> constants_;
-};
-
-class AidlStructuredParcelable : public AidlParcelable, public AidlWithMembers {
+class AidlStructuredParcelable : public AidlParcelable {
  public:
   AidlStructuredParcelable(const AidlLocation& location, const std::string& name,
                            const std::string& package, const std::string& comments,
-                           std::vector<std::unique_ptr<AidlMember>>* members,
-                           std::vector<std::string>* type_params);
+                           std::vector<std::string>* type_params,
+                           std::vector<std::unique_ptr<AidlMember>>* members);
   virtual ~AidlStructuredParcelable() = default;
 
   // non-copyable, non-movable
@@ -930,11 +944,11 @@
   std::unique_ptr<const AidlTypeSpecifier> backing_type_;
 };
 
-class AidlUnionDecl : public AidlParcelable, public AidlWithMembers {
+class AidlUnionDecl : public AidlParcelable {
  public:
   AidlUnionDecl(const AidlLocation& location, const std::string& name, const std::string& package,
-                const std::string& comments, std::vector<std::unique_ptr<AidlMember>>* members,
-                std::vector<std::string>* type_params);
+                const std::string& comments, std::vector<std::string>* type_params,
+                std::vector<std::unique_ptr<AidlMember>>* members);
   virtual ~AidlUnionDecl() = default;
 
   // non-copyable, non-movable
@@ -959,8 +973,8 @@
 class AidlInterface final : public AidlDefinedType {
  public:
   AidlInterface(const AidlLocation& location, const std::string& name, const std::string& comments,
-                bool oneway_, std::vector<std::unique_ptr<AidlMember>>* members,
-                const std::string& package);
+                bool oneway_, const std::string& package,
+                std::vector<std::unique_ptr<AidlMember>>* members);
   virtual ~AidlInterface() = default;
 
   // non-copyable, non-movable
@@ -969,13 +983,6 @@
   AidlInterface& operator=(const AidlInterface&) = delete;
   AidlInterface& operator=(AidlInterface&&) = delete;
 
-  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"; }
 
@@ -987,10 +994,6 @@
                                   Options::Language lang) const override;
 
   std::string GetDescriptor() const;
-
- private:
-  std::vector<std::unique_ptr<AidlMethod>> methods_;
-  std::vector<std::unique_ptr<AidlConstantDeclaration>> constants_;
 };
 
 class AidlImport : public AidlNode {