[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,