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

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

Issue 1257613003: bindings: Supports inheritance of [Unforgeable] attributes as accessor-type properties. (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Minor fix Created 5 years, 5 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
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 79b28ea133445b94448cf0229d84f171bfa38196..e643e19d0b7ec407a3708466504c17c0d7988ad8 100644
--- a/Source/bindings/scripts/interface_dependency_resolver.py
+++ b/Source/bindings/scripts/interface_dependency_resolver.py
@@ -119,6 +119,8 @@ class InterfaceDependencyResolver(object):
interface_info['dependencies_other_component_full_paths'],
self.reader)
+ inherit_unforgeable_attributes(resolved_definitions, self.interfaces_info)
+
for referenced_interface_name in interface_info['referenced_interfaces']:
referenced_definitions = self.reader.read_idl_definitions(
self.interfaces_info[referenced_interface_name]['full_path'])
@@ -305,3 +307,47 @@ def transfer_extended_attributes(dependency_interface, dependency_interface_base
update_attributes(constant.extended_attributes, merged_extended_attributes)
for operation in dependency_interface.operations:
update_attributes(operation.extended_attributes, merged_extended_attributes)
+
+
+def inherit_unforgeable_attributes(resolved_definitions, interfaces_info):
+ """Inherits [Unforgeable] attributes and updates the arguments accordingly.
+
+ For each interface in |resolved_definitions|, collects all [Unforgeable]
+ attributes in ancestor interfaces in the same component and adds them to
+ the interface. 'referenced_interfaces' and 'cpp_includes' in
+ |interfaces_info| are updated accordingly.
+ """
+ def collect_unforgeable_attributes_in_ancestors(interface_name, component, unforgeable_attributes=None, referenced_interfaces=None, cpp_includes=None):
+ if unforgeable_attributes is None:
+ unforgeable_attributes = []
+ if referenced_interfaces is None:
+ referenced_interfaces = []
+ if cpp_includes is None:
+ cpp_includes = set()
+ if not interface_name:
+ return unforgeable_attributes, referenced_interfaces, cpp_includes
+ interface = interfaces_info[interface_name]
+ attrs = interface.get('unforgeable_attributes', {}).get(component, [])
+ unforgeable_attributes.extend(attrs)
+ referenced = [attr.idl_type.base_type for attr in attrs
+ if attr.idl_type.base_type in
+ interface.get('referenced_interfaces', [])]
+ referenced_interfaces.extend(referenced)
+ cpp_includes.update(interface.get('cpp_includes', {}).get(component, {}))
+ return collect_unforgeable_attributes_in_ancestors(
bashi 2015/07/28 00:38:47 How about merge-and-return recursive results (unfo
Yuki 2015/07/29 08:16:24 Done.
+ interface.get('parent'), component,
+ unforgeable_attributes, referenced_interfaces, cpp_includes)
+
+ for component, definitions in resolved_definitions.iteritems():
+ for interface_name, interface in definitions.interfaces.iteritems():
bashi 2015/07/28 00:38:47 Help me understand: len(definitions.interfaces) co
Yuki 2015/07/29 08:16:24 For some interfaces, it's greater than one. It see
bashi 2015/07/29 09:24:33 As chatted offline, this could be executed multipl
Yuki 2015/07/29 09:32:38 I've updated the code so that we don't add any dup
+ interface_info = interfaces_info[interface_name]
+ inherited_unforgeable_attributes, referenced_interfaces, cpp_includes = collect_unforgeable_attributes_in_ancestors(interface_info.get('parent'), component)
+ interface.attributes.extend(inherited_unforgeable_attributes)
+ referenced_interfaces.extend(interface_info.get('referenced_interfaces', []))
+ interface_info['referenced_interfaces'] = sorted(set(referenced_interfaces))
+ cpp_includes.update(interface_info.get('cpp_includes', {}).get(component, set()))
+ if 'cpp_includes' not in interface_info:
+ interface_info['cpp_includes'] = {}
+ if component not in interface_info['cpp_includes']:
+ interface_info['cpp_includes'][component] = set()
+ interface_info['cpp_includes'][component].update(cpp_includes)

Powered by Google App Engine
This is Rietveld 408576698