| OLD | NEW |
| 1 #!/usr/bin/env python | 1 #!/usr/bin/env python |
| 2 # Copyright 2015 The Chromium Authors. All rights reserved. | 2 # Copyright 2015 The Chromium Authors. All rights reserved. |
| 3 # Use of this source code is governed by a BSD-style license that can be | 3 # Use of this source code is governed by a BSD-style license that can be |
| 4 # found in the LICENSE file. | 4 # found in the LICENSE file. |
| 5 # | 5 # |
| 6 # This module is responsible for translating a MojomFileGraph (see | 6 # This module is responsible for translating a MojomFileGraph (see |
| 7 # mojom_files.mojom) to one or more module.Module. | 7 # mojom_files.mojom) to one or more module.Module. |
| 8 # | 8 # |
| 9 # This module takes the output of the mojom parser, a MojomFileGraph and | 9 # This module takes the output of the mojom parser, a MojomFileGraph and |
| 10 # translates it to the input of the code generators, a module.Module object. | 10 # translates it to the input of the code generators, a module.Module object. |
| (...skipping 11 matching lines...) Expand all Loading... |
| 22 # NOTE: This module assumes that the python path contains the generated modules | 22 # NOTE: This module assumes that the python path contains the generated modules |
| 23 # for mojom_files.mojom and mojom_types.mojom as well as their dependencies. | 23 # for mojom_files.mojom and mojom_types.mojom as well as their dependencies. |
| 24 # It is the responsibility of the module's loader to handle this. | 24 # It is the responsibility of the module's loader to handle this. |
| 25 | 25 |
| 26 import os | 26 import os |
| 27 | 27 |
| 28 from generated import mojom_files_mojom | 28 from generated import mojom_files_mojom |
| 29 from generated import mojom_types_mojom | 29 from generated import mojom_types_mojom |
| 30 import module | 30 import module |
| 31 import operator | 31 import operator |
| 32 import pack |
| 32 | 33 |
| 33 | 34 |
| 34 class FileTranslator(object): | 35 class FileTranslator(object): |
| 35 """FileTranslator translates a MojomFile to a module.Module.""" | 36 """FileTranslator translates a MojomFile to a module.Module.""" |
| 36 def __init__(self, graph, file_name): | 37 def __init__(self, graph, file_name): |
| 37 """Initializes a FileTranslator. | 38 """Initializes a FileTranslator. |
| 38 | 39 |
| 39 Args: | 40 Args: |
| 40 graph: {mojom_files_mojom.MojomFileGraph} containing the file to be | 41 graph: {mojom_files_mojom.MojomFileGraph} containing the file to be |
| 41 translated. | 42 translated. |
| (...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 185 def StructFromMojom(self, struct, mojom_type): | 186 def StructFromMojom(self, struct, mojom_type): |
| 186 """Populates a module.Struct based on a MojomStruct. | 187 """Populates a module.Struct based on a MojomStruct. |
| 187 | 188 |
| 188 Args: | 189 Args: |
| 189 struct: {module.Struct} to be populated. | 190 struct: {module.Struct} to be populated. |
| 190 mojom_type: {UserDefinedType} referring to the MojomStruct to be | 191 mojom_type: {UserDefinedType} referring to the MojomStruct to be |
| 191 translated. | 192 translated. |
| 192 """ | 193 """ |
| 193 assert mojom_type.tag == mojom_types_mojom.UserDefinedType.Tags.struct_type | 194 assert mojom_type.tag == mojom_types_mojom.UserDefinedType.Tags.struct_type |
| 194 mojom_struct = mojom_type.struct_type | 195 mojom_struct = mojom_type.struct_type |
| 196 self.StructFromMojomStruct(struct, mojom_struct) |
| 197 |
| 198 def StructFromMojomStruct(self, struct, mojom_struct): |
| 199 """Populates a module.Struct based on a MojomStruct. |
| 200 |
| 201 Args: |
| 202 struct: {module.Struct} to be populated. |
| 203 mojom_struct: {mojom_types.MojomStruct} to be translated. |
| 204 """ |
| 195 self.PopulateUserDefinedType(struct, mojom_struct) | 205 self.PopulateUserDefinedType(struct, mojom_struct) |
| 196 # mojom_struct.fields is indexed by the field ordinals. We want | 206 # mojom_struct.fields is indexed by the field ordinals. |
| 197 # to capture these ordinals but sort struct.fields by declaration_order. | 207 struct.fields_in_ordinal_order = [self.StructFieldFromMojom(ordinal, f) |
| 198 struct.fields = [self.StructFieldFromMojom(ordinal, f) for (ordinal, f) in | 208 for (ordinal, f) in enumerate(mojom_struct.fields)] |
| 199 enumerate(mojom_struct.fields)] | 209 # We also want a list of fields sorted in declaration_order. |
| 210 struct.fields = [f for f in struct.fields_in_ordinal_order] |
| 200 struct.fields.sort(key=lambda field: field.declaration_order) | 211 struct.fields.sort(key=lambda field: field.declaration_order) |
| 212 |
| 213 assert mojom_struct.version_info |
| 214 struct.versions = [self.VersionInfoFromMojom(version) for version in |
| 215 mojom_struct.version_info] |
| 201 self.PopulateContainedDeclarationsFromMojom( | 216 self.PopulateContainedDeclarationsFromMojom( |
| 202 struct, mojom_struct.decl_data.contained_declarations) | 217 struct, mojom_struct.decl_data.contained_declarations) |
| 203 | 218 |
| 204 def UnionFieldFromMojom(self, mojom_field): | 219 def UnionFieldFromMojom(self, mojom_field): |
| 205 """Translates a mojom_types_mojom.UnionField to a module.UnionField. | 220 """Translates a mojom_types_mojom.UnionField to a module.UnionField. |
| 206 | 221 |
| 207 Args: | 222 Args: |
| 208 mojom_field: {mojom_types_mojom.UnionField} to be translated. | 223 mojom_field: {mojom_types_mojom.UnionField} to be translated. |
| 209 | 224 |
| 210 Returns: | 225 Returns: |
| (...skipping 21 matching lines...) Expand all Loading... |
| 232 ordinal: {int} The 0-based ordinal position of the field within the | 247 ordinal: {int} The 0-based ordinal position of the field within the |
| 233 struct. Note that this is not necessarily the same as the lexical | 248 struct. Note that this is not necessarily the same as the lexical |
| 234 order or the packing order. | 249 order or the packing order. |
| 235 mojom_field: {mojom_types_mojom.StructField} to be translated. | 250 mojom_field: {mojom_types_mojom.StructField} to be translated. |
| 236 | 251 |
| 237 Returns: | 252 Returns: |
| 238 {module.StructField} translated from mojom_field. | 253 {module.StructField} translated from mojom_field. |
| 239 """ | 254 """ |
| 240 struct_field = module.StructField() | 255 struct_field = module.StructField() |
| 241 self.PopulateCommonFieldValues(struct_field, mojom_field) | 256 self.PopulateCommonFieldValues(struct_field, mojom_field) |
| 257 struct_field.computed_offset = mojom_field.offset |
| 258 struct_field.computed_bit = mojom_field.bit |
| 259 struct_field.computed_min_version = mojom_field.min_version |
| 242 # Note that the |ordinal| attribute of |struct_field| records only the | 260 # Note that the |ordinal| attribute of |struct_field| records only the |
| 243 # *declared* ordinal and as such is not defined for every field whereas | 261 # *declared* ordinal and as such is not defined for every field whereas |
| 244 # the |computed_ordinal| attribute is defined for every field. If | 262 # the |computed_ordinal| attribute is defined for every field. If |
| 245 # |ordinal| is defined then it is equal to |computed_ordinal|. | 263 # |ordinal| is defined then it is equal to |computed_ordinal|. |
| 246 struct_field.ordinal = self.OrdinalFromMojom(mojom_field) | 264 struct_field.ordinal = self.OrdinalFromMojom(mojom_field) |
| 247 struct_field.computed_ordinal = ordinal | 265 struct_field.computed_ordinal = ordinal |
| 248 struct_field.declaration_order = mojom_field.decl_data.declaration_order | 266 struct_field.declaration_order = mojom_field.decl_data.declaration_order |
| 249 if mojom_field.default_value: | 267 if mojom_field.default_value: |
| 250 if (mojom_field.default_value.tag == | 268 if (mojom_field.default_value.tag == |
| 251 mojom_types_mojom.DefaultFieldValue.Tags.default_keyword): | 269 mojom_types_mojom.DefaultFieldValue.Tags.default_keyword): |
| 252 struct_field.default = 'default' | 270 struct_field.default = 'default' |
| 253 else: | 271 else: |
| 254 struct_field.default = self.ValueFromMojom( | 272 struct_field.default = self.ValueFromMojom( |
| 255 mojom_field.default_value.value) | 273 mojom_field.default_value.value) |
| 256 | 274 |
| 257 return struct_field | 275 return struct_field |
| 258 | 276 |
| 277 def VersionInfoFromMojom(self, mojom_version): |
| 278 """Translates a mojom_types_mojom.StructVersion to a pack.VersionInfo |
| 279 Args: |
| 280 mojom_version: {mojom_types_mojom.StructVersion} to be translated. |
| 281 |
| 282 Returns: |
| 283 {pack.VersionInfo} translated from |mojom_version|. |
| 284 """ |
| 285 return pack.VersionInfo(mojom_version.version_number, |
| 286 mojom_version.num_fields, mojom_version.num_bytes) |
| 287 |
| 288 |
| 259 def ParamFromMojom(self, mojom): | 289 def ParamFromMojom(self, mojom): |
| 260 """Translates a mojom_types_mojom.StructField to a module.Parameter. | 290 """Translates a mojom_types_mojom.StructField to a module.Parameter. |
| 261 | 291 |
| 262 The parameters passed to and returned from a method are expressed as a | 292 The parameters passed to and returned from a method are expressed as a |
| 263 struct. The struct fields in the struct are the parameters. | 293 struct. The struct fields in the struct are the parameters. |
| 264 | 294 |
| 265 Args: | 295 Args: |
| 266 mojom: {mojom_types_mojom.StructField} representing a method parameter. | 296 mojom: {mojom_types_mojom.StructField} representing a method parameter. |
| 267 | 297 |
| 268 Returns: | 298 Returns: |
| (...skipping 178 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 447 | 477 |
| 448 Args: | 478 Args: |
| 449 mojom_method: {mojom_types_mojom.MojomMethod} to be translated. | 479 mojom_method: {mojom_types_mojom.MojomMethod} to be translated. |
| 450 interface: {module.Interface} the method is a member of. | 480 interface: {module.Interface} the method is a member of. |
| 451 | 481 |
| 452 Returns: | 482 Returns: |
| 453 {module.Method} translated from mojom_method. | 483 {module.Method} translated from mojom_method. |
| 454 """ | 484 """ |
| 455 method = module.Method(interface, mojom_method.decl_data.short_name) | 485 method = module.Method(interface, mojom_method.decl_data.short_name) |
| 456 method.ordinal = mojom_method.ordinal | 486 method.ordinal = mojom_method.ordinal |
| 487 method.param_struct = module.Struct() |
| 488 self.StructFromMojomStruct(method.param_struct, mojom_method.parameters) |
| 489 # The name of a synthetic request parameter struct is not guaranteed by |
| 490 # the frontend to be anything in particular so we set the name of the |
| 491 # translated struct to a value that the code generators are expecting. |
| 492 method.param_struct.name = "%s_%s_Params" % ( |
| 493 method.interface.name, method.name) |
| 457 method.parameters = [self.ParamFromMojom(param) | 494 method.parameters = [self.ParamFromMojom(param) |
| 458 for param in mojom_method.parameters.fields] | 495 for param in mojom_method.parameters.fields] |
| 459 if mojom_method.response_params is not None: | 496 if mojom_method.response_params is not None: |
| 497 method.response_param_struct = module.Struct() |
| 498 self.StructFromMojomStruct(method.response_param_struct, |
| 499 mojom_method.response_params) |
| 500 # The name of a synthetic response parameter struct is not guaranteed by |
| 501 # the frontend to be anything in particular so we set the name of the |
| 502 # translated struct to a value that the code generators are expecting. |
| 503 method.response_param_struct.name = "%s_%s_ResponseParams" % ( |
| 504 method.interface.name, method.name) |
| 460 method.response_parameters = [self.ParamFromMojom(param) | 505 method.response_parameters = [self.ParamFromMojom(param) |
| 461 for param in mojom_method.response_params.fields] | 506 for param in mojom_method.response_params.fields] |
| 507 |
| 508 # Set the min_version attribute on the method. |
| 509 method.min_version=None |
| 510 # TODO(rudominer) For now we parse the "MinVersion" attribute here but |
| 511 # after we add a min_version field to mojom_types_mojom.MojomMethod then |
| 512 # we should take the value from there instead. |
| 513 if method.attributes: |
| 514 method.min_version=method.get('MinVersion') |
| 515 |
| 462 return method | 516 return method |
| 463 | 517 |
| 464 def ConstantFromValueKey(self, value_key): | 518 def ConstantFromValueKey(self, value_key): |
| 465 """Takes a value key into a graph.resolved_values referring to a constant | 519 """Takes a value key into a graph.resolved_values referring to a constant |
| 466 and returns the module equivalent. | 520 and returns the module equivalent. |
| 467 | 521 |
| 468 Args: | 522 Args: |
| 469 value_key: {str} the value key referring to the value to be returned. | 523 value_key: {str} the value key referring to the value to be returned. |
| 470 | 524 |
| 471 Returns: | 525 Returns: |
| (...skipping 362 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 834 | 888 |
| 835 Args: | 889 Args: |
| 836 graph: {mojom_types_mojom.MojomFileGraph} to be translated. | 890 graph: {mojom_types_mojom.MojomFileGraph} to be translated. |
| 837 | 891 |
| 838 Return: | 892 Return: |
| 839 {dict<str, module.Module>} mapping the file's name to its module.Module | 893 {dict<str, module.Module>} mapping the file's name to its module.Module |
| 840 translation for all files in graph.files. | 894 translation for all files in graph.files. |
| 841 """ | 895 """ |
| 842 return {file_name: FileTranslator(graph, file_name).Translate() | 896 return {file_name: FileTranslator(graph, file_name).Translate() |
| 843 for file_name in graph.files} | 897 for file_name in graph.files} |
| OLD | NEW |