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 de906690344d6b1db2664376002d81b77bae5c6a..07eb45bfc3ec2681a844efcd9b5295fe3abc7456 100644 |
--- a/mojo/public/tools/bindings/generators/mojom_cpp_generator.py |
+++ b/mojo/public/tools/bindings/generators/mojom_cpp_generator.py |
@@ -152,9 +152,11 @@ def DefaultValue(field): |
def NamespaceToArray(namespace): |
return namespace.split(".") if namespace else [] |
-def GetNameForKind(kind, internal=False, flatten_nested_kind=False): |
+def GetNameForKind(kind, internal=False, flatten_nested_kind=False, |
+ add_same_module_namespaces=False): |
return _NameFormatter(kind, _variant).FormatForCpp( |
- internal=internal, flatten_nested_kind=flatten_nested_kind) |
+ internal=internal, flatten_nested_kind=flatten_nested_kind, |
+ add_same_module_namespaces=add_same_module_namespaces) |
def GetQualifiedNameForKind(kind, internal=False, flatten_nested_kind=False): |
return _NameFormatter(kind, _variant).FormatForCpp( |
@@ -172,6 +174,45 @@ def IsNativeOnlyKind(kind): |
return (mojom.IsStructKind(kind) or mojom.IsEnumKind(kind)) and \ |
kind.native_only |
+ |
+def IsHashableKind(kind): |
+ """Check if the kind can be hashed. |
+ |
+ Args: |
+ kind: {Kind} The kind to check. |
+ |
+ Returns: |
+ {bool} True if a value of this kind can be hashed. |
+ """ |
+ checked = set() |
+ def Check(kind): |
+ if kind.spec in checked: |
+ return True |
+ checked.add(kind.spec) |
+ if mojom.IsNullableKind(kind): |
+ return False |
+ elif mojom.IsStructKind(kind): |
+ if (IsTypemappedKind(kind) and |
+ not _current_typemap[GetFullMojomNameForKind(kind)]["hashable"]): |
+ return False |
+ return all(Check(field.kind) for field in kind.fields) |
+ elif mojom.IsUnionKind(kind): |
+ return all(Check(field.kind) for field in kind.fields) |
+ elif mojom.IsAnyHandleKind(kind): |
+ return False |
+ elif mojom.IsAnyInterfaceKind(kind): |
+ return False |
+ # TODO(tibell): Arrays and maps could be made hashable. We just don't have a |
+ # use case yet. |
+ elif mojom.IsArrayKind(kind): |
+ return False |
+ elif mojom.IsMapKind(kind): |
+ return False |
+ else: |
+ return True |
+ return Check(kind) |
+ |
+ |
def GetNativeTypeName(typemapped_kind): |
return _current_typemap[GetFullMojomNameForKind(typemapped_kind)]["typename"] |
@@ -180,7 +221,7 @@ def GetCppPodType(kind): |
return "char*" |
return _kind_to_cpp_type[kind] |
-def GetCppWrapperType(kind): |
+def GetCppWrapperType(kind, add_same_module_namespaces=False): |
def _AddOptional(type_name): |
pattern = "WTF::Optional<%s>" if _for_blink else "base::Optional<%s>" |
return pattern % type_name |
@@ -193,9 +234,11 @@ def GetCppWrapperType(kind): |
type_name = _AddOptional(type_name) |
return type_name |
if mojom.IsEnumKind(kind): |
- return GetNameForKind(kind) |
+ return GetNameForKind( |
+ kind, add_same_module_namespaces=add_same_module_namespaces) |
if mojom.IsStructKind(kind) or mojom.IsUnionKind(kind): |
- return "%sPtr" % GetNameForKind(kind) |
+ return "%sPtr" % GetNameForKind( |
+ kind, add_same_module_namespaces=add_same_module_namespaces) |
if mojom.IsArrayKind(kind): |
pattern = None |
if _use_new_wrapper_types: |
@@ -204,7 +247,8 @@ def GetCppWrapperType(kind): |
pattern = _AddOptional(pattern) |
else: |
pattern = "mojo::WTFArray<%s>" if _for_blink else "mojo::Array<%s>" |
- return pattern % GetCppWrapperType(kind.kind) |
+ return pattern % GetCppWrapperType( |
+ kind.kind, add_same_module_namespaces=add_same_module_namespaces) |
if mojom.IsMapKind(kind): |
pattern = None |
if _use_new_wrapper_types: |
@@ -214,16 +258,25 @@ def GetCppWrapperType(kind): |
pattern = _AddOptional(pattern) |
else: |
pattern = "mojo::WTFMap<%s, %s>" if _for_blink else "mojo::Map<%s, %s>" |
- return pattern % (GetCppWrapperType(kind.key_kind), |
- GetCppWrapperType(kind.value_kind)) |
+ return pattern % ( |
+ GetCppWrapperType( |
+ kind.key_kind, |
+ add_same_module_namespaces=add_same_module_namespaces), |
+ GetCppWrapperType( |
+ kind.value_kind, |
+ add_same_module_namespaces=add_same_module_namespaces)) |
if mojom.IsInterfaceKind(kind): |
- return "%sPtr" % GetNameForKind(kind) |
+ return "%sPtr" % GetNameForKind( |
+ kind, add_same_module_namespaces=add_same_module_namespaces) |
if mojom.IsInterfaceRequestKind(kind): |
- return "%sRequest" % GetNameForKind(kind.kind) |
+ return "%sRequest" % GetNameForKind( |
+ kind.kind, add_same_module_namespaces=add_same_module_namespaces) |
if mojom.IsAssociatedInterfaceKind(kind): |
- return "%sAssociatedPtrInfo" % GetNameForKind(kind.kind) |
+ return "%sAssociatedPtrInfo" % GetNameForKind( |
+ kind.kind, add_same_module_namespaces=add_same_module_namespaces) |
if mojom.IsAssociatedInterfaceRequestKind(kind): |
- return "%sAssociatedRequest" % GetNameForKind(kind.kind) |
+ return "%sAssociatedRequest" % GetNameForKind( |
+ kind.kind, add_same_module_namespaces=add_same_module_namespaces) |
if mojom.IsStringKind(kind): |
if _for_blink: |
return "WTF::String" |
@@ -313,6 +366,22 @@ def GetUnionGetterReturnType(kind): |
return "%s&" % GetCppWrapperType(kind) |
return GetCppWrapperType(kind) |
+def GetUnionTraitGetterReturnType(kind): |
+ """Get field type used in UnionTraits template specialization. |
+ |
+ The type may be qualified as UnionTraits specializations live outside the |
+ namespace where e.g. structs are defined. |
+ |
+ Args: |
+ kind: {Kind} The type of the field. |
+ |
+ Returns: |
+ {str} The C++ type to use for the field. |
+ """ |
+ if mojom.IsReferenceKind(kind): |
+ return "%s&" % GetCppWrapperType(kind, add_same_module_namespaces=True) |
+ return GetCppWrapperType(kind, add_same_module_namespaces=True) |
+ |
def GetCppDataViewType(kind, qualified=False): |
def _GetName(input_kind): |
return _NameFormatter(input_kind, None).FormatForCpp( |
@@ -465,6 +534,7 @@ class Generator(generator.Generator): |
cpp_filters = { |
"constant_value": ConstantValue, |
+ "contains_handles_or_interfaces": mojom.ContainsHandlesOrInterfaces, |
"contains_move_only_members": ContainsMoveOnlyMembers, |
"cpp_wrapper_param_type": GetCppWrapperParamType, |
"cpp_data_view_type": GetCppDataViewType, |
@@ -472,6 +542,7 @@ class Generator(generator.Generator): |
"cpp_union_field_type": GetCppUnionFieldType, |
"cpp_pod_type": GetCppPodType, |
"cpp_union_getter_return_type": GetUnionGetterReturnType, |
+ "cpp_union_trait_getter_return_type": GetUnionTraitGetterReturnType, |
"cpp_wrapper_type": GetCppWrapperType, |
"default_value": DefaultValue, |
"expression_to_text": ExpressionToText, |
@@ -493,9 +564,11 @@ class Generator(generator.Generator): |
"is_any_interface_kind": mojom.IsAnyInterfaceKind, |
"is_any_handle_or_interface_kind": mojom.IsAnyHandleOrInterfaceKind, |
"is_associated_kind": mojom.IsAssociatedKind, |
+ "is_hashable": IsHashableKind, |
"is_map_kind": mojom.IsMapKind, |
"is_nullable_kind": mojom.IsNullableKind, |
"is_object_kind": mojom.IsObjectKind, |
+ "is_reference_kind": mojom.IsReferenceKind, |
"is_string_kind": mojom.IsStringKind, |
"is_struct_kind": mojom.IsStructKind, |
"is_typemapped_kind": IsTypemappedKind, |