Index: mojo/public/tools/bindings/generators/mojom_cpp_generator.py |
diff --git a/mojo/public/tools/bindings/generators/mojom_cpp_generator.py b/mojo/public/tools/bindings/generators/mojom_cpp_generator.py |
index f5219a3a3e1cf07e5b20428dabad720fff4cc4b7..6b2322eaf54b64544701bb682f243caba16a92dd 100644 |
--- a/mojo/public/tools/bindings/generators/mojom_cpp_generator.py |
+++ b/mojo/public/tools/bindings/generators/mojom_cpp_generator.py |
@@ -42,9 +42,25 @@ _kind_to_cpp_literal_suffix = { |
mojom.UINT64: "ULL", |
} |
+ |
_current_variant = None |
+_variant_metadata_attributes = { |
+ "chromium": { |
+ "typename": "ChromiumType", |
+ "headers": "ChromiumHeaders", |
+ }, |
+ "blink": { |
+ "typename": "BlinkType", |
+ "headers": "BlinkHeaders", |
+ } |
+} |
+ |
+ |
+_variant_typemap = {} |
+ |
+ |
def ConstantValue(constant): |
return ExpressionToText(constant.value, kind=constant.kind) |
@@ -56,6 +72,13 @@ def DefaultValue(field): |
return ExpressionToText(field.default, kind=field.kind) |
return "" |
+def IsNativeKind(kind): |
+ if hasattr(kind, "name") and kind.name in _variant_typemap: |
+ return True |
+ |
+def GetNativeTypeName(kind): |
+ return _variant_typemap[kind.name] |
+ |
def NamespaceToArray(namespace): |
return namespace.split(".") if namespace else [] |
@@ -72,6 +95,11 @@ def GetNameForKind(kind, internal = False): |
parts.append(kind.name) |
return "::".join(parts) |
+def GetQualifiedGenericInterfaceName(interface_kind): |
+ parts = NamespaceToArray(interface_kind.module.namespace) |
+ parts.append(interface_kind.name) |
+ return "::".join(parts) |
+ |
def GetCppType(kind): |
if mojom.IsArrayKind(kind): |
return "mojo::internal::Array_Data<%s>*" % GetCppType(kind.kind) |
@@ -135,6 +163,8 @@ def GetCppArrayArgWrapperType(kind): |
return _kind_to_cpp_type[kind] |
def GetCppResultWrapperType(kind): |
+ if IsNativeKind(kind): |
+ return "const %s&" % GetNativeTypeName(kind) |
if mojom.IsEnumKind(kind): |
return GetNameForKind(kind) |
if mojom.IsStructKind(kind) or mojom.IsUnionKind(kind): |
@@ -173,6 +203,8 @@ def GetCppResultWrapperType(kind): |
raise Exception("Unrecognized kind %s" % kind.spec) |
def GetCppWrapperType(kind): |
+ if IsNativeKind(kind): |
+ return GetNativeTypeName(kind) |
if mojom.IsEnumKind(kind): |
return GetNameForKind(kind) |
if mojom.IsStructKind(kind) or mojom.IsUnionKind(kind): |
@@ -205,6 +237,8 @@ def GetCppWrapperType(kind): |
return _kind_to_cpp_type.get(kind) |
def GetCppConstWrapperType(kind): |
+ if IsNativeKind(kind): |
+ return "const %s&" % GetNativeTypeName(kind) |
if mojom.IsStructKind(kind) or mojom.IsUnionKind(kind): |
return "%sPtr" % GetNameForKind(kind) |
if mojom.IsArrayKind(kind): |
@@ -239,6 +273,8 @@ def GetCppConstWrapperType(kind): |
return _kind_to_cpp_type[kind] |
def GetCppFieldType(kind): |
+ if IsNativeKind(kind): |
+ return "mojo::internal::NativePointer<%s>" % GetNativeTypeName(kind) |
if mojom.IsStructKind(kind): |
return ("mojo::internal::StructPointer<%s_Data>" % |
GetNameForKind(kind, internal=True)) |
@@ -397,6 +433,7 @@ class Generator(generator.Generator): |
"get_map_validate_params_ctor_args": GetMapValidateParamsCtorArgs, |
"get_name_for_kind": GetNameForKind, |
"get_pad": pack.GetPad, |
+ "get_qualified_generic_interface_name": GetQualifiedGenericInterfaceName, |
"has_callbacks": mojom.HasCallbacks, |
"should_inline": ShouldInlineStruct, |
"should_inline_union": ShouldInlineUnion, |
@@ -405,6 +442,7 @@ class Generator(generator.Generator): |
"is_enum_kind": mojom.IsEnumKind, |
"is_integral_kind": mojom.IsIntegralKind, |
"is_move_only_kind": mojom.IsMoveOnlyKind, |
+ "is_native_kind": IsNativeKind, |
"is_any_handle_kind": mojom.IsAnyHandleKind, |
"is_interface_kind": mojom.IsInterfaceKind, |
"is_interface_request_kind": mojom.IsInterfaceRequestKind, |
@@ -428,7 +466,30 @@ class Generator(generator.Generator): |
chromium_cpp_filters = dict(cpp_filters) |
blink_cpp_filters = dict(cpp_filters) |
+ def GetExtraHeaders(self): |
+ if not _current_variant: |
+ return [] |
+ extra_headers = [] |
+ headers_attribute = \ |
+ _variant_metadata_attributes[_current_variant]["headers"] |
+ for struct in self.GetStructs(): |
+ if struct.attributes: |
+ headers = struct.attributes.get(headers_attribute, []) |
+ extra_headers.extend(headers) |
+ return extra_headers |
+ |
def GetJinjaExports(self): |
+ global _variant_typemap |
+ _variant_typemap = {} |
+ if _current_variant: |
+ typename_attribute = \ |
+ _variant_metadata_attributes[_current_variant]["typename"] |
+ for struct in self.GetStructs(): |
+ if struct.attributes: |
+ typename = struct.attributes.get(typename_attribute) |
+ if typename: |
+ _variant_typemap[struct.name] = typename |
+ |
return { |
"module": self.module, |
"namespace": self.module.namespace, |
@@ -440,6 +501,7 @@ class Generator(generator.Generator): |
"unions": self.GetUnions(), |
"interfaces": self.GetInterfaces(), |
"variant": _current_variant, |
+ "extra_headers": self.GetExtraHeaders(), |
} |
@UseJinja("cpp_templates/module.h.tmpl", filters=cpp_filters) |