union: java backend

union is a parcelable which can hold only a single field with a tag.

Example:
  union Union {
    int n;
    String s;
  }

In Java, you can instantiate it with
- default constructor: init with first field
- value constructor: Union.n(42) or Union.s("abc")

You can query "tag" before getting the contents from it.
It also supports getter/setter.

Example:
  void foo(Union u) {
    if (u.getTag() == Union.n) {  // query
      int n = u.getN();           // getter
      ...
    }
    u.setS("abc");                // setter
  }

Bug: 150948558
Test: atest aidl_integration_test
Change-Id: I5c2d87e09462c0d3c6617d73fdf0e49c281d551e
diff --git a/aidl_language.h b/aidl_language.h
index a648232..6a5932d 100644
--- a/aidl_language.h
+++ b/aidl_language.h
@@ -646,6 +646,8 @@
 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 {
@@ -676,6 +678,7 @@
   virtual const AidlStructuredParcelable* AsStructuredParcelable() const { return nullptr; }
   virtual const AidlParcelable* AsParcelable() const { return nullptr; }
   virtual const AidlEnumDeclaration* AsEnumDeclaration() const { return nullptr; }
+  virtual const AidlUnionDecl* AsUnionDeclaration() const { return nullptr; }
   virtual const AidlInterface* AsInterface() const { return nullptr; }
   virtual const AidlParameterizable<std::string>* AsParameterizable() const { return nullptr; }
   bool CheckValid(const AidlTypenames& typenames) const override;
@@ -692,6 +695,10 @@
     return const_cast<AidlEnumDeclaration*>(
         const_cast<const AidlDefinedType*>(this)->AsEnumDeclaration());
   }
+  AidlUnionDecl* AsUnionDeclaration() {
+    return const_cast<AidlUnionDecl*>(
+        const_cast<const AidlDefinedType*>(this)->AsUnionDeclaration());
+  }
   AidlInterface* AsInterface() {
     return const_cast<AidlInterface*>(const_cast<const AidlDefinedType*>(this)->AsInterface());
   }
@@ -703,6 +710,7 @@
 
   const AidlParcelable* AsUnstructuredParcelable() const {
     if (this->AsStructuredParcelable() != nullptr) return nullptr;
+    if (this->AsUnionDeclaration() != nullptr) return nullptr;
     return this->AsParcelable();
   }
   AidlParcelable* AsUnstructuredParcelable() {
@@ -846,6 +854,40 @@
   std::unique_ptr<const AidlTypeSpecifier> backing_type_;
 };
 
+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<AidlVariableDeclaration>>* variables,
+                std::vector<std::string>* type_params);
+  virtual ~AidlUnionDecl() = default;
+
+  // non-copyable, non-movable
+  AidlUnionDecl(const AidlUnionDecl&) = delete;
+  AidlUnionDecl(AidlUnionDecl&&) = delete;
+  AidlUnionDecl& operator=(const AidlUnionDecl&) = delete;
+  AidlUnionDecl& operator=(AidlUnionDecl&&) = delete;
+
+  std::set<AidlAnnotation::Type> GetSupportedAnnotations() const override;
+
+  const AidlNode& AsAidlNode() const override { return *this; }
+
+  const std::vector<std::unique_ptr<AidlVariableDeclaration>>& GetFields() const {
+    return variables_;
+  }
+  bool LanguageSpecificCheckValid(const AidlTypenames& /*typenames*/,
+                                  Options::Language) const override {
+    return true;
+  }
+  std::string GetPreprocessDeclarationName() const override { return "union"; }
+
+  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 {
  public:
   AidlInterface(const AidlLocation& location, const std::string& name, const std::string& comments,