Chromium Code Reviews| 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..7d5cdf150dc04b8724dc0671e8fb90763cae6e26 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): |
|
yzshen1
2016/09/22 23:48:56
Just something to think about, we could remove thi
tibell
2016/09/23 00:07:08
Acknowledged.
|
| return _NameFormatter(kind, _variant).FormatForCpp( |
| @@ -172,6 +174,44 @@ 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 (kind.native_only or |
|
yzshen1
2016/09/22 23:48:56
As we discussed, native-only types may be hashable
tibell
2016/09/23 00:07:08
Done.
|
| + (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 |
| + elif mojom.IsArrayKind(kind): |
|
yzshen1
2016/09/22 23:48:56
Why array/map are not hashable?
tibell
2016/09/23 00:07:08
We didn't think we'd need it. I've added a TODO. I
|
| + 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 +220,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 +233,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 +246,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 +257,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 +365,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 +533,7 @@ class Generator(generator.Generator): |
| cpp_filters = { |
| "constant_value": ConstantValue, |
| + "contains_handles": mojom.ContainsHandles, |
| "contains_move_only_members": ContainsMoveOnlyMembers, |
| "cpp_wrapper_param_type": GetCppWrapperParamType, |
| "cpp_data_view_type": GetCppDataViewType, |
| @@ -472,6 +541,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 +563,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, |