Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2978)

Unified Diff: mojo/public/tools/bindings/generators/mojom_cpp_generator.py

Issue 2247083003: Mojo C++ bindings: extract code shared by different variants. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: . Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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)))

Powered by Google App Engine
This is Rietveld 408576698