Index: bindings/scripts/interface_dependency_resolver.py |
diff --git a/bindings/scripts/interface_dependency_resolver.py b/bindings/scripts/interface_dependency_resolver.py |
index ece506a61d0fabf08e1e9e2f72426f5187f11894..7bf3b05c0598a715152d0b5e5ce6038479a9afae 100644 |
--- a/bindings/scripts/interface_dependency_resolver.py |
+++ b/bindings/scripts/interface_dependency_resolver.py |
@@ -63,7 +63,7 @@ class InterfaceDependencyResolver(object): |
self.interfaces_info = interfaces_info |
self.reader = reader |
- def resolve_dependencies(self, definitions): |
+ def resolve_dependencies(self, definitions, component): |
"""Resolve dependencies, merging them into IDL definitions of main file. |
Dependencies consist of 'partial interface' for the same interface as |
@@ -81,10 +81,27 @@ class InterfaceDependencyResolver(object): |
Args: |
definitions: IdlDefinitions object, modified in place |
+ component: |
+ string, describing where the above definitions are defined, |
+ 'core' or 'modules'. See KNOWN_COMPONENTS in utilities.py |
+ |
+ Returns: |
+ A dictionary whose key is component and value is IdlDefinitions |
+ object whose dependency is resolved. |
+ |
+ Raises: |
+ Exception: |
+ A given IdlDefinitions object doesn't have any interfaces, |
+ or a given IdlDefinitions object has incorrect referenced |
+ interfaces. |
""" |
+ # FIXME: we need to resolve dependency when we implement partial |
+ # dictionary. |
if not definitions.interfaces: |
- # This definitions should have a dictionary. Nothing to do for it. |
- return |
+ raise Exception('No need to resolve any dependencies of ' |
+ 'this definition: %s, because this should ' |
+ 'have a dictionary.' % definitions.idl_name) |
+ |
target_interface = next(definitions.interfaces.itervalues()) |
interface_name = target_interface.name |
interface_info = self.interfaces_info[interface_name] |
@@ -93,18 +110,30 @@ class InterfaceDependencyResolver(object): |
target_interface.extended_attributes.update( |
interface_info['inherited_extended_attributes']) |
- merge_interface_dependencies(definitions, |
- target_interface, |
- interface_info['dependencies_full_paths'], |
- self.reader) |
+ resolved_definitions = merge_interface_dependencies( |
+ definitions, |
+ component, |
+ target_interface, |
+ interface_info['dependencies_full_paths'], |
+ self.reader) |
for referenced_interface_name in interface_info['referenced_interfaces']: |
referenced_definitions = self.reader.read_idl_definitions( |
self.interfaces_info[referenced_interface_name]['full_path']) |
- definitions.update(referenced_definitions) |
+ if component not in referenced_definitions: |
+ raise Exception('This definitions: %s is defined in %s ' |
+ 'but reference interface:%s is not defined ' |
+ 'in %s' % (definitions.idl_name, |
+ component, |
+ referenced_interface_name, |
+ component)) |
+ |
+ resolved_definitions[component].update(referenced_definitions[component]) |
+ return resolved_definitions |
-def merge_interface_dependencies(definitions, target_interface, dependency_idl_filenames, reader): |
+ |
+def merge_interface_dependencies(definitions, component, target_interface, dependency_idl_filenames, reader): |
"""Merge dependencies ('partial interface' and 'implements') in dependency_idl_filenames into target_interface. |
No return: modifies target_interface in place. |
@@ -112,6 +141,8 @@ def merge_interface_dependencies(definitions, target_interface, dependency_idl_f |
# Sort so order consistent, so can compare output from run to run. |
for dependency_idl_filename in sorted(dependency_idl_filenames): |
dependency_definitions = reader.read_idl_file(dependency_idl_filename) |
+ # FIXME(crbug.com/358074): should not merge core definitions with |
+ # modules definitions. |
dependency_interface = next(dependency_definitions.interfaces.itervalues()) |
dependency_interface_basename, _ = os.path.splitext(os.path.basename(dependency_idl_filename)) |
@@ -124,6 +155,12 @@ def merge_interface_dependencies(definitions, target_interface, dependency_idl_f |
# over one list (and not need to handle 'implements' itself). |
target_interface.merge(dependency_interface) |
+ # FIXME: Currently, this function just returns one IdlDefinitions |
+ # instance. However, for partial interface modularization, we need to |
+ # make this function return multiple definitions, i.e. |
+ # { 'core': ..., 'modules': ... }. |
+ return {component: definitions} |
+ |
def transfer_extended_attributes(dependency_interface, dependency_interface_basename): |
"""Transfer extended attributes from dependency interface onto members. |