Chromium Code Reviews| 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..d818afe16b0da21315acfa4eadef73f1fae26d02 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 toList(x): |
|
bashi
2015/02/23 01:54:11
nit: toList() -> to_list()
sof
2015/02/23 06:08:55
thanks, done.
|
| + 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] = toList(attributes[key]) + toList(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) |