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

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

Issue 938403007: Support [TypeChecking] on dependent/partial interfaces. (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: follow naming convention for to_list helper Created 5 years, 10 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 | « no previous file | Source/bindings/tests/idls/core/TestInterface3.idl » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 c1f220fb59b1fc9db6e96b4fb7d74ecd9ea901b7..0db1ca18328fd4551dcad32a81f5a54c1055dca0 100644
--- a/Source/bindings/scripts/interface_dependency_resolver.py
+++ b/Source/bindings/scripts/interface_dependency_resolver.py
@@ -44,11 +44,16 @@ from utilities import idl_filename_to_component, is_valid_component_dependency
# Note that this moves the extended attribute from the interface to the member,
# which changes the semantics and yields different code than the same extended
# attribute on the main interface.
-DEPENDENCY_EXTENDED_ATTRIBUTES = set([
- 'Conditional',
- 'PerContextEnabled',
- 'RuntimeEnabled',
-])
+#
+# Paired with the extended attribute name is its value type; needed to be able
+# to correctly merge interface-level occurrences with ones that may
+# be present on the method/attribute/constant.
+DEPENDENCY_EXTENDED_ATTRIBUTES = {
+ 'Conditional': 'string',
+ 'PerContextEnabled': 'string',
+ 'RuntimeEnabled': 'string',
+ 'TypeChecking': 'list',
+}
class InterfaceDependencyResolver(object):
@@ -243,7 +248,7 @@ def transfer_extended_attributes(dependency_interface, dependency_interface_base
merged_extended_attributes = dict(
(key, value)
for key, value in dependency_interface.extended_attributes.iteritems()
- if key in DEPENDENCY_EXTENDED_ATTRIBUTES)
+ if key in DEPENDENCY_EXTENDED_ATTRIBUTES.keys())
# A partial interface's members are implemented as static member functions
# in a separate C++ class. This class name is stored in
@@ -274,9 +279,26 @@ def transfer_extended_attributes(dependency_interface, dependency_interface_base
dependency_interface.extended_attributes.get(
'ImplementedAs', dependency_interface_basename))
+ def update_attributes(attributes, extras):
+ def to_list(x):
+ if type(x) is list:
+ return x
+ else:
+ return [x]
+
+ for key, value in extras.items():
+ if key in attributes:
+ # Interface-level extended attributes do not take precedence
+ # over same attribute at the method/attribute/const-level.
+ # If the attribute value is a list, the two are combined.
+ if DEPENDENCY_EXTENDED_ATTRIBUTES[key] == 'list':
+ attributes[key] = to_list(attributes[key]) + to_list(value)
+ else:
+ attributes[key] = value
+
for attribute in dependency_interface.attributes:
- attribute.extended_attributes.update(merged_extended_attributes)
+ update_attributes(attribute.extended_attributes, merged_extended_attributes)
for constant in dependency_interface.constants:
- constant.extended_attributes.update(merged_extended_attributes)
+ update_attributes(constant.extended_attributes, merged_extended_attributes)
for operation in dependency_interface.operations:
- operation.extended_attributes.update(merged_extended_attributes)
+ update_attributes(operation.extended_attributes, merged_extended_attributes)
« no previous file with comments | « no previous file | Source/bindings/tests/idls/core/TestInterface3.idl » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698