From 9693d3707e16f783b97dcf0a7340ded0427aa3c0 Mon Sep 17 00:00:00 2001 From: Soshun Naito Date: Wed, 7 Aug 2024 03:47:23 +0000 Subject: [PATCH] Mojo: Introduce [Uuid] attribute This is a cherry-pick of the CL: https://crrev.com/c/2462378 It adds Uuid_ attribute to the corresponding cpp interface when we add [Uuid=] to the mojo interface. Bug: b:357737923, b:40152372 Test: m libmojo Change-Id: I927361da96eba66420f6c95777cba43b0055baec --- mojo/public/tools/bindings/README.md | 7 +++++++ .../cpp_templates/interface_declaration.tmpl | 4 ++++ .../cpp_templates/interface_definition.tmpl | 3 +++ .../bindings/generators/mojom_cpp_generator.py | 5 ++++- .../bindings/pylib/mojom/generate/module.py | 17 +++++++++++++++++ 5 files changed, 35 insertions(+), 1 deletion(-) diff --git a/mojo/public/tools/bindings/README.md b/mojo/public/tools/bindings/README.md index d1ffc448e..ce291ae0e 100644 --- a/mojo/public/tools/bindings/README.md +++ b/mojo/public/tools/bindings/README.md @@ -395,6 +395,13 @@ interesting attributes supported today. field, enum value, interface method, or method parameter was introduced. See [Versioning](#Versioning) for more details. +**`[Uuid=]`** +: Specifies a UUID to be associated with a given interface. The UUID is + intended to remain stable across all changes to the interface definition, + including name changes. The value given for this attribute should be a + standard UUID string representation as specified by RFC 4122. New UUIDs can + be generated with common tools such as `uuidgen`. + **`[EnableIf=value]`** : The `EnableIf` attribute is used to conditionally enable definitions when the mojom is parsed. If the `mojom` target in the GN file does not include diff --git a/mojo/public/tools/bindings/generators/cpp_templates/interface_declaration.tmpl b/mojo/public/tools/bindings/generators/cpp_templates/interface_declaration.tmpl index 193d380e7..bd007ab2a 100644 --- a/mojo/public/tools/bindings/generators/cpp_templates/interface_declaration.tmpl +++ b/mojo/public/tools/bindings/generators/cpp_templates/interface_declaration.tmpl @@ -13,6 +13,10 @@ class {{export_attribute}} {{interface.name}} : public {{interface.name}}InterfaceBase { public: static const char Name_[]; +{%- if interface.uuid %} + static constexpr base::Token Uuid_{ {{interface.uuid[0]}}ULL, + {{interface.uuid[1]}}ULL }; +{%- endif %} static constexpr uint32_t Version_ = {{interface.version}}; static constexpr bool PassesAssociatedKinds_ = {% if interface|passes_associated_kinds %}true{% else %}false{% endif %}; static constexpr bool HasSyncMethods_ = {% if interface|has_sync_methods %}true{% else %}false{% endif %}; diff --git a/mojo/public/tools/bindings/generators/cpp_templates/interface_definition.tmpl b/mojo/public/tools/bindings/generators/cpp_templates/interface_definition.tmpl index 72c3101c1..bc3200bf6 100644 --- a/mojo/public/tools/bindings/generators/cpp_templates/interface_definition.tmpl +++ b/mojo/public/tools/bindings/generators/cpp_templates/interface_definition.tmpl @@ -32,6 +32,9 @@ std::move(p_{{param.name}}) {#--- Begin #} const char {{class_name}}::Name_[] = "{{namespace}}.{{class_name}}"; +{%- if interface.uuid %} +constexpr base::Token {{class_name}}::Uuid_; +{%- endif %} {#--- Constants #} {%- for constant in interface.constants %} diff --git a/mojo/public/tools/bindings/generators/mojom_cpp_generator.py b/mojo/public/tools/bindings/generators/mojom_cpp_generator.py index 97bc827c9..b6519a80b 100644 --- a/mojo/public/tools/bindings/generators/mojom_cpp_generator.py +++ b/mojo/public/tools/bindings/generators/mojom_cpp_generator.py @@ -256,16 +256,19 @@ class Generator(generator.Generator): return used_typemaps def _GetExtraPublicHeaders(self): + headers = set() + all_enums = list(self.module.enums) for struct in self.module.structs: all_enums.extend(struct.enums) for interface in self.module.interfaces: all_enums.extend(interface.enums) + if interface.uuid: + headers.add('base/token.h') types = set(self._GetFullMojomNameForKind(typename) for typename in self.module.structs + all_enums + self.module.unions) - headers = set() for typename, typemap in self.typemap.items(): if typename in types: headers.update(typemap.get("public_headers", [])) diff --git a/mojo/public/tools/bindings/pylib/mojom/generate/module.py b/mojo/public/tools/bindings/pylib/mojom/generate/module.py index aeeb4fce0..6a48791e5 100644 --- a/mojo/public/tools/bindings/pylib/mojom/generate/module.py +++ b/mojo/public/tools/bindings/pylib/mojom/generate/module.py @@ -12,6 +12,8 @@ # method = interface.AddMethod('Tat', 0) # method.AddParameter('baz', 0, mojom.INT32) +from uuid import UUID + # We use our own version of __repr__ when displaying the AST, as the # AST currently doesn't capture which nodes are reference (e.g. to # types) and which nodes are definitions. This allows us to e.g. print @@ -224,6 +226,7 @@ PRIMITIVES = ( ATTRIBUTE_MIN_VERSION = 'MinVersion' ATTRIBUTE_EXTENSIBLE = 'Extensible' ATTRIBUTE_SYNC = 'Sync' +ATTRIBUTE_UUID = 'Uuid' class NamedValue(object): @@ -642,6 +645,20 @@ class Interface(ReferenceKind): for constant in self.constants: constant.Stylize(stylizer) + @property + def uuid(self): + uuid_str = self.attributes.get(ATTRIBUTE_UUID) if self.attributes else None + if uuid_str is None: + return None + + try: + u = UUID(uuid_str) + except: + raise ValueError('Invalid format for Uuid attribute on interface {}. ' + 'Expected standard RFC 4122 string representation of ' + 'a UUID.'.format(self.mojom_name)) + return (int(u.hex[:16], 16), int(u.hex[16:], 16)) + class AssociatedInterface(ReferenceKind): ReferenceKind.AddSharedProperty('kind') -- 2.46.0.rc2.264.g509ed76dc8-goog