Union can be @JavaOnlyImmutable

For now it doesn't affect generated code, but it enables immutable
parcelables can have immutable unions. Upcoming change will make
generated class immutable when a union is annotated as
@JavaOnlyImmutable.

Introduced "AidlWithFields" which can handles fields of parcelable
classes(AidlStructuredParcelable and AidlUnionDeclaration).

Bug: 171637180
Test: aidl_unittests / aidl_integration_test
Change-Id: I492722eeed36e8a7e6f0eb81ef292d2caff5d624
diff --git a/aidl_language.h b/aidl_language.h
index 73f2d66..dbd987e 100644
--- a/aidl_language.h
+++ b/aidl_language.h
@@ -762,7 +762,24 @@
   std::string cpp_header_;
 };
 
-class AidlStructuredParcelable : public AidlParcelable {
+class AidlWithFields {
+ public:
+  AidlWithFields(std::vector<std::unique_ptr<AidlVariableDeclaration>>* variables)
+      : variables_(std::move(*variables)) {}
+
+  const std::vector<std::unique_ptr<AidlVariableDeclaration>>& GetFields() const {
+    return variables_;
+  }
+
+ 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_;
+};
+
+class AidlStructuredParcelable : public AidlParcelable, public AidlWithFields {
  public:
   AidlStructuredParcelable(const AidlLocation& location, const std::string& name,
                            const std::string& package, const std::string& comments,
@@ -776,10 +793,6 @@
   AidlStructuredParcelable& operator=(const AidlStructuredParcelable&) = delete;
   AidlStructuredParcelable& operator=(AidlStructuredParcelable&&) = delete;
 
-  const std::vector<std::unique_ptr<AidlVariableDeclaration>>& GetFields() const {
-    return variables_;
-  }
-
   const AidlStructuredParcelable* AsStructuredParcelable() const override { return this; }
   std::string GetPreprocessDeclarationName() const override { return "structured_parcelable"; }
 
@@ -789,9 +802,6 @@
   bool CheckValid(const AidlTypenames& typenames) const override;
   bool LanguageSpecificCheckValid(const AidlTypenames& typenames,
                                   Options::Language lang) const override;
-
- private:
-  const std::vector<std::unique_ptr<AidlVariableDeclaration>> variables_;
 };
 
 class AidlEnumerator : public AidlNode {
@@ -858,7 +868,7 @@
   std::unique_ptr<const AidlTypeSpecifier> backing_type_;
 };
 
-class AidlUnionDecl : public AidlParcelable {
+class AidlUnionDecl : public AidlParcelable, public AidlWithFields {
  public:
   AidlUnionDecl(const AidlLocation& location, const std::string& name, const std::string& package,
                 const std::string& comments,
@@ -876,9 +886,6 @@
 
   const AidlNode& AsAidlNode() const override { return *this; }
 
-  const std::vector<std::unique_ptr<AidlVariableDeclaration>>& GetFields() const {
-    return variables_;
-  }
   bool CheckValid(const AidlTypenames& typenames) const override;
   bool LanguageSpecificCheckValid(const AidlTypenames& typenames,
                                   Options::Language lang) const override;
@@ -886,9 +893,6 @@
 
   void Dump(CodeWriter* writer) const override;
   const AidlUnionDecl* AsUnionDeclaration() const override { return this; }
-
- private:
-  const std::vector<std::unique_ptr<AidlVariableDeclaration>> variables_;
 };
 
 class AidlInterface final : public AidlDefinedType {