| Index: mojo/public/tools/bindings/pylib/mojom/generate/mojom_translator.py
|
| diff --git a/mojo/public/tools/bindings/pylib/mojom/generate/mojom_translator.py b/mojo/public/tools/bindings/pylib/mojom/generate/mojom_translator.py
|
| deleted file mode 100755
|
| index ed117c090e501e7492e52601bcec38199c7f8861..0000000000000000000000000000000000000000
|
| --- a/mojo/public/tools/bindings/pylib/mojom/generate/mojom_translator.py
|
| +++ /dev/null
|
| @@ -1,901 +0,0 @@
|
| -#!/usr/bin/env python
|
| -# 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.
|
| -#
|
| -# This module is responsible for translating a MojomFileGraph (see
|
| -# mojom_files.mojom) to one or more module.Module.
|
| -#
|
| -# This module takes the output of the mojom parser, a MojomFileGraph and
|
| -# translates it to the input of the code generators, a module.Module object.
|
| -# This is part of version 2 of the code generation pipeline. In version 1, the
|
| -# analogous functionality (translating from parser output to code generators
|
| -# input) is performed by the data module.
|
| -#
|
| -# The code generators remain from version 1 of the pipeline and so this module
|
| -# serves as an adapter between the v1 backends and the v2 frontend.
|
| -#
|
| -# The current version of this script does not validate the input data at all
|
| -# and instead trusts that it will be invoked with valid data produced by the
|
| -# frontend parser.
|
| -#
|
| -# NOTE: This module assumes that the python path contains the generated modules
|
| -# for mojom_files.mojom and mojom_types.mojom as well as their dependencies.
|
| -# It is the responsibility of the module's loader to handle this.
|
| -
|
| -import os
|
| -
|
| -from generated import mojom_files_mojom
|
| -from generated import mojom_types_mojom
|
| -import module
|
| -import operator
|
| -import pack
|
| -
|
| -
|
| -class FileTranslator(object):
|
| - """FileTranslator translates a MojomFile to a module.Module."""
|
| - def __init__(self, graph, file_name):
|
| - """Initializes a FileTranslator.
|
| -
|
| - Args:
|
| - graph: {mojom_files_mojom.MojomFileGraph} containing the file to be
|
| - translated.
|
| - file_name: {str} key to the file to be translated in graph.files.
|
| - """
|
| - assert isinstance(graph, mojom_files_mojom.MojomFileGraph)
|
| - self._type_cache = {}
|
| - self._value_cache = {}
|
| - self._constant_cache = {}
|
| - self._graph = graph
|
| - self._file_name = file_name
|
| - self._types = {}
|
| - self._module = module.Module()
|
| - self._transitive_imports = {}
|
| -
|
| - def Translate(self):
|
| - """Translates the file specified in the constructor.
|
| -
|
| - Returns:
|
| - {module.Module} representing the translated file.
|
| - """
|
| - mojom_file = self._graph.files[self._file_name]
|
| -
|
| - mod = self._module
|
| - self.PopulateModuleMetadata(mod, mojom_file)
|
| -
|
| - mod.imports = []
|
| - self._transitive_imports = self.GetTransitiveImports(mojom_file)
|
| - mod.transitive_imports = self._transitive_imports.values()
|
| - if mojom_file.imports:
|
| - mod.imports = [
|
| - self._transitive_imports[imp] for imp in mojom_file.imports]
|
| -
|
| - if mojom_file.declared_mojom_objects:
|
| - if mojom_file.declared_mojom_objects.top_level_constants:
|
| - mod.constants = [
|
| - self.ConstantFromKey(key)
|
| - for key in mojom_file.declared_mojom_objects.top_level_constants]
|
| -
|
| - user_defined_types = ['interfaces', 'structs', 'unions']
|
| - for user_defined_type in user_defined_types:
|
| - if getattr(mojom_file.declared_mojom_objects, user_defined_type):
|
| - setattr(mod, user_defined_type, [self.UserDefinedFromTypeKey(key)
|
| - for key in getattr(
|
| - mojom_file.declared_mojom_objects, user_defined_type)])
|
| - if mojom_file.declared_mojom_objects.top_level_enums:
|
| - mod.enums = [self.UserDefinedFromTypeKey(key)
|
| - for key in mojom_file.declared_mojom_objects.top_level_enums]
|
| -
|
| - mod.serialized_runtime_type_info = mojom_file.serialized_runtime_type_info
|
| -
|
| - return mod
|
| -
|
| - def PopulateModuleMetadata(self, mod, mojom_file):
|
| - """Populates some fields of a module.Module based on a MojomFile.
|
| -
|
| - Populates name, path, namespace and attributes of mod.
|
| -
|
| - Args:
|
| - mod: {module.Module} the module to be populated.
|
| - mojom_file: {MojomFile} the file to be translated.
|
| - """
|
| - mod.name = os.path.basename(mojom_file.file_name)
|
| - # specified_file_name is the file name specified on the command line if one
|
| - # was specified. The mojom parser sets specified_file_name to the empty
|
| - # string if the file was parsed only because the file was imported by
|
| - # another file. While specified_file_name can be None, the mojom parser
|
| - # should not set it to None, so we check for that error here.
|
| - assert mojom_file.specified_file_name is not None
|
| - mod.specified_name = mojom_file.specified_file_name
|
| - mod.path = mojom_file.file_name
|
| - mod.namespace = mojom_file.module_namespace
|
| - # Note that attribute values are typed. That is why we use
|
| - # attr.value.data directly instead of the string representation of it.
|
| - if mojom_file.attributes:
|
| - mod.attributes = {attr.key:
|
| - attr.value.data for attr in mojom_file.attributes}
|
| -
|
| - def GetTransitiveImports(self, mojom_file):
|
| - """Gets a mojom file's transitive imports.
|
| -
|
| - Args:
|
| - mojom_file: {mojom_files.MojomFile} the mojom file whose imports have to
|
| - be found.
|
| -
|
| - Returns:
|
| - {dict} The key is the file_name which is an index into self._graph.files
|
| - and is referenced in the SourceFileInfo.file_name of imported types.
|
| - The value is a dictionary as returned by ImportFromMojom.
|
| - """
|
| - if not mojom_file.imports:
|
| - return {}
|
| - to_be_processed = set(mojom_file.imports)
|
| - processed = set()
|
| - transitive_imports = {}
|
| -
|
| - while to_be_processed:
|
| - import_name = to_be_processed.pop()
|
| - processed.add(import_name)
|
| -
|
| - import_dict = self.ImportFromMojom(import_name)
|
| -
|
| - transitive_imports[import_dict['module'].path] = import_dict
|
| -
|
| - import_file = self._graph.files[import_name]
|
| - if import_file.imports:
|
| - to_be_processed.update(set(import_file.imports) - processed)
|
| -
|
| - return transitive_imports
|
| -
|
| - def ImportFromMojom(self, import_name):
|
| - """Builds a dict representing an import.
|
| -
|
| - Args:
|
| - import_name: {str} key to the imported file in graph.files.
|
| -
|
| - Returns:
|
| - {dict} representing the imported file.
|
| - """
|
| - import_file = self._graph.files[import_name]
|
| - import_module = module.Module()
|
| - self.PopulateModuleMetadata(import_module, import_file)
|
| -
|
| - import_item = {
|
| - 'module_name': import_module.name,
|
| - 'namespace': import_module.namespace,
|
| - 'module': import_module,
|
| - }
|
| - return import_item
|
| -
|
| - def UnionFromMojom(self, union, mojom_type):
|
| - """Populates a module.Union based on a MojomUnion.
|
| -
|
| - Args:
|
| - union: {module.Union} to be populated.
|
| - mojom_type: {UserDefinedType} referring to the MojomUnion to be
|
| - translated.
|
| - """
|
| - assert mojom_type.tag == mojom_types_mojom.UserDefinedType.Tags.union_type
|
| - mojom_union = mojom_type.union_type
|
| - self.PopulateUserDefinedType(union, mojom_union)
|
| - union.fields = [self.UnionFieldFromMojom(f) for f in mojom_union.fields]
|
| - # mojom_union.fields is indexed by the field tags. We want
|
| - # to capture these tags but sort union.fields by declaration_order.
|
| - union.fields.sort(key=lambda field: field.declaration_order)
|
| -
|
| - def StructFromMojom(self, struct, mojom_type):
|
| - """Populates a module.Struct based on a MojomStruct.
|
| -
|
| - Args:
|
| - struct: {module.Struct} to be populated.
|
| - mojom_type: {UserDefinedType} referring to the MojomStruct to be
|
| - translated.
|
| - """
|
| - assert mojom_type.tag == mojom_types_mojom.UserDefinedType.Tags.struct_type
|
| - mojom_struct = mojom_type.struct_type
|
| - self.StructFromMojomStruct(struct, mojom_struct)
|
| -
|
| - def StructFromMojomStruct(self, struct, mojom_struct):
|
| - """Populates a module.Struct based on a MojomStruct.
|
| -
|
| - Args:
|
| - struct: {module.Struct} to be populated.
|
| - mojom_struct: {mojom_types.MojomStruct} to be translated.
|
| - """
|
| - self.PopulateUserDefinedType(struct, mojom_struct)
|
| - # mojom_struct.fields is indexed by the field ordinals.
|
| - struct.fields_in_ordinal_order = [self.StructFieldFromMojom(ordinal, f)
|
| - for (ordinal, f) in enumerate(mojom_struct.fields)]
|
| - # We also want a list of fields sorted in declaration_order.
|
| - struct.fields = [f for f in struct.fields_in_ordinal_order]
|
| - struct.fields.sort(key=lambda field: field.declaration_order)
|
| -
|
| - assert mojom_struct.version_info
|
| - struct.versions = [self.VersionInfoFromMojom(version) for version in
|
| - mojom_struct.version_info]
|
| - self.PopulateContainedDeclarationsFromMojom(
|
| - struct, mojom_struct.decl_data.contained_declarations)
|
| -
|
| - def UnionFieldFromMojom(self, mojom_field):
|
| - """Translates a mojom_types_mojom.UnionField to a module.UnionField.
|
| -
|
| - Args:
|
| - mojom_field: {mojom_types_mojom.UnionField} to be translated.
|
| -
|
| - Returns:
|
| - {module.UnionField} translated from mojom_field.
|
| - """
|
| - union_field = module.UnionField()
|
| - self.PopulateCommonFieldValues(union_field, mojom_field)
|
| - # The |ordinal| attribute of |union_field| contains the field's tag
|
| - # as computed by the Mojom front-end.
|
| - union_field.ordinal = mojom_field.tag
|
| - # The |declared_tag| field is populated only if the user explicitly
|
| - # specified a tag for the field in the .mojom file and as such is not
|
| - # defined for every field. If defined it is equal to the |ordinal|
|
| - # attribute. Currently no code generators are consuming this data.
|
| - union_field.declared_tag = self.OrdinalFromMojom(mojom_field)
|
| - # The declaration_order field preserves the index of the field in
|
| - # declaration order in the .mojom file.
|
| - union_field.declaration_order = mojom_field.decl_data.declaration_order
|
| - return union_field
|
| -
|
| - def StructFieldFromMojom(self, ordinal, mojom_field):
|
| - """Translates a mojom_types_mojom.StructField to a module.StructField.
|
| -
|
| - Args:
|
| - ordinal: {int} The 0-based ordinal position of the field within the
|
| - struct. Note that this is not necessarily the same as the lexical
|
| - order or the packing order.
|
| - mojom_field: {mojom_types_mojom.StructField} to be translated.
|
| -
|
| - Returns:
|
| - {module.StructField} translated from mojom_field.
|
| - """
|
| - struct_field = module.StructField()
|
| - self.PopulateCommonFieldValues(struct_field, mojom_field)
|
| - struct_field.computed_offset = mojom_field.offset
|
| - struct_field.computed_bit = mojom_field.bit
|
| - struct_field.computed_min_version = mojom_field.min_version
|
| - # Note that the |ordinal| attribute of |struct_field| records only the
|
| - # *declared* ordinal and as such is not defined for every field whereas
|
| - # the |computed_ordinal| attribute is defined for every field. If
|
| - # |ordinal| is defined then it is equal to |computed_ordinal|.
|
| - struct_field.ordinal = self.OrdinalFromMojom(mojom_field)
|
| - struct_field.computed_ordinal = ordinal
|
| - struct_field.declaration_order = mojom_field.decl_data.declaration_order
|
| - if mojom_field.default_value:
|
| - if (mojom_field.default_value.tag ==
|
| - mojom_types_mojom.DefaultFieldValue.Tags.default_keyword):
|
| - struct_field.default = 'default'
|
| - else:
|
| - struct_field.default = self.ValueFromMojom(
|
| - mojom_field.default_value.value)
|
| -
|
| - return struct_field
|
| -
|
| - def VersionInfoFromMojom(self, mojom_version):
|
| - """Translates a mojom_types_mojom.StructVersion to a pack.VersionInfo
|
| - Args:
|
| - mojom_version: {mojom_types_mojom.StructVersion} to be translated.
|
| -
|
| - Returns:
|
| - {pack.VersionInfo} translated from |mojom_version|.
|
| - """
|
| - return pack.VersionInfo(mojom_version.version_number,
|
| - mojom_version.num_fields, mojom_version.num_bytes)
|
| -
|
| -
|
| - def ParamFromMojom(self, mojom):
|
| - """Translates a mojom_types_mojom.StructField to a module.Parameter.
|
| -
|
| - The parameters passed to and returned from a method are expressed as a
|
| - struct. The struct fields in the struct are the parameters.
|
| -
|
| - Args:
|
| - mojom: {mojom_types_mojom.StructField} representing a method parameter.
|
| -
|
| - Returns:
|
| - {module.Parameter} translated from the mojom.
|
| - """
|
| - param = module.Parameter()
|
| - param.ordinal = self.OrdinalFromMojom(mojom)
|
| - self.PopulateCommonFieldValues(param, mojom)
|
| - return param
|
| -
|
| - def PopulateCommonFieldValues(self, field, mojom_field):
|
| - """Populates a number of common field values based on a mojom field.
|
| -
|
| - Args:
|
| - field: {module.Field|module.Parameter} to be populated.
|
| - mojom_field: {StructField|UnionField} to be translated.
|
| - """
|
| - # TODO(rudominer) Some of the code generators check that the type
|
| - # of field.name is a non-unicode string. If we change this we can
|
| - # remove the str() below.
|
| - field.name = str(mojom_field.decl_data.short_name)
|
| - field.kind = self.KindFromMojom(mojom_field.type)
|
| - field.attributes = self.AttributesFromMojom(mojom_field)
|
| -
|
| - def PopulateContainedDeclarationsFromMojom(
|
| - self, parent_kind, contained_declarations):
|
| - """Populates a module.Struct|module.Interface with contained declarations.
|
| -
|
| - Args:
|
| - parent_kind: {module.Struct|module.Interface} to be populated.
|
| - contained_declarations: {mojom_types_mojom.ContainedDeclarations} from
|
| - which the contained types need to be extracted.
|
| - """
|
| - if not contained_declarations:
|
| - return
|
| -
|
| - if contained_declarations.enums:
|
| - for enum_key in contained_declarations.enums:
|
| - enum = self.UserDefinedFromTypeKey(enum_key)
|
| - parent_kind.enums.append(enum)
|
| -
|
| - if contained_declarations.constants:
|
| - for const_key in contained_declarations.constants:
|
| - const = self.ConstantFromKey(const_key)
|
| - parent_kind.constants.append(const)
|
| -
|
| - def EnumFromMojom(self, enum, mojom_type):
|
| - """Populates a module.Enum based on a MojomEnum.
|
| -
|
| - Args:
|
| - enum: {module.Enum} to be populated.
|
| - mojom_type: {mojom_types_mojom.Type} referring to the MojomEnum to be
|
| - translated.
|
| - """
|
| - assert mojom_type.tag == mojom_types_mojom.UserDefinedType.Tags.enum_type
|
| - mojom_enum = mojom_type.enum_type
|
| - self.PopulateUserDefinedType(enum, mojom_enum)
|
| - if mojom_enum.decl_data.container_type_key:
|
| - parent_kind = self.UserDefinedFromTypeKey(
|
| - mojom_enum.decl_data.container_type_key)
|
| - enum.parent_kind = parent_kind
|
| - enum.fields = [self.EnumFieldFromMojom(value)
|
| - for value in mojom_enum.values]
|
| -
|
| - def EnumFieldFromMojom(self, mojom_enum_value):
|
| - """Translates an mojom_types_mojom.EnumValue to a module.EnumField.
|
| -
|
| - mojom_enum_value: {mojom_types_mojom.EnumValue} to be translated.
|
| -
|
| - Returns:
|
| - {module.EnumField} translated from mojom_enum_value.
|
| - """
|
| - field = module.EnumField()
|
| - field.name = mojom_enum_value.decl_data.short_name
|
| - field.attributes = self.AttributesFromMojom(mojom_enum_value)
|
| - field.numeric_value = mojom_enum_value.int_value
|
| - if mojom_enum_value.initializer_value is not None:
|
| - field.value = self.ValueFromMojom(mojom_enum_value.initializer_value)
|
| -
|
| - return field
|
| -
|
| - def AttributesFromMojom(self, mojom):
|
| - """Extracts the attributes from a Mojom object into a dict.
|
| -
|
| - Args:
|
| - mojom: A type in mojom_types_mojom containing a decl_data field.
|
| -
|
| - Returns:
|
| - {dict<str, str>} of the attributes.
|
| - """
|
| - if not mojom.decl_data.attributes:
|
| - return None
|
| -
|
| - # Note that attribute values are typed. That is why we use
|
| - # attr.value.data directly instead of the string representation of it.
|
| - return {attr.key: attr.value.data for attr in mojom.decl_data.attributes}
|
| -
|
| - def PopulateUserDefinedType(self, module_type, mojom):
|
| - """Populates fields that are common among user-defined types.
|
| -
|
| - Args:
|
| - module_type: {module.Struct|Union|Enum} to be populated.
|
| - mojom: {MojomStruct|MojomUnion|MojomEnum} to be translated.
|
| - """
|
| - module_type.attributes = self.AttributesFromMojom(mojom)
|
| - module_type.name = mojom.decl_data.short_name
|
| - module_type.spec = mojom.decl_data.full_identifier
|
| - if module_type.spec == None:
|
| - module_type.spec = mojom.decl_data.short_name
|
| - self.PopulateModuleOrImportedFrom(module_type, mojom)
|
| -
|
| - def PopulateModuleOrImportedFrom(self, module_type, mojom):
|
| - """Populates either the module field or the imported_from field.
|
| -
|
| - All user-defined types must have either the module field populated (if
|
| - they are from the currently-processed module) or the imported_from (if
|
| - they are imported from another module).
|
| -
|
| - Args:
|
| - module_type: {module.Struct|Union|Enum|Interface} to be populated.
|
| - mojom: {MojomStruct|MojomUnion|MojomEnum|MojomInterface} to be translated.
|
| - """
|
| - if mojom.decl_data.source_file_info:
|
| - if mojom.decl_data.source_file_info.file_name == self._file_name:
|
| - module_type.module = self._module
|
| - else:
|
| - imported_from = self._transitive_imports[
|
| - mojom.decl_data.source_file_info.file_name]
|
| - module_type.imported_from = imported_from
|
| - module_type.module = imported_from['module']
|
| -
|
| -
|
| - def OrdinalFromMojom(self, mojom):
|
| - """Extracts the declared ordinal from a mojom StructField or UnionField.
|
| -
|
| - Args:
|
| - mojom: {MojomStruct|MojomUnion} from which the ordinal is to be extracted.
|
| -
|
| - Returns:
|
| - {int} if an ordinal was present, {NoneType} otherwise.
|
| - """
|
| - ordinal = mojom.decl_data.declared_ordinal
|
| - if ordinal < 0:
|
| - return None
|
| - return ordinal
|
| -
|
| - def InterfaceFromMojom(self, interface, mojom_type):
|
| - """Populates a module.Interface from a mojom_types_mojom.MojomInterface.
|
| -
|
| - Args:
|
| - interface: {module.Interface} to be populated.
|
| - mojom_type: {UserDefinedType} referring to the MojomInterface to be
|
| - translated.
|
| - """
|
| - assert (mojom_type.tag
|
| - == mojom_types_mojom.UserDefinedType.Tags.interface_type)
|
| - mojom_interface = mojom_type.interface_type
|
| - interface.attributes = self.AttributesFromMojom(mojom_interface)
|
| - self.PopulateModuleOrImportedFrom(interface, mojom_interface)
|
| - interface.name = mojom_interface.decl_data.short_name
|
| - interface.spec = interface.name
|
| - interface.version = mojom_interface.current_version
|
| - interface.service_name = mojom_interface.service_name
|
| - if interface.attributes:
|
| - assert interface.service_name == interface.attributes.get(
|
| - 'ServiceName', None), interface.service_name
|
| - else:
|
| - assert interface.service_name is None, interface.service_name
|
| -
|
| -
|
| - # Translate the dictionary of methods into a list of module.Methods.
|
| - interface.methods = [self.MethodFromMojom(mojom_method, interface)
|
| - for ordinal, mojom_method in mojom_interface.methods.iteritems()]
|
| - # We want the methods in an interface to be in some deterministic order
|
| - # and we choose declaration order (i.e. lexical order within the
|
| - # .mojom file.)
|
| - interface.methods.sort(key=lambda method: method.declaration_order)
|
| - self.PopulateContainedDeclarationsFromMojom(
|
| - interface, mojom_interface.decl_data.contained_declarations)
|
| -
|
| - def MethodFromMojom(self, mojom_method, interface):
|
| - """Translates a mojom_types_mojom.MojomMethod to a module.Method.
|
| -
|
| - Args:
|
| - mojom_method: {mojom_types_mojom.MojomMethod} to be translated.
|
| - interface: {module.Interface} the method is a member of.
|
| -
|
| - Returns:
|
| - {module.Method} translated from mojom_method.
|
| - """
|
| - method = module.Method(interface, mojom_method.decl_data.short_name)
|
| - method.ordinal = mojom_method.ordinal
|
| - method.declaration_order = mojom_method.decl_data.declaration_order
|
| - method.param_struct = module.Struct()
|
| - self.StructFromMojomStruct(method.param_struct, mojom_method.parameters)
|
| - # The name of a synthetic request parameter struct is not guaranteed by
|
| - # the frontend to be anything in particular so we set the name of the
|
| - # translated struct to a value that the code generators are expecting.
|
| - method.param_struct.name = "%s_%s_Params" % (
|
| - method.interface.name, method.name)
|
| - method.parameters = [self.ParamFromMojom(param)
|
| - for param in mojom_method.parameters.fields]
|
| - if mojom_method.response_params is not None:
|
| - method.response_param_struct = module.Struct()
|
| - self.StructFromMojomStruct(method.response_param_struct,
|
| - mojom_method.response_params)
|
| - # The name of a synthetic response parameter struct is not guaranteed by
|
| - # the frontend to be anything in particular so we set the name of the
|
| - # translated struct to a value that the code generators are expecting.
|
| - method.response_param_struct.name = "%s_%s_ResponseParams" % (
|
| - method.interface.name, method.name)
|
| - method.response_parameters = [self.ParamFromMojom(param)
|
| - for param in mojom_method.response_params.fields]
|
| -
|
| - method.min_version=mojom_method.min_version
|
| -
|
| - return method
|
| -
|
| - def ConstantFromKey(self, constant_key):
|
| - """Takes a key into the map graph.resolved_constants and returns the module
|
| - equivalent constant.
|
| -
|
| - Args:
|
| - constant_key: {str} the key referring to the constant whose translation
|
| - is to be returned.
|
| -
|
| - Returns:
|
| - {module.Constant} translated.
|
| - """
|
| - if constant_key in self._constant_cache:
|
| - return self._constant_cache[constant_key]
|
| -
|
| - mojom_const = self._graph.resolved_constants[constant_key]
|
| - const = module.Constant()
|
| - self._constant_cache[constant_key] = const
|
| -
|
| - self.ConstantFromMojom(const, mojom_const)
|
| - return const
|
| -
|
| - def ConstantFromMojom(self, const, mojom_const):
|
| - """Populates a module.Constant based on a DeclaredConstant.
|
| -
|
| - Args:
|
| - const: {module.Constant} to be populated.
|
| - mojom_const: {mojom_types_mojom.DeclaredConstant} to be translated.
|
| -
|
| - Returns:
|
| - {module.Constant} translated from mojom_const.
|
| - """
|
| - const.name = mojom_const.decl_data.short_name
|
| - const.kind = self.KindFromMojom(mojom_const.type)
|
| - const.value = self.ValueFromMojom(mojom_const.value)
|
| - const.parent_kind = None
|
| - if mojom_const.decl_data.container_type_key:
|
| - const.parent_kind = self.UserDefinedFromTypeKey(
|
| - mojom_const.decl_data.container_type_key)
|
| -
|
| - def ValueFromMojom(self, value):
|
| - """Translates a mojom_types_mojom.Value.
|
| -
|
| - Args:
|
| - value: {mojom_types_mojom.Value} to be translated.
|
| -
|
| - Returns:
|
| - {str|module.BuiltinValue|module.NamedValue} translated from the passed in
|
| - mojom_value.
|
| - If value is a literal value, a string is returned. If the literal value is
|
| - a string literal value, the returned string is enclosed in double
|
| - quotes. If the literal value is a boolean literal value then one of the
|
| - strings 'true' or 'false' is returned. Otherwise the literal value is a
|
| - numeric literal value and in this case the returned value is a Python
|
| - string representation of the numeric value.
|
| - If value is a built-in value, a module.BuiltinValue is returned.
|
| - If value is a user defined reference, a module.NamedValue is returned.
|
| - """
|
| - if value.tag == mojom_types_mojom.Value.Tags.literal_value:
|
| - if (value.literal_value.tag
|
| - == mojom_types_mojom.LiteralValue.Tags.string_value):
|
| - return '"%s"' % value.literal_value.data
|
| - if (value.literal_value.tag
|
| - == mojom_types_mojom.LiteralValue.Tags.bool_value):
|
| - # The strings 'true' and 'false' are used to represent bool literals.
|
| - return ('%s' % value.literal_value.data).lower()
|
| - elif (value.literal_value.tag
|
| - == mojom_types_mojom.LiteralValue.Tags.float_value or
|
| - value.literal_value.tag
|
| - == mojom_types_mojom.LiteralValue.Tags.double_value):
|
| - # Use the Python repr() function to get a string that accurately
|
| - # represents the value of the floating point number.
|
| - return repr(value.literal_value.data)
|
| - return str(value.literal_value.data)
|
| - elif value.tag == mojom_types_mojom.Value.Tags.builtin_value:
|
| - mojom_to_builtin = {
|
| - mojom_types_mojom.BuiltinConstantValue.DOUBLE_INFINITY:
|
| - 'double.INFINITY',
|
| - mojom_types_mojom.BuiltinConstantValue.DOUBLE_NEGATIVE_INFINITY:
|
| - 'double.NEGATIVE_INFINITY',
|
| - mojom_types_mojom.BuiltinConstantValue.DOUBLE_NAN:
|
| - 'double.NAN',
|
| - mojom_types_mojom.BuiltinConstantValue.FLOAT_INFINITY:
|
| - 'float.INFINITY',
|
| - mojom_types_mojom.BuiltinConstantValue.FLOAT_NEGATIVE_INFINITY:
|
| - 'float.NEGATIVE_INFINITY',
|
| - mojom_types_mojom.BuiltinConstantValue.FLOAT_NAN: 'float.NAN',
|
| - }
|
| - return module.BuiltinValue(mojom_to_builtin[value.builtin_value])
|
| - return self.FromUserValueReference(value)
|
| -
|
| - def FromUserValueReference(self, value):
|
| - """Translates a mojom_types.EnumValueReference or ConstantReference into the
|
| - module equivalent.
|
| -
|
| - Args:
|
| - value: {mojom_types_mojom.Value} the value ref to be translated. It
|
| - must be of type EnumValueReference or ConstantReference.
|
| -
|
| - Returns:
|
| - {module.EnumValue|module.ConstantValue} translated.
|
| - """
|
| - if value.tag == mojom_types_mojom.Value.Tags.constant_reference:
|
| - return self.ConstantValueFromKey(value.constant_reference.constant_key)
|
| - assert value.tag == mojom_types_mojom.Value.Tags.enum_value_reference
|
| - return self.EnumValueFromKey(value.enum_value_reference.enum_type_key,
|
| - value.enum_value_reference.enum_value_index)
|
| -
|
| - def ConstantValueFromKey(self, constant_key):
|
| - """Takes a key into graph.resolved_constants referring to a
|
| - mojom declared_constant and returns a module.ConstantValue referring to the
|
| - module equivalent constant.
|
| -
|
| - Args:
|
| - constant_key: {str} the constant key referring to a constant.
|
| -
|
| - Returns:
|
| - {module.ConstantValue} translated.
|
| - """
|
| - if constant_key in self._value_cache:
|
| - return self._value_cache[constant_key]
|
| -
|
| - const_value = module.ConstantValue()
|
| - self._value_cache[constant_key] = const_value
|
| -
|
| - const = self.ConstantFromKey(constant_key)
|
| - const_value.constant = const
|
| - const_value.name = const.name
|
| - const_value.parent_kind = const.parent_kind
|
| - self.PopulateModuleOrImportedFrom(const_value,
|
| - self._graph.resolved_constants[constant_key])
|
| - const_value.namespace = const_value.module.namespace
|
| - return const_value
|
| -
|
| - def EnumValueFromKey(self, enum_type_key, enum_value_index):
|
| - """Takes an enum type key and an enum value index (together these
|
| - form a key to a mojom_enum_value) and returns a module.EnumValue referring
|
| - the module equivalent enum value
|
| -
|
| - Args:
|
| - enum_type_key: {str} the type key of a mojom_enum
|
| - enum_value_index: {int} the 0-based index into the |values| array of
|
| - the mojom_enum
|
| -
|
| - Returns:
|
| - {module.EnumValue} translated from mojom_enum_value.
|
| - """
|
| - enum_value_key = (enum_type_key, enum_value_index)
|
| - if enum_value_key in self._value_cache:
|
| - return self._value_cache[enum_value_key]
|
| -
|
| - mojom_enum = self._graph.resolved_types[enum_type_key].enum_type
|
| - mojom_enum_value = mojom_enum.values[enum_value_index]
|
| -
|
| - # We need to create and cache the EnumValue object just in case later calls
|
| - # require the creation of that same EnumValue object.
|
| - enum_value = module.EnumValue()
|
| - self._value_cache[enum_value_key] = enum_value
|
| -
|
| - enum = self.UserDefinedFromTypeKey(enum_type_key)
|
| - enum_value.enum = enum
|
| - self.PopulateModuleOrImportedFrom(enum_value, mojom_enum_value)
|
| - enum_value.namespace = enum_value.module.namespace
|
| - enum_value.parent_kind = enum.parent_kind
|
| - enum_value.name = mojom_enum_value.decl_data.short_name
|
| -
|
| - return enum_value
|
| -
|
| - def KindFromMojom(self, mojom_type):
|
| - """Translates a mojom_types_mojom.Type to its equivalent module type.
|
| -
|
| - It is guaranteed that two calls to KindFromMojom with the same input yield
|
| - the same object.
|
| -
|
| - Args:
|
| - mojom_type: {mojom_types_mojom.Type} to be translated.
|
| -
|
| - Returns:
|
| - {module.Kind} translated from mojom_type.
|
| - """
|
| - mappers = {
|
| - mojom_types_mojom.Type.Tags.simple_type: self.SimpleKindFromMojom,
|
| - mojom_types_mojom.Type.Tags.string_type: self.StringFromMojom,
|
| - mojom_types_mojom.Type.Tags.handle_type: self.HandleFromMojom,
|
| - mojom_types_mojom.Type.Tags.array_type: self.ArrayFromMojom,
|
| - mojom_types_mojom.Type.Tags.map_type: self.MapFromMojom,
|
| - mojom_types_mojom.Type.Tags.type_reference: self.UserDefinedFromTypeRef,
|
| - }
|
| - return mappers[mojom_type.tag](mojom_type)
|
| -
|
| - def SimpleKindFromMojom(self, mojom_type):
|
| - """Translates a simple type to its module equivalent.
|
| -
|
| - Args:
|
| - mojom_type: {mojom_types_mojom.Type} with its simple_type field set to be
|
| - translated.
|
| -
|
| - Returns:
|
| - {module.Kind} translated from mojom_type.
|
| - """
|
| - simple_mojom_types = {
|
| - mojom_types_mojom.SimpleType.BOOL: module.BOOL,
|
| - mojom_types_mojom.SimpleType.INT8: module.INT8,
|
| - mojom_types_mojom.SimpleType.INT16: module.INT16,
|
| - mojom_types_mojom.SimpleType.INT32: module.INT32,
|
| - mojom_types_mojom.SimpleType.INT64: module.INT64,
|
| - mojom_types_mojom.SimpleType.UINT8: module.UINT8,
|
| - mojom_types_mojom.SimpleType.UINT16: module.UINT16,
|
| - mojom_types_mojom.SimpleType.UINT32: module.UINT32,
|
| - mojom_types_mojom.SimpleType.UINT64: module.UINT64,
|
| - mojom_types_mojom.SimpleType.FLOAT: module.FLOAT,
|
| - mojom_types_mojom.SimpleType.DOUBLE: module.DOUBLE,
|
| - }
|
| - return simple_mojom_types[mojom_type.simple_type]
|
| -
|
| - def HandleFromMojom(self, mojom_type):
|
| - """Translates a handle type to its module equivalent.
|
| -
|
| - Args:
|
| - mojom_type: {mojom_types_mojom.Type} with its handle_type field set to be
|
| - translated.
|
| -
|
| - Returns:
|
| - {module.ReferenceKind} translated from mojom_type.
|
| - """
|
| - handle_mojom_types = {
|
| - mojom_types_mojom.HandleType.Kind.UNSPECIFIED: module.HANDLE,
|
| - mojom_types_mojom.HandleType.Kind.MESSAGE_PIPE: module.MSGPIPE,
|
| - mojom_types_mojom.HandleType.Kind.DATA_PIPE_CONSUMER: module.DCPIPE,
|
| - mojom_types_mojom.HandleType.Kind.DATA_PIPE_PRODUCER: module.DPPIPE,
|
| - mojom_types_mojom.HandleType.Kind.SHARED_BUFFER: module.SHAREDBUFFER,
|
| - }
|
| -
|
| - nullable_handle_mojom_types = {
|
| - mojom_types_mojom.HandleType.Kind.UNSPECIFIED: module.NULLABLE_HANDLE,
|
| - mojom_types_mojom.HandleType.Kind.MESSAGE_PIPE: module.NULLABLE_MSGPIPE,
|
| - mojom_types_mojom.HandleType.Kind.DATA_PIPE_CONSUMER:
|
| - module.NULLABLE_DCPIPE,
|
| - mojom_types_mojom.HandleType.Kind.DATA_PIPE_PRODUCER:
|
| - module.NULLABLE_DPPIPE,
|
| - mojom_types_mojom.HandleType.Kind.SHARED_BUFFER:
|
| - module.NULLABLE_SHAREDBUFFER,
|
| - }
|
| -
|
| - if mojom_type.handle_type.nullable:
|
| - return nullable_handle_mojom_types[mojom_type.handle_type.kind]
|
| - return handle_mojom_types[mojom_type.handle_type.kind]
|
| -
|
| - def StringFromMojom(self, mojom_type):
|
| - """Translates a string type to its module equivalent.
|
| -
|
| - Args:
|
| - mojom_type: {mojom_types_mojom.Type} with its string_type field set to be
|
| - translated.
|
| -
|
| - Returns:
|
| - {module.ReferenceKind} translated from mojom_type. Either module.STRING or
|
| - module.NULLABLE_STRING.
|
| - """
|
| - if mojom_type.string_type.nullable:
|
| - return module.NULLABLE_STRING
|
| - return module.STRING
|
| -
|
| - def ArrayFromMojom(self, mojom_type):
|
| - """Translates an array type to its module equivalent.
|
| -
|
| - Args:
|
| - mojom_type: {mojom_types_mojom.Type} with its array_type field set to be
|
| - translated.
|
| -
|
| - Returns:
|
| - {module.Array} translated from mojom_type.
|
| - """
|
| - array = module.Array(
|
| - kind=self.KindFromMojom(mojom_type.array_type.element_type))
|
| - if mojom_type.array_type.fixed_length > 0:
|
| - array.length = mojom_type.array_type.fixed_length
|
| - if mojom_type.array_type.nullable:
|
| - return array.MakeNullableKind()
|
| - return array
|
| -
|
| - def MapFromMojom(self, mojom_type):
|
| - """Translates a map type to its module equivalent.
|
| -
|
| - Args:
|
| - mojom_type: {mojom_types_mojom.Type} with its map_type field set to be
|
| - translated.
|
| -
|
| - Returns:
|
| - {module.Map} translated from mojom_type.
|
| - """
|
| - key_kind = self.KindFromMojom(mojom_type.map_type.key_type)
|
| - value_kind = self.KindFromMojom(mojom_type.map_type.value_type)
|
| - module_map = module.Map(key_kind=key_kind, value_kind=value_kind)
|
| - if mojom_type.map_type.nullable:
|
| - return module_map.MakeNullableKind()
|
| - return module_map
|
| -
|
| - def UserDefinedFromTypeRef(self, mojom_type):
|
| - """Translates a type reference to the module equivalent of the
|
| - UserDefinedType that the reference refers to.
|
| -
|
| - Args:
|
| - mojom_type: {mojom_types_mojom.Type} with its type_reference field set to
|
| - be translated.
|
| -
|
| - Returns:
|
| - {module.Enum|Struct|Union|Interface} translated from mojom_type.
|
| - """
|
| - type_key = mojom_type.type_reference.type_key
|
| - module_type = self.UserDefinedFromTypeKey(type_key)
|
| - if mojom_type.type_reference.is_interface_request:
|
| - module_type = module.InterfaceRequest(module_type)
|
| - if mojom_type.type_reference.nullable:
|
| - return module_type.MakeNullableKind()
|
| - return module_type
|
| -
|
| - def UserDefinedFromTypeKey(self, type_key):
|
| - """Takes a type key into graph.resolved_types and returns the module
|
| - equivalent.
|
| -
|
| - Args:
|
| - type_key: {str} the type key referring to the type to be returned.
|
| -
|
| - Returns:
|
| - {module.Enum|Struct|Union|Interface} translated.
|
| - """
|
| - if type_key in self._type_cache:
|
| - return self._type_cache[type_key]
|
| - else:
|
| - mojom_type = self._graph.resolved_types[type_key]
|
| - return self.UserDefinedFromMojom(type_key, mojom_type)
|
| -
|
| - def UserDefinedFromMojom(self, type_key, mojom_type):
|
| - """Translates a user defined type to its module equivalent.
|
| -
|
| - Args:
|
| - type_key: {str} the type key referring to the type in graph.resolved_types
|
| - used to cache the type object.
|
| - mojom_type: {mojom_types_mojom.UserDefinedType} to be translated.
|
| -
|
| - Returns:
|
| - {module.Enum|Struct|Union|Interface} translated from mojom_type.
|
| - """
|
| - user_defined_types = {
|
| - mojom_types_mojom.UserDefinedType.Tags.struct_type:
|
| - (module.Struct, self.StructFromMojom),
|
| - mojom_types_mojom.UserDefinedType.Tags.enum_type:
|
| - (module.Enum, self.EnumFromMojom),
|
| - mojom_types_mojom.UserDefinedType.Tags.union_type:
|
| - (module.Union, self.UnionFromMojom),
|
| - mojom_types_mojom.UserDefinedType.Tags.interface_type:
|
| - (module.Interface, self.InterfaceFromMojom),
|
| - }
|
| - module_type_class, from_mojom = user_defined_types[mojom_type.tag]
|
| - module_type = module_type_class()
|
| -
|
| - if module_type.spec == None:
|
| - # module.py expects the spec of user defined types to be set when
|
| - # constructing map, array, and interface request types, but the value
|
| - # appears to be only used for error messages.
|
| - module_type.spec = 'dummyspec'
|
| -
|
| - # It is necessary to cache the type object before populating it since in
|
| - # the course of populating it, it may be necessary to resolve that same
|
| - # type (say, a struct with a field of its own type).
|
| - self._type_cache[type_key] = module_type
|
| - from_mojom(module_type, mojom_type)
|
| -
|
| - module_type.type_key = type_key
|
| -
|
| - return module_type
|
| -
|
| -
|
| -def TranslateFileGraph(graph):
|
| - """Translates a mojom_types_mojom.MojomFileGraph to module.Module(s).
|
| -
|
| - The input is the output of the parser. The output is the input to the
|
| - various bindings generators.
|
| -
|
| - Args:
|
| - graph: {mojom_types_mojom.MojomFileGraph} to be translated.
|
| -
|
| - Return:
|
| - {dict<str, module.Module>} mapping the file's name to its module.Module
|
| - translation for all files in graph.files.
|
| - """
|
| - return {file_name: FileTranslator(graph, file_name).Translate()
|
| - for file_name in graph.files}
|
|
|