Index: mojo/public/tools/bindings/pylib/mojom/parse/translate.py |
diff --git a/mojo/public/tools/bindings/pylib/mojom/parse/translate.py b/mojo/public/tools/bindings/pylib/mojom/parse/translate.py |
deleted file mode 100644 |
index 88bd2698ade8e5a1e06e7f654187f877bef1a9c3..0000000000000000000000000000000000000000 |
--- a/mojo/public/tools/bindings/pylib/mojom/parse/translate.py |
+++ /dev/null |
@@ -1,167 +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. |
- |
-"""Translates parse tree to Mojom IR.""" |
- |
- |
-from . import ast |
- |
- |
-def _MapTreeForType(func, tree, type_to_map): |
- assert isinstance(type_to_map, type) |
- if not tree: |
- return [] |
- return [func(subtree) for subtree in tree if isinstance(subtree, type_to_map)] |
- |
-def _MapKind(kind): |
- map_to_kind = {'bool': 'b', |
- 'int8': 'i8', |
- 'int16': 'i16', |
- 'int32': 'i32', |
- 'int64': 'i64', |
- 'uint8': 'u8', |
- 'uint16': 'u16', |
- 'uint32': 'u32', |
- 'uint64': 'u64', |
- 'float': 'f', |
- 'double': 'd', |
- 'string': 's', |
- 'handle': 'h', |
- 'handle<data_pipe_consumer>': 'h:d:c', |
- 'handle<data_pipe_producer>': 'h:d:p', |
- 'handle<message_pipe>': 'h:m', |
- 'handle<shared_buffer>': 'h:s'} |
- if kind.endswith('?'): |
- base_kind = _MapKind(kind[0:-1]) |
- # NOTE: This doesn't rule out enum types. Those will be detected later, when |
- # cross-reference is established. |
- reference_kinds = ('m', 's', 'h', 'a', 'r', 'x') |
- if base_kind[0] not in reference_kinds: |
- raise Exception( |
- 'A type (spec "%s") cannot be made nullable' % base_kind) |
- return '?' + base_kind |
- if kind.endswith('}'): |
- lbracket = kind.rfind('{') |
- value = kind[0:lbracket] |
- return 'm[' + _MapKind(kind[lbracket+1:-1]) + '][' + _MapKind(value) + ']' |
- if kind.endswith(']'): |
- lbracket = kind.rfind('[') |
- typename = kind[0:lbracket] |
- return 'a' + kind[lbracket+1:-1] + ':' + _MapKind(typename) |
- if kind.endswith('&'): |
- return 'r:' + _MapKind(kind[0:-1]) |
- if kind in map_to_kind: |
- return map_to_kind[kind] |
- return 'x:' + kind |
- |
-def _AttributeListToDict(attribute_list): |
- if attribute_list is None: |
- return {} |
- assert isinstance(attribute_list, ast.AttributeList) |
- # TODO(vtl): Check for duplicate keys here. |
- return dict([(attribute.key, attribute.value) |
- for attribute in attribute_list]) |
- |
-def _EnumToDict(enum): |
- def EnumValueToDict(enum_value): |
- assert isinstance(enum_value, ast.EnumValue) |
- return {'name': enum_value.name, |
- 'value': enum_value.value} |
- |
- assert isinstance(enum, ast.Enum) |
- return {'name': enum.name, |
- 'fields': map(EnumValueToDict, enum.enum_value_list)} |
- |
-def _ConstToDict(const): |
- assert isinstance(const, ast.Const) |
- return {'name': const.name, |
- 'kind': _MapKind(const.typename), |
- 'value': const.value} |
- |
- |
-class _MojomBuilder(object): |
- def __init__(self): |
- self.mojom = {} |
- |
- def Build(self, tree, name): |
- def StructToDict(struct): |
- def StructFieldToDict(struct_field): |
- assert isinstance(struct_field, ast.StructField) |
- return {'name': struct_field.name, |
- 'kind': _MapKind(struct_field.typename), |
- 'ordinal': struct_field.ordinal.value \ |
- if struct_field.ordinal else None, |
- 'default': struct_field.default_value} |
- |
- assert isinstance(struct, ast.Struct) |
- return {'name': struct.name, |
- 'attributes': _AttributeListToDict(struct.attribute_list), |
- 'fields': _MapTreeForType(StructFieldToDict, struct.body, |
- ast.StructField), |
- 'enums': _MapTreeForType(_EnumToDict, struct.body, ast.Enum), |
- 'constants': _MapTreeForType(_ConstToDict, struct.body, |
- ast.Const)} |
- |
- def UnionToDict(union): |
- def UnionFieldToDict(union_field): |
- assert isinstance(union_field, ast.UnionField) |
- return {'name': union_field.name, |
- 'kind': _MapKind(union_field.typename), |
- 'ordinal': union_field.ordinal.value \ |
- if union_field.ordinal else None} |
- assert isinstance(union, ast.Union) |
- return {'name': union.name, |
- 'fields': _MapTreeForType(UnionFieldToDict, union.body, |
- ast.UnionField)} |
- |
- def InterfaceToDict(interface): |
- def MethodToDict(method): |
- def ParameterToDict(param): |
- assert isinstance(param, ast.Parameter) |
- return {'name': param.name, |
- 'kind': _MapKind(param.typename), |
- 'ordinal': param.ordinal.value if param.ordinal else None} |
- |
- assert isinstance(method, ast.Method) |
- rv = {'name': method.name, |
- 'parameters': map(ParameterToDict, method.parameter_list), |
- 'ordinal': method.ordinal.value if method.ordinal else None} |
- if method.response_parameter_list is not None: |
- rv['response_parameters'] = map(ParameterToDict, |
- method.response_parameter_list) |
- return rv |
- |
- assert isinstance(interface, ast.Interface) |
- attributes = _AttributeListToDict(interface.attribute_list) |
- return {'name': interface.name, |
- 'attributes': attributes, |
- 'client': attributes.get('Client'), |
- 'methods': _MapTreeForType(MethodToDict, interface.body, |
- ast.Method), |
- 'enums': _MapTreeForType(_EnumToDict, interface.body, ast.Enum), |
- 'constants': _MapTreeForType(_ConstToDict, interface.body, |
- ast.Const)} |
- |
- assert isinstance(tree, ast.Mojom) |
- self.mojom['name'] = name |
- self.mojom['namespace'] = tree.module.name[1] if tree.module else '' |
- self.mojom['imports'] = \ |
- [{'filename': imp.import_filename} for imp in tree.import_list] |
- self.mojom['attributes'] = \ |
- _AttributeListToDict(tree.module.attribute_list) if tree.module else {} |
- self.mojom['structs'] = \ |
- _MapTreeForType(StructToDict, tree.definition_list, ast.Struct) |
- self.mojom['union'] = \ |
- _MapTreeForType(UnionToDict, tree.definition_list, ast.Union) |
- self.mojom['interfaces'] = \ |
- _MapTreeForType(InterfaceToDict, tree.definition_list, ast.Interface) |
- self.mojom['enums'] = \ |
- _MapTreeForType(_EnumToDict, tree.definition_list, ast.Enum) |
- self.mojom['constants'] = \ |
- _MapTreeForType(_ConstToDict, tree.definition_list, ast.Const) |
- return self.mojom |
- |
- |
-def Translate(tree, name): |
- return _MojomBuilder().Build(tree, name) |