Index: mojo/public/tools/bindings/generators/go_templates/source.tmpl |
diff --git a/mojo/public/tools/bindings/generators/go_templates/source.tmpl b/mojo/public/tools/bindings/generators/go_templates/source.tmpl |
index e864d67ca8b3e220e173691ce6df5f71a56d66fe..4c81d6521f75e64fe85b1b7071886c277d1c8cba 100644 |
--- a/mojo/public/tools/bindings/generators/go_templates/source.tmpl |
+++ b/mojo/public/tools/bindings/generators/go_templates/source.tmpl |
@@ -20,23 +20,80 @@ import ( |
{% import "interface.tmpl" as interface_macros %} |
{% import "struct.tmpl" as struct_macros %} |
{% import "union.tmpl" as union_macros %} |
+{% import "mojom_reference_macros.tmpl" as mojom_reference_macros %} |
-{#- Enum definitions #} |
+{#- This init function initializes a mapping between identifiers and their |
+ corresponding user-defined type. This could have been a MojomDescriptor, |
+ but since it allows Types to be unresolved, it is more complex than is |
+ necessary. It's simpler to resolve everything in codegen. |
+ It is also difficult to insert changes to the description during the |
+ process of generating each type, so this mapping is computed in Python. |
+ Note: While we may register items into the map multiple times, this is okay |
+ because the keys will match. |
+-#} |
+ |
+{%- if should_gen_mojom_types -%} |
+// These IDs are the Mojom Identifiers / Type Keys. |
+// Mojom libraries importing this one will use these identifiers when building |
+// TypeReference objects. |
{% for enum in enums %} |
-{{enum_macros.define(enum)}} |
+var ID_{{enum|mojom_type_identifier}} string = "{{enum|mojom_type_identifier}}" |
+{% endfor %} |
+{% for struct in structs %} |
+var ID_{{struct|mojom_type_identifier}} string = "{{struct|mojom_type_identifier}}" |
+{% endfor %} |
+{% for union in unions %} |
+var ID_{{union|mojom_type_identifier}} string = "{{union|mojom_type_identifier}}" |
+{% endfor %} |
+{% for interface in interfaces %} |
+var ID_{{interface|mojom_type_identifier}} string = "{{interface|mojom_type_identifier}}" |
+{% endfor %} |
+ |
+{% set mapping = package|qualified(None, false) ~ 'Desc__' %} |
+var {{mapping}} = make(map[string]{{typepkg}}UserDefinedType) |
+func init() { |
+ {% for enum in enums %} |
+ {{mojom_reference_macros.registerType(mapping, typepkg, package, enum)}} |
+ {%- endfor %} |
+ {% for struct in structs %} |
+ {{mojom_reference_macros.registerType(mapping, typepkg, package, struct)}} |
+ {%- endfor %} |
+ {% for union in unions %} |
+ {{mojom_reference_macros.registerType(mapping, typepkg, package, union)}} |
+ {%- endfor %} |
+ {% for interface in interfaces %} |
+ {{mojom_reference_macros.registerType(mapping, typepkg, package, interface)}} |
+ {%- endfor %} |
+ |
+ {% for mi in mojom_imports.values() %} |
+ {%- if mi ~ '.' != typepkg and mi ~ '.' != descpkg %} |
+ for s, udt := range {{mi}}.GetAllMojomTypeDefinitions() { |
+ {{mapping}}[s] = udt |
+ } |
+ {% endif -%} |
+ {% endfor %} |
+} |
+func GetAllMojomTypeDefinitions() map[string]{{typepkg}}UserDefinedType { |
+ return {{mapping}} |
+} |
+{% endif %} |
+ |
+{# Enum definitions #} |
+{%- for enum in enums %} |
+{{enum_macros.define(enum, typepkg, package)}} |
{%- endfor %} |
{#- Interface definitions #} |
{% for interface in interfaces %} |
-{{interface_macros.define(interface)}} |
+{{interface_macros.define(interface, descpkg, typepkg, package)}} |
{%- endfor %} |
{#- Struct definitions #} |
{% for struct in structs %} |
-{{struct_macros.define(struct)}} |
+{{struct_macros.define(struct, typepkg, package)}} |
{%- endfor %} |
{#- Union definitions #} |
{% for union in unions %} |
-{{union_macros.define(union)}} |
+{{union_macros.define(union, typepkg, package)}} |
{%- endfor %} |