Index: third_party/mojo/src/mojo/public/tools/bindings/generators/dart_templates/union_definition.tmpl |
diff --git a/third_party/mojo/src/mojo/public/tools/bindings/generators/dart_templates/union_definition.tmpl b/third_party/mojo/src/mojo/public/tools/bindings/generators/dart_templates/union_definition.tmpl |
new file mode 100644 |
index 0000000000000000000000000000000000000000..b4a74207a5d5bfb1ced36c414878dd996935d57e |
--- /dev/null |
+++ b/third_party/mojo/src/mojo/public/tools/bindings/generators/dart_templates/union_definition.tmpl |
@@ -0,0 +1,109 @@ |
+{#--- Begin #} |
+ |
+{%- import "encoding_macros.tmpl" as encoding_macros %} |
+ |
+{%- macro enum_def(union) %} |
+enum {{union|name}}Tag { |
+{%- for field in union.fields %} |
+ {{field|tag_name}}, |
+{%- endfor %} |
+ unknown |
+} |
+{%- endmacro %} |
+ |
+{%- macro wrapper_def(union) %} |
+class {{union|name}}Wrapper extends bindings.Union { |
+ static final _tag_to_int = const { |
+{%- for field in union.fields %} |
+ {{union|name}}Tag.{{field|tag_name}}: {{field.ordinal}}, |
+{%- endfor %} |
+ }; |
+ |
+ static final _int_to_tag = const { |
+{%- for field in union.fields %} |
+ {{field.ordinal}}: {{union|name}}Tag.{{field|tag_name}}, |
+{%- endfor %} |
+ }; |
+ |
+ var _data; |
+ {{union|name}}Tag _tag = {{union|name}}Tag.unknown; |
+ |
+ {{union|name}}Tag get tag => _tag; |
+ |
+{%- for field in union.fields %} |
+ {{field.kind|dart_type}} get {{field|name}} { |
+ if (_tag != {{union|name}}Tag.{{field|tag_name}}) { |
+ throw new bindings.UnsetUnionTagError(_tag, {{union|name}}Tag.{{field|tag_name}}); |
+ } |
+ return _data; |
+ } |
+ |
+ set {{field|name}}({{field.kind|dart_type}} value) { |
+ _tag = {{union|name}}Tag.{{field|tag_name}}; |
+ _data = value; |
+ } |
+{%- endfor %} |
+ |
+ static {{union|name}}Wrapper decode(bindings.Decoder decoder0, int offset) { |
+ int size = decoder0.decodeUint32(offset); |
+ if (size == 0) { |
+ return null; |
+ } |
+ {{union|name}}Wrapper result = new {{union|name}}Wrapper(); |
+ |
+ // TODO(azani): Handle unknown union member. |
+ {{union|name}}Tag tag = _int_to_tag[decoder0.decodeUint32(offset + 4)]; |
+ switch (tag) { |
+{%- for field in union.fields %} |
+ case {{union|name}}Tag.{{field|tag_name}}: |
+{%- if field.kind|is_union_kind %} |
+ var decoder1 = decoder0.decodePointer(offset + 8, {{field.kind|is_nullable_kind|dart_true_false}}); |
+ result.{{field|name}} = {{field.kind|dart_type}}.decode(decoder1, 0); |
+{%- else %} |
+ {{encoding_macros.decode('result.' ~ field|name, field.kind, "offset + 8", 0)|indent(8)}} |
+{%- endif %} |
+ break; |
+{%- endfor %} |
+ } |
+ |
+ return result; |
+ } |
+ |
+ void encode(bindings.Encoder encoder0, int offset) { |
+ // TODO(azani): Error when trying to encode an unknown member. |
+ encoder0.encodeUint32(16, offset); |
+ encoder0.encodeUint32(_tag_to_int[_tag], offset + 4); |
+ switch (_tag) { |
+{%- for field in union.fields %} |
+ case {{union|name}}Tag.{{field|tag_name}}: |
+{%- if field.kind|is_union_kind %} |
+ encoder0.encodeNestedUnion({{field|name}}, offset + 8, {{field.kind|is_nullable_kind|dart_true_false}}); |
+{%- else %} |
+ {{encoding_macros.encode(field|name, field.kind, "offset + 8", 0)|indent(8)}} |
+{%- endif %} |
+ break; |
+{%- endfor %} |
+ } |
+ } |
+ |
+ String toString() { |
+ String result = "{{union|name}}Wrapper("; |
+ switch (_tag) { |
+{%- for field in union.fields %} |
+ case {{union|name}}Tag.{{field|tag_name}}: |
+ result += "{{field|name}}"; |
+ break; |
+{%- endfor %} |
+ default: |
+ result += "unknown"; |
+ } |
+ result += ": $_data)" |
+ } |
+} |
+{%- endmacro %} |
+ |
+ |
+{%- macro union_def(union) %} |
+{{enum_def(union)}} |
+{{wrapper_def(union)}} |
+{%- endmacro %} |