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

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

Issue 680193003: IDL: Generate union type containers (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Created 6 years, 1 month 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
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 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
57 class IdlBadFilenameError(Exception): 57 class IdlBadFilenameError(Exception):
58 """Raised if an IDL filename disagrees with the interface name in the file." "" 58 """Raised if an IDL filename disagrees with the interface name in the file." ""
59 pass 59 pass
60 60
61 61
62 def parse_options(): 62 def parse_options():
63 usage = 'Usage: %prog [options] [generated1.idl]...' 63 usage = 'Usage: %prog [options] [generated1.idl]...'
64 parser = optparse.OptionParser(usage=usage) 64 parser = optparse.OptionParser(usage=usage)
65 parser.add_option('--cache-directory', help='cache directory') 65 parser.add_option('--cache-directory', help='cache directory')
66 parser.add_option('--idl-files-list', help='file listing IDL files') 66 parser.add_option('--idl-files-list', help='file listing IDL files')
67 parser.add_option('--interfaces-info-file', help='output pickle file') 67 parser.add_option('--interfaces-info-file', help='interface info pickle file ')
68 parser.add_option('--component-info-file', help='component wide info pickle file')
68 parser.add_option('--write-file-only-if-changed', type='int', help='if true, do not write an output file if it would be identical to the existing one, which avoids unnecessary rebuilds in ninja') 69 parser.add_option('--write-file-only-if-changed', type='int', help='if true, do not write an output file if it would be identical to the existing one, which avoids unnecessary rebuilds in ninja')
69 70
70 options, args = parser.parse_args() 71 options, args = parser.parse_args()
71 if options.interfaces_info_file is None: 72 if options.interfaces_info_file is None:
72 parser.error('Must specify an output file using --interfaces-info-file.' ) 73 parser.error('Must specify an output file using --interfaces-info-file.' )
73 if options.idl_files_list is None: 74 if options.idl_files_list is None:
74 parser.error('Must specify a file listing IDL files using --idl-files-li st.') 75 parser.error('Must specify a file listing IDL files using --idl-files-li st.')
75 if options.write_file_only_if_changed is None: 76 if options.write_file_only_if_changed is None:
76 parser.error('Must specify whether file is only written if changed using --write-file-only-if-changed.') 77 parser.error('Must specify whether file is only written if changed using --write-file-only-if-changed.')
77 options.write_file_only_if_changed = bool(options.write_file_only_if_changed ) 78 options.write_file_only_if_changed = bool(options.write_file_only_if_changed )
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after
190 elif definitions.dictionaries: 191 elif definitions.dictionaries:
191 definition = next(definitions.dictionaries.itervalues()) 192 definition = next(definitions.dictionaries.itervalues())
192 interface_info = { 193 interface_info = {
193 'is_callback_interface': False, 194 'is_callback_interface': False,
194 'is_dictionary': True, 195 'is_dictionary': True,
195 'referenced_interfaces': None, 196 'referenced_interfaces': None,
196 } 197 }
197 else: 198 else:
198 raise Exception('IDL file must contain one interface or dictionary') 199 raise Exception('IDL file must contain one interface or dictionary')
199 200
200 self.union_types.update( 201 this_union_types = collect_union_types_from_definitions(definitions)
201 collect_union_types_from_definitions(definitions)) 202 self.union_types.update(this_union_types)
202 203
203 extended_attributes = definition.extended_attributes 204 extended_attributes = definition.extended_attributes
204 implemented_as = extended_attributes.get('ImplementedAs') 205 implemented_as = extended_attributes.get('ImplementedAs')
205 full_path = os.path.realpath(idl_filename) 206 full_path = os.path.realpath(idl_filename)
206 this_include_path = None if 'NoImplHeader' in extended_attributes else i nclude_path(idl_filename, implemented_as) 207 this_include_path = None if 'NoImplHeader' in extended_attributes else i nclude_path(idl_filename, implemented_as)
207 if definition.is_partial: 208 if definition.is_partial:
208 # We don't create interface_info for partial interfaces, but 209 # We don't create interface_info for partial interfaces, but
209 # adds paths to another dict. 210 # adds paths to another dict.
210 self.add_paths_to_partials_dict(definition.name, full_path, this_inc lude_path) 211 self.add_paths_to_partials_dict(definition.name, full_path, this_inc lude_path)
211 return 212 return
212 213
213 # 'implements' statements can be included in either the file for the 214 # 'implements' statements can be included in either the file for the
214 # implement*ing* interface (lhs of 'implements') or implement*ed* interf ace 215 # implement*ing* interface (lhs of 'implements') or implement*ed* interf ace
215 # (rhs of 'implements'). Store both for now, then merge to implement*ing * 216 # (rhs of 'implements'). Store both for now, then merge to implement*ing *
216 # interface later. 217 # interface later.
217 left_interfaces, right_interfaces = get_implements_from_definitions( 218 left_interfaces, right_interfaces = get_implements_from_definitions(
218 definitions, definition.name) 219 definitions, definition.name)
219 220
220 interface_info.update({ 221 interface_info.update({
221 'extended_attributes': extended_attributes, 222 'extended_attributes': extended_attributes,
222 'full_path': full_path, 223 'full_path': full_path,
224 'has_union_types': bool(this_union_types),
223 'implemented_as': implemented_as, 225 'implemented_as': implemented_as,
224 'implemented_by_interfaces': left_interfaces, 226 'implemented_by_interfaces': left_interfaces,
225 'implements_interfaces': right_interfaces, 227 'implements_interfaces': right_interfaces,
226 'include_path': this_include_path, 228 'include_path': this_include_path,
227 # FIXME: temporary private field, while removing old treatement of 229 # FIXME: temporary private field, while removing old treatement of
228 # 'implements': http://crbug.com/360435 230 # 'implements': http://crbug.com/360435
229 'is_legacy_treat_as_partial_interface': 'LegacyTreatAsPartialInterfa ce' in extended_attributes, 231 'is_legacy_treat_as_partial_interface': 'LegacyTreatAsPartialInterfa ce' in extended_attributes,
230 'parent': definition.parent, 232 'parent': definition.parent,
231 'relative_dir': relative_dir_posix(idl_filename), 233 'relative_dir': relative_dir_posix(idl_filename),
232 }) 234 })
233 self.interfaces_info[definition.name] = interface_info 235 self.interfaces_info[definition.name] = interface_info
234 236
235 def get_info_as_dict(self): 237 def get_info_as_dict(self):
236 """Returns info packaged as a dict.""" 238 """Returns info packaged as a dict."""
237 return { 239 return {
238 'interfaces_info': self.interfaces_info, 240 'interfaces_info': self.interfaces_info,
239 # Can't pickle defaultdict, convert to dict 241 # Can't pickle defaultdict, convert to dict
242 # FIXME: this should be included in get_component_info.
240 'partial_interface_files': dict(self.partial_interface_files), 243 'partial_interface_files': dict(self.partial_interface_files),
244 }
245
246 def get_component_info_as_dict(self):
247 """Returns component wide information as a dict."""
248 return {
241 'union_types': self.union_types, 249 'union_types': self.union_types,
242 } 250 }
243 251
244 252
245 ################################################################################ 253 ################################################################################
246 254
247 def main(): 255 def main():
248 options, args = parse_options() 256 options, args = parse_options()
249 257
250 # Static IDL files are passed in a file (generated at GYP time), due to OS 258 # Static IDL files are passed in a file (generated at GYP time), due to OS
251 # command line length limits 259 # command line length limits
252 idl_files = read_file_to_list(options.idl_files_list) 260 idl_files = read_file_to_list(options.idl_files_list)
253 # Generated IDL files are passed at the command line, since these are in the 261 # Generated IDL files are passed at the command line, since these are in the
254 # build directory, which is determined at build time, not GYP time, so these 262 # build directory, which is determined at build time, not GYP time, so these
255 # cannot be included in the file listing static files 263 # cannot be included in the file listing static files
256 idl_files.extend(args) 264 idl_files.extend(args)
257 265
258 # Compute information for individual files 266 # Compute information for individual files
259 # Information is stored in global variables interfaces_info and 267 # Information is stored in global variables interfaces_info and
260 # partial_interface_files. 268 # partial_interface_files.
261 info_collector = InterfaceInfoCollector(options.cache_directory) 269 info_collector = InterfaceInfoCollector(options.cache_directory)
262 for idl_filename in idl_files: 270 for idl_filename in idl_files:
263 info_collector.collect_info(idl_filename) 271 info_collector.collect_info(idl_filename)
264 272
265 write_pickle_file(options.interfaces_info_file, 273 write_pickle_file(options.interfaces_info_file,
266 info_collector.get_info_as_dict(), 274 info_collector.get_info_as_dict(),
267 options.write_file_only_if_changed) 275 options.write_file_only_if_changed)
268 276 write_pickle_file(options.component_info_file,
277 info_collector.get_component_info_as_dict(),
278 options.write_file_only_if_changed)
269 279
270 if __name__ == '__main__': 280 if __name__ == '__main__':
271 sys.exit(main()) 281 sys.exit(main())
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698