Index: third_party/mojo/src/mojo/public/tools/bindings/generators/mojom_go_generator.py |
diff --git a/third_party/mojo/src/mojo/public/tools/bindings/generators/mojom_go_generator.py b/third_party/mojo/src/mojo/public/tools/bindings/generators/mojom_go_generator.py |
deleted file mode 100644 |
index 62babffad83c138045e94330b17023c58d5fba16..0000000000000000000000000000000000000000 |
--- a/third_party/mojo/src/mojo/public/tools/bindings/generators/mojom_go_generator.py |
+++ /dev/null |
@@ -1,373 +0,0 @@ |
-# Copyright 2015 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 Go source files from a mojom.Module.''' |
- |
-from itertools import chain |
-import os |
-import re |
- |
-from mojom.generate.template_expander import UseJinja |
- |
-import mojom.generate.generator as generator |
-import mojom.generate.module as mojom |
-import mojom.generate.pack as pack |
- |
-class KindInfo(object): |
- def __init__(self, go_type, encode_suffix, decode_suffix, bit_size): |
- self.go_type = go_type |
- self.encode_suffix = encode_suffix |
- self.decode_suffix = decode_suffix |
- self.bit_size = bit_size |
- |
-_kind_infos = { |
- mojom.BOOL: KindInfo('bool', 'Bool', 'Bool', 1), |
- mojom.INT8: KindInfo('int8', 'Int8', 'Int8', 8), |
- mojom.UINT8: KindInfo('uint8', 'Uint8', 'Uint8', 8), |
- mojom.INT16: KindInfo('int16', 'Int16', 'Int16', 16), |
- mojom.UINT16: KindInfo('uint16', 'Uint16', 'Uint16', 16), |
- mojom.INT32: KindInfo('int32', 'Int32', 'Int32', 32), |
- mojom.UINT32: KindInfo('uint32', 'Uint32', 'Uint32', 32), |
- mojom.FLOAT: KindInfo('float32', 'Float32', 'Float32', 32), |
- mojom.HANDLE: KindInfo( |
- 'system.Handle', 'Handle', 'Handle', 32), |
- mojom.DCPIPE: KindInfo( |
- 'system.ConsumerHandle', 'Handle', 'ConsumerHandle', 32), |
- mojom.DPPIPE: KindInfo( |
- 'system.ProducerHandle', 'Handle', 'ProducerHandle', 32), |
- mojom.MSGPIPE: KindInfo( |
- 'system.MessagePipeHandle', 'Handle', 'MessagePipeHandle', 32), |
- mojom.SHAREDBUFFER: KindInfo( |
- 'system.SharedBufferHandle', 'Handle', 'SharedBufferHandle', 32), |
- mojom.NULLABLE_HANDLE: KindInfo( |
- 'system.Handle', 'Handle', 'Handle', 32), |
- mojom.NULLABLE_DCPIPE: KindInfo( |
- 'system.ConsumerHandle', 'Handle', 'ConsumerHandle', 32), |
- mojom.NULLABLE_DPPIPE: KindInfo( |
- 'system.ProducerHandle', 'Handle', 'ProducerHandle', 32), |
- mojom.NULLABLE_MSGPIPE: KindInfo( |
- 'system.MessagePipeHandle', 'Handle', 'MessagePipeHandle', 32), |
- mojom.NULLABLE_SHAREDBUFFER: KindInfo( |
- 'system.SharedBufferHandle', 'Handle', 'SharedBufferHandle', 32), |
- mojom.INT64: KindInfo('int64', 'Int64', 'Int64', 64), |
- mojom.UINT64: KindInfo('uint64', 'Uint64', 'Uint64', 64), |
- mojom.DOUBLE: KindInfo('float64', 'Float64', 'Float64', 64), |
- mojom.STRING: KindInfo('string', 'String', 'String', 64), |
- mojom.NULLABLE_STRING: KindInfo('string', 'String', 'String', 64), |
-} |
- |
-_imports = {} |
- |
-def GetBitSize(kind): |
- if isinstance(kind, (mojom.Union)): |
- return 128 |
- if isinstance(kind, (mojom.Array, mojom.Map, mojom.Struct, mojom.Interface)): |
- return 64 |
- if mojom.IsUnionKind(kind): |
- return 2*64 |
- if isinstance(kind, (mojom.InterfaceRequest)): |
- kind = mojom.MSGPIPE |
- if isinstance(kind, mojom.Enum): |
- kind = mojom.INT32 |
- return _kind_infos[kind].bit_size |
- |
-# Returns go type corresponding to provided kind. If |nullable| is true |
-# and kind is nullable adds an '*' to type (example: ?string -> *string). |
-def GetGoType(kind, nullable = True): |
- if nullable and mojom.IsNullableKind(kind) and not mojom.IsUnionKind(kind): |
- return '*%s' % GetNonNullableGoType(kind) |
- return GetNonNullableGoType(kind) |
- |
-# Returns go type corresponding to provided kind. Ignores nullability of |
-# top-level kind. |
-def GetNonNullableGoType(kind): |
- if mojom.IsStructKind(kind) or mojom.IsUnionKind(kind): |
- return '%s' % GetFullName(kind) |
- if mojom.IsArrayKind(kind): |
- if kind.length: |
- return '[%s]%s' % (kind.length, GetGoType(kind.kind)) |
- return '[]%s' % GetGoType(kind.kind) |
- if mojom.IsMapKind(kind): |
- return 'map[%s]%s' % (GetGoType(kind.key_kind), GetGoType(kind.value_kind)) |
- if mojom.IsInterfaceKind(kind): |
- return '%s_Pointer' % GetFullName(kind) |
- if mojom.IsInterfaceRequestKind(kind): |
- return '%s_Request' % GetFullName(kind.kind) |
- if mojom.IsEnumKind(kind): |
- return GetNameForNestedElement(kind) |
- return _kind_infos[kind].go_type |
- |
-def IsPointer(kind): |
- return mojom.IsObjectKind(kind) and not mojom.IsUnionKind(kind) |
- |
-# Splits name to lower-cased parts used for camel-casing |
-# (example: HTTPEntry2FooBar -> ['http', 'entry2', 'foo', 'bar']). |
-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)]) |
- |
-# Formats a name. If |exported| is true makes name camel-cased with first |
-# letter capital, otherwise does no camel-casing and makes first letter |
-# lower-cased (which is used for making internal names more readable). |
-def FormatName(name, exported=True): |
- if exported: |
- return UpperCamelCase(name) |
- # Leave '_' symbols for unexported names. |
- return name[0].lower() + name[1:] |
- |
-# Returns full name of an imported element based on prebuilt dict |_imports|. |
-# If the |element| is not imported returns formatted name of it. |
-# |element| should have attr 'name'. |exported| argument is used to make |
-# |FormatName()| calls only. |
-def GetFullName(element, exported=True): |
- return GetQualifiedName( |
- element.name, GetPackageNameForElement(element), exported) |
- |
-# Returns a name for nested elements like enum field or constant. |
-# The returned name consists of camel-cased parts separated by '_'. |
-def GetNameForNestedElement(element): |
- if element.parent_kind: |
- return "%s_%s" % (GetNameForElement(element.parent_kind), |
- FormatName(element.name)) |
- return GetFullName(element) |
- |
-def GetNameForElement(element, exported=True): |
- if (mojom.IsInterfaceKind(element) or mojom.IsStructKind(element) |
- or mojom.IsUnionKind(element)): |
- return GetFullName(element, exported) |
- if isinstance(element, (mojom.EnumField, |
- mojom.Field, |
- mojom.Method, |
- mojom.Parameter)): |
- return FormatName(element.name, exported) |
- if isinstance(element, (mojom.Enum, |
- mojom.Constant, |
- mojom.ConstantValue)): |
- return GetNameForNestedElement(element) |
- raise Exception('Unexpected element: %s' % element) |
- |
-def ExpressionToText(token): |
- if isinstance(token, mojom.EnumValue): |
- return "%s_%s" % (GetNameForNestedElement(token.enum), |
- FormatName(token.name, True)) |
- if isinstance(token, mojom.ConstantValue): |
- return GetNameForNestedElement(token) |
- if isinstance(token, mojom.Constant): |
- return ExpressionToText(token.value) |
- return token |
- |
-def DecodeSuffix(kind): |
- if mojom.IsEnumKind(kind): |
- return DecodeSuffix(mojom.INT32) |
- if mojom.IsInterfaceKind(kind): |
- return 'Interface' |
- if mojom.IsInterfaceRequestKind(kind): |
- return DecodeSuffix(mojom.MSGPIPE) |
- return _kind_infos[kind].decode_suffix |
- |
-def EncodeSuffix(kind): |
- if mojom.IsEnumKind(kind): |
- return EncodeSuffix(mojom.INT32) |
- if mojom.IsInterfaceKind(kind): |
- return 'Interface' |
- if mojom.IsInterfaceRequestKind(kind): |
- return EncodeSuffix(mojom.MSGPIPE) |
- return _kind_infos[kind].encode_suffix |
- |
-def GetPackageName(module): |
- return module.name.split('.')[0] |
- |
-def GetPackageNameForElement(element): |
- if not hasattr(element, 'imported_from') or not element.imported_from: |
- return '' |
- path = '' |
- if element.imported_from['module'].path: |
- path += GetPackagePath(element.imported_from['module']) |
- if path in _imports: |
- return _imports[path] |
- return '' |
- |
-def GetQualifiedName(name, package=None, exported=True): |
- if not package: |
- return FormatName(name, exported) |
- return '%s.%s' % (package, FormatName(name, exported)) |
- |
-def GetPackagePath(module): |
- name = module.name.split('.')[0] |
- return '/'.join(module.path.split('/')[:-1] + [name]) |
- |
-def GetAllConstants(module): |
- data = [module] + module.structs + module.interfaces |
- constants = [x.constants for x in data] |
- return [i for i in chain.from_iterable(constants)] |
- |
-def GetAllEnums(module): |
- data = [module] + module.structs + module.interfaces |
- enums = [x.enums for x in data] |
- return [i for i in chain.from_iterable(enums)] |
- |
-# Adds an import required to use the provided |element|. |
-# The required import is stored at '_imports'. |
-def AddImport(module, element): |
- if not isinstance(element, mojom.Kind): |
- return |
- |
- if mojom.IsArrayKind(element) or mojom.IsInterfaceRequestKind(element): |
- AddImport(module, element.kind) |
- return |
- if mojom.IsMapKind(element): |
- AddImport(module, element.key_kind) |
- AddImport(module, element.value_kind) |
- return |
- if mojom.IsAnyHandleKind(element): |
- _imports['mojo/public/go/system'] = 'system' |
- return |
- |
- if not hasattr(element, 'imported_from') or not element.imported_from: |
- return |
- imported = element.imported_from |
- if GetPackagePath(imported['module']) == GetPackagePath(module): |
- return |
- path = GetPackagePath(imported['module']) |
- if path in _imports: |
- return |
- name = GetPackageName(imported['module']) |
- while name in _imports.values(): |
- name += '_' |
- _imports[path] = name |
- |
- |
-class Generator(generator.Generator): |
- go_filters = { |
- 'array': lambda kind: mojom.Array(kind), |
- 'bit_size': GetBitSize, |
- 'decode_suffix': DecodeSuffix, |
- 'encode_suffix': EncodeSuffix, |
- 'go_type': GetGoType, |
- 'expression_to_text': ExpressionToText, |
- 'is_array': mojom.IsArrayKind, |
- 'is_enum': mojom.IsEnumKind, |
- 'is_handle': mojom.IsAnyHandleKind, |
- 'is_interface': mojom.IsInterfaceKind, |
- 'is_interface_request': mojom.IsInterfaceRequestKind, |
- 'is_map': mojom.IsMapKind, |
- 'is_none_or_empty': lambda array: array == None or len(array) == 0, |
- 'is_nullable': mojom.IsNullableKind, |
- 'is_pointer': IsPointer, |
- 'is_object': mojom.IsObjectKind, |
- 'is_struct': mojom.IsStructKind, |
- 'is_union': mojom.IsUnionKind, |
- 'qualified': GetQualifiedName, |
- 'name': GetNameForElement, |
- 'package': GetPackageNameForElement, |
- 'tab_indent': lambda s, size = 1: ('\n' + '\t' * size).join(s.splitlines()) |
- } |
- |
- def GetParameters(self): |
- return { |
- 'enums': GetAllEnums(self.module), |
- 'imports': self.GetImports(), |
- 'interfaces': self.GetInterfaces(), |
- 'package': GetPackageName(self.module), |
- 'structs': self.GetStructs(), |
- 'unions': self.GetUnions(), |
- } |
- |
- @UseJinja('go_templates/source.tmpl', filters=go_filters) |
- def GenerateSource(self): |
- return self.GetParameters() |
- |
- def GenerateFiles(self, args): |
- self.Write(self.GenerateSource(), os.path.join("go", "src", |
- GetPackagePath(self.module), "%s.go" % self.module.name)) |
- |
- def GetJinjaParameters(self): |
- return { |
- 'lstrip_blocks': True, |
- 'trim_blocks': True, |
- } |
- |
- def GetGlobals(self): |
- return { |
- 'namespace': self.module.namespace, |
- 'module': self.module, |
- } |
- |
- # Scans |self.module| for elements that require imports and adds all found |
- # imports to '_imports' dict. Returns a list of imports that should include |
- # the generated go file. |
- def GetImports(self): |
- # Imports can only be used in structs, constants, enums, interfaces. |
- all_structs = list(self.module.structs) |
- for i in self.module.interfaces: |
- for method in i.methods: |
- all_structs.append(self._GetStructFromMethod(method)) |
- if method.response_parameters: |
- all_structs.append(self._GetResponseStructFromMethod(method)) |
- |
- if len(all_structs) > 0 or len(self.module.interfaces) > 0: |
- _imports['fmt'] = 'fmt' |
- _imports['mojo/public/go/bindings'] = 'bindings' |
- if len(self.module.interfaces) > 0: |
- _imports['mojo/public/go/system'] = 'system' |
- if len(all_structs) > 0: |
- _imports['sort'] = 'sort' |
- |
- for union in self.module.unions: |
- for field in union.fields: |
- AddImport(self.module, field.kind) |
- |
- for struct in all_structs: |
- for field in struct.fields: |
- AddImport(self.module, field.kind) |
-# TODO(rogulenko): add these after generating constants and struct defaults. |
-# if field.default: |
-# AddImport(self.module, field.default) |
- |
- for enum in GetAllEnums(self.module): |
- for field in enum.fields: |
- if field.value: |
- AddImport(self.module, field.value) |
- |
-# TODO(rogulenko): add these after generating constants and struct defaults. |
-# for constant in GetAllConstants(self.module): |
-# AddImport(self.module, constant.value) |
- |
- imports_list = [] |
- for i in _imports: |
- if i.split('/')[-1] == _imports[i]: |
- imports_list.append('"%s"' % i) |
- else: |
- imports_list.append('%s "%s"' % (_imports[i], i)) |
- return sorted(imports_list) |
- |
- # Overrides the implementation from the base class in order to customize the |
- # struct and field names. |
- def _GetStructFromMethod(self, method): |
- params_class = "%s_%s_Params" % (GetNameForElement(method.interface), |
- GetNameForElement(method)) |
- struct = mojom.Struct(params_class, module=method.interface.module) |
- for param in method.parameters: |
- struct.AddField("in%s" % GetNameForElement(param), |
- param.kind, param.ordinal, attributes=param.attributes) |
- return self._AddStructComputedData(False, struct) |
- |
- # Overrides the implementation from the base class in order to customize the |
- # struct and field names. |
- def _GetResponseStructFromMethod(self, method): |
- params_class = "%s_%s_ResponseParams" % ( |
- GetNameForElement(method.interface), GetNameForElement(method)) |
- struct = mojom.Struct(params_class, module=method.interface.module) |
- for param in method.response_parameters: |
- struct.AddField("out%s" % GetNameForElement(param), |
- param.kind, param.ordinal, attributes=param.attributes) |
- return self._AddStructComputedData(False, struct) |