Add support for xunions.

Change-Id: I08954e5079e6c55e314d8fd488e231165ce603c4
diff --git a/src/fuchsia/developer/plugin/fidl/BUILD b/src/fuchsia/developer/plugin/fidl/BUILD
index 8a13b03..d324d46 100644
--- a/src/fuchsia/developer/plugin/fidl/BUILD
+++ b/src/fuchsia/developer/plugin/fidl/BUILD
@@ -25,98 +25,102 @@
 
 GEN_SRCS_PARSE = [
     "fuchsia/developer/plugin/fidl/parser/Parser.java",
-    "fuchsia/developer/plugin/fidl/psi/FidlBracketAttributeList.java",
-    "fuchsia/developer/plugin/fidl/psi/FidlDocAttributeList.java",
-    "fuchsia/developer/plugin/fidl/psi/FidlInterfaceDeclaration.java",
-    "fuchsia/developer/plugin/fidl/psi/FidlVectorType.java",
-    "fuchsia/developer/plugin/fidl/psi/FidlPrimitiveType.java",
-    "fuchsia/developer/plugin/fidl/psi/FidlUsingList.java",
-    "fuchsia/developer/plugin/fidl/psi/FidlInterfaceMethod.java",
-    "fuchsia/developer/plugin/fidl/psi/FidlCompoundIdentifier.java",
-    "fuchsia/developer/plugin/fidl/psi/FidlEnumMemberValue.java",
-    "fuchsia/developer/plugin/fidl/psi/FidlParameter.java",
-    "fuchsia/developer/plugin/fidl/psi/FidlLiteral.java",
-    "fuchsia/developer/plugin/fidl/psi/FidlAttributeList.java",
-    "fuchsia/developer/plugin/fidl/psi/FidlDeclarationList.java",
-    "fuchsia/developer/plugin/fidl/psi/FidlDeclaration.java",
-    "fuchsia/developer/plugin/fidl/psi/FidlSuperInterfaceList.java",
-    "fuchsia/developer/plugin/fidl/psi/FidlInterfaceParameters.java",
-    "fuchsia/developer/plugin/fidl/psi/FidlVisitor.java",
-    "fuchsia/developer/plugin/fidl/psi/FidlEnumMember.java",
-    "fuchsia/developer/plugin/fidl/psi/FidlIdentifierType.java",
-    "fuchsia/developer/plugin/fidl/psi/FidlIdentifierToken.java",
-    "fuchsia/developer/plugin/fidl/psi/FidlConstDeclaration.java",
-    "fuchsia/developer/plugin/fidl/psi/FidlStructDeclaration.java",
-    "fuchsia/developer/plugin/fidl/psi/FidlTableDeclaration.java",
-    "fuchsia/developer/plugin/fidl/psi/FidlParameters.java",
     "fuchsia/developer/plugin/fidl/psi/FidlArrayType.java",
-    "fuchsia/developer/plugin/fidl/psi/FidlHandleSubtype.java",
-    "fuchsia/developer/plugin/fidl/psi/FidlLibraryHeader.java",
-    "fuchsia/developer/plugin/fidl/psi/FidlOrdinal.java",
-    "fuchsia/developer/plugin/fidl/psi/Types.java",
+    "fuchsia/developer/plugin/fidl/psi/FidlAttribute.java",
+    "fuchsia/developer/plugin/fidl/psi/FidlAttributeList.java",
     "fuchsia/developer/plugin/fidl/psi/FidlAttributes.java",
-    "fuchsia/developer/plugin/fidl/psi/FidlUsingDeclaration.java",
-    "fuchsia/developer/plugin/fidl/psi/FidlStringType.java",
+    "fuchsia/developer/plugin/fidl/psi/FidlBracketAttributeList.java",
+    "fuchsia/developer/plugin/fidl/psi/FidlCompoundIdentifier.java",
     "fuchsia/developer/plugin/fidl/psi/FidlConstant.java",
-    "fuchsia/developer/plugin/fidl/psi/FidlType.java",
+    "fuchsia/developer/plugin/fidl/psi/FidlConstDeclaration.java",
+    "fuchsia/developer/plugin/fidl/psi/FidlDeclaration.java",
+    "fuchsia/developer/plugin/fidl/psi/FidlDeclarationList.java",
+    "fuchsia/developer/plugin/fidl/psi/FidlDocAttributeList.java",
+    "fuchsia/developer/plugin/fidl/psi/FidlEnumDeclaration.java",
+    "fuchsia/developer/plugin/fidl/psi/FidlEnumMember.java",
+    "fuchsia/developer/plugin/fidl/psi/FidlEnumMemberValue.java",
+    "fuchsia/developer/plugin/fidl/psi/FidlHandleSubtype.java",
     "fuchsia/developer/plugin/fidl/psi/FidlHandleType.java",
+    "fuchsia/developer/plugin/fidl/psi/FidlIdentifierToken.java",
+    "fuchsia/developer/plugin/fidl/psi/FidlIdentifierType.java",
+    "fuchsia/developer/plugin/fidl/psi/FidlIntegerType.java",
+    "fuchsia/developer/plugin/fidl/psi/FidlInterfaceDeclaration.java",
+    "fuchsia/developer/plugin/fidl/psi/FidlInterfaceMethod.java",
+    "fuchsia/developer/plugin/fidl/psi/FidlInterfaceParameters.java",
+    "fuchsia/developer/plugin/fidl/psi/FidlLibraryHeader.java",
+    "fuchsia/developer/plugin/fidl/psi/FidlLiteral.java",
+    "fuchsia/developer/plugin/fidl/psi/FidlOrdinal.java",
+    "fuchsia/developer/plugin/fidl/psi/FidlParameter.java",
+    "fuchsia/developer/plugin/fidl/psi/FidlParameterList.java",
+    "fuchsia/developer/plugin/fidl/psi/FidlParameters.java",
+    "fuchsia/developer/plugin/fidl/psi/FidlPopulatedTableField.java",
+    "fuchsia/developer/plugin/fidl/psi/FidlPrimitiveType.java",
+    "fuchsia/developer/plugin/fidl/psi/FidlRequestType.java",
+    "fuchsia/developer/plugin/fidl/psi/FidlReservedTableField.java",
+    "fuchsia/developer/plugin/fidl/psi/FidlStringType.java",
+    "fuchsia/developer/plugin/fidl/psi/FidlStructDeclaration.java",
+    "fuchsia/developer/plugin/fidl/psi/FidlStructField.java",
+    "fuchsia/developer/plugin/fidl/psi/FidlSuperInterfaceList.java",
+    "fuchsia/developer/plugin/fidl/psi/FidlTableDeclaration.java",
+    "fuchsia/developer/plugin/fidl/psi/FidlTableField.java",
+    "fuchsia/developer/plugin/fidl/psi/FidlType.java",
+    "fuchsia/developer/plugin/fidl/psi/FidlUnionDeclaration.java",
     "fuchsia/developer/plugin/fidl/psi/FidlUnionField.java",
+    "fuchsia/developer/plugin/fidl/psi/FidlUsingDeclaration.java",
+    "fuchsia/developer/plugin/fidl/psi/FidlUsing.java",
+    "fuchsia/developer/plugin/fidl/psi/FidlUsingList.java",
+    "fuchsia/developer/plugin/fidl/psi/FidlVectorType.java",
+    "fuchsia/developer/plugin/fidl/psi/FidlVisitor.java",
+    "fuchsia/developer/plugin/fidl/psi/FidlXunionDeclaration.java",
+    "fuchsia/developer/plugin/fidl/psi/FidlXunionField.java",
+    "fuchsia/developer/plugin/fidl/psi/impl/FidlArrayTypeImpl.java",
+    "fuchsia/developer/plugin/fidl/psi/impl/FidlAttributeImpl.java",
+    "fuchsia/developer/plugin/fidl/psi/impl/FidlAttributeListImpl.java",
+    "fuchsia/developer/plugin/fidl/psi/impl/FidlAttributesImpl.java",
     "fuchsia/developer/plugin/fidl/psi/impl/FidlBracketAttributeListImpl.java",
-    "fuchsia/developer/plugin/fidl/psi/impl/FidlDocAttributeListImpl.java",
-    "fuchsia/developer/plugin/fidl/psi/impl/FidlUsingImpl.java",
-    "fuchsia/developer/plugin/fidl/psi/impl/FidlEnumDeclarationImpl.java",
-    "fuchsia/developer/plugin/fidl/psi/impl/FidlUsingListImpl.java",
-    "fuchsia/developer/plugin/fidl/psi/impl/FidlStructDeclarationImpl.java",
-    "fuchsia/developer/plugin/fidl/psi/impl/FidlTableDeclarationImpl.java",
-    "fuchsia/developer/plugin/fidl/psi/impl/FidlOrdinalImpl.java",
-    "fuchsia/developer/plugin/fidl/psi/impl/FidlPrimitiveTypeImpl.java",
     "fuchsia/developer/plugin/fidl/psi/impl/FidlCompoundIdentifierImpl.java",
+    "fuchsia/developer/plugin/fidl/psi/impl/FidlConstantImpl.java",
+    "fuchsia/developer/plugin/fidl/psi/impl/FidlConstDeclarationImpl.java",
+    "fuchsia/developer/plugin/fidl/psi/impl/FidlDeclarationImpl.java",
+    "fuchsia/developer/plugin/fidl/psi/impl/FidlDeclarationListImpl.java",
+    "fuchsia/developer/plugin/fidl/psi/impl/FidlDocAttributeListImpl.java",
+    "fuchsia/developer/plugin/fidl/psi/impl/FidlEnumDeclarationImpl.java",
+    "fuchsia/developer/plugin/fidl/psi/impl/FidlEnumMemberImpl.java",
+    "fuchsia/developer/plugin/fidl/psi/impl/FidlEnumMemberValueImpl.java",
     "fuchsia/developer/plugin/fidl/psi/impl/FidlHandleSubtypeImpl.java",
-    "fuchsia/developer/plugin/fidl/psi/impl/FidlIdentifierTypeImpl.java",
-    "fuchsia/developer/plugin/fidl/psi/impl/FidlIdentifierTokenImpl.java",
-    "fuchsia/developer/plugin/fidl/psi/impl/FidlUsingDeclarationImpl.java",
-    "fuchsia/developer/plugin/fidl/psi/impl/FidlUnionFieldImpl.java",
-    "fuchsia/developer/plugin/fidl/psi/impl/FidlStructFieldImpl.java",
-    "fuchsia/developer/plugin/fidl/psi/impl/FidlPopulatedTableFieldImpl.java",
-    "fuchsia/developer/plugin/fidl/psi/impl/FidlReservedTableFieldImpl.java",
-    "fuchsia/developer/plugin/fidl/psi/impl/FidlTableFieldImpl.java",
     "fuchsia/developer/plugin/fidl/psi/impl/FidlHandleTypeImpl.java",
-    "fuchsia/developer/plugin/fidl/psi/impl/FidlVectorTypeImpl.java",
-    "fuchsia/developer/plugin/fidl/psi/impl/FidlStringTypeImpl.java",
-    "fuchsia/developer/plugin/fidl/psi/impl/FidlLiteralImpl.java",
-    "fuchsia/developer/plugin/fidl/psi/impl/FidlParametersImpl.java",
-    "fuchsia/developer/plugin/fidl/psi/impl/FidlTypeImpl.java",
-    "fuchsia/developer/plugin/fidl/psi/impl/FidlInterfaceParametersImpl.java",
-    "fuchsia/developer/plugin/fidl/psi/impl/FidlLibraryHeaderImpl.java",
+    "fuchsia/developer/plugin/fidl/psi/impl/FidlIdentifierTokenImpl.java",
+    "fuchsia/developer/plugin/fidl/psi/impl/FidlIdentifierTypeImpl.java",
     "fuchsia/developer/plugin/fidl/psi/impl/FidlIntegerTypeImpl.java",
     "fuchsia/developer/plugin/fidl/psi/impl/FidlInterfaceDeclarationImpl.java",
     "fuchsia/developer/plugin/fidl/psi/impl/FidlInterfaceMethodImpl.java",
-    "fuchsia/developer/plugin/fidl/psi/impl/FidlAttributeListImpl.java",
-    "fuchsia/developer/plugin/fidl/psi/impl/FidlConstantImpl.java",
-    "fuchsia/developer/plugin/fidl/psi/impl/FidlConstDeclarationImpl.java",
-    "fuchsia/developer/plugin/fidl/psi/impl/FidlAttributeImpl.java",
-    "fuchsia/developer/plugin/fidl/psi/impl/FidlEnumMemberImpl.java",
-    "fuchsia/developer/plugin/fidl/psi/impl/FidlSuperInterfaceListImpl.java",
-    "fuchsia/developer/plugin/fidl/psi/impl/FidlUnionDeclarationImpl.java",
-    "fuchsia/developer/plugin/fidl/psi/impl/FidlDeclarationListImpl.java",
+    "fuchsia/developer/plugin/fidl/psi/impl/FidlInterfaceParametersImpl.java",
+    "fuchsia/developer/plugin/fidl/psi/impl/FidlLibraryHeaderImpl.java",
+    "fuchsia/developer/plugin/fidl/psi/impl/FidlLiteralImpl.java",
+    "fuchsia/developer/plugin/fidl/psi/impl/FidlOrdinalImpl.java",
     "fuchsia/developer/plugin/fidl/psi/impl/FidlParameterImpl.java",
-    "fuchsia/developer/plugin/fidl/psi/impl/FidlDeclarationImpl.java",
-    "fuchsia/developer/plugin/fidl/psi/impl/FidlAttributesImpl.java",
-    "fuchsia/developer/plugin/fidl/psi/impl/FidlRequestTypeImpl.java",
-    "fuchsia/developer/plugin/fidl/psi/impl/FidlArrayTypeImpl.java",
     "fuchsia/developer/plugin/fidl/psi/impl/FidlParameterListImpl.java",
-    "fuchsia/developer/plugin/fidl/psi/impl/FidlEnumMemberValueImpl.java",
-    "fuchsia/developer/plugin/fidl/psi/FidlAttribute.java",
-    "fuchsia/developer/plugin/fidl/psi/FidlUsing.java",
-    "fuchsia/developer/plugin/fidl/psi/FidlRequestType.java",
-    "fuchsia/developer/plugin/fidl/psi/FidlParameterList.java",
-    "fuchsia/developer/plugin/fidl/psi/FidlIntegerType.java",
-    "fuchsia/developer/plugin/fidl/psi/FidlUnionDeclaration.java",
-    "fuchsia/developer/plugin/fidl/psi/FidlStructField.java",
-    "fuchsia/developer/plugin/fidl/psi/FidlPopulatedTableField.java",
-    "fuchsia/developer/plugin/fidl/psi/FidlReservedTableField.java",
-    "fuchsia/developer/plugin/fidl/psi/FidlTableField.java",
-    "fuchsia/developer/plugin/fidl/psi/FidlEnumDeclaration.java",
+    "fuchsia/developer/plugin/fidl/psi/impl/FidlParametersImpl.java",
+    "fuchsia/developer/plugin/fidl/psi/impl/FidlPopulatedTableFieldImpl.java",
+    "fuchsia/developer/plugin/fidl/psi/impl/FidlPrimitiveTypeImpl.java",
+    "fuchsia/developer/plugin/fidl/psi/impl/FidlRequestTypeImpl.java",
+    "fuchsia/developer/plugin/fidl/psi/impl/FidlReservedTableFieldImpl.java",
+    "fuchsia/developer/plugin/fidl/psi/impl/FidlStringTypeImpl.java",
+    "fuchsia/developer/plugin/fidl/psi/impl/FidlStructDeclarationImpl.java",
+    "fuchsia/developer/plugin/fidl/psi/impl/FidlStructFieldImpl.java",
+    "fuchsia/developer/plugin/fidl/psi/impl/FidlSuperInterfaceListImpl.java",
+    "fuchsia/developer/plugin/fidl/psi/impl/FidlTableDeclarationImpl.java",
+    "fuchsia/developer/plugin/fidl/psi/impl/FidlTableFieldImpl.java",
+    "fuchsia/developer/plugin/fidl/psi/impl/FidlTypeImpl.java",
+    "fuchsia/developer/plugin/fidl/psi/impl/FidlUnionDeclarationImpl.java",
+    "fuchsia/developer/plugin/fidl/psi/impl/FidlUnionFieldImpl.java",
+    "fuchsia/developer/plugin/fidl/psi/impl/FidlUsingDeclarationImpl.java",
+    "fuchsia/developer/plugin/fidl/psi/impl/FidlUsingImpl.java",
+    "fuchsia/developer/plugin/fidl/psi/impl/FidlUsingListImpl.java",
+    "fuchsia/developer/plugin/fidl/psi/impl/FidlVectorTypeImpl.java",
+    "fuchsia/developer/plugin/fidl/psi/impl/FidlXunionDeclarationImpl.java",
+    "fuchsia/developer/plugin/fidl/psi/impl/FidlXunionFieldImpl.java",
+    "fuchsia/developer/plugin/fidl/psi/Types.java",
 ]
 
 genrule(
diff --git a/src/fuchsia/developer/plugin/fidl/ContextAwareHighlighter.java b/src/fuchsia/developer/plugin/fidl/ContextAwareHighlighter.java
index 85bc16d..c77c80b 100644
--- a/src/fuchsia/developer/plugin/fidl/ContextAwareHighlighter.java
+++ b/src/fuchsia/developer/plugin/fidl/ContextAwareHighlighter.java
@@ -35,5 +35,9 @@
       holder.createWarningAnnotation(element,
           "Ordinals are deprecated, and will be removed in a future language revision");
     }
+    if (element.getNode().getElementType() == Types.XUNION) {
+      holder.createWarningAnnotation(element,
+          "Xunions are transitional, and will be removed in a future language revision");
+    }
   }
 }
diff --git a/src/fuchsia/developer/plugin/fidl/Fidl.bnf b/src/fuchsia/developer/plugin/fidl/Fidl.bnf
index 734bcfd..96564f8 100644
--- a/src/fuchsia/developer/plugin/fidl/Fidl.bnf
+++ b/src/fuchsia/developer/plugin/fidl/Fidl.bnf
@@ -36,7 +36,7 @@
 using ::= USING_T compound-identifier ( AS identifier-token )? SEMICOLON
 
 declaration ::= const-declaration | enum-declaration | interface-declaration |
-              struct-declaration | union-declaration | table-declaration
+              struct-declaration | union-declaration | xunion-declaration | table-declaration
 
 const-declaration ::= attribute-list? CONST type identifier-token EQUALS constant
 
@@ -79,6 +79,10 @@
 
 union-field ::= type identifier-token
 
+xunion-declaration ::= attribute-list? XUNION identifier-token OBRACE ( xunion-field SEMICOLON )+ CBRACE
+
+xunion-field ::= type identifier-token
+
 attribute-list ::= doc-attribute-list | bracket-attribute-list
 
 doc-attribute-list ::= ( DOC_COMMENT )+ bracket-attribute-list?
@@ -122,5 +126,6 @@
 identifier-token ::= IDENTIFIER | ARRAY | AS | CHANNEL | CONST | ENUM | EVENT | EVENTPAIR | FIFO |
                      GUEST | HANDLE | INTERFACE | INTERRUPT | JOB | LIBRARY | LOG | PORT | PROCESS |
                      REQUEST | RESERVED | RESOURCE | SOCKET | STRING | STRUCT | TABLE | THREAD |
-                     TIMER | UNION | USING_T | VECTOR | VMAR | VMO | BOOL | FLOAT32 | FLOAT64 |
-                     INT8 | INT16 | INT32 | INT64 | UINT8 | UINT16 | UINT32 | UINT64 | TRUE | FALSE
\ No newline at end of file
+                     TIMER | UNION | USING_T | VECTOR | VMAR | VMO | XUNION | BOOL | FLOAT32 |
+                     FLOAT64 | INT8 | INT16 | INT32 | INT64 | UINT8 | UINT16 | UINT32 | UINT64 |
+                     TRUE | FALSE
\ No newline at end of file
diff --git a/src/fuchsia/developer/plugin/fidl/FidlLexer.flex b/src/fuchsia/developer/plugin/fidl/FidlLexer.flex
index 24ec127..c2725fa 100644
--- a/src/fuchsia/developer/plugin/fidl/FidlLexer.flex
+++ b/src/fuchsia/developer/plugin/fidl/FidlLexer.flex
@@ -62,6 +62,7 @@
 VECTOR=vector
 VMAR=vmar
 VMO=vmo
+XUNION=xunion
 
 // Scalar types
 BOOL=bool
@@ -118,6 +119,7 @@
   {STRUCT} { return STRUCT; }
   {TABLE} { return TABLE; }
   {UNION} { return UNION; }
+  {XUNION} { return XUNION; }
   {ARRAY} { return ARRAY; }
   {VECTOR} { return VECTOR; }
   {STRING} { return STRING; }
diff --git a/src/fuchsia/developer/plugin/fidl/SyntaxHighlighter.java b/src/fuchsia/developer/plugin/fidl/SyntaxHighlighter.java
index e448b17..8754c43 100644
--- a/src/fuchsia/developer/plugin/fidl/SyntaxHighlighter.java
+++ b/src/fuchsia/developer/plugin/fidl/SyntaxHighlighter.java
@@ -84,6 +84,7 @@
             Types.STRUCT,
             Types.TABLE,
             Types.UNION,
+            Types.XUNION,
             Types.ARRAY,
             Types.VECTOR,
             Types.STRING,