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 a9fa2398588904778dbf5f7e0478f9f817bb2034..32ccb51c3ace1ab132df66256192e5bffee73dac 100644 |
--- a/mojo/public/tools/bindings/generators/mojom_cpp_generator.py |
+++ b/mojo/public/tools/bindings/generators/mojom_cpp_generator.py |
@@ -50,22 +50,40 @@ class _NameFormatter(object): |
self._variant = variant |
def Format(self, separator, prefixed=False, internal=False, |
- include_variant=False, add_same_module_namespaces=False): |
+ include_variant=False, add_same_module_namespaces=False, |
+ flatten_nested_kind=False): |
+ """Formats the name according to the given configuration. |
+ |
+ Args: |
+ separator: Separator between different parts of the name. |
+ prefixed: Whether a leading separator should be added. |
+ internal: Returns the name in the "internal" namespace. |
+ include_variant: Whether to include variant as namespace. If |internal| is |
+ True, then this flag is ignored and variant is not included. |
+ add_same_module_namespaces: Includes all namespaces even if the token is |
+ from the same module as the current mojom file. |
+ flatten_nested_kind: It is allowed to define enums inside structs and |
+ interfaces. If this flag is set to True, this method concatenates the |
+ parent kind and the nested kind with '_', instead of treating the |
+ parent kind as a scope.""" |
+ |
parts = [] |
if self._ShouldIncludeNamespace(add_same_module_namespaces): |
if prefixed: |
parts.append("") |
parts.extend(self._GetNamespace()) |
- if include_variant and self._variant: |
+ if include_variant and self._variant and not internal: |
parts.append(self._variant) |
- parts.extend(self._GetName(internal)) |
+ parts.extend(self._GetName(internal, flatten_nested_kind)) |
return separator.join(parts) |
- def FormatForCpp(self, add_same_module_namespaces=False, internal=False): |
+ def FormatForCpp(self, add_same_module_namespaces=False, internal=False, |
+ flatten_nested_kind=False): |
return self.Format( |
"::", prefixed=True, |
add_same_module_namespaces=add_same_module_namespaces, |
- internal=internal, include_variant=True) |
+ internal=internal, include_variant=True, |
+ flatten_nested_kind=flatten_nested_kind) |
def FormatForMojom(self): |
return self.Format(".", add_same_module_namespaces=True) |
@@ -74,24 +92,32 @@ class _NameFormatter(object): |
if not internal: |
return token.name |
if (mojom.IsStructKind(token) or mojom.IsUnionKind(token) or |
- mojom.IsInterfaceKind(token) or mojom.IsEnumKind(token)): |
+ mojom.IsEnumKind(token)): |
return token.name + "_Data" |
return token.name |
- def _GetName(self, internal): |
- name = [] |
+ def _GetName(self, internal, flatten_nested_kind): |
+ if isinstance(self._token, mojom.EnumValue): |
+ name_parts = _NameFormatter(self._token.enum, self._variant)._GetName( |
+ internal, flatten_nested_kind) |
+ name_parts.append(self._token.name) |
+ return name_parts |
+ |
+ name_parts = [] |
if internal: |
- name.append("internal") |
+ name_parts.append("internal") |
+ |
+ if (flatten_nested_kind and mojom.IsEnumKind(self._token) and |
+ self._token.parent_kind): |
+ name = "%s_%s" % (self._token.parent_kind.name, |
+ self._MapKindName(self._token, internal)) |
+ name_parts.append(name) |
+ return name_parts |
+ |
if self._token.parent_kind: |
- name.append(self._MapKindName(self._token.parent_kind, internal)) |
- # Both variable and enum constants are constructed like: |
- # Namespace::Struct::CONSTANT_NAME |
- # For enums, CONSTANT_NAME is EnumName::ENUM_VALUE. |
- if isinstance(self._token, mojom.EnumValue): |
- name.extend([self._token.enum.name, self._token.name]) |
- else: |
- name.append(self._MapKindName(self._token, internal)) |
- return name |
+ name_parts.append(self._MapKindName(self._token.parent_kind, internal)) |
+ name_parts.append(self._MapKindName(self._token, internal)) |
+ return name_parts |
def _ShouldIncludeNamespace(self, add_same_module_namespaces): |
return add_same_module_namespaces or self._token.imported_from |
@@ -126,12 +152,14 @@ def DefaultValue(field): |
def NamespaceToArray(namespace): |
return namespace.split(".") if namespace else [] |
-def GetNameForKind(kind, internal=False): |
- return _NameFormatter(kind, _variant).FormatForCpp(internal=internal) |
+def GetNameForKind(kind, internal=False, flatten_nested_kind=False): |
+ return _NameFormatter(kind, _variant).FormatForCpp( |
+ internal=internal, flatten_nested_kind=flatten_nested_kind) |
-def GetQualifiedNameForKind(kind, internal=False): |
+def GetQualifiedNameForKind(kind, internal=False, flatten_nested_kind=False): |
return _NameFormatter(kind, _variant).FormatForCpp( |
- internal=internal, add_same_module_namespaces=True) |
+ internal=internal, add_same_module_namespaces=True, |
+ flatten_nested_kind=flatten_nested_kind) |
def GetFullMojomNameForKind(kind): |
return _NameFormatter(kind, _variant).FormatForMojom() |
@@ -334,7 +362,8 @@ def GetUnmappedTypeForSerializer(kind): |
def TranslateConstants(token, kind): |
if isinstance(token, mojom.NamedValue): |
- return _NameFormatter(token, _variant).FormatForCpp() |
+ return _NameFormatter(token, _variant).FormatForCpp( |
+ flatten_nested_kind=True) |
if isinstance(token, mojom.BuiltinValue): |
if token.value == "double.INFINITY" or token.value == "float.INFINITY": |
@@ -410,7 +439,8 @@ def GetContainerValidateParamsCtorArgs(kind): |
element_validate_params = GetNewContainerValidateParams(kind.kind) |
if mojom.IsEnumKind(kind.kind): |
enum_validate_func = ("%s::Validate" % |
- GetQualifiedNameForKind(kind.kind, internal=True)) |
+ GetQualifiedNameForKind(kind.kind, internal=True, |
+ flatten_nested_kind=True)) |
else: |
enum_validate_func = "nullptr" |
@@ -446,7 +476,7 @@ class Generator(generator.Generator): |
"default_value": DefaultValue, |
"expression_to_text": ExpressionToText, |
"get_container_validate_params_ctor_args": |
- GetContainerValidateParamsCtorArgs, |
+ GetContainerValidateParamsCtorArgs, |
"get_name_for_kind": GetNameForKind, |
"get_pad": pack.GetPad, |
"get_qualified_name_for_kind": GetQualifiedNameForKind, |
@@ -488,6 +518,14 @@ class Generator(generator.Generator): |
return list(extra_headers) |
def GetJinjaExports(self): |
+ structs = self.GetStructs() |
+ interfaces = self.GetInterfaces() |
+ all_enums = list(self.module.enums) |
+ for struct in structs: |
+ all_enums.extend(struct.enums) |
+ for interface in interfaces: |
+ all_enums.extend(interface.enums) |
+ |
return { |
"module": self.module, |
"namespace": self.module.namespace, |
@@ -495,9 +533,10 @@ class Generator(generator.Generator): |
"imports": self.module.imports, |
"kinds": self.module.kinds, |
"enums": self.module.enums, |
- "structs": self.GetStructs(), |
+ "all_enums": all_enums, |
+ "structs": structs, |
"unions": self.GetUnions(), |
- "interfaces": self.GetInterfaces(), |
+ "interfaces": interfaces, |
"variant": self.variant, |
"extra_traits_headers": self.GetExtraTraitsHeaders(), |
"extra_public_headers": self.GetExtraPublicHeaders(), |
@@ -519,10 +558,6 @@ class Generator(generator.Generator): |
def GenerateModuleHeader(self): |
return self.GetJinjaExports() |
- @UseJinja("module-internal.h.tmpl") |
- def GenerateModuleInternalHeader(self): |
- return self.GetJinjaExports() |
- |
@UseJinja("module.cc.tmpl") |
def GenerateModuleSource(self): |
return self.GetJinjaExports() |
@@ -560,9 +595,6 @@ class Generator(generator.Generator): |
suffix = "-%s" % self.variant if self.variant else "" |
self.Write(self.GenerateModuleHeader(), |
self.MatchMojomFilePath("%s%s.h" % (self.module.name, suffix))) |
- self.Write(self.GenerateModuleInternalHeader(), |
- self.MatchMojomFilePath("%s%s-internal.h" % |
- (self.module.name, suffix))) |
self.Write( |
self.GenerateModuleSource(), |
self.MatchMojomFilePath("%s%s.cc" % (self.module.name, suffix))) |