| OLD | NEW |
| 1 # Copyright 2013 The Chromium Authors. All rights reserved. | 1 # Copyright 2013 The Chromium Authors. All rights reserved. |
| 2 # Use of this source code is governed by a BSD-style license that can be | 2 # Use of this source code is governed by a BSD-style license that can be |
| 3 # found in the LICENSE file. | 3 # found in the LICENSE file. |
| 4 | 4 |
| 5 """Convert parse tree to AST. | 5 """Convert parse tree to AST. |
| 6 | 6 |
| 7 This module converts the parse tree to the AST we use for code generation. The | 7 This module converts the parse tree to the AST we use for code generation. The |
| 8 main entry point is OrderedModule, which gets passed the parser | 8 main entry point is OrderedModule, which gets passed the parser |
| 9 representation of a mojom file. When called it's assumed that all imports have | 9 representation of a mojom file. When called it's assumed that all imports have |
| 10 already been parsed and converted to ASTs before. | 10 already been parsed and converted to ASTs before. |
| (...skipping 204 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 215 second_kind = spec[key_end+2:-1] | 215 second_kind = spec[key_end+2:-1] |
| 216 | 216 |
| 217 kind = mojom.Map(_Kind(kinds, first_kind, scope), | 217 kind = mojom.Map(_Kind(kinds, first_kind, scope), |
| 218 _Kind(kinds, second_kind, scope)) | 218 _Kind(kinds, second_kind, scope)) |
| 219 else: | 219 else: |
| 220 kind = mojom.Kind(spec) | 220 kind = mojom.Kind(spec) |
| 221 | 221 |
| 222 kinds[spec] = kind | 222 kinds[spec] = kind |
| 223 return kind | 223 return kind |
| 224 | 224 |
| 225 def _KindFromImport(original_kind, imported_from): | |
| 226 """Used with 'import module' - clones the kind imported from the given | |
| 227 module's namespace. Only used with Structs, Unions, Interfaces and Enums.""" | |
| 228 kind = copy.copy(original_kind) | |
| 229 # |shared_definition| is used to store various properties (see | |
| 230 # |AddSharedProperty()| in module.py), including |imported_from|. We don't | |
| 231 # want the copy to share these with the original, so copy it if necessary. | |
| 232 if hasattr(original_kind, 'shared_definition'): | |
| 233 kind.shared_definition = copy.copy(original_kind.shared_definition) | |
| 234 kind.imported_from = imported_from | |
| 235 return kind | |
| 236 | |
| 237 def _Import(module, import_module): | 225 def _Import(module, import_module): |
| 238 import_item = {} | |
| 239 import_item['module_name'] = import_module.name | |
| 240 import_item['namespace'] = import_module.namespace | |
| 241 import_item['module'] = import_module | |
| 242 | |
| 243 # Copy the struct kinds from our imports into the current module. | 226 # Copy the struct kinds from our imports into the current module. |
| 244 importable_kinds = (mojom.Struct, mojom.Union, mojom.Enum, mojom.Interface) | 227 importable_kinds = (mojom.Struct, mojom.Union, mojom.Enum, mojom.Interface) |
| 245 for kind in import_module.kinds.itervalues(): | 228 for kind in import_module.kinds.itervalues(): |
| 246 if (isinstance(kind, importable_kinds) and | 229 if (isinstance(kind, importable_kinds) and |
| 247 kind.imported_from is None): | 230 kind.module.path == import_module.path): |
| 248 kind = _KindFromImport(kind, import_item) | |
| 249 module.kinds[kind.spec] = kind | 231 module.kinds[kind.spec] = kind |
| 250 # Ditto for values. | 232 # Ditto for values. |
| 251 for value in import_module.values.itervalues(): | 233 for value in import_module.values.itervalues(): |
| 252 if value.imported_from is None: | 234 if value.module.path == import_module.path: |
| 253 # Values don't have shared definitions (since they're not nullable), so no | |
| 254 # need to do anything special. | |
| 255 value = copy.copy(value) | |
| 256 value.imported_from = import_item | |
| 257 module.values[value.GetSpec()] = value | 235 module.values[value.GetSpec()] = value |
| 258 | 236 |
| 259 return import_item | 237 return import_module |
| 260 | 238 |
| 261 def _Struct(module, parsed_struct): | 239 def _Struct(module, parsed_struct): |
| 262 """ | 240 """ |
| 263 Args: | 241 Args: |
| 264 module: {mojom.Module} Module currently being constructed. | 242 module: {mojom.Module} Module currently being constructed. |
| 265 parsed_struct: {ast.Struct} Parsed struct. | 243 parsed_struct: {ast.Struct} Parsed struct. |
| 266 | 244 |
| 267 Returns: | 245 Returns: |
| 268 {mojom.Struct} AST struct. | 246 {mojom.Struct} AST struct. |
| 269 """ | 247 """ |
| (...skipping 360 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 630 {mojom.Module} An AST for the mojom. | 608 {mojom.Module} An AST for the mojom. |
| 631 """ | 609 """ |
| 632 module = _Module(tree, name, imports) | 610 module = _Module(tree, name, imports) |
| 633 for interface in module.interfaces: | 611 for interface in module.interfaces: |
| 634 next_ordinal = 0 | 612 next_ordinal = 0 |
| 635 for method in interface.methods: | 613 for method in interface.methods: |
| 636 if method.ordinal is None: | 614 if method.ordinal is None: |
| 637 method.ordinal = next_ordinal | 615 method.ordinal = next_ordinal |
| 638 next_ordinal = method.ordinal + 1 | 616 next_ordinal = method.ordinal + 1 |
| 639 return module | 617 return module |
| OLD | NEW |