Index: Source/bindings/scripts/interface_dependency_resolver.py |
diff --git a/Source/bindings/scripts/interface_dependency_resolver.py b/Source/bindings/scripts/interface_dependency_resolver.py |
index 27495c71f5d025eb8d591aaebf261e32c4c8c13a..23c09ab4a42c143bfad46ece13bb37aaf733cd58 100644 |
--- a/Source/bindings/scripts/interface_dependency_resolver.py |
+++ b/Source/bindings/scripts/interface_dependency_resolver.py |
@@ -35,26 +35,31 @@ entire interface. |
It also checks whether a file should have bindings generated, or whether |
instead it is just a dependency. |
- |
-FIXME: Currently a stub, as part of landing the parser incrementally. |
-Just computes dependencies, and should always return None, indicating |
-bindings should not be generated. |
-Does not read IDL files or merge IdlDefinitions yet. |
""" |
import os.path |
+import idl_reader |
+ |
+ |
+class InterfaceNotFoundError(Exception): |
+ """Raised if (partial) interface not found in target.""" |
+ pass |
+ |
-def merge_interface_dependencies(idl_definitions, idl_filename, interface_dependencies_filename, additional_idl_filenames): |
+class InvalidPartialInterfaceError(Exception): |
+ """Raised if a file listed as a partial interface is not in fact so.""" |
+ pass |
+ |
+ |
+def merge_dependencies(definitions, idl_filename, interface_dependencies_filename, additional_idl_filenames, verbose=False): |
"""Merges dependencies into an existing IDL document. |
- Modifies idl_definitions in place by adding parsed dependencies, and checks |
+ Modifies definitions in place by adding parsed dependencies, and checks |
whether bindings should be generated, returning bool. |
- FIXME: stub: parser not implemented yet |
- |
Arguments: |
- idl_definitions: IdlDefinitions object, modified in place |
+ definitions: IdlDefinitions object, modified in place |
idl_filename: filename of main IDL file for the interface |
interface_dependencies_file: filename of dependencies file (produced by compute_dependencies.py) |
additional_idl_files: list of additional files, not listed in interface_dependencies_file, for which bindings should nonetheless be generated |
@@ -67,10 +72,18 @@ def merge_interface_dependencies(idl_definitions, idl_filename, interface_depend |
dependency_idl_filenames = compute_dependency_idl_files(basename, interface_dependencies_filename, additional_idl_filenames) |
if dependency_idl_filenames is None: |
return False |
- # FIXME: currently dependency_idl_files *must* be None (indicating that |
- # dummy .cpp and .h files should be generated), as actual parser not |
- # present yet. |
- raise RuntimeError('Stub: parser not implemented yet') |
+ # The Blink IDL filenaming convention is that the file <interface_name>.idl |
+ # MUST contain the interface "interface_name" or exception "interface_name". |
+ if interface_name in definitions.exceptions: |
+ # Exceptions do not have dependencies, so no merging necessary |
+ return definitions |
+ try: |
+ interface = definitions.interfaces[interface_name] |
+ except KeyError: |
+ raise InterfaceNotFoundError('Could not find interface or exception "{interface_name}" in {basename}'.format(**locals())) |
+ merge_interface_dependencies(interface, idl_filename, dependency_idl_filenames, verbose=verbose) |
+ |
+ return definitions |
def compute_dependency_idl_files(target_idl_basename, interface_dependencies_filename, additional_idl_filenames): |
@@ -121,3 +134,42 @@ def compute_dependency_idl_files(target_idl_basename, interface_dependencies_fil |
return [] |
return None |
+ |
+ |
+def merge_interface_dependencies(interface, idl_filename, dependency_idl_filenames, verbose=False): |
+ """Merge partial interfaces in supplementary_idl_files into target_document. |
+ |
+ No return: modifies target_document in place. |
+ """ |
+ # Sort so order consistent, so can compare output from run to run. |
+ for dependency_idl_filename in sorted(dependency_idl_filenames): |
+ dependency_interface_name, _ = os.path.splitext(os.path.basename(dependency_idl_filename)) |
+ definitions = idl_reader.read_idl_file(dependency_idl_filename, verbose=verbose) |
+ |
+ for dependency_interface in definitions.interfaces.itervalues(): |
+ # Supplemental files contain either partial interfaces for |
+ # the (single) target interface, in which case the interface names |
+ # must agree, or interfaces that are implemented by the target |
+ # interface, in which case the interface names differ. |
+ if dependency_interface.is_partial and dependency_interface.name != interface.name: |
+ raise InvalidPartialInterfaceError('%s is not a partial interface of %s. There maybe a bug in the the dependency generator (compute_depedencies.py).' % (dependency_idl_filename, idl_filename)) |
+ if 'ImplementedAs' in dependency_interface.extended_attributes: |
+ del dependency_interface.extended_attributes['ImplementedAs'] |
+ merge_dependency_interface(interface, dependency_interface, dependency_interface_name) |
+ |
+ |
+def merge_dependency_interface(interface, dependency_interface, dependency_interface_name): |
+ """Merge dependency_interface into interface. |
+ |
+ No return: modifies interface in place. |
+ """ |
+ def merge_lists(source_list, target_list): |
+ for element in source_list: |
+ if dependency_interface.is_partial: |
+ element.extended_attributes['ImplementedBy'] = dependency_interface_name |
+ element.extended_attributes.update(dependency_interface.extended_attributes) |
+ target_list.append(element) |
+ |
+ merge_lists(dependency_interface.attributes, interface.attributes) |
+ merge_lists(dependency_interface.constants, interface.constants) |
+ merge_lists(dependency_interface.functions, interface.functions) |