| Index: mojo/public/tools/bindings/generators/mojom_dart_generator.py
|
| diff --git a/mojo/public/tools/bindings/generators/mojom_dart_generator.py b/mojo/public/tools/bindings/generators/mojom_dart_generator.py
|
| deleted file mode 100644
|
| index 4aed8e35734a21ab8d1f5398745964182feac2dc..0000000000000000000000000000000000000000
|
| --- a/mojo/public/tools/bindings/generators/mojom_dart_generator.py
|
| +++ /dev/null
|
| @@ -1,663 +0,0 @@
|
| -# Copyright 2014 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 dart source files from a mojom.Module."""
|
| -
|
| -import errno
|
| -import os
|
| -import re
|
| -import shutil
|
| -import sys
|
| -
|
| -import mojom.fileutil as fileutil
|
| -import mojom.generate.constant_resolver as resolver
|
| -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
|
| -
|
| -GENERATOR_PREFIX = 'dart'
|
| -
|
| -# CAUTION: To generate Dart-style names, and to avoid generating reserved words
|
| -# for identifiers, the template files should generate names using
|
| -# {{element|name}}, not {{element.name}}.
|
| -
|
| -# Dart reserved words from:
|
| -# http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-408.pdf
|
| -# We must not generate reserved words for identifiers.
|
| -# NB: async, await, and yield are not technically reserved words, but since
|
| -# they are not valid identifiers in all contexts, we include them here as well.
|
| -_dart_reserved_words = [
|
| - "assert",
|
| - "async",
|
| - "await",
|
| - "break",
|
| - "case",
|
| - "catch",
|
| - "class",
|
| - "const",
|
| - "continue",
|
| - "default",
|
| - "do",
|
| - "else",
|
| - "enum",
|
| - "extends",
|
| - "false",
|
| - "final",
|
| - "finally",
|
| - "for",
|
| - "if",
|
| - "in",
|
| - "is",
|
| - "new",
|
| - "null",
|
| - "rethrow",
|
| - "return",
|
| - "super",
|
| - "switch",
|
| - "this",
|
| - "throw",
|
| - "true",
|
| - "try",
|
| - "var",
|
| - "void",
|
| - "while",
|
| - "with",
|
| - "yield",
|
| -]
|
| -
|
| -# These names are the class fields and methods of the Proxy class in
|
| -# lib/src/proxy.dart of Dart's mojo package. If these names appear in a .mojom
|
| -# they must be mangled to avoid name conflicts. They are mangled by appending
|
| -# an underscore ('_'), which is banned on names in mojom interfaces.
|
| -_reserved_words = _dart_reserved_words + [
|
| - "close",
|
| - "connectToService",
|
| - "ctrl",
|
| - "fromEndpoint",
|
| - "fromHandle",
|
| - "fromMock",
|
| - "impl",
|
| - "newFromEndpoint",
|
| - "responseOrError",
|
| - "serviceDescription",
|
| - "serviceName",
|
| - "unbound",
|
| -]
|
| -
|
| -_kind_to_dart_default_value = {
|
| - mojom.BOOL: "false",
|
| - mojom.INT8: "0",
|
| - mojom.UINT8: "0",
|
| - mojom.INT16: "0",
|
| - mojom.UINT16: "0",
|
| - mojom.INT32: "0",
|
| - mojom.UINT32: "0",
|
| - mojom.FLOAT: "0.0",
|
| - mojom.HANDLE: "null",
|
| - mojom.DCPIPE: "null",
|
| - mojom.DPPIPE: "null",
|
| - mojom.MSGPIPE: "null",
|
| - mojom.SHAREDBUFFER: "null",
|
| - mojom.NULLABLE_HANDLE: "null",
|
| - mojom.NULLABLE_DCPIPE: "null",
|
| - mojom.NULLABLE_DPPIPE: "null",
|
| - mojom.NULLABLE_MSGPIPE: "null",
|
| - mojom.NULLABLE_SHAREDBUFFER: "null",
|
| - mojom.INT64: "0",
|
| - mojom.UINT64: "0",
|
| - mojom.DOUBLE: "0.0",
|
| - mojom.STRING: "null",
|
| - mojom.NULLABLE_STRING: "null"
|
| -}
|
| -
|
| -_kind_to_dart_decl_type = {
|
| - mojom.BOOL: "bool",
|
| - mojom.INT8: "int",
|
| - mojom.UINT8: "int",
|
| - mojom.INT16: "int",
|
| - mojom.UINT16: "int",
|
| - mojom.INT32: "int",
|
| - mojom.UINT32: "int",
|
| - mojom.FLOAT: "double",
|
| - mojom.HANDLE: "core.MojoHandle",
|
| - mojom.DCPIPE: "core.MojoDataPipeConsumer",
|
| - mojom.DPPIPE: "core.MojoDataPipeProducer",
|
| - mojom.MSGPIPE: "core.MojoMessagePipeEndpoint",
|
| - mojom.SHAREDBUFFER: "core.MojoSharedBuffer",
|
| - mojom.NULLABLE_HANDLE: "core.MojoHandle",
|
| - mojom.NULLABLE_DCPIPE: "core.MojoDataPipeConsumer",
|
| - mojom.NULLABLE_DPPIPE: "core.MojoDataPipeProducer",
|
| - mojom.NULLABLE_MSGPIPE: "core.MojoMessagePipeEndpoint",
|
| - mojom.NULLABLE_SHAREDBUFFER: "core.MojoSharedBuffer",
|
| - mojom.INT64: "int",
|
| - mojom.UINT64: "int",
|
| - mojom.DOUBLE: "double",
|
| - mojom.STRING: "String",
|
| - mojom.NULLABLE_STRING: "String"
|
| -}
|
| -
|
| -_spec_to_decode_method = {
|
| - mojom.BOOL.spec: 'decodeBool',
|
| - mojom.DCPIPE.spec: 'decodeConsumerHandle',
|
| - mojom.DOUBLE.spec: 'decodeDouble',
|
| - mojom.DPPIPE.spec: 'decodeProducerHandle',
|
| - mojom.FLOAT.spec: 'decodeFloat',
|
| - mojom.HANDLE.spec: 'decodeHandle',
|
| - mojom.INT16.spec: 'decodeInt16',
|
| - mojom.INT32.spec: 'decodeInt32',
|
| - mojom.INT64.spec: 'decodeInt64',
|
| - mojom.INT8.spec: 'decodeInt8',
|
| - mojom.MSGPIPE.spec: 'decodeMessagePipeHandle',
|
| - mojom.NULLABLE_DCPIPE.spec: 'decodeConsumerHandle',
|
| - mojom.NULLABLE_DPPIPE.spec: 'decodeProducerHandle',
|
| - mojom.NULLABLE_HANDLE.spec: 'decodeHandle',
|
| - mojom.NULLABLE_MSGPIPE.spec: 'decodeMessagePipeHandle',
|
| - mojom.NULLABLE_SHAREDBUFFER.spec: 'decodeSharedBufferHandle',
|
| - mojom.NULLABLE_STRING.spec: 'decodeString',
|
| - mojom.SHAREDBUFFER.spec: 'decodeSharedBufferHandle',
|
| - mojom.STRING.spec: 'decodeString',
|
| - mojom.UINT16.spec: 'decodeUint16',
|
| - mojom.UINT32.spec: 'decodeUint32',
|
| - mojom.UINT64.spec: 'decodeUint64',
|
| - mojom.UINT8.spec: 'decodeUint8',
|
| -}
|
| -
|
| -_spec_to_encode_method = {
|
| - mojom.BOOL.spec: 'encodeBool',
|
| - mojom.DCPIPE.spec: 'encodeConsumerHandle',
|
| - mojom.DOUBLE.spec: 'encodeDouble',
|
| - mojom.DPPIPE.spec: 'encodeProducerHandle',
|
| - mojom.FLOAT.spec: 'encodeFloat',
|
| - mojom.HANDLE.spec: 'encodeHandle',
|
| - mojom.INT16.spec: 'encodeInt16',
|
| - mojom.INT32.spec: 'encodeInt32',
|
| - mojom.INT64.spec: 'encodeInt64',
|
| - mojom.INT8.spec: 'encodeInt8',
|
| - mojom.MSGPIPE.spec: 'encodeMessagePipeHandle',
|
| - mojom.NULLABLE_DCPIPE.spec: 'encodeConsumerHandle',
|
| - mojom.NULLABLE_DPPIPE.spec: 'encodeProducerHandle',
|
| - mojom.NULLABLE_HANDLE.spec: 'encodeHandle',
|
| - mojom.NULLABLE_MSGPIPE.spec: 'encodeMessagePipeHandle',
|
| - mojom.NULLABLE_SHAREDBUFFER.spec: 'encodeSharedBufferHandle',
|
| - mojom.NULLABLE_STRING.spec: 'encodeString',
|
| - mojom.SHAREDBUFFER.spec: 'encodeSharedBufferHandle',
|
| - mojom.STRING.spec: 'encodeString',
|
| - mojom.UINT16.spec: 'encodeUint16',
|
| - mojom.UINT32.spec: 'encodeUint32',
|
| - mojom.UINT64.spec: 'encodeUint64',
|
| - mojom.UINT8.spec: 'encodeUint8',
|
| -}
|
| -
|
| -# The mojom_types.mojom and service_describer.mojom files are special because
|
| -# they are used to generate mojom Type's and ServiceDescription implementations.
|
| -# They need to be imported, unless the file itself is being generated.
|
| -_service_describer_pkg_short = "service_describer"
|
| -_service_describer_pkg = "package:mojo/mojo/bindings/types/%s.mojom.dart" % \
|
| - _service_describer_pkg_short
|
| -_mojom_types_pkg_short = "mojom_types"
|
| -_mojom_types_pkg = "package:mojo/mojo/bindings/types/%s.mojom.dart" % \
|
| - _mojom_types_pkg_short
|
| -
|
| -def GetDartType(kind):
|
| - if kind.imported_from:
|
| - return kind.imported_from["unique_name"] + "." + GetNameForElement(kind)
|
| - return GetNameForElement(kind)
|
| -
|
| -def DartDefaultValue(field):
|
| - if field.default:
|
| - if mojom.IsStructKind(field.kind):
|
| - assert field.default == "default"
|
| - return "new %s()" % GetDartType(field.kind)
|
| - if mojom.IsEnumKind(field.kind):
|
| - return ("new %s(%s)" %
|
| - (GetDartType(field.kind), ExpressionToText(field.default)))
|
| - return ExpressionToText(field.default)
|
| - if field.kind in mojom.PRIMITIVES:
|
| - return _kind_to_dart_default_value[field.kind]
|
| - if mojom.IsStructKind(field.kind):
|
| - return "null"
|
| - if mojom.IsUnionKind(field.kind):
|
| - return "null"
|
| - if mojom.IsArrayKind(field.kind):
|
| - return "null"
|
| - if mojom.IsMapKind(field.kind):
|
| - return "null"
|
| - if mojom.IsInterfaceKind(field.kind) or \
|
| - mojom.IsInterfaceRequestKind(field.kind):
|
| - return "null"
|
| - if mojom.IsEnumKind(field.kind):
|
| - return "null"
|
| -
|
| -def DartDeclType(kind):
|
| - if kind in mojom.PRIMITIVES:
|
| - return _kind_to_dart_decl_type[kind]
|
| - if mojom.IsStructKind(kind):
|
| - return GetDartType(kind)
|
| - if mojom.IsUnionKind(kind):
|
| - return GetDartType(kind)
|
| - if mojom.IsArrayKind(kind):
|
| - array_type = DartDeclType(kind.kind)
|
| - return "List<" + array_type + ">"
|
| - if mojom.IsMapKind(kind):
|
| - key_type = DartDeclType(kind.key_kind)
|
| - value_type = DartDeclType(kind.value_kind)
|
| - return "Map<"+ key_type + ", " + value_type + ">"
|
| - if mojom.IsInterfaceKind(kind):
|
| - return ("%sInterface" % GetDartType(kind))
|
| - if mojom.IsInterfaceRequestKind(kind):
|
| - return ("%sInterfaceRequest" % GetDartType(kind.kind))
|
| - if mojom.IsEnumKind(kind):
|
| - return GetDartType(kind)
|
| -
|
| -def NameToComponent(name):
|
| - # insert '_' between anything and a Title name (e.g, HTTPEntry2FooBar ->
|
| - # HTTP_Entry2_FooBar). Numbers terminate a string of lower-case characters.
|
| - name = re.sub('([^_])([A-Z][^A-Z1-9_]+)', r'\1_\2', name)
|
| - # insert '_' between non upper and start of upper blocks (e.g.,
|
| - # HTTP_Entry2_FooBar -> HTTP_Entry2_Foo_Bar).
|
| - name = re.sub('([^A-Z_])([A-Z])', r'\1_\2', name)
|
| - return [x.lower() for x in name.split('_')]
|
| -
|
| -def UpperCamelCase(name):
|
| - return ''.join([x.capitalize() for x in NameToComponent(name)])
|
| -
|
| -def CamelCase(name):
|
| - uccc = UpperCamelCase(name)
|
| - return uccc[0].lower() + uccc[1:]
|
| -
|
| -def DotToUnderscore(name):
|
| - return name.replace('.', '_')
|
| -
|
| -def IsParamStruct(kind):
|
| - assert(isinstance(kind, mojom.Struct))
|
| - return kind.name.endswith('_Params')
|
| -
|
| -# This may generate Dart reserved words. Call GetNameForElement to avoid
|
| -# generating reserved words.
|
| -def GetNameForElementUnsafe(element):
|
| - if (mojom.IsInterfaceKind(element) or mojom.IsUnionKind(element)):
|
| - return UpperCamelCase(element.name)
|
| - if mojom.IsStructKind(element):
|
| - if (IsParamStruct(element)):
|
| - # Param Structs are library private.
|
| - return '_' + UpperCamelCase(element.name)
|
| - return UpperCamelCase(element.name)
|
| - if mojom.IsInterfaceRequestKind(element):
|
| - return GetNameForElement(element.kind)
|
| - if isinstance(element, (mojom.Constant,
|
| - mojom.EnumField,
|
| - mojom.Field,
|
| - mojom.Method,
|
| - mojom.NamedValue,
|
| - mojom.Parameter,
|
| - mojom.UnionField)):
|
| - return CamelCase(element.name)
|
| - if mojom.IsEnumKind(element):
|
| - # If the enum is nested in some other mojom element, then we
|
| - # mangle the enum name by prepending it with the name of the containing
|
| - # element.
|
| - if element.parent_kind:
|
| - return ("%s%s" % (GetNameForElement(element.parent_kind),
|
| - UpperCamelCase(element.name)))
|
| - return UpperCamelCase(element.name)
|
| - if isinstance(element, mojom.EnumValue):
|
| - return (GetNameForElement(element.enum) + '.' + CamelCase(element.name))
|
| - raise Exception('Unexpected element: %s' % element)
|
| -
|
| -def GetNameForElement(element):
|
| - name = GetNameForElementUnsafe(element)
|
| - if name in _reserved_words:
|
| - name = name + '_'
|
| - return name
|
| -
|
| -def GetInterfaceResponseName(method):
|
| - return UpperCamelCase(method.name + 'Response')
|
| -
|
| -def GetDartTrueFalse(value):
|
| - return 'true' if value else 'false'
|
| -
|
| -def GetArrayNullabilityFlags(kind):
|
| - """Returns nullability flags for an array type, see codec.dart.
|
| -
|
| - As we have dedicated decoding functions for arrays, we have to pass
|
| - nullability information about both the array itself, as well as the array
|
| - element type there.
|
| - """
|
| - assert mojom.IsArrayKind(kind)
|
| - ARRAY_NULLABLE = 'bindings.kArrayNullable'
|
| - ELEMENT_NULLABLE = 'bindings.kElementNullable'
|
| - NOTHING_NULLABLE = 'bindings.kNothingNullable'
|
| -
|
| - flags_to_set = []
|
| - if mojom.IsNullableKind(kind):
|
| - flags_to_set.append(ARRAY_NULLABLE)
|
| - if mojom.IsNullableKind(kind.kind):
|
| - flags_to_set.append(ELEMENT_NULLABLE)
|
| -
|
| - if not flags_to_set:
|
| - flags_to_set = [NOTHING_NULLABLE]
|
| - return ' | '.join(flags_to_set)
|
| -
|
| -def AppendDecodeParams(initial_params, kind, bit):
|
| - """ Appends standard parameters for decode calls. """
|
| - params = list(initial_params)
|
| - if (kind == mojom.BOOL):
|
| - params.append(str(bit))
|
| - if mojom.IsReferenceKind(kind):
|
| - if mojom.IsArrayKind(kind):
|
| - params.append(GetArrayNullabilityFlags(kind))
|
| - else:
|
| - params.append(GetDartTrueFalse(mojom.IsNullableKind(kind)))
|
| - if mojom.IsInterfaceKind(kind):
|
| - params.append('%sProxy.newFromEndpoint' % GetDartType(kind))
|
| - if mojom.IsArrayKind(kind) and mojom.IsInterfaceKind(kind.kind):
|
| - params.append('%sProxy.newFromEndpoint' % GetDartType(kind.kind))
|
| - if mojom.IsInterfaceRequestKind(kind):
|
| - params.append('%sStub.newFromEndpoint' % GetDartType(kind.kind))
|
| - if mojom.IsArrayKind(kind) and mojom.IsInterfaceRequestKind(kind.kind):
|
| - params.append('%sStub.newFromEndpoint' % GetDartType(kind.kind.kind))
|
| - if mojom.IsArrayKind(kind):
|
| - params.append(GetArrayExpectedLength(kind))
|
| - return params
|
| -
|
| -def AppendEncodeParams(initial_params, kind, bit):
|
| - """ Appends standard parameters shared between encode and decode calls. """
|
| - params = list(initial_params)
|
| - if (kind == mojom.BOOL):
|
| - params.append(str(bit))
|
| - if mojom.IsReferenceKind(kind):
|
| - if mojom.IsArrayKind(kind):
|
| - params.append(GetArrayNullabilityFlags(kind))
|
| - else:
|
| - params.append(GetDartTrueFalse(mojom.IsNullableKind(kind)))
|
| - if mojom.IsArrayKind(kind):
|
| - params.append(GetArrayExpectedLength(kind))
|
| - return params
|
| -
|
| -def DecodeMethod(kind, offset, bit):
|
| - def _DecodeMethodName(kind):
|
| - if mojom.IsArrayKind(kind):
|
| - return _DecodeMethodName(kind.kind) + 'Array'
|
| - if mojom.IsInterfaceRequestKind(kind):
|
| - return 'decodeInterfaceRequest'
|
| - if mojom.IsInterfaceKind(kind):
|
| - return 'decodeServiceInterface'
|
| - return _spec_to_decode_method[kind.spec]
|
| - methodName = _DecodeMethodName(kind)
|
| - params = AppendDecodeParams([ str(offset) ], kind, bit)
|
| - return '%s(%s)' % (methodName, ', '.join(params))
|
| -
|
| -def EncodeMethod(kind, variable, offset, bit):
|
| - def _EncodeMethodName(kind):
|
| - if mojom.IsStructKind(kind):
|
| - return 'encodeStruct'
|
| - if mojom.IsUnionKind(kind):
|
| - return 'encodeUnion'
|
| - if mojom.IsArrayKind(kind):
|
| - return _EncodeMethodName(kind.kind) + 'Array'
|
| - if mojom.IsEnumKind(kind):
|
| - return 'encodeEnum'
|
| - if mojom.IsInterfaceRequestKind(kind):
|
| - return 'encodeInterfaceRequest'
|
| - if mojom.IsInterfaceKind(kind):
|
| - return 'encodeInterface'
|
| - return _spec_to_encode_method[kind.spec]
|
| - methodName = _EncodeMethodName(kind)
|
| - params = AppendEncodeParams([ variable, str(offset) ], kind, bit)
|
| - return '%s(%s)' % (methodName, ', '.join(params))
|
| -
|
| -def TranslateConstants(token):
|
| - if isinstance(token, mojom.BuiltinValue):
|
| - if token.value == "double.INFINITY" or token.value == "float.INFINITY":
|
| - return "double.INFINITY";
|
| - if token.value == "double.NEGATIVE_INFINITY" or \
|
| - token.value == "float.NEGATIVE_INFINITY":
|
| - return "double.NEGATIVE_INFINITY";
|
| - if token.value == "double.NAN" or token.value == "float.NAN":
|
| - return "double.NAN";
|
| -
|
| - # Strip leading '+'.
|
| - if token[0] == '+':
|
| - token = token[1:]
|
| -
|
| - return token
|
| -
|
| -def ExpressionToText(token):
|
| - if isinstance(token, (mojom.EnumValue, mojom.NamedValue)):
|
| - return str(token.resolved_value)
|
| - return TranslateConstants(token)
|
| -
|
| -def GetArrayKind(kind, size = None):
|
| - if size is None:
|
| - return mojom.Array(kind)
|
| - else:
|
| - array = mojom.Array(kind, 0)
|
| - array.dart_map_size = size
|
| - return array
|
| -
|
| -def GetArrayExpectedLength(kind):
|
| - if mojom.IsArrayKind(kind) and kind.length is not None:
|
| - return getattr(kind, 'dart_map_size', str(kind.length))
|
| - else:
|
| - return 'bindings.kUnspecifiedArrayLength'
|
| -
|
| -def IsPointerArrayKind(kind):
|
| - if not mojom.IsArrayKind(kind):
|
| - return False
|
| - sub_kind = kind.kind
|
| - return mojom.IsObjectKind(sub_kind)
|
| -
|
| -def IsEnumArrayKind(kind):
|
| - return mojom.IsArrayKind(kind) and mojom.IsEnumKind(kind.kind)
|
| -
|
| -def IsImportedKind(kind):
|
| - return hasattr(kind, 'imported_from') and kind.imported_from
|
| -
|
| -def ParseStringAttribute(attribute):
|
| - assert isinstance(attribute, basestring)
|
| - return attribute
|
| -
|
| -def GetPackage(module):
|
| - if module.attributes and 'DartPackage' in module.attributes:
|
| - package = ParseStringAttribute(module.attributes['DartPackage'])
|
| - package = package.strip()
|
| - if package != '':
|
| - return package
|
| - # Default package.
|
| - return 'mojom'
|
| -
|
| -def GetImportUri(module):
|
| - package = GetPackage(module);
|
| - elements = module.namespace.split('.')
|
| - elements.append("%s" % module.name)
|
| - return os.path.join(package, *elements)
|
| -
|
| -def RaiseHelper(msg):
|
| - raise Exception(msg)
|
| -
|
| -class Generator(generator.Generator):
|
| -
|
| - dart_filters = {
|
| - 'array_expected_length': GetArrayExpectedLength,
|
| - 'array': GetArrayKind,
|
| - 'decode_method': DecodeMethod,
|
| - 'default_value': DartDefaultValue,
|
| - 'encode_method': EncodeMethod,
|
| - 'is_imported_kind': IsImportedKind,
|
| - 'is_array_kind': mojom.IsArrayKind,
|
| - 'is_map_kind': mojom.IsMapKind,
|
| - 'is_numerical_kind': mojom.IsNumericalKind,
|
| - 'is_any_handle_kind': mojom.IsAnyHandleKind,
|
| - 'is_string_kind': mojom.IsStringKind,
|
| - 'is_nullable_kind': mojom.IsNullableKind,
|
| - 'is_pointer_array_kind': IsPointerArrayKind,
|
| - 'is_enum_array_kind': IsEnumArrayKind,
|
| - 'is_struct_kind': mojom.IsStructKind,
|
| - 'is_union_kind': mojom.IsUnionKind,
|
| - 'is_enum_kind': mojom.IsEnumKind,
|
| - 'is_interface_kind': mojom.IsInterfaceKind,
|
| - 'is_interface_request_kind': mojom.IsInterfaceRequestKind,
|
| - 'dart_true_false': GetDartTrueFalse,
|
| - 'dart_type': DartDeclType,
|
| - 'name': GetNameForElement,
|
| - 'interface_response_name': GetInterfaceResponseName,
|
| - 'dot_to_underscore': DotToUnderscore,
|
| - 'is_cloneable_kind': mojom.IsCloneableKind,
|
| - 'upper_camel': UpperCamelCase,
|
| - 'lower_camel': CamelCase,
|
| - 'raise': RaiseHelper,
|
| - }
|
| -
|
| - # If set to True, then mojom type information will be generated.
|
| - should_gen_mojom_types = False
|
| -
|
| - def GetParameters(self, args):
|
| - package = self.module.name.split('.')[0]
|
| -
|
| - # True if handles are used anywhere in the mojom.
|
| - has_handles = any(not mojom.IsCloneableKind(kind)
|
| - for kind in (self.GetStructs() +
|
| - self.GetStructsFromMethods() +
|
| - self.GetUnions()))
|
| -
|
| - # True if the binding will need dart:async
|
| - needs_dart_async = any(any(method.response_parameters is not None
|
| - for method in interface.methods)
|
| - for interface in self.GetInterfaces())
|
| -
|
| - parameters = {
|
| - "namespace": self.module.namespace,
|
| - "imports": self.GetImports(args),
|
| - "kinds": self.module.kinds,
|
| - "enums": self.module.enums,
|
| - "module": resolver.ResolveConstants(self.module, ExpressionToText),
|
| - "structs": self.GetStructs() + self.GetStructsFromMethods(),
|
| - "unions": self.GetUnions(),
|
| - "interfaces": self.GetInterfaces(),
|
| - "imported_interfaces": self.GetImportedInterfaces(),
|
| - "imported_from": self.ImportedFrom(),
|
| - "typepkg": '%s.' % _mojom_types_pkg_short,
|
| - "descpkg": '%s.' % _service_describer_pkg_short,
|
| - "mojom_types_import": 'import \'%s\' as %s;' % \
|
| - (_mojom_types_pkg, _mojom_types_pkg_short),
|
| - "service_describer_import": 'import \'%s\' as %s;' % \
|
| - (_service_describer_pkg, _service_describer_pkg_short),
|
| - "has_handles": has_handles,
|
| - "needs_dart_async": needs_dart_async,
|
| - }
|
| -
|
| - # If this is the mojom types package, clear the import-related params.
|
| - if package == _mojom_types_pkg_short:
|
| - parameters["typepkg"] = ""
|
| - parameters["mojom_types_import"] = ""
|
| -
|
| - # If this is the service describer package, clear the import-related params.
|
| - if package == _service_describer_pkg_short:
|
| - parameters["descpkg"] = ""
|
| - parameters["service_describer_import"] = ""
|
| -
|
| - # If no interfaces were defined, the service describer import isn't needed.
|
| - if len(self.module.interfaces) == 0:
|
| - parameters["service_describer_import"] = ""
|
| -
|
| - return parameters
|
| -
|
| - def GetGlobals(self):
|
| - return {
|
| - 'should_gen_mojom_types': self.should_gen_mojom_types,
|
| - }
|
| -
|
| - @UseJinja("dart_templates/module.lib.tmpl", filters=dart_filters)
|
| - def GenerateLibModule(self, args):
|
| - return self.GetParameters(args)
|
| -
|
| -
|
| - def GenerateFiles(self, args):
|
| - self.should_gen_mojom_types = "--generate_type_info" in args
|
| -
|
| - elements = self.module.namespace.split('.')
|
| - elements.append("%s.dart" % self.module.name)
|
| -
|
| - lib_module = self.GenerateLibModule(args)
|
| -
|
| - # List of packages with checked in bindings.
|
| - # TODO(johnmccutchan): Stop generating bindings as part of build system
|
| - # and then remove this.
|
| - packages_with_checked_in_bindings = [
|
| - '_mojo_for_test_only',
|
| - 'mojo',
|
| - 'mojo_apptest',
|
| - 'mojo_services',
|
| - 'mojo_sdk',
|
| - 'mojom',
|
| - ]
|
| - package_name = GetPackage(self.module)
|
| - if not (package_name in packages_with_checked_in_bindings):
|
| - pkg_path = os.path.join("dart-pkg", package_name, "lib", *elements)
|
| - self.Write(lib_module, pkg_path)
|
| -
|
| - gen_path = os.path.join("dart-gen", package_name, "lib", *elements)
|
| - full_gen_path = os.path.join(self.output_dir, gen_path)
|
| - self.Write(lib_module, gen_path)
|
| -
|
| - link = self.MatchMojomFilePath("%s.dart" % self.module.name)
|
| - full_link_path = os.path.join(self.output_dir, link)
|
| - try:
|
| - os.unlink(full_link_path)
|
| - except OSError, exc:
|
| - # If the file does not exist, ignore the error.
|
| - if errno.ENOENT == exc.errno:
|
| - pass
|
| - else:
|
| - raise
|
| - fileutil.EnsureDirectoryExists(os.path.dirname(full_link_path))
|
| - try:
|
| - if sys.platform == "win32":
|
| - shutil.copy(full_gen_path, full_link_path)
|
| - else:
|
| - os.symlink(full_gen_path, full_link_path)
|
| - except OSError as e:
|
| - # Errno 17 is file already exists. If the link fails because file already
|
| - # exists assume another instance of this script tried to create the same
|
| - # file and continue on.
|
| - if e.errno != 17:
|
| - raise e
|
| -
|
| - def GetImports(self, args):
|
| - used_imports = self.GetUsedImports(self.module)
|
| - used_names = set()
|
| - for each_import in used_imports.values():
|
| - simple_name = each_import["module_name"].split(".")[0]
|
| -
|
| - # Since each import is assigned a library in Dart, they need to have
|
| - # unique names.
|
| - unique_name = simple_name
|
| - counter = 0
|
| - while unique_name in used_names:
|
| - counter += 1
|
| - unique_name = simple_name + str(counter)
|
| -
|
| - used_names.add(unique_name)
|
| - each_import["unique_name"] = unique_name + '_mojom'
|
| - counter += 1
|
| -
|
| - each_import["rebased_path"] = GetImportUri(each_import['module'])
|
| - return sorted(used_imports.values(), key=lambda x: x['rebased_path'])
|
| -
|
| - def GetImportedInterfaces(self):
|
| - interface_to_import = {}
|
| - for each_import in self.module.imports:
|
| - for each_interface in each_import["module"].interfaces:
|
| - name = each_interface.name
|
| - interface_to_import[name] = each_import["unique_name"] + "." + name
|
| - return interface_to_import
|
| -
|
| - def ImportedFrom(self):
|
| - interface_to_import = {}
|
| - for each_import in self.module.imports:
|
| - for each_interface in each_import["module"].interfaces:
|
| - name = each_interface.name
|
| - interface_to_import[name] = each_import["unique_name"] + "."
|
| - return interface_to_import
|
|
|