Handle contained declarations for interfaces and structs. R=rudominer@chromium.org, rudominer BUG= #461 Review URL: https://codereview.chromium.org/1427893002 .
diff --git a/mojo/public/tools/bindings/pylib/mojom/generate/module.py b/mojo/public/tools/bindings/pylib/mojom/generate/module.py index 1433030..86c71ce 100644 --- a/mojo/public/tools/bindings/pylib/mojom/generate/module.py +++ b/mojo/public/tools/bindings/pylib/mojom/generate/module.py
@@ -365,6 +365,8 @@ ReferenceKind.AddSharedProperty('imported_from') ReferenceKind.AddSharedProperty('methods') ReferenceKind.AddSharedProperty('attributes') + ReferenceKind.AddSharedProperty('constants') + ReferenceKind.AddSharedProperty('enums') def __init__(self, name=None, module=None, attributes=None): if name is not None:
diff --git a/mojo/public/tools/bindings/pylib/mojom/generate/mojom_translator.py b/mojo/public/tools/bindings/pylib/mojom/generate/mojom_translator.py index 69a364d..25334c6 100755 --- a/mojo/public/tools/bindings/pylib/mojom/generate/mojom_translator.py +++ b/mojo/public/tools/bindings/pylib/mojom/generate/mojom_translator.py
@@ -145,7 +145,8 @@ mojom_struct = mojom_type.struct_type self.PopulateUserDefinedType(struct, mojom_struct) struct.fields = [self.StructFieldFromMojom(f) for f in mojom_struct.fields] - # TODO(azani): Handle mojom_struct.decl_data.contained_declarations. + self.PopulateContainedDeclarationsFromMojom( + struct, mojom_struct.decl_data.contained_declarations) def UnionFieldFromMojom(self, mojom_field): """Translates a mojom_types_mojom.UnionField to a module.UnionField. @@ -211,18 +212,42 @@ field.kind = self.KindFromMojom(mojom_field.type) field.attributes = self.AttributesFromMojom(mojom_field) - def EnumFromMojom(self, enum, mojom_type, parent_kind=None): + 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) + enum.name = '%s.%s' % (parent_kind.name, enum.name) + enum.parent_kind = parent_kind + parent_kind.enums.append(enum) + + if contained_declarations.constants: + for const_key in contained_declarations.constants: + const = self.ConstFromMojom( + self._graph.resolved_values[const_key].declared_constant, + parent_kind) + 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. - parent_kind: {MojomStruct|MojomInterface} in which the enum is nested. """ assert mojom_type.tag == mojom_types_mojom.UserDefinedType.Tags.enum_type mojom_enum = mojom_type.enum_type - enum.parent_kind = parent_kind self.PopulateUserDefinedType(enum, mojom_enum) enum.fields = [self.EnumFieldFromMojom(value) for value in mojom_enum.values] @@ -315,6 +340,8 @@ interface.name = mojom_interface.interface_name interface.methods = [self.MethodFromMojom(mojom_method, interface) for mojom_method in mojom_interface.methods.itervalues()] + 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.
diff --git a/mojo/public/tools/bindings/pylib/mojom/generate/mojom_translator_unittest.py b/mojo/public/tools/bindings/pylib/mojom/generate/mojom_translator_unittest.py index 1784049..b4c8001 100644 --- a/mojo/public/tools/bindings/pylib/mojom/generate/mojom_translator_unittest.py +++ b/mojo/public/tools/bindings/pylib/mojom/generate/mojom_translator_unittest.py
@@ -238,7 +238,7 @@ enum = module.Enum() translator = mojom_translator.FileTranslator(graph, file_name) translator.EnumFromMojom( - enum, mojom_types_mojom.UserDefinedType(enum_type=mojom_enum), None) + enum, mojom_types_mojom.UserDefinedType(enum_type=mojom_enum)) self.assertEquals(translator._module, enum.module) self.assertEquals(mojom_enum.decl_data.short_name, enum.name) @@ -448,6 +448,45 @@ self.assertEquals(module.UINT64, param.kind) self.assertEquals(mojom_param.decl_data.declared_ordinal, param.ordinal) + def test_contained_declarations(self): + graph = mojom_files_mojom.MojomFileGraph() + file_name = 'root/f.mojom' + + mojom_enum = mojom_types_mojom.MojomEnum( + values=[], + decl_data=mojom_types_mojom.DeclarationData( + short_name='AnEnum', + source_file_info=mojom_types_mojom.SourceFileInfo( + file_name=file_name))) + graph.resolved_types = { + 'enum_key': mojom_types_mojom.UserDefinedType(enum_type=mojom_enum)} + + mojom_const = mojom_types_mojom.DeclaredConstant( + decl_data=mojom_types_mojom.DeclarationData(short_name='AConst'), + type=mojom_types_mojom.Type( + simple_type=mojom_types_mojom.SimpleType.INT64), + value=mojom_types_mojom.Value( + literal_value=mojom_types_mojom.LiteralValue( + int64_value=30))) + user_defined_value = mojom_types_mojom.UserDefinedValue() + user_defined_value.declared_constant = mojom_const + graph.resolved_values = {'value_key': user_defined_value} + + contained_declarations = mojom_types_mojom.ContainedDeclarations( + enums=['enum_key'], constants=['value_key']) + + translator = mojom_translator.FileTranslator(graph, file_name) + struct = module.Struct(name='parent') + translator.PopulateContainedDeclarationsFromMojom( + struct, contained_declarations) + + self.assertEquals( + 'parent.' + mojom_enum.decl_data.short_name, struct.enums[0].name) + self.assertEquals(struct, struct.enums[0].parent_kind) + self.assertEquals( + mojom_const.decl_data.short_name, struct.constants[0].name) + self.assertEquals(struct, struct.constants[0].parent_kind) + @unittest.skipUnless(bindings_imported, 'Could not import python bindings.') class TestEvalValue(unittest.TestCase):