Add union ordinals and remove xunions

Change-Id: Ied56ff9511c5d136602e37168141cf43f3a21017
diff --git a/FIDL-Plugin.iml b/FIDL-Plugin.iml
index c0dfef1..31ad032 100644
--- a/FIDL-Plugin.iml
+++ b/FIDL-Plugin.iml
@@ -24,5 +24,32 @@
         <SOURCES />
       </library>
     </orderEntry>
+    <orderEntry type="module-library">
+      <library>
+        <CLASSES>
+          <root url="jar:///opt/intellij-ce-2019.2/lib/platform-api.jar!/" />
+        </CLASSES>
+        <JAVADOC />
+        <SOURCES />
+      </library>
+    </orderEntry>
+    <orderEntry type="module-library">
+      <library>
+        <CLASSES>
+          <root url="jar:///opt/intellij-ce-2019.2/lib/platform-util-ui.jar!/" />
+        </CLASSES>
+        <JAVADOC />
+        <SOURCES />
+      </library>
+    </orderEntry>
+    <orderEntry type="module-library">
+      <library>
+        <CLASSES>
+          <root url="jar:///opt/intellij-ce-2019.2/lib/spellchecker.jar!/" />
+        </CLASSES>
+        <JAVADOC />
+        <SOURCES />
+      </library>
+    </orderEntry>
   </component>
 </module>
\ No newline at end of file
diff --git a/resources/META-INF/plugin.xml b/resources/META-INF/plugin.xml
index 27c4010..0964eb1 100644
--- a/resources/META-INF/plugin.xml
+++ b/resources/META-INF/plugin.xml
@@ -20,6 +20,7 @@
       <ul>
         <li><b>0.14</b>
           <ul>
+            <li>Support union ordinals and remove xunion.</li>
             <li>Support service declarations.</li>
           </ul>
         </li>
diff --git a/src/fuchsia/developer/plugin/fidl/BUILD b/src/fuchsia/developer/plugin/fidl/BUILD
index c34217c..5a26970 100644
--- a/src/fuchsia/developer/plugin/fidl/BUILD
+++ b/src/fuchsia/developer/plugin/fidl/BUILD
@@ -47,8 +47,11 @@
     "fuchsia/developer/plugin/fidl/psi/FidlIntegralLiteral.java",
     "fuchsia/developer/plugin/fidl/psi/FidlLibraryHeader.java",
     "fuchsia/developer/plugin/fidl/psi/FidlLiteral.java",
+    "fuchsia/developer/plugin/fidl/psi/FidlMemberField.java",
     "fuchsia/developer/plugin/fidl/psi/FidlNumericLiteral.java",
     "fuchsia/developer/plugin/fidl/psi/FidlOrdinal.java",
+    "fuchsia/developer/plugin/fidl/psi/FidlOrdinalMemberFieldBody.java",
+    "fuchsia/developer/plugin/fidl/psi/FidlOrdinalMemberField.java",
     "fuchsia/developer/plugin/fidl/psi/FidlParameter.java",
     "fuchsia/developer/plugin/fidl/psi/FidlParameterList.java",
     "fuchsia/developer/plugin/fidl/psi/FidlParameters.java",
@@ -60,20 +63,14 @@
     "fuchsia/developer/plugin/fidl/psi/FidlServiceDeclaration.java",
     "fuchsia/developer/plugin/fidl/psi/FidlServiceMember.java",
     "fuchsia/developer/plugin/fidl/psi/FidlStructDeclaration.java",
-    "fuchsia/developer/plugin/fidl/psi/FidlStructField.java",
     "fuchsia/developer/plugin/fidl/psi/FidlTableDeclaration.java",
-    "fuchsia/developer/plugin/fidl/psi/FidlTableFieldDecl.java",
-    "fuchsia/developer/plugin/fidl/psi/FidlTableField.java",
-    "fuchsia/developer/plugin/fidl/psi/FidlTableFieldOrdinal.java",
     "fuchsia/developer/plugin/fidl/psi/FidlTypeAliasDeclaration.java",
     "fuchsia/developer/plugin/fidl/psi/FidlTypeConstraint.java",
     "fuchsia/developer/plugin/fidl/psi/FidlTypeConstructor.java",
     "fuchsia/developer/plugin/fidl/psi/FidlUnionDeclaration.java",
-    "fuchsia/developer/plugin/fidl/psi/FidlUnionField.java",
     "fuchsia/developer/plugin/fidl/psi/FidlUsing.java",
     "fuchsia/developer/plugin/fidl/psi/FidlUsingList.java",
     "fuchsia/developer/plugin/fidl/psi/FidlVisitor.java",
-    "fuchsia/developer/plugin/fidl/psi/FidlXunionDeclaration.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",
@@ -94,8 +91,11 @@
     "fuchsia/developer/plugin/fidl/psi/impl/FidlIntegralLiteralImpl.java",
     "fuchsia/developer/plugin/fidl/psi/impl/FidlLibraryHeaderImpl.java",
     "fuchsia/developer/plugin/fidl/psi/impl/FidlLiteralImpl.java",
+    "fuchsia/developer/plugin/fidl/psi/impl/FidlMemberFieldImpl.java",
     "fuchsia/developer/plugin/fidl/psi/impl/FidlNumericLiteralImpl.java",
     "fuchsia/developer/plugin/fidl/psi/impl/FidlOrdinalImpl.java",
+    "fuchsia/developer/plugin/fidl/psi/impl/FidlOrdinalMemberFieldBodyImpl.java",
+    "fuchsia/developer/plugin/fidl/psi/impl/FidlOrdinalMemberFieldImpl.java",
     "fuchsia/developer/plugin/fidl/psi/impl/FidlParameterImpl.java",
     "fuchsia/developer/plugin/fidl/psi/impl/FidlParameterListImpl.java",
     "fuchsia/developer/plugin/fidl/psi/impl/FidlParametersImpl.java",
@@ -107,19 +107,13 @@
     "fuchsia/developer/plugin/fidl/psi/impl/FidlServiceDeclarationImpl.java",
     "fuchsia/developer/plugin/fidl/psi/impl/FidlServiceMemberImpl.java",
     "fuchsia/developer/plugin/fidl/psi/impl/FidlStructDeclarationImpl.java",
-    "fuchsia/developer/plugin/fidl/psi/impl/FidlStructFieldImpl.java",
     "fuchsia/developer/plugin/fidl/psi/impl/FidlTableDeclarationImpl.java",
-    "fuchsia/developer/plugin/fidl/psi/impl/FidlTableFieldDeclImpl.java",
-    "fuchsia/developer/plugin/fidl/psi/impl/FidlTableFieldImpl.java",
-    "fuchsia/developer/plugin/fidl/psi/impl/FidlTableFieldOrdinalImpl.java",
     "fuchsia/developer/plugin/fidl/psi/impl/FidlTypeAliasDeclarationImpl.java",
     "fuchsia/developer/plugin/fidl/psi/impl/FidlTypeConstraintImpl.java",
     "fuchsia/developer/plugin/fidl/psi/impl/FidlTypeConstructorImpl.java",
     "fuchsia/developer/plugin/fidl/psi/impl/FidlUnionDeclarationImpl.java",
-    "fuchsia/developer/plugin/fidl/psi/impl/FidlUnionFieldImpl.java",
     "fuchsia/developer/plugin/fidl/psi/impl/FidlUsingImpl.java",
     "fuchsia/developer/plugin/fidl/psi/impl/FidlUsingListImpl.java",
-    "fuchsia/developer/plugin/fidl/psi/impl/FidlXunionDeclarationImpl.java",
     "fuchsia/developer/plugin/fidl/psi/Types.java",
 ]
 
@@ -164,4 +158,3 @@
     srcs = ["icons/fuchsia-logo-16x16.png"],
     visibility = ["//visibility:public"],
 )
-
diff --git a/src/fuchsia/developer/plugin/fidl/ContextAwareHighlighter.java b/src/fuchsia/developer/plugin/fidl/ContextAwareHighlighter.java
index 0bdb241..091ef85 100644
--- a/src/fuchsia/developer/plugin/fidl/ContextAwareHighlighter.java
+++ b/src/fuchsia/developer/plugin/fidl/ContextAwareHighlighter.java
@@ -323,9 +323,9 @@
 
     // Attributes cannot be placed on a reserved member.
     if (thisType == Types.RESERVED) {
-      // Parent is TABLE_FIELD_DECL, Grandparent is TABLE_FIELD
+      // Parent is TABLE_FIELD_DECL, Grandparent is ORDINAL_MEMBER_FIELD
       ASTNode grandParent = element.getParent().getParent().getNode();
-      if (grandParent.getElementType() == Types.TABLE_FIELD) {
+      if (grandParent.getElementType() == Types.ORDINAL_MEMBER_FIELD) {
         ASTNode maybeAttributeList = grandParent.findChildByType(Types.ATTRIBUTE_LIST);
         if (maybeAttributeList != null) {
           holder.createErrorAnnotation(
diff --git a/src/fuchsia/developer/plugin/fidl/Fidl.bnf b/src/fuchsia/developer/plugin/fidl/Fidl.bnf
index 3040f92..6abd49f 100644
--- a/src/fuchsia/developer/plugin/fidl/Fidl.bnf
+++ b/src/fuchsia/developer/plugin/fidl/Fidl.bnf
@@ -18,9 +18,9 @@
 
   // The FidlNamedElements identify the elements we want to appear in the structure view.
   implements(".*-declaration")="fuchsia.developer.plugin.fidl.psi.FidlNamedElement"
-  implements("protocol-method|protocol-event|struct-field|union-field|bits-or-enum-member")="fuchsia.developer.plugin.fidl.psi.FidlNamedElement"
+  implements("protocol-method|protocol-event|member-field|bits-or-enum-member")="fuchsia.developer.plugin.fidl.psi.FidlNamedElement"
   extends(".*-declaration")="fuchsia.developer.plugin.fidl.psi.FidlNamedElementImpl"
-  extends("protocol-method|protocol-event|struct-field|union-field|bits-or-enum-member")="fuchsia.developer.plugin.fidl.psi.FidlNamedElementImpl"
+  extends("protocol-method|protocol-event|member-field|bits-or-enum-member")="fuchsia.developer.plugin.fidl.psi.FidlNamedElementImpl"
 
   tokens = [
     line_comment="regexp://.*"
@@ -47,7 +47,6 @@
                 table-declaration |
                 type-alias-declaration |
                 union-declaration |
-                xunion-declaration |
                 service-declaration
 
 const-declaration ::= attribute-list? CONST type-constructor identifier-token EQUALS constant
@@ -79,25 +78,17 @@
 
 protocol-compose ::= COMPOSE compound-identifier
 
-struct-declaration ::= attribute-list? STRUCT identifier-token OBRACE ( struct-field SEMICOLON )* CBRACE
+struct-declaration ::= attribute-list? STRUCT identifier-token OBRACE ( member-field SEMICOLON )* CBRACE
 
-struct-field ::= attribute-list? type-constructor identifier-token ( EQUALS constant )?
+union-declaration ::= attribute-list? STRICT? UNION identifier-token OBRACE ( ordinal-member-field SEMICOLON )+ CBRACE
 
-union-declaration ::= attribute-list? UNION identifier-token OBRACE ( union-field SEMICOLON )+ CBRACE
+table-declaration ::= attribute-list? STRICT? TABLE identifier-token OBRACE ( ordinal-member-field SEMICOLON )* CBRACE
 
-xunion-declaration ::= attribute-list? STRICT? XUNION identifier-token OBRACE ( union-field SEMICOLON )+ CBRACE
+member-field ::= attribute-list? type-constructor identifier-token ( EQUALS constant )?
 
-union-field ::= attribute-list? type-constructor identifier-token
+ordinal-member-field ::= attribute-list? ordinal COLON ordinal-member-field-body
 
-table-declaration ::= attribute-list? STRICT? TABLE identifier-token OBRACE ( table-field SEMICOLON )* CBRACE
-
-table-field ::= attribute-list? table-field-ordinal table-field-decl
-
-table-field-ordinal ::= ordinal COLON
-
-// Diff from master grammar: decl instead of declaration, because declaration is reserved for named
-// things.
-table-field-decl ::= struct-field | RESERVED
+ordinal-member-field-body ::= member-field | RESERVED
 
 type-alias-declaration ::= attribute-list? USING_T identifier-token EQUALS type-constructor
 
diff --git a/src/fuchsia/developer/plugin/fidl/psi/FidlNamedElementImpl.java b/src/fuchsia/developer/plugin/fidl/psi/FidlNamedElementImpl.java
index 586e87b..7ec809e 100644
--- a/src/fuchsia/developer/plugin/fidl/psi/FidlNamedElementImpl.java
+++ b/src/fuchsia/developer/plugin/fidl/psi/FidlNamedElementImpl.java
@@ -14,16 +14,14 @@
 import fuchsia.developer.plugin.fidl.psi.impl.FidlBitsOrEnumMemberImpl;
 import fuchsia.developer.plugin.fidl.psi.impl.FidlConstDeclarationImpl;
 import fuchsia.developer.plugin.fidl.psi.impl.FidlEnumDeclarationImpl;
+import fuchsia.developer.plugin.fidl.psi.impl.FidlMemberFieldImpl;
 import fuchsia.developer.plugin.fidl.psi.impl.FidlProtocolDeclarationImpl;
 import fuchsia.developer.plugin.fidl.psi.impl.FidlProtocolEventImpl;
 import fuchsia.developer.plugin.fidl.psi.impl.FidlProtocolMethodImpl;
 import fuchsia.developer.plugin.fidl.psi.impl.FidlStructDeclarationImpl;
-import fuchsia.developer.plugin.fidl.psi.impl.FidlStructFieldImpl;
 import fuchsia.developer.plugin.fidl.psi.impl.FidlTableDeclarationImpl;
 import fuchsia.developer.plugin.fidl.psi.impl.FidlTypeAliasDeclarationImpl;
 import fuchsia.developer.plugin.fidl.psi.impl.FidlUnionDeclarationImpl;
-import fuchsia.developer.plugin.fidl.psi.impl.FidlUnionFieldImpl;
-import fuchsia.developer.plugin.fidl.psi.impl.FidlXunionDeclarationImpl;
 import java.util.Map;
 import javax.swing.Icon;
 import org.jetbrains.annotations.NotNull;
@@ -46,12 +44,10 @@
             .put(FidlTableDeclarationImpl.class, IconLoader.getIcon(path + "T.png"))
             .put(FidlUnionDeclarationImpl.class, IconLoader.getIcon(path + "U.png"))
             .put(FidlTypeAliasDeclarationImpl.class, IconLoader.getIcon(path + "U.png"))
-            .put(FidlXunionDeclarationImpl.class, IconLoader.getIcon(path + "X.png"))
             .put(FidlBitsOrEnumMemberImpl.class, IconLoader.getIcon(path + "M.png"))
             .put(FidlProtocolMethodImpl.class, IconLoader.getIcon(path + "M.png"))
             .put(FidlProtocolEventImpl.class, IconLoader.getIcon(path + "E.png"))
-            .put(FidlStructFieldImpl.class, IconLoader.getIcon(path + "F.png"))
-            .put(FidlUnionFieldImpl.class, IconLoader.getIcon(path + "F.png"))
+            .put(FidlMemberFieldImpl.class, IconLoader.getIcon(path + "F.png"))
             .build();
   }