| 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 0d28239958ffd0a134f31ed826950ce38a7cf6d0..d5e3db1b3fc1d24a0a22d3663fe21378d2f1ebe0 100644
|
| --- a/mojo/public/tools/bindings/generators/mojom_cpp_generator.py
|
| +++ b/mojo/public/tools/bindings/generators/mojom_cpp_generator.py
|
| @@ -51,6 +51,70 @@ _for_blink = False
|
| _variant = None
|
|
|
|
|
| +class _NameFormatter(object):
|
| + """A formatter for the names of kinds or values."""
|
| +
|
| + def __init__(self, token, variant):
|
| + self._token = token
|
| + self._variant = variant
|
| +
|
| + def Format(self, separator, prefixed=False, internal=False,
|
| + include_variant=False, add_same_module_namespaces=False):
|
| + parts = []
|
| + if self._ShouldIncludeNamespace(add_same_module_namespaces):
|
| + if prefixed:
|
| + parts.append("")
|
| + parts.extend(self._GetNamespace())
|
| + if include_variant and self._variant:
|
| + parts.append(self._variant)
|
| + parts.extend(self._GetName(internal))
|
| + return separator.join(parts)
|
| +
|
| + def FormatForCpp(self, add_same_module_namespaces=False, internal=False):
|
| + return self.Format(
|
| + "::", prefixed=True,
|
| + add_same_module_namespaces=add_same_module_namespaces,
|
| + internal=internal, include_variant=True)
|
| +
|
| + def FormatForMojom(self):
|
| + return self.Format(".", add_same_module_namespaces=True)
|
| +
|
| + def _MapKindName(self, token, internal):
|
| + if not internal:
|
| + return token.name
|
| + if mojom.IsStructKind(token) and token.native_only:
|
| + return "mojo::Array_Data<uint8_t>"
|
| + if (mojom.IsStructKind(token) or mojom.IsUnionKind(token) or
|
| + mojom.IsInterfaceKind(token) or mojom.IsEnumKind(token)):
|
| + return token.name + "_Data"
|
| + return token.name
|
| +
|
| + def _GetName(self, internal):
|
| + name = []
|
| + if internal:
|
| + name.append("internal")
|
| + 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
|
| +
|
| + def _ShouldIncludeNamespace(self, add_same_module_namespaces):
|
| + return add_same_module_namespaces or self._token.imported_from
|
| +
|
| + def _GetNamespace(self):
|
| + if self._token.imported_from:
|
| + return NamespaceToArray(self._token.imported_from["namespace"])
|
| + elif hasattr(self._token, "module"):
|
| + return NamespaceToArray(self._token.module.namespace)
|
| + return []
|
| +
|
| +
|
| def ConstantValue(constant):
|
| return ExpressionToText(constant.value, kind=constant.kind)
|
|
|
| @@ -69,48 +133,15 @@ def DefaultValue(field):
|
| def NamespaceToArray(namespace):
|
| return namespace.split(".") if namespace else []
|
|
|
| -def GetNamePartsForKind(kind, add_same_module_namespaces, add_variant,
|
| - internal):
|
| - def MapKindName_(kind):
|
| - if not internal:
|
| - return kind.name
|
| - if mojom.IsStructKind(kind) and kind.native_only:
|
| - return "mojo::Array_Data<uint8_t>"
|
| - if (mojom.IsStructKind(kind) or mojom.IsUnionKind(kind) or
|
| - mojom.IsInterfaceKind(kind) or mojom.IsEnumKind(kind)):
|
| - return kind.name + "_Data"
|
| - return kind.name
|
| -
|
| - parts = []
|
| - if kind.imported_from:
|
| - parts.extend(NamespaceToArray(kind.imported_from["namespace"]))
|
| - if _variant and add_variant:
|
| - parts.append(_variant)
|
| - elif add_same_module_namespaces:
|
| - if hasattr(kind, "module"):
|
| - parts.extend(NamespaceToArray(kind.module.namespace))
|
| - if _variant and add_variant:
|
| - parts.append(_variant)
|
| - if internal:
|
| - parts.append("internal")
|
| - if kind.parent_kind:
|
| - parts.append(MapKindName_(kind.parent_kind))
|
| - parts.append(MapKindName_(kind))
|
| - return parts
|
| -
|
| def GetNameForKind(kind, internal=False):
|
| - parts = GetNamePartsForKind(kind, False, True, internal)
|
| - return "::".join(parts)
|
| + return _NameFormatter(kind, _variant).FormatForCpp(internal=internal)
|
|
|
| def GetQualifiedNameForKind(kind, internal=False):
|
| - # Always start with an empty part to force a leading "::" on output.
|
| - parts = [""]
|
| - parts.extend(GetNamePartsForKind(kind, True, True, internal))
|
| - return "::".join(parts)
|
| + return _NameFormatter(kind, _variant).FormatForCpp(
|
| + internal=internal, add_same_module_namespaces=True)
|
|
|
| def GetFullMojomNameForKind(kind):
|
| - parts = GetNamePartsForKind(kind, True, False, False)
|
| - return ".".join(parts)
|
| + return _NameFormatter(kind, _variant).FormatForMojom()
|
|
|
| def IsTypemappedKind(kind):
|
| return hasattr(kind, "name") and \
|
| @@ -378,21 +409,7 @@ def GetUnionGetterReturnType(kind):
|
|
|
| def TranslateConstants(token, kind):
|
| if isinstance(token, mojom.NamedValue):
|
| - # Both variable and enum constants are constructed like:
|
| - # Namespace::Struct::CONSTANT_NAME
|
| - # For enums, CONSTANT_NAME is ENUM_NAME_ENUM_VALUE.
|
| - name = []
|
| - if token.imported_from:
|
| - name.extend(NamespaceToArray(token.namespace))
|
| - if _variant:
|
| - name.append(_variant)
|
| - if token.parent_kind:
|
| - name.append(token.parent_kind.name)
|
| - if isinstance(token, mojom.EnumValue):
|
| - name.extend([token.enum.name, token.name])
|
| - else:
|
| - name.append(token.name)
|
| - return "::".join(name)
|
| + return _NameFormatter(token, _variant).FormatForCpp()
|
|
|
| if isinstance(token, mojom.BuiltinValue):
|
| if token.value == "double.INFINITY" or token.value == "float.INFINITY":
|
| @@ -523,10 +540,16 @@ class Generator(generator.Generator):
|
| "under_to_camel": generator.UnderToCamel,
|
| }
|
|
|
| - def GetExtraHeaders(self):
|
| + def GetExtraTraitsHeaders(self):
|
| + extra_headers = set()
|
| + for entry in self.typemap.itervalues():
|
| + extra_headers.update(entry.get("traits_headers", []))
|
| + return list(extra_headers)
|
| +
|
| + def GetExtraPublicHeaders(self):
|
| extra_headers = set()
|
| - for name, entry in self.typemap.iteritems():
|
| - extra_headers.update(entry["headers"])
|
| + for entry in self.typemap.itervalues():
|
| + extra_headers.update(entry.get("public_headers", []))
|
| return list(extra_headers)
|
|
|
| def GetJinjaExports(self):
|
| @@ -541,7 +564,8 @@ class Generator(generator.Generator):
|
| "unions": self.GetUnions(),
|
| "interfaces": self.GetInterfaces(),
|
| "variant": self.variant,
|
| - "extra_headers": self.GetExtraHeaders(),
|
| + "extra_traits_headers": self.GetExtraTraitsHeaders(),
|
| + "extra_public_headers": self.GetExtraPublicHeaders(),
|
| "for_blink": self.for_blink,
|
| }
|
|
|
|
|