| Index: mojo/public/tools/bindings/pylib/mojom/generate/translate.py
|
| diff --git a/mojo/public/tools/bindings/pylib/mojom/generate/translate.py b/mojo/public/tools/bindings/pylib/mojom/generate/translate.py
|
| index 5e4183a63b11b45dae11ef6becc5c2ff1e544497..f1d8f4264ec5dc44ff11089321c7618ff592d78e 100644
|
| --- a/mojo/public/tools/bindings/pylib/mojom/generate/translate.py
|
| +++ b/mojo/public/tools/bindings/pylib/mojom/generate/translate.py
|
| @@ -10,20 +10,20 @@ representation of a mojom file. When called it's assumed that all imports have
|
| already been parsed and converted to ASTs before.
|
| """
|
|
|
| -import copy
|
| +import os
|
| import re
|
|
|
| import module as mojom
|
| from mojom.parse import ast
|
|
|
| def _DuplicateName(values):
|
| - """Returns the 'name' of the first entry in |values| whose 'name' has already
|
| - been encountered. If there are no duplicates, returns None."""
|
| + """Returns the 'mojom_name' of the first entry in |values| whose 'mojom_name'
|
| + has already been encountered. If there are no duplicates, returns None."""
|
| names = set()
|
| for value in values:
|
| - if value.name in names:
|
| - return value.name
|
| - names.add(value.name)
|
| + if value.mojom_name in names:
|
| + return value.mojom_name
|
| + names.add(value.mojom_name)
|
| return None
|
|
|
| def _ElemsOfType(elems, elem_type, scope):
|
| @@ -121,36 +121,36 @@ def _LookupKind(kinds, spec, scope):
|
| |scope| is a tuple that looks like (namespace, struct/interface), referring
|
| to the location where the type is referenced."""
|
| if spec.startswith('x:'):
|
| - name = spec[2:]
|
| + mojom_name = spec[2:]
|
| for i in xrange(len(scope), -1, -1):
|
| test_spec = 'x:'
|
| if i > 0:
|
| test_spec += '.'.join(scope[:i]) + '.'
|
| - test_spec += name
|
| + test_spec += mojom_name
|
| kind = kinds.get(test_spec)
|
| if kind:
|
| return kind
|
|
|
| return kinds.get(spec)
|
|
|
| -def _LookupValue(values, name, scope, kind):
|
| +def _LookupValue(values, mojom_name, scope, kind):
|
| """Like LookupKind, but for constant values."""
|
| # If the type is an enum, the value can be specified as a qualified name, in
|
| # which case the form EnumName.ENUM_VALUE must be used. We use the presence
|
| # of a '.' in the requested name to identify this. Otherwise, we prepend the
|
| # enum name.
|
| - if isinstance(kind, mojom.Enum) and '.' not in name:
|
| - name = '%s.%s' % (kind.spec.split(':', 1)[1], name)
|
| + if isinstance(kind, mojom.Enum) and '.' not in mojom_name:
|
| + mojom_name = '%s.%s' % (kind.spec.split(':', 1)[1], mojom_name)
|
| for i in reversed(xrange(len(scope) + 1)):
|
| test_spec = '.'.join(scope[:i])
|
| if test_spec:
|
| test_spec += '.'
|
| - test_spec += name
|
| + test_spec += mojom_name
|
| value = values.get(test_spec)
|
| if value:
|
| return value
|
|
|
| - return values.get(name)
|
| + return values.get(mojom_name)
|
|
|
| def _FixupExpression(module, value, scope, kind):
|
| """Translates an IDENTIFIER into a built-in value or structured NamedValue
|
| @@ -246,9 +246,9 @@ def _Struct(module, parsed_struct):
|
| {mojom.Struct} AST struct.
|
| """
|
| struct = mojom.Struct(module=module)
|
| - struct.name = parsed_struct.name
|
| + struct.mojom_name = parsed_struct.mojom_name
|
| struct.native_only = parsed_struct.body is None
|
| - struct.spec = 'x:' + module.namespace + '.' + struct.name
|
| + struct.spec = 'x:' + module.mojom_namespace + '.' + struct.mojom_name
|
| module.kinds[struct.spec] = struct
|
| if struct.native_only:
|
| struct.enums = []
|
| @@ -257,13 +257,13 @@ def _Struct(module, parsed_struct):
|
| else:
|
| struct.enums = map(
|
| lambda enum: _Enum(module, enum, struct),
|
| - _ElemsOfType(parsed_struct.body, ast.Enum, parsed_struct.name))
|
| + _ElemsOfType(parsed_struct.body, ast.Enum, parsed_struct.mojom_name))
|
| struct.constants = map(
|
| lambda constant: _Constant(module, constant, struct),
|
| - _ElemsOfType(parsed_struct.body, ast.Const, parsed_struct.name))
|
| + _ElemsOfType(parsed_struct.body, ast.Const, parsed_struct.mojom_name))
|
| # Stash fields parsed_struct here temporarily.
|
| struct.fields_data = _ElemsOfType(
|
| - parsed_struct.body, ast.StructField, parsed_struct.name)
|
| + parsed_struct.body, ast.StructField, parsed_struct.mojom_name)
|
| struct.attributes = _AttributeListToDict(parsed_struct.attribute_list)
|
|
|
| # Enforce that a [Native] attribute is set to make native-only struct
|
| @@ -285,12 +285,12 @@ def _Union(module, parsed_union):
|
| {mojom.Union} AST union.
|
| """
|
| union = mojom.Union(module=module)
|
| - union.name = parsed_union.name
|
| - union.spec = 'x:' + module.namespace + '.' + union.name
|
| + union.mojom_name = parsed_union.mojom_name
|
| + union.spec = 'x:' + module.mojom_namespace + '.' + union.mojom_name
|
| module.kinds[union.spec] = union
|
| # Stash fields parsed_union here temporarily.
|
| union.fields_data = _ElemsOfType(
|
| - parsed_union.body, ast.UnionField, parsed_union.name)
|
| + parsed_union.body, ast.UnionField, parsed_union.mojom_name)
|
| union.attributes = _AttributeListToDict(parsed_union.attribute_list)
|
| return union
|
|
|
| @@ -305,14 +305,14 @@ def _StructField(module, parsed_field, struct):
|
| {mojom.StructField} AST struct field.
|
| """
|
| field = mojom.StructField()
|
| - field.name = parsed_field.name
|
| + field.mojom_name = parsed_field.mojom_name
|
| field.kind = _Kind(
|
| module.kinds, _MapKind(parsed_field.typename),
|
| - (module.namespace, struct.name))
|
| + (module.mojom_namespace, struct.mojom_name))
|
| field.ordinal = parsed_field.ordinal.value if parsed_field.ordinal else None
|
| field.default = _FixupExpression(
|
| - module, parsed_field.default_value, (module.namespace, struct.name),
|
| - field.kind)
|
| + module, parsed_field.default_value,
|
| + (module.mojom_namespace, struct.mojom_name), field.kind)
|
| field.attributes = _AttributeListToDict(parsed_field.attribute_list)
|
| return field
|
|
|
| @@ -327,13 +327,13 @@ def _UnionField(module, parsed_field, union):
|
| {mojom.UnionField} AST union.
|
| """
|
| field = mojom.UnionField()
|
| - field.name = parsed_field.name
|
| + field.mojom_name = parsed_field.mojom_name
|
| field.kind = _Kind(
|
| module.kinds, _MapKind(parsed_field.typename),
|
| - (module.namespace, union.name))
|
| + (module.mojom_namespace, union.mojom_name))
|
| field.ordinal = parsed_field.ordinal.value if parsed_field.ordinal else None
|
| field.default = _FixupExpression(
|
| - module, None, (module.namespace, union.name), field.kind)
|
| + module, None, (module.mojom_namespace, union.mojom_name), field.kind)
|
| field.attributes = _AttributeListToDict(parsed_field.attribute_list)
|
| return field
|
|
|
| @@ -348,10 +348,10 @@ def _Parameter(module, parsed_param, interface):
|
| {mojom.Parameter} AST parameter.
|
| """
|
| parameter = mojom.Parameter()
|
| - parameter.name = parsed_param.name
|
| + parameter.mojom_name = parsed_param.mojom_name
|
| parameter.kind = _Kind(
|
| module.kinds, _MapKind(parsed_param.typename),
|
| - (module.namespace, interface.name))
|
| + (module.mojom_namespace, interface.mojom_name))
|
| parameter.ordinal = (
|
| parsed_param.ordinal.value if parsed_param.ordinal else None)
|
| parameter.default = None # TODO(tibell): We never have these. Remove field?
|
| @@ -369,7 +369,7 @@ def _Method(module, parsed_method, interface):
|
| {mojom.Method} AST method.
|
| """
|
| method = mojom.Method(
|
| - interface, parsed_method.name,
|
| + interface, parsed_method.mojom_name,
|
| ordinal=parsed_method.ordinal.value if parsed_method.ordinal else None)
|
| method.parameters = map(
|
| lambda parameter: _Parameter(module, parameter, interface),
|
| @@ -399,18 +399,18 @@ def _Interface(module, parsed_iface):
|
| {mojom.Interface} AST interface.
|
| """
|
| interface = mojom.Interface(module=module)
|
| - interface.name = parsed_iface.name
|
| - interface.spec = 'x:' + module.namespace + '.' + interface.name
|
| + interface.mojom_name = parsed_iface.mojom_name
|
| + interface.spec = 'x:' + module.mojom_namespace + '.' + interface.mojom_name
|
| module.kinds[interface.spec] = interface
|
| interface.enums = map(
|
| lambda enum: _Enum(module, enum, interface),
|
| - _ElemsOfType(parsed_iface.body, ast.Enum, parsed_iface.name))
|
| + _ElemsOfType(parsed_iface.body, ast.Enum, parsed_iface.mojom_name))
|
| interface.constants = map(
|
| lambda constant: _Constant(module, constant, interface),
|
| - _ElemsOfType(parsed_iface.body, ast.Const, parsed_iface.name))
|
| + _ElemsOfType(parsed_iface.body, ast.Const, parsed_iface.mojom_name))
|
| # Stash methods parsed_iface here temporarily.
|
| interface.methods_data = _ElemsOfType(
|
| - parsed_iface.body, ast.Method, parsed_iface.name)
|
| + parsed_iface.body, ast.Method, parsed_iface.mojom_name)
|
| interface.attributes = _AttributeListToDict(parsed_iface.attribute_list)
|
| return interface
|
|
|
| @@ -426,17 +426,18 @@ def _EnumField(module, enum, parsed_field, parent_kind):
|
| {mojom.EnumField} AST enum field.
|
| """
|
| field = mojom.EnumField()
|
| - field.name = parsed_field.name
|
| + field.mojom_name = parsed_field.mojom_name
|
| # TODO(mpcomplete): FixupExpression should be done in the second pass,
|
| # so constants and enums can refer to each other.
|
| # TODO(mpcomplete): But then, what if constants are initialized to an enum? Or
|
| # vice versa?
|
| if parent_kind:
|
| field.value = _FixupExpression(
|
| - module, parsed_field.value, (module.namespace, parent_kind.name), enum)
|
| + module, parsed_field.value,
|
| + (module.mojom_namespace, parent_kind.mojom_name), enum)
|
| else:
|
| field.value = _FixupExpression(
|
| - module, parsed_field.value, (module.namespace, ), enum)
|
| + module, parsed_field.value, (module.mojom_namespace, ), enum)
|
| field.attributes = _AttributeListToDict(parsed_field.attribute_list)
|
| value = mojom.EnumValue(module, enum, field)
|
| module.values[value.GetSpec()] = value
|
| @@ -448,7 +449,7 @@ def _ResolveNumericEnumValues(enum_fields):
|
| values to EnumField.numeric_value.
|
| """
|
|
|
| - # map of <name> -> integral value
|
| + # map of <mojom_name> -> integral value
|
| resolved_enum_values = {}
|
| prev_value = -1
|
| for field in enum_fields:
|
| @@ -462,11 +463,11 @@ def _ResolveNumericEnumValues(enum_fields):
|
|
|
| # Reference to a previous enum value (e.g: INIT = BEGIN).
|
| elif type(field.value) is mojom.EnumValue:
|
| - prev_value = resolved_enum_values[field.value.name]
|
| + prev_value = resolved_enum_values[field.value.mojom_name]
|
| else:
|
| raise Exception("Unresolved enum value.")
|
|
|
| - resolved_enum_values[field.name] = prev_value
|
| + resolved_enum_values[field.mojom_name] = prev_value
|
| field.numeric_value = prev_value
|
|
|
| def _Enum(module, parsed_enum, parent_kind):
|
| @@ -479,12 +480,12 @@ def _Enum(module, parsed_enum, parent_kind):
|
| {mojom.Enum} AST enum.
|
| """
|
| enum = mojom.Enum(module=module)
|
| - enum.name = parsed_enum.name
|
| + enum.mojom_name = parsed_enum.mojom_name
|
| enum.native_only = parsed_enum.enum_value_list is None
|
| - name = enum.name
|
| + mojom_name = enum.mojom_name
|
| if parent_kind:
|
| - name = parent_kind.name + '.' + name
|
| - enum.spec = 'x:%s.%s' % (module.namespace, name)
|
| + mojom_name = parent_kind.mojom_name + '.' + mojom_name
|
| + enum.spec = 'x:%s.%s' % (module.mojom_namespace, mojom_name)
|
| enum.parent_kind = parent_kind
|
| enum.attributes = _AttributeListToDict(parsed_enum.attribute_list)
|
| if enum.native_only:
|
| @@ -516,11 +517,11 @@ def _Constant(module, parsed_const, parent_kind):
|
| {mojom.Constant} AST constant.
|
| """
|
| constant = mojom.Constant()
|
| - constant.name = parsed_const.name
|
| + constant.mojom_name = parsed_const.mojom_name
|
| if parent_kind:
|
| - scope = (module.namespace, parent_kind.name)
|
| + scope = (module.mojom_namespace, parent_kind.mojom_name)
|
| else:
|
| - scope = (module.namespace, )
|
| + scope = (module.mojom_namespace, )
|
| # TODO(mpcomplete): maybe we should only support POD kinds.
|
| constant.kind = _Kind(module.kinds, _MapKind(parsed_const.typename), scope)
|
| constant.parent_kind = parent_kind
|
| @@ -530,26 +531,25 @@ def _Constant(module, parsed_const, parent_kind):
|
| module.values[value.GetSpec()] = value
|
| return constant
|
|
|
| -def _Module(tree, name, imports):
|
| +def _Module(tree, path, imports):
|
| """
|
| Args:
|
| tree: {ast.Mojom} The parse tree.
|
| - name: {str} The mojom filename, excluding the path.
|
| + path: {str} The path to the mojom file.
|
| imports: {Dict[str, mojom.Module]} Mapping from filenames, as they appear in
|
| the import list, to already processed modules. Used to process imports.
|
|
|
| Returns:
|
| {mojom.Module} An AST for the mojom.
|
| """
|
| - module = mojom.Module()
|
| + module = mojom.Module(path=path)
|
| module.kinds = {}
|
| for kind in mojom.PRIMITIVES:
|
| module.kinds[kind.spec] = kind
|
|
|
| module.values = {}
|
|
|
| - module.name = name
|
| - module.namespace = tree.module.name[1] if tree.module else ''
|
| + module.mojom_namespace = tree.module.mojom_namespace[1] if tree.module else ''
|
| # Imports must come first, because they add to module.kinds which is used
|
| # by by the others.
|
| module.imports = [
|
| @@ -561,22 +561,23 @@ def _Module(tree, name, imports):
|
| module.attributes = dict((attribute.key, attribute.value)
|
| for attribute in tree.module.attribute_list)
|
|
|
| + filename = os.path.basename(path)
|
| # First pass collects kinds.
|
| module.enums = map(
|
| lambda enum: _Enum(module, enum, None),
|
| - _ElemsOfType(tree.definition_list, ast.Enum, name))
|
| + _ElemsOfType(tree.definition_list, ast.Enum, filename))
|
| module.structs = map(
|
| lambda struct: _Struct(module, struct),
|
| - _ElemsOfType(tree.definition_list, ast.Struct, name))
|
| + _ElemsOfType(tree.definition_list, ast.Struct, filename))
|
| module.unions = map(
|
| lambda union: _Union(module, union),
|
| - _ElemsOfType(tree.definition_list, ast.Union, name))
|
| + _ElemsOfType(tree.definition_list, ast.Union, filename))
|
| module.interfaces = map(
|
| lambda interface: _Interface(module, interface),
|
| - _ElemsOfType(tree.definition_list, ast.Interface, name))
|
| + _ElemsOfType(tree.definition_list, ast.Interface, filename))
|
| module.constants = map(
|
| lambda constant: _Constant(module, constant, None),
|
| - _ElemsOfType(tree.definition_list, ast.Const, name))
|
| + _ElemsOfType(tree.definition_list, ast.Const, filename))
|
|
|
| # Second pass expands fields and methods. This allows fields and parameters
|
| # to refer to kinds defined anywhere in the mojom.
|
| @@ -595,17 +596,17 @@ def _Module(tree, name, imports):
|
|
|
| return module
|
|
|
| -def OrderedModule(tree, name, imports):
|
| +def OrderedModule(tree, path, imports):
|
| """Convert parse tree to AST module.
|
|
|
| Args:
|
| tree: {ast.Mojom} The parse tree.
|
| - name: {str} The mojom filename, excluding the path.
|
| + path: {str} The path to the mojom file.
|
| imports: {Dict[str, mojom.Module]} Mapping from filenames, as they appear in
|
| the import list, to already processed modules. Used to process imports.
|
|
|
| Returns:
|
| {mojom.Module} An AST for the mojom.
|
| """
|
| - module = _Module(tree, name, imports)
|
| + module = _Module(tree, path, imports)
|
| return module
|
|
|