Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(349)

Unified Diff: Source/bindings/scripts/preprocess_idls.py

Issue 17376006: Implement WebIDL implements (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Add back [PerWorldBindings] Created 7 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « Source/bindings/scripts/generate-bindings.pl ('k') | Source/bindings/tests/idls/TestImplements.idl » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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
+ 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
« no previous file with comments | « Source/bindings/scripts/generate-bindings.pl ('k') | Source/bindings/tests/idls/TestImplements.idl » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698