| Index: mojo/public/tools/bindings/generators/mojom_python_generator.py
|
| diff --git a/mojo/public/tools/bindings/generators/mojom_python_generator.py b/mojo/public/tools/bindings/generators/mojom_python_generator.py
|
| deleted file mode 100644
|
| index 33bfdd5743b480029ef3ef778a607d1c825716b6..0000000000000000000000000000000000000000
|
| --- a/mojo/public/tools/bindings/generators/mojom_python_generator.py
|
| +++ /dev/null
|
| @@ -1,338 +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 Python source files from a mojom.Module."""
|
| -
|
| -import re
|
| -from itertools import ifilter
|
| -
|
| -import mojom.generate.generator as generator
|
| -import mojom.generate.data as data
|
| -import mojom.generate.module as mojom
|
| -from mojom.generate.template_expander import UseJinja
|
| -
|
| -_kind_to_type = {
|
| - mojom.BOOL: '_descriptor.TYPE_BOOL',
|
| - mojom.INT8: '_descriptor.TYPE_INT8',
|
| - mojom.UINT8: '_descriptor.TYPE_UINT8',
|
| - mojom.INT16: '_descriptor.TYPE_INT16',
|
| - mojom.UINT16: '_descriptor.TYPE_UINT16',
|
| - mojom.INT32: '_descriptor.TYPE_INT32',
|
| - mojom.UINT32: '_descriptor.TYPE_UINT32',
|
| - mojom.INT64: '_descriptor.TYPE_INT64',
|
| - mojom.UINT64: '_descriptor.TYPE_UINT64',
|
| - mojom.FLOAT: '_descriptor.TYPE_FLOAT',
|
| - mojom.DOUBLE: '_descriptor.TYPE_DOUBLE',
|
| - mojom.STRING: '_descriptor.TYPE_STRING',
|
| - mojom.NULLABLE_STRING: '_descriptor.TYPE_NULLABLE_STRING',
|
| - mojom.HANDLE: '_descriptor.TYPE_HANDLE',
|
| - mojom.DCPIPE: '_descriptor.TYPE_HANDLE',
|
| - mojom.DPPIPE: '_descriptor.TYPE_HANDLE',
|
| - mojom.MSGPIPE: '_descriptor.TYPE_HANDLE',
|
| - mojom.SHAREDBUFFER: '_descriptor.TYPE_HANDLE',
|
| - mojom.NULLABLE_HANDLE: '_descriptor.TYPE_NULLABLE_HANDLE',
|
| - mojom.NULLABLE_DCPIPE: '_descriptor.TYPE_NULLABLE_HANDLE',
|
| - mojom.NULLABLE_DPPIPE: '_descriptor.TYPE_NULLABLE_HANDLE',
|
| - mojom.NULLABLE_MSGPIPE: '_descriptor.TYPE_NULLABLE_HANDLE',
|
| - mojom.NULLABLE_SHAREDBUFFER: '_descriptor.TYPE_NULLABLE_HANDLE',
|
| -}
|
| -
|
| -# int64 integers are not handled by array.array. int64/uint64 array are
|
| -# supported but storage is not optimized (ie. they are plain python list, not
|
| -# array.array)
|
| -_kind_to_typecode_for_native_array = {
|
| - mojom.INT8: 'b',
|
| - mojom.UINT8: 'B',
|
| - mojom.INT16: 'h',
|
| - mojom.UINT16: 'H',
|
| - mojom.INT32: 'i',
|
| - mojom.UINT32: 'I',
|
| - mojom.FLOAT: 'f',
|
| - mojom.DOUBLE: 'd',
|
| -}
|
| -
|
| -
|
| -def NameToComponent(name):
|
| - # insert '_' between anything and a Title name (e.g, HTTPEntry2FooBar ->
|
| - # HTTP_Entry2_FooBar)
|
| - name = re.sub('([^_])([A-Z][^A-Z_]+)', 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 ConstantStyle(name):
|
| - components = NameToComponent(name)
|
| - if components[0] == 'k':
|
| - components = components[1:]
|
| - return '_'.join([x.upper() for x in components])
|
| -
|
| -def FieldStyle(name):
|
| - components = NameToComponent(name)
|
| - return '_'.join([x.lower() for x in components])
|
| -
|
| -def GetNameForElement(element):
|
| - if (mojom.IsEnumKind(element) or mojom.IsInterfaceKind(element) or
|
| - mojom.IsStructKind(element) or isinstance(element, mojom.Method)):
|
| - return UpperCamelCase(element.name)
|
| - if isinstance(element, mojom.EnumValue):
|
| - return (GetNameForElement(element.enum) + '.' +
|
| - ConstantStyle(element.name))
|
| - if isinstance(element, (mojom.NamedValue,
|
| - mojom.Constant)):
|
| - return ConstantStyle(element.name)
|
| - if isinstance(element, mojom.Field):
|
| - return FieldStyle(element.name)
|
| - raise Exception('Unexpected element: %s' % element)
|
| -
|
| -def ExpressionToText(token):
|
| - if isinstance(token, (mojom.EnumValue, mojom.NamedValue)):
|
| - return str(token.computed_value)
|
| -
|
| - if isinstance(token, mojom.BuiltinValue):
|
| - if token.value == 'double.INFINITY' or token.value == 'float.INFINITY':
|
| - return 'float(\'inf\')';
|
| - if (token.value == 'double.NEGATIVE_INFINITY' or
|
| - token.value == 'float.NEGATIVE_INFINITY'):
|
| - return 'float(\'-inf\')'
|
| - if token.value == 'double.NAN' or token.value == 'float.NAN':
|
| - return 'float(\'nan\')';
|
| -
|
| - if token in ['true', 'false']:
|
| - return str(token == 'true')
|
| -
|
| - return token
|
| -
|
| -def GetFullyQualifiedName(kind):
|
| - name = []
|
| - if kind.imported_from:
|
| - name.append(kind.imported_from['python_module'])
|
| - name.append(GetNameForElement(kind))
|
| - return '.'.join(name)
|
| -
|
| -def GetFieldType(kind, field=None):
|
| - if mojom.IsArrayKind(kind):
|
| - arguments = []
|
| - if kind.kind in _kind_to_typecode_for_native_array:
|
| - arguments.append('%r' % _kind_to_typecode_for_native_array[kind.kind])
|
| - elif kind.kind != mojom.BOOL:
|
| - arguments.append(GetFieldType(kind.kind))
|
| - if mojom.IsNullableKind(kind):
|
| - arguments.append('nullable=True')
|
| - if kind.length is not None:
|
| - arguments.append('length=%d' % kind.length)
|
| - array_type = 'GenericArrayType'
|
| - if kind.kind == mojom.BOOL:
|
| - array_type = 'BooleanArrayType'
|
| - elif kind.kind in _kind_to_typecode_for_native_array:
|
| - array_type = 'NativeArrayType'
|
| - return '_descriptor.%s(%s)' % (array_type, ', '.join(arguments))
|
| -
|
| - if mojom.IsMapKind(kind):
|
| - arguments = [
|
| - GetFieldType(kind.key_kind),
|
| - GetFieldType(kind.value_kind),
|
| - ]
|
| - if mojom.IsNullableKind(kind):
|
| - arguments.append('nullable=True')
|
| - return '_descriptor.MapType(%s)' % ', '.join(arguments)
|
| -
|
| - if mojom.IsStructKind(kind):
|
| - arguments = [ 'lambda: %s' % GetFullyQualifiedName(kind) ]
|
| - if mojom.IsNullableKind(kind):
|
| - arguments.append('nullable=True')
|
| - return '_descriptor.StructType(%s)' % ', '.join(arguments)
|
| -
|
| - if mojom.IsEnumKind(kind):
|
| - return GetFieldType(mojom.INT32)
|
| -
|
| - if mojom.IsInterfaceKind(kind):
|
| - arguments = [ 'lambda: %s' % GetFullyQualifiedName(kind) ]
|
| - if mojom.IsNullableKind(kind):
|
| - arguments.append('nullable=True')
|
| - return '_descriptor.InterfaceType(%s)' % ', '.join(arguments)
|
| -
|
| - if mojom.IsInterfaceRequestKind(kind):
|
| - arguments = []
|
| - if mojom.IsNullableKind(kind):
|
| - arguments.append('nullable=True')
|
| - return '_descriptor.InterfaceRequestType(%s)' % ', '.join(arguments)
|
| -
|
| - return _kind_to_type[kind]
|
| -
|
| -def GetFieldDescriptor(packed_field):
|
| - field = packed_field.field
|
| - class_name = 'SingleFieldGroup'
|
| - if field.kind == mojom.BOOL:
|
| - class_name = 'FieldDescriptor'
|
| - arguments = [ '%r' % GetNameForElement(field) ]
|
| - arguments.append(GetFieldType(field.kind, field))
|
| - arguments.append(str(packed_field.index))
|
| - arguments.append(str(packed_field.ordinal))
|
| - if field.default:
|
| - if mojom.IsStructKind(field.kind):
|
| - arguments.append('default_value=True')
|
| - else:
|
| - arguments.append('default_value=%s' % ExpressionToText(field.default))
|
| - return '_descriptor.%s(%s)' % (class_name, ', '.join(arguments))
|
| -
|
| -def GetFieldGroup(byte):
|
| - if byte.packed_fields[0].field.kind == mojom.BOOL:
|
| - descriptors = map(GetFieldDescriptor, byte.packed_fields)
|
| - return '_descriptor.BooleanGroup([%s])' % ', '.join(descriptors)
|
| - assert len(byte.packed_fields) == 1
|
| - return GetFieldDescriptor(byte.packed_fields[0])
|
| -
|
| -def GetResponseStructFromMethod(method):
|
| - return generator.GetDataHeader(
|
| - False, generator.GetResponseStructFromMethod(method))
|
| -
|
| -def GetStructFromMethod(method):
|
| - return generator.GetDataHeader(
|
| - False, generator.GetStructFromMethod(method))
|
| -
|
| -def ComputeStaticValues(module):
|
| - in_progress = set()
|
| - computed = set()
|
| -
|
| - def GetComputedValue(named_value):
|
| - if isinstance(named_value, mojom.EnumValue):
|
| - field = next(ifilter(lambda field: field.name == named_value.name,
|
| - named_value.enum.fields), None)
|
| - if not field:
|
| - raise RuntimeError(
|
| - 'Unable to get computed value for field %s of enum %s' %
|
| - (named_value.name, named_value.enum.name))
|
| - if field not in computed:
|
| - ResolveEnum(named_value.enum)
|
| - return field.computed_value
|
| - elif isinstance(named_value, mojom.ConstantValue):
|
| - ResolveConstant(named_value.constant)
|
| - named_value.computed_value = named_value.constant.computed_value
|
| - return named_value.computed_value
|
| - else:
|
| - print named_value
|
| -
|
| - def ResolveConstant(constant):
|
| - if constant in computed:
|
| - return
|
| - if constant in in_progress:
|
| - raise RuntimeError('Circular dependency for constant: %s' % constant.name)
|
| - in_progress.add(constant)
|
| - if isinstance(constant.value, (mojom.EnumValue, mojom.ConstantValue)):
|
| - computed_value = GetComputedValue(constant.value)
|
| - else:
|
| - computed_value = ExpressionToText(constant.value)
|
| - constant.computed_value = computed_value
|
| - in_progress.remove(constant)
|
| - computed.add(constant)
|
| -
|
| - def ResolveEnum(enum):
|
| - def ResolveEnumField(enum, field, default_value):
|
| - if field in computed:
|
| - return
|
| - if field in in_progress:
|
| - raise RuntimeError('Circular dependency for enum: %s' % enum.name)
|
| - in_progress.add(field)
|
| - if field.value:
|
| - if isinstance(field.value, mojom.EnumValue):
|
| - computed_value = GetComputedValue(field.value)
|
| - elif isinstance(field.value, str):
|
| - computed_value = int(field.value, 0)
|
| - else:
|
| - raise RuntimeError('Unexpected value: %s' % field.value)
|
| - else:
|
| - computed_value = default_value
|
| - field.computed_value = computed_value
|
| - in_progress.remove(field)
|
| - computed.add(field)
|
| -
|
| - current_value = 0
|
| - for field in enum.fields:
|
| - ResolveEnumField(enum, field, current_value)
|
| - current_value = field.computed_value + 1
|
| -
|
| - for constant in module.constants:
|
| - ResolveConstant(constant)
|
| -
|
| - for enum in module.enums:
|
| - ResolveEnum(enum)
|
| -
|
| - for struct in module.structs:
|
| - for constant in struct.constants:
|
| - ResolveConstant(constant)
|
| - for enum in struct.enums:
|
| - ResolveEnum(enum)
|
| - for field in struct.fields:
|
| - if isinstance(field.default, (mojom.ConstantValue, mojom.EnumValue)):
|
| - field.default.computed_value = GetComputedValue(field.default)
|
| -
|
| - return module
|
| -
|
| -def MojomToPythonImport(mojom):
|
| - return mojom.replace('.mojom', '_mojom')
|
| -
|
| -class Generator(generator.Generator):
|
| -
|
| - python_filters = {
|
| - 'expression_to_text': ExpressionToText,
|
| - 'field_group': GetFieldGroup,
|
| - 'fully_qualified_name': GetFullyQualifiedName,
|
| - 'name': GetNameForElement,
|
| - 'response_struct_from_method': GetResponseStructFromMethod,
|
| - 'struct_from_method': GetStructFromMethod,
|
| - }
|
| -
|
| - @UseJinja('python_templates/module.py.tmpl', filters=python_filters)
|
| - def GeneratePythonModule(self):
|
| - return {
|
| - 'enums': self.module.enums,
|
| - 'imports': self.GetImports(),
|
| - 'interfaces': self.GetQualifiedInterfaces(),
|
| - 'module': ComputeStaticValues(self.module),
|
| - 'structs': self.GetStructs(),
|
| - }
|
| -
|
| - def GenerateFiles(self, args):
|
| - import_path = MojomToPythonImport(self.module.name)
|
| - self.Write(self.GeneratePythonModule(),
|
| - self.MatchMojomFilePath('%s.py' % import_path))
|
| -
|
| - def GetImports(self):
|
| - for each in self.module.imports:
|
| - each['python_module'] = MojomToPythonImport(each['module_name'])
|
| - return self.module.imports
|
| -
|
| - def GetQualifiedInterfaces(self):
|
| - """
|
| - Returns the list of interfaces of the module. Each interface that has a
|
| - client will have a reference to the representation of the client interface
|
| - in the 'qualified_client' field.
|
| - """
|
| - interfaces = self.module.interfaces
|
| - all_interfaces = [] + interfaces
|
| - for each in self.GetImports():
|
| - all_interfaces += [data.KindFromImport(x, each) for x in
|
| - each['module'].interfaces];
|
| - interfaces_by_name = dict((x.name, x) for x in all_interfaces)
|
| - for interface in interfaces:
|
| - if interface.client:
|
| - assert interface.client in interfaces_by_name, (
|
| - 'Unable to find interface %s declared as client of %s.' %
|
| - (interface.client, interface.name))
|
| - interface.qualified_client = interfaces_by_name[interface.client]
|
| - return sorted(interfaces, key=lambda i: (bool(i.client), i.name))
|
| -
|
| - def GetJinjaParameters(self):
|
| - return {
|
| - 'lstrip_blocks': True,
|
| - 'trim_blocks': True,
|
| - }
|
|
|