[fidl][dart] Allow recursive xunions

This adds a missing "ignore: recursive_compile_time_constant"

It leaves open the greater question of how to move away from recursive
compile time constants in Dart.

Bug: fxb/7644
Change-Id: I56495f4e1954d738fc4c6038b893f68b956b2bad
diff --git a/bin/fidlgen_dart/backend/templates/xunion.tmpl.go b/bin/fidlgen_dart/backend/templates/xunion.tmpl.go
index f70ffda..e913c83 100644
--- a/bin/fidlgen_dart/backend/templates/xunion.tmpl.go
+++ b/bin/fidlgen_dart/backend/templates/xunion.tmpl.go
@@ -72,6 +72,8 @@
 // See FIDL-308:
 // ignore: recursive_compile_time_constant
 const $fidl.XUnionType<{{ .Name }}> {{ .TypeSymbol }} = {{ .TypeExpr }};
+// See FIDL-308:
+// ignore: recursive_compile_time_constant
 const $fidl.XUnionType<{{ .Name }}> {{ .OptTypeSymbol }} = {{ .OptTypeExpr }};
 {{ end }}
 `
diff --git a/bin/fidlgen_dart/goldens/bits.test.test.fidl.json b/bin/fidlgen_dart/goldens/bits.test.test.fidl.json
index 3a69e93..30b6748 100644
--- a/bin/fidlgen_dart/goldens/bits.test.test.fidl.json
+++ b/bin/fidlgen_dart/goldens/bits.test.test.fidl.json
@@ -49,7 +49,7 @@
           }
         }
       ],
-      "strict": false
+      "strict": true
     }
   ],
   "const_declarations": [],
diff --git a/bin/fidlgen_dart/goldens/consts.test.fidl.json b/bin/fidlgen_dart/goldens/consts.test.fidl.json
index 8497d51..a5e70f7 100644
--- a/bin/fidlgen_dart/goldens/consts.test.fidl.json
+++ b/bin/fidlgen_dart/goldens/consts.test.fidl.json
@@ -298,7 +298,7 @@
           }
         }
       ],
-      "strict": false
+      "strict": true
     },
     {
       "name": "test.name/BitsType",
@@ -326,7 +326,7 @@
           }
         }
       ],
-      "strict": false
+      "strict": true
     }
   ],
   "interface_declarations": [],
diff --git a/bin/fidlgen_dart/goldens/enum.test.fidl.json b/bin/fidlgen_dart/goldens/enum.test.fidl.json
index 463cfe7..f127b13 100644
--- a/bin/fidlgen_dart/goldens/enum.test.fidl.json
+++ b/bin/fidlgen_dart/goldens/enum.test.fidl.json
@@ -10,7 +10,7 @@
       "location": {
         "filename": "garnet/go/src/fidl/compiler/backend/typestest/enum.test.fidl",
         "line": 3,
-        "column": 6
+        "column": 28
       },
       "type": "uint32",
       "members": [
@@ -54,7 +54,7 @@
       "location": {
         "filename": "garnet/go/src/fidl/compiler/backend/typestest/enum.test.fidl",
         "line": 8,
-        "column": 13
+        "column": 6
       },
       "type": "uint32",
       "members": [
diff --git a/bin/fidlgen_dart/goldens/protocols.test.fidl.json b/bin/fidlgen_dart/goldens/protocols.test.fidl.json
index 99d11e7..03df244 100644
--- a/bin/fidlgen_dart/goldens/protocols.test.fidl.json
+++ b/bin/fidlgen_dart/goldens/protocols.test.fidl.json
@@ -47,7 +47,7 @@
           }
         }
       ],
-      "strict": false
+      "strict": true
     }
   ],
   "interface_declarations": [
diff --git a/bin/fidlgen_dart/goldens/union.test.fidl.json b/bin/fidlgen_dart/goldens/union.test.fidl.json
index 5ba5522..9bf296e 100644
--- a/bin/fidlgen_dart/goldens/union.test.fidl.json
+++ b/bin/fidlgen_dart/goldens/union.test.fidl.json
@@ -75,14 +75,46 @@
       "max_out_of_line": 4294967295,
       "alignment": 8,
       "max_handles": 0
+    },
+    {
+      "name": "test.name/FieldCollision",
+      "location": {
+        "filename": "garnet/go/src/fidl/compiler/backend/typestest/union.test.fidl",
+        "line": 9,
+        "column": 7
+      },
+      "members": [
+        {
+          "type": {
+            "kind": "primitive",
+            "subtype": "int32"
+          },
+          "name": "field_collision_tag",
+          "location": {
+            "filename": "garnet/go/src/fidl/compiler/backend/typestest/union.test.fidl",
+            "line": 10,
+            "column": 11
+          },
+          "size": 4,
+          "max_out_of_line": 0,
+          "alignment": 4,
+          "offset": 4
+        }
+      ],
+      "size": 8,
+      "max_out_of_line": 0,
+      "alignment": 4,
+      "max_handles": 0
     }
   ],
   "xunion_declarations": [],
   "type_alias_declarations": [],
   "declaration_order": [
-    "test.name/Union"
+    "test.name/Union",
+    "test.name/FieldCollision"
   ],
   "declarations": {
-    "test.name/Union": "union"
+    "test.name/Union": "union",
+    "test.name/FieldCollision": "union"
   }
 }
diff --git a/bin/fidlgen_dart/goldens/union.test.fidl.json_async.dart.golden b/bin/fidlgen_dart/goldens/union.test.fidl.json_async.dart.golden
index 87e7467..7c89bcb 100644
--- a/bin/fidlgen_dart/goldens/union.test.fidl.json_async.dart.golden
+++ b/bin/fidlgen_dart/goldens/union.test.fidl.json_async.dart.golden
@@ -130,5 +130,63 @@
   ctor: Union._ctor,
 );
 
+enum FieldCollisionTag {
+  fieldCollisionTag,
+}
+
+class FieldCollision extends $fidl.Union {
+  const FieldCollision.withFieldCollisionTag(int value)
+      : _data = value,
+        _tag = FieldCollisionTag.fieldCollisionTag;
+
+  FieldCollision._(FieldCollisionTag tag, Object data)
+      : _tag = tag,
+        _data = data;
+
+  final FieldCollisionTag _tag;
+  final _data;
+  int get fieldCollisionTag {
+    if (_tag != FieldCollisionTag.fieldCollisionTag) {
+      return null;
+    }
+    return _data;
+  }
+
+  @override
+  String toString() {
+    switch (_tag) {
+      case FieldCollisionTag.fieldCollisionTag:
+        return r'FieldCollision.fieldCollisionTag($fieldCollisionTag)';
+      default:
+        return null;
+    }
+  }
+
+  FieldCollisionTag get $tag => _tag;
+  // TODO: remove, see: FIDL-587
+  FieldCollisionTag get tag => _tag;
+
+  @override
+  int get $index => _tag.index;
+
+  @override
+  Object get $data => _data;
+
+  static FieldCollision _ctor(int index, Object data) {
+    return FieldCollision._(FieldCollisionTag.values[index], data);
+  }
+}
+
+// See FIDL-308:
+// ignore: recursive_compile_time_constant
+const $fidl.UnionType<FieldCollision> kFieldCollision_Type =
+    $fidl.UnionType<FieldCollision>(
+  encodedSize: 8,
+  members: <$fidl.MemberType>[
+    $fidl.MemberType<int>(type: $fidl.Int32Type(), offset: 4),
+  ],
+  ctor: FieldCollision._ctor,
+);
+
 // ignore: unused_element, avoid_private_typedef_functions
 typedef _VoidCallback = void Function();
diff --git a/bin/fidlgen_dart/goldens/xunion.test.fidl.json_async.dart.golden b/bin/fidlgen_dart/goldens/xunion.test.fidl.json_async.dart.golden
index b45caae..ba2b94d 100644
--- a/bin/fidlgen_dart/goldens/xunion.test.fidl.json_async.dart.golden
+++ b/bin/fidlgen_dart/goldens/xunion.test.fidl.json_async.dart.golden
@@ -112,6 +112,8 @@
   },
   ctor: OlderSimpleUnion._ctor,
 );
+// See FIDL-308:
+// ignore: recursive_compile_time_constant
 const $fidl.XUnionType<OlderSimpleUnion> kOlderSimpleUnion_OptType =
     $fidl.XUnionType<OlderSimpleUnion>(
   encodedSize: 24,
@@ -218,6 +220,8 @@
   },
   ctor: NewerSimpleUnion._ctor,
 );
+// See FIDL-308:
+// ignore: recursive_compile_time_constant
 const $fidl.XUnionType<NewerSimpleUnion> kNewerSimpleUnion_OptType =
     $fidl.XUnionType<NewerSimpleUnion>(
   encodedSize: 24,
@@ -325,6 +329,8 @@
   },
   ctor: StrictSimpleXUnion._ctor,
 );
+// See FIDL-308:
+// ignore: recursive_compile_time_constant
 const $fidl.XUnionType<StrictSimpleXUnion> kStrictSimpleXUnion_OptType =
     $fidl.XUnionType<StrictSimpleXUnion>(
   encodedSize: 24,
@@ -400,6 +406,8 @@
   },
   ctor: XUnionContainingEmptyStruct._ctor,
 );
+// See FIDL-308:
+// ignore: recursive_compile_time_constant
 const $fidl.XUnionType<XUnionContainingEmptyStruct>
     kXUnionContainingEmptyStruct_OptType =
     $fidl.XUnionType<XUnionContainingEmptyStruct>(
@@ -472,6 +480,8 @@
   },
   ctor: StrictBoundedXUnion._ctor,
 );
+// See FIDL-308:
+// ignore: recursive_compile_time_constant
 const $fidl.XUnionType<StrictBoundedXUnion> kStrictBoundedXUnion_OptType =
     $fidl.XUnionType<StrictBoundedXUnion>(
   encodedSize: 24,