Chromium Code Reviews| Index: Source/bindings/scripts/preprocess_idls.py |
| diff --git a/Source/bindings/scripts/preprocess_idls.py b/Source/bindings/scripts/preprocess_idls.py |
| index e9342121fcf7cdf95a4dfb7a36b31fa0831ef477..d62ed2e9db891f1f7c50aea355cd9657dee7992d 100644 |
| --- a/Source/bindings/scripts/preprocess_idls.py |
| +++ b/Source/bindings/scripts/preprocess_idls.py |
| @@ -70,6 +70,16 @@ def get_partial_interface_name_from_idl(file_contents): |
| return None |
| +# identifier-A implements identifier-B; |
| +# http://www.w3.org/TR/WebIDL/#idl-implements-statements |
| +def get_implementers_from_idl(file_contents, interface_name): |
| + implementers = [] |
| + for match in re.finditer(r'(\w+)\s+implements\s+(\w+)\s*;', file_contents): |
| + # identifier-B must be the current interface |
| + assert match.group(2) == interface_name |
| + implementers.append(match.group(1)) |
| + return implementers |
| + |
| def is_callback_interface_from_idl(file_contents): |
| match = re.search(r'callback\s+interface\s+\w+', file_contents) |
| return match is not None |
| @@ -142,11 +152,17 @@ def parse_idl_files(idl_files, window_constructors_filename, workercontext_const |
| for idl_file_name in idl_files: |
| full_path = os.path.realpath(idl_file_name) |
| idl_file_contents = get_file_contents(full_path) |
| + # Handle partial interfaces |
| partial_interface_name = get_partial_interface_name_from_idl(idl_file_contents) |
| if partial_interface_name: |
| - supplemental_dependencies[full_path] = partial_interface_name |
| + supplemental_dependencies[full_path] = [partial_interface_name] |
| continue |
| interface_name, _ = os.path.splitext(os.path.basename(idl_file_name)) |
| + # Parse 'identifier-A implements identifier-B; statements |
|
arv (Not doing code reviews)
2013/06/18 15:18:21
# Parse 'identifier-A implements identifier-B;' st
|
| + implementers = get_implementers_from_idl(idl_file_contents, interface_name) |
| + for implementer in implementers: |
| + supplemental_dependencies.setdefault(full_path, []).append(implementer) |
| + # Handle [NoInterfaceObject] |
| if not is_callback_interface_from_idl(idl_file_contents): |
| extended_attributes = get_interface_extended_attributes_from_idl(idl_file_contents) |
| if 'NoInterfaceObject' not in extended_attributes: |
| @@ -163,18 +179,19 @@ def parse_idl_files(idl_files, window_constructors_filename, workercontext_const |
| # Generate Global constructors |
| generate_global_constructors_partial_interface("Window", window_constructors_filename, window_constructor_attributes_list) |
| if 'Window' in interface_name_to_idl_file: |
| - supplemental_dependencies[window_constructors_filename] = 'Window' |
| + supplemental_dependencies[window_constructors_filename] = ['Window'] |
| generate_global_constructors_partial_interface("WorkerContext", workercontext_constructors_filename, workercontext_constructor_attributes_list) |
| if 'WorkerContext' in interface_name_to_idl_file: |
| - supplemental_dependencies[workercontext_constructors_filename] = 'WorkerContext' |
| + supplemental_dependencies[workercontext_constructors_filename] = ['WorkerContext'] |
| # Resolve partial interfaces dependencies |
| - for idl_file, base_file in supplemental_dependencies.iteritems(): |
| - target_idl_file = interface_name_to_idl_file[base_file] |
| - supplementals[target_idl_file].append(idl_file) |
| - if idl_file in supplementals: |
| - # Should never occur. Might be needed in corner cases. |
| - del supplementals[idl_file] |
| + for idl_file, base_files in supplemental_dependencies.iteritems(): |
| + for base_file in base_files: |
| + target_idl_file = interface_name_to_idl_file[base_file] |
| + supplementals[target_idl_file].append(idl_file) |
| + if idl_file in supplementals: |
| + # Should never occur. Might be needed in corner cases. |
| + del supplementals[idl_file] |
| return supplementals |