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

Side by Side Diff: Source/bindings/scripts/compute_interfaces_info_individual.py

Issue 1063253005: bindings: Use Visitor to collect union types (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 5 years, 8 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 unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | Source/bindings/tests/idls/core/TestInterfaceConstructor.idl » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 #!/usr/bin/python 1 #!/usr/bin/python
2 # 2 #
3 # Copyright (C) 2013 Google Inc. All rights reserved. 3 # Copyright (C) 2013 Google Inc. All rights reserved.
4 # 4 #
5 # Redistribution and use in source and binary forms, with or without 5 # Redistribution and use in source and binary forms, with or without
6 # modification, are permitted provided that the following conditions are 6 # modification, are permitted provided that the following conditions are
7 # met: 7 # met:
8 # 8 #
9 # * Redistributions of source code must retain the above copyright 9 # * Redistributions of source code must retain the above copyright
10 # notice, this list of conditions and the following disclaimer. 10 # notice, this list of conditions and the following disclaimer.
(...skipping 29 matching lines...) Expand all
40 40
41 Design doc: http://www.chromium.org/developers/design-documents/idl-build 41 Design doc: http://www.chromium.org/developers/design-documents/idl-build
42 """ 42 """
43 43
44 from collections import defaultdict 44 from collections import defaultdict
45 import optparse 45 import optparse
46 import os 46 import os
47 import posixpath 47 import posixpath
48 import sys 48 import sys
49 49
50 from idl_definitions import Visitor
50 from idl_reader import IdlReader 51 from idl_reader import IdlReader
51 from utilities import get_file_contents, read_file_to_list, idl_filename_to_inte rface_name, idl_filename_to_component, write_pickle_file, get_interface_extended _attributes_from_idl, is_callback_interface_from_idl 52 from utilities import get_file_contents, read_file_to_list, idl_filename_to_inte rface_name, idl_filename_to_component, write_pickle_file, get_interface_extended _attributes_from_idl, is_callback_interface_from_idl
52 53
53 module_path = os.path.dirname(__file__) 54 module_path = os.path.dirname(__file__)
54 source_path = os.path.normpath(os.path.join(module_path, os.pardir, os.pardir)) 55 source_path = os.path.normpath(os.path.join(module_path, os.pardir, os.pardir))
55 56
56 57
57 class IdlBadFilenameError(Exception): 58 class IdlBadFilenameError(Exception):
58 """Raised if an IDL filename disagrees with the interface name in the file." "" 59 """Raised if an IDL filename disagrees with the interface name in the file." ""
59 pass 60 pass
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
122 (implement.left_interface, implement.right_interface, definition _name)) 123 (implement.left_interface, implement.right_interface, definition _name))
123 return left_interfaces, right_interfaces 124 return left_interfaces, right_interfaces
124 125
125 126
126 def get_put_forward_interfaces_from_definition(definition): 127 def get_put_forward_interfaces_from_definition(definition):
127 return sorted(set(attribute.idl_type.base_type 128 return sorted(set(attribute.idl_type.base_type
128 for attribute in definition.attributes 129 for attribute in definition.attributes
129 if 'PutForwards' in attribute.extended_attributes)) 130 if 'PutForwards' in attribute.extended_attributes))
130 131
131 132
132 def collect_union_types_from_definitions(definitions): 133 class UnionTypeCollector(Visitor):
Jens Widell 2015/04/08 09:35:19 I guess we could have kept a collect_union_types_f
bashi 2015/04/10 00:05:14 Done.
133 """Traverse definitions and collect all union types.""" 134 """Traverse definitions and collect all union types."""
134 135
135 def union_types_from(things): 136 def collect(self, definitions):
136 return (thing.idl_type for thing in things 137 self._union_types = set()
137 if thing.idl_type.is_union_type) 138 definitions.accept(self)
139 return self._union_types
138 140
139 this_union_types = set() 141 def visit_typed_object(self, typed_object):
140 for interface in definitions.interfaces.itervalues(): 142 try:
141 this_union_types.update(union_types_from(interface.attributes)) 143 idl_type = getattr(typed_object, 'idl_type')
Jens Widell 2015/04/08 09:35:19 It would be better to use typed_object.idl_type_at
bashi 2015/04/10 00:05:14 Done.
142 for operation in interface.operations: 144 except AttributeError:
143 this_union_types.update(union_types_from(operation.arguments)) 145 return
144 if operation.idl_type.is_union_type: 146 if not idl_type:
145 this_union_types.add(operation.idl_type) 147 return
146 for constructor in interface.constructors: 148 if idl_type.is_union_type:
147 this_union_types.update(union_types_from(constructor.arguments)) 149 self._union_types.add(idl_type)
148 for constructor in interface.custom_constructors: 150 if idl_type.element_type and idl_type.element_type.is_union_type:
Jens Widell 2015/04/08 09:35:19 I think it would be better to have a process_type(
bashi 2015/04/10 00:05:14 Good suggestion. I added idl_types() to IdlTypeBas
149 this_union_types.update(union_types_from(constructor.arguments)) 151 self._union_types.add(idl_type.element_type)
150 for callback_function in definitions.callback_functions.itervalues(): 152 if idl_type.inner_type and idl_type.inner_type.is_union_type:
151 this_union_types.update(union_types_from(callback_function.arguments)) 153 self._union_types.add(idl_type.inner_type)
152 if callback_function.idl_type.is_union_type:
153 this_union_types.add(callback_function.idl_type)
154 for dictionary in definitions.dictionaries.itervalues():
155 this_union_types.update(union_types_from(dictionary.members))
156 for typedef in definitions.typedefs.itervalues():
157 if typedef.idl_type.is_union_type:
158 this_union_types.add(typedef.idl_type)
159 return this_union_types
160 154
161 155
162 class InterfaceInfoCollector(object): 156 class InterfaceInfoCollector(object):
163 """A class that collects interface information from idl files.""" 157 """A class that collects interface information from idl files."""
164 def __init__(self, cache_directory=None): 158 def __init__(self, cache_directory=None):
165 self.reader = IdlReader(interfaces_info=None, outputdir=cache_directory) 159 self.reader = IdlReader(interfaces_info=None, outputdir=cache_directory)
166 self.interfaces_info = {} 160 self.interfaces_info = {}
167 self.partial_interface_files = defaultdict(lambda: { 161 self.partial_interface_files = defaultdict(lambda: {
168 'full_paths': [], 162 'full_paths': [],
169 'include_paths': [], 163 'include_paths': [],
170 }) 164 })
171 self.enumerations = set() 165 self.enumerations = set()
172 self.union_types = set() 166 self.union_types = set()
173 self.typedefs = {} 167 self.typedefs = {}
174 168
175 def add_paths_to_partials_dict(self, partial_interface_name, full_path, 169 def add_paths_to_partials_dict(self, partial_interface_name, full_path,
176 include_paths): 170 include_paths):
177 paths_dict = self.partial_interface_files[partial_interface_name] 171 paths_dict = self.partial_interface_files[partial_interface_name]
178 paths_dict['full_paths'].append(full_path) 172 paths_dict['full_paths'].append(full_path)
179 paths_dict['include_paths'].extend(include_paths) 173 paths_dict['include_paths'].extend(include_paths)
180 174
181 def collect_info(self, idl_filename): 175 def collect_info(self, idl_filename):
182 """Reads an idl file and collects information which is required by the 176 """Reads an idl file and collects information which is required by the
183 binding code generation.""" 177 binding code generation."""
184 definitions = self.reader.read_idl_file(idl_filename) 178 definitions = self.reader.read_idl_file(idl_filename)
185 179
186 this_union_types = collect_union_types_from_definitions(definitions) 180 this_union_types = UnionTypeCollector().collect(definitions)
187 self.union_types.update(this_union_types) 181 self.union_types.update(this_union_types)
188 self.typedefs.update(definitions.typedefs) 182 self.typedefs.update(definitions.typedefs)
189 # Check enum duplication. 183 # Check enum duplication.
190 for enum_name in definitions.enumerations.keys(): 184 for enum_name in definitions.enumerations.keys():
191 for defined_enum in self.enumerations: 185 for defined_enum in self.enumerations:
192 if defined_enum.name == enum_name: 186 if defined_enum.name == enum_name:
193 raise Exception('Enumeration %s has multiple definitions' % enum_name) 187 raise Exception('Enumeration %s has multiple definitions' % enum_name)
194 self.enumerations.update(definitions.enumerations.values()) 188 self.enumerations.update(definitions.enumerations.values())
195 189
196 if definitions.interfaces: 190 if definitions.interfaces:
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after
298 292
299 write_pickle_file(options.interfaces_info_file, 293 write_pickle_file(options.interfaces_info_file,
300 info_collector.get_info_as_dict(), 294 info_collector.get_info_as_dict(),
301 options.write_file_only_if_changed) 295 options.write_file_only_if_changed)
302 write_pickle_file(options.component_info_file, 296 write_pickle_file(options.component_info_file,
303 info_collector.get_component_info_as_dict(), 297 info_collector.get_component_info_as_dict(),
304 options.write_file_only_if_changed) 298 options.write_file_only_if_changed)
305 299
306 if __name__ == '__main__': 300 if __name__ == '__main__':
307 sys.exit(main()) 301 sys.exit(main())
OLDNEW
« no previous file with comments | « no previous file | Source/bindings/tests/idls/core/TestInterfaceConstructor.idl » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698