| 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
|
| deleted file mode 100644
|
| index 34bba30e69be34948f5bd666dc76fbfc94388e61..0000000000000000000000000000000000000000
|
| --- a/mojo/public/tools/bindings/generators/mojom_cpp_generator.py
|
| +++ /dev/null
|
| @@ -1,387 +0,0 @@
|
| -# Copyright 2013 The Chromium Authors. All rights reserved.
|
| -# Use of this source code is governed by a BSD-style license that can be
|
| -# found in the LICENSE file.
|
| -
|
| -"""Generates C++ source files from a mojom.Module."""
|
| -
|
| -import mojom.generate.generator as generator
|
| -import mojom.generate.module as mojom
|
| -import mojom.generate.pack as pack
|
| -from mojom.generate.template_expander import UseJinja
|
| -
|
| -
|
| -_kind_to_cpp_type = {
|
| - mojom.BOOL: "bool",
|
| - mojom.INT8: "int8_t",
|
| - mojom.UINT8: "uint8_t",
|
| - mojom.INT16: "int16_t",
|
| - mojom.UINT16: "uint16_t",
|
| - mojom.INT32: "int32_t",
|
| - mojom.UINT32: "uint32_t",
|
| - mojom.FLOAT: "float",
|
| - mojom.HANDLE: "mojo::Handle",
|
| - mojom.DCPIPE: "mojo::DataPipeConsumerHandle",
|
| - mojom.DPPIPE: "mojo::DataPipeProducerHandle",
|
| - mojom.MSGPIPE: "mojo::MessagePipeHandle",
|
| - mojom.SHAREDBUFFER: "mojo::SharedBufferHandle",
|
| - mojom.NULLABLE_HANDLE: "mojo::Handle",
|
| - mojom.NULLABLE_DCPIPE: "mojo::DataPipeConsumerHandle",
|
| - mojom.NULLABLE_DPPIPE: "mojo::DataPipeProducerHandle",
|
| - mojom.NULLABLE_MSGPIPE: "mojo::MessagePipeHandle",
|
| - mojom.NULLABLE_SHAREDBUFFER: "mojo::SharedBufferHandle",
|
| - mojom.INT64: "int64_t",
|
| - mojom.UINT64: "uint64_t",
|
| - mojom.DOUBLE: "double",
|
| -}
|
| -
|
| -_kind_to_cpp_literal_suffix = {
|
| - mojom.UINT8: "U",
|
| - mojom.UINT16: "U",
|
| - mojom.UINT32: "U",
|
| - mojom.FLOAT: "f",
|
| - mojom.UINT64: "ULL",
|
| -}
|
| -
|
| -def ConstantValue(constant):
|
| - return ExpressionToText(constant.value, kind=constant.kind)
|
| -
|
| -def DefaultValue(field):
|
| - if field.default:
|
| - if mojom.IsStructKind(field.kind):
|
| - assert field.default == "default"
|
| - return "%s::New()" % GetNameForKind(field.kind)
|
| - return ExpressionToText(field.default, kind=field.kind)
|
| - return ""
|
| -
|
| -def NamespaceToArray(namespace):
|
| - return namespace.split('.') if namespace else []
|
| -
|
| -def GetNameForKind(kind, internal = False):
|
| - parts = []
|
| - if kind.imported_from:
|
| - parts.extend(NamespaceToArray(kind.imported_from["namespace"]))
|
| - if internal:
|
| - parts.append("internal")
|
| - if kind.parent_kind:
|
| - parts.append(kind.parent_kind.name)
|
| - parts.append(kind.name)
|
| - return "::".join(parts)
|
| -
|
| -def GetCppType(kind):
|
| - if mojom.IsArrayKind(kind):
|
| - return "mojo::internal::Array_Data<%s>*" % GetCppType(kind.kind)
|
| - if mojom.IsMapKind(kind):
|
| - return "mojo::internal::Map_Data<%s, %s>*" % (
|
| - GetCppType(kind.key_kind), GetCppType(kind.value_kind))
|
| - if mojom.IsStructKind(kind):
|
| - return "%s_Data*" % GetNameForKind(kind, internal=True)
|
| - if mojom.IsInterfaceKind(kind) or mojom.IsInterfaceRequestKind(kind):
|
| - return "mojo::MessagePipeHandle"
|
| - if mojom.IsEnumKind(kind):
|
| - return "int32_t"
|
| - if mojom.IsStringKind(kind):
|
| - return "mojo::internal::String_Data*"
|
| - return _kind_to_cpp_type[kind]
|
| -
|
| -def GetCppPodType(kind):
|
| - if mojom.IsStringKind(kind):
|
| - return "char*"
|
| - return _kind_to_cpp_type[kind]
|
| -
|
| -def GetCppArrayArgWrapperType(kind):
|
| - if mojom.IsEnumKind(kind):
|
| - return GetNameForKind(kind)
|
| - if mojom.IsStructKind(kind):
|
| - return "%sPtr" % GetNameForKind(kind)
|
| - if mojom.IsArrayKind(kind):
|
| - return "mojo::Array<%s> " % GetCppArrayArgWrapperType(kind.kind)
|
| - if mojom.IsMapKind(kind):
|
| - return "mojo::Map<%s, %s> " % (GetCppArrayArgWrapperType(kind.key_kind),
|
| - GetCppArrayArgWrapperType(kind.value_kind))
|
| - if mojom.IsInterfaceKind(kind):
|
| - raise Exception("Arrays of interfaces not yet supported!")
|
| - if mojom.IsInterfaceRequestKind(kind):
|
| - raise Exception("Arrays of interface requests not yet supported!")
|
| - if mojom.IsStringKind(kind):
|
| - return "mojo::String"
|
| - if mojom.IsHandleKind(kind):
|
| - return "mojo::ScopedHandle"
|
| - if mojom.IsDataPipeConsumerKind(kind):
|
| - return "mojo::ScopedDataPipeConsumerHandle"
|
| - if mojom.IsDataPipeProducerKind(kind):
|
| - return "mojo::ScopedDataPipeProducerHandle"
|
| - if mojom.IsMessagePipeKind(kind):
|
| - return "mojo::ScopedMessagePipeHandle"
|
| - if mojom.IsSharedBufferKind(kind):
|
| - return "mojo::ScopedSharedBufferHandle"
|
| - return _kind_to_cpp_type[kind]
|
| -
|
| -def GetCppResultWrapperType(kind):
|
| - if mojom.IsEnumKind(kind):
|
| - return GetNameForKind(kind)
|
| - if mojom.IsStructKind(kind):
|
| - return "%sPtr" % GetNameForKind(kind)
|
| - if mojom.IsArrayKind(kind):
|
| - return "mojo::Array<%s>" % GetCppArrayArgWrapperType(kind.kind)
|
| - if mojom.IsMapKind(kind):
|
| - return "mojo::Map<%s, %s>" % (GetCppArrayArgWrapperType(kind.key_kind),
|
| - GetCppArrayArgWrapperType(kind.value_kind))
|
| - if mojom.IsInterfaceKind(kind):
|
| - return "%sPtr" % GetNameForKind(kind)
|
| - if mojom.IsInterfaceRequestKind(kind):
|
| - return "mojo::InterfaceRequest<%s>" % GetNameForKind(kind.kind)
|
| - if mojom.IsStringKind(kind):
|
| - return "mojo::String"
|
| - if mojom.IsHandleKind(kind):
|
| - return "mojo::ScopedHandle"
|
| - if mojom.IsDataPipeConsumerKind(kind):
|
| - return "mojo::ScopedDataPipeConsumerHandle"
|
| - if mojom.IsDataPipeProducerKind(kind):
|
| - return "mojo::ScopedDataPipeProducerHandle"
|
| - if mojom.IsMessagePipeKind(kind):
|
| - return "mojo::ScopedMessagePipeHandle"
|
| - if mojom.IsSharedBufferKind(kind):
|
| - return "mojo::ScopedSharedBufferHandle"
|
| - return _kind_to_cpp_type[kind]
|
| -
|
| -def GetCppWrapperType(kind):
|
| - if mojom.IsEnumKind(kind):
|
| - return GetNameForKind(kind)
|
| - if mojom.IsStructKind(kind):
|
| - return "%sPtr" % GetNameForKind(kind)
|
| - if mojom.IsArrayKind(kind):
|
| - return "mojo::Array<%s>" % GetCppArrayArgWrapperType(kind.kind)
|
| - if mojom.IsMapKind(kind):
|
| - return "mojo::Map<%s, %s>" % (GetCppArrayArgWrapperType(kind.key_kind),
|
| - GetCppArrayArgWrapperType(kind.value_kind))
|
| - if mojom.IsInterfaceKind(kind):
|
| - return "%sPtr" % GetNameForKind(kind)
|
| - if mojom.IsInterfaceRequestKind(kind):
|
| - raise Exception("InterfaceRequest fields not supported!")
|
| - if mojom.IsStringKind(kind):
|
| - return "mojo::String"
|
| - if mojom.IsHandleKind(kind):
|
| - return "mojo::ScopedHandle"
|
| - if mojom.IsDataPipeConsumerKind(kind):
|
| - return "mojo::ScopedDataPipeConsumerHandle"
|
| - if mojom.IsDataPipeProducerKind(kind):
|
| - return "mojo::ScopedDataPipeProducerHandle"
|
| - if mojom.IsMessagePipeKind(kind):
|
| - return "mojo::ScopedMessagePipeHandle"
|
| - if mojom.IsSharedBufferKind(kind):
|
| - return "mojo::ScopedSharedBufferHandle"
|
| - return _kind_to_cpp_type[kind]
|
| -
|
| -def GetCppConstWrapperType(kind):
|
| - if mojom.IsStructKind(kind):
|
| - return "%sPtr" % GetNameForKind(kind)
|
| - if mojom.IsArrayKind(kind):
|
| - return "mojo::Array<%s>" % GetCppArrayArgWrapperType(kind.kind)
|
| - if mojom.IsMapKind(kind):
|
| - return "mojo::Map<%s, %s>" % (GetCppArrayArgWrapperType(kind.key_kind),
|
| - GetCppArrayArgWrapperType(kind.value_kind))
|
| - if mojom.IsInterfaceKind(kind):
|
| - return "%sPtr" % GetNameForKind(kind)
|
| - if mojom.IsInterfaceRequestKind(kind):
|
| - return "mojo::InterfaceRequest<%s>" % GetNameForKind(kind.kind)
|
| - if mojom.IsEnumKind(kind):
|
| - return GetNameForKind(kind)
|
| - if mojom.IsStringKind(kind):
|
| - return "const mojo::String&"
|
| - if mojom.IsHandleKind(kind):
|
| - return "mojo::ScopedHandle"
|
| - if mojom.IsDataPipeConsumerKind(kind):
|
| - return "mojo::ScopedDataPipeConsumerHandle"
|
| - if mojom.IsDataPipeProducerKind(kind):
|
| - return "mojo::ScopedDataPipeProducerHandle"
|
| - if mojom.IsMessagePipeKind(kind):
|
| - return "mojo::ScopedMessagePipeHandle"
|
| - if mojom.IsSharedBufferKind(kind):
|
| - return "mojo::ScopedSharedBufferHandle"
|
| - if not kind in _kind_to_cpp_type:
|
| - print "missing:", kind.spec
|
| - return _kind_to_cpp_type[kind]
|
| -
|
| -def GetCppFieldType(kind):
|
| - if mojom.IsStructKind(kind):
|
| - return ("mojo::internal::StructPointer<%s_Data>" %
|
| - GetNameForKind(kind, internal=True))
|
| - if mojom.IsArrayKind(kind):
|
| - return "mojo::internal::ArrayPointer<%s>" % GetCppType(kind.kind)
|
| - if mojom.IsMapKind(kind):
|
| - return ("mojo::internal::StructPointer<mojo::internal::Map_Data<%s, %s>>" %
|
| - (GetCppType(kind.key_kind), GetCppType(kind.value_kind)))
|
| - if mojom.IsInterfaceKind(kind) or mojom.IsInterfaceRequestKind(kind):
|
| - return "mojo::MessagePipeHandle"
|
| - if mojom.IsEnumKind(kind):
|
| - return GetNameForKind(kind)
|
| - if mojom.IsStringKind(kind):
|
| - return "mojo::internal::StringPointer"
|
| - return _kind_to_cpp_type[kind]
|
| -
|
| -def IsStructWithHandles(struct):
|
| - for pf in struct.packed.packed_fields:
|
| - if mojom.IsAnyHandleKind(pf.field.kind):
|
| - return True
|
| - return False
|
| -
|
| -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 token.parent_kind:
|
| - name.append(token.parent_kind.name)
|
| - if isinstance(token, mojom.EnumValue):
|
| - name.append(
|
| - "%s_%s" % (generator.CamelCaseToAllCaps(token.enum.name), token.name))
|
| - else:
|
| - name.append(token.name)
|
| - return "::".join(name)
|
| -
|
| - if isinstance(token, mojom.BuiltinValue):
|
| - if token.value == "double.INFINITY" or token.value == "float.INFINITY":
|
| - return "INFINITY";
|
| - if token.value == "double.NEGATIVE_INFINITY" or \
|
| - token.value == "float.NEGATIVE_INFINITY":
|
| - return "-INFINITY";
|
| - if token.value == "double.NAN" or token.value == "float.NAN":
|
| - return "NAN";
|
| -
|
| - if (kind is not None and mojom.IsFloatKind(kind)):
|
| - return token if token.isdigit() else token + "f";
|
| -
|
| - # Per C++11, 2.14.2, the type of an integer literal is the first of the
|
| - # corresponding list in Table 6 in which its value can be represented. In this
|
| - # case, the list for decimal constants with no suffix is:
|
| - # int, long int, long long int
|
| - # The standard considers a program ill-formed if it contains an integer
|
| - # literal that cannot be represented by any of the allowed types.
|
| - #
|
| - # As it turns out, MSVC doesn't bother trying to fall back to long long int,
|
| - # so the integral constant -2147483648 causes it grief: it decides to
|
| - # represent 2147483648 as an unsigned integer, and then warns that the unary
|
| - # minus operator doesn't make sense on unsigned types. Doh!
|
| - if kind == mojom.INT32 and token == '-2147483648':
|
| - return '(-%d - 1) /* %s */' % (
|
| - 2**31 - 1, 'Workaround for MSVC bug; see https://crbug.com/445618')
|
| -
|
| - return '%s%s' % (token, _kind_to_cpp_literal_suffix.get(kind, ''))
|
| -
|
| -def ExpressionToText(value, kind=None):
|
| - return TranslateConstants(value, kind)
|
| -
|
| -def ShouldInlineStruct(struct):
|
| - # TODO(darin): Base this on the size of the wrapper class.
|
| - if len(struct.fields) > 4:
|
| - return False
|
| - for field in struct.fields:
|
| - if mojom.IsMoveOnlyKind(field.kind):
|
| - return False
|
| - return True
|
| -
|
| -def GetArrayValidateParams(kind):
|
| - if (not mojom.IsArrayKind(kind) and not mojom.IsMapKind(kind) and
|
| - not mojom.IsStringKind(kind)):
|
| - return "mojo::internal::NoValidateParams"
|
| -
|
| - if mojom.IsStringKind(kind):
|
| - expected_num_elements = 0
|
| - element_is_nullable = False
|
| - element_validate_params = "mojo::internal::NoValidateParams"
|
| - elif mojom.IsMapKind(kind):
|
| - expected_num_elements = 0
|
| - element_is_nullable = mojom.IsNullableKind(kind.value_kind)
|
| - element_validate_params = GetArrayValidateParams(kind.value_kind)
|
| - else:
|
| - expected_num_elements = generator.ExpectedArraySize(kind) or 0
|
| - element_is_nullable = mojom.IsNullableKind(kind.kind)
|
| - element_validate_params = GetArrayValidateParams(kind.kind)
|
| -
|
| - return "mojo::internal::ArrayValidateParams<%d, %s,\n%s> " % (
|
| - expected_num_elements,
|
| - 'true' if element_is_nullable else 'false',
|
| - element_validate_params)
|
| -
|
| -def GetMapValidateParams(value_kind):
|
| - # Unlike GetArrayValidateParams, we are given the wrapped kind, instead of
|
| - # the raw array kind. So we wrap the return value of GetArrayValidateParams.
|
| - element_is_nullable = mojom.IsNullableKind(value_kind)
|
| - return "mojo::internal::ArrayValidateParams<0, %s,\n%s> " % (
|
| - 'true' if element_is_nullable else 'false',
|
| - GetArrayValidateParams(value_kind))
|
| -
|
| -_HEADER_SIZE = 8
|
| -
|
| -class Generator(generator.Generator):
|
| -
|
| - cpp_filters = {
|
| - "constant_value": ConstantValue,
|
| - "cpp_const_wrapper_type": GetCppConstWrapperType,
|
| - "cpp_field_type": GetCppFieldType,
|
| - "cpp_pod_type": GetCppPodType,
|
| - "cpp_result_type": GetCppResultWrapperType,
|
| - "cpp_type": GetCppType,
|
| - "cpp_wrapper_type": GetCppWrapperType,
|
| - "default_value": DefaultValue,
|
| - "expression_to_text": ExpressionToText,
|
| - "get_array_validate_params": GetArrayValidateParams,
|
| - "get_map_validate_params": GetMapValidateParams,
|
| - "get_name_for_kind": GetNameForKind,
|
| - "get_pad": pack.GetPad,
|
| - "has_callbacks": mojom.HasCallbacks,
|
| - "should_inline": ShouldInlineStruct,
|
| - "is_array_kind": mojom.IsArrayKind,
|
| - "is_cloneable_kind": mojom.IsCloneableKind,
|
| - "is_enum_kind": mojom.IsEnumKind,
|
| - "is_move_only_kind": mojom.IsMoveOnlyKind,
|
| - "is_any_handle_kind": mojom.IsAnyHandleKind,
|
| - "is_interface_kind": mojom.IsInterfaceKind,
|
| - "is_interface_request_kind": mojom.IsInterfaceRequestKind,
|
| - "is_map_kind": mojom.IsMapKind,
|
| - "is_nullable_kind": mojom.IsNullableKind,
|
| - "is_object_kind": mojom.IsObjectKind,
|
| - "is_string_kind": mojom.IsStringKind,
|
| - "is_struct_kind": mojom.IsStructKind,
|
| - "is_struct_with_handles": IsStructWithHandles,
|
| - "struct_size": lambda ps: ps.GetTotalSize() + _HEADER_SIZE,
|
| - "struct_from_method": generator.GetStructFromMethod,
|
| - "response_struct_from_method": generator.GetResponseStructFromMethod,
|
| - "stylize_method": generator.StudlyCapsToCamel,
|
| - "to_all_caps": generator.CamelCaseToAllCaps,
|
| - }
|
| -
|
| - def GetJinjaExports(self):
|
| - return {
|
| - "module": self.module,
|
| - "namespace": self.module.namespace,
|
| - "namespaces_as_array": NamespaceToArray(self.module.namespace),
|
| - "imports": self.module.imports,
|
| - "kinds": self.module.kinds,
|
| - "enums": self.module.enums,
|
| - "structs": self.GetStructs(),
|
| - "interfaces": self.module.interfaces,
|
| - }
|
| -
|
| - @UseJinja("cpp_templates/module.h.tmpl", filters=cpp_filters)
|
| - def GenerateModuleHeader(self):
|
| - return self.GetJinjaExports()
|
| -
|
| - @UseJinja("cpp_templates/module-internal.h.tmpl", filters=cpp_filters)
|
| - def GenerateModuleInternalHeader(self):
|
| - return self.GetJinjaExports()
|
| -
|
| - @UseJinja("cpp_templates/module.cc.tmpl", filters=cpp_filters)
|
| - def GenerateModuleSource(self):
|
| - return self.GetJinjaExports()
|
| -
|
| - def GenerateFiles(self, args):
|
| - self.Write(self.GenerateModuleHeader(),
|
| - self.MatchMojomFilePath("%s.h" % self.module.name))
|
| - self.Write(self.GenerateModuleInternalHeader(),
|
| - self.MatchMojomFilePath("%s-internal.h" % self.module.name))
|
| - self.Write(self.GenerateModuleSource(),
|
| - self.MatchMojomFilePath("%s.cc" % self.module.name))
|
|
|