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

Side by Side Diff: tools/dom/scripts/generator.py

Issue 605083004: Merge 38 changes to bleeding edge (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 6 years, 2 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 | « tools/dom/scripts/databasebuilder.py ('k') | tools/dom/scripts/htmlrenamer.py » ('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 # Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file 2 # Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
3 # for details. All rights reserved. Use of this source code is governed by a 3 # for details. All rights reserved. Use of this source code is governed by a
4 # BSD-style license that can be found in the LICENSE file. 4 # BSD-style license that can be found in the LICENSE file.
5 5
6 """This module provides shared functionality for systems to generate 6 """This module provides shared functionality for systems to generate
7 Dart APIs from the IDL database.""" 7 Dart APIs from the IDL database."""
8 8
9 import copy 9 import copy
10 import json 10 import json
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after
107 # Nodes with different tags in different browsers can be listed as multiple 107 # Nodes with different tags in different browsers can be listed as multiple
108 # tags here provided there is not conflict in usage (e.g. browser X has tag 108 # tags here provided there is not conflict in usage (e.g. browser X has tag
109 # T and no other browser has tag T). 109 # T and no other browser has tag T).
110 110
111 'AnalyserNode': 'AnalyserNode,RealtimeAnalyserNode', 111 'AnalyserNode': 'AnalyserNode,RealtimeAnalyserNode',
112 'AudioContext': 'AudioContext,webkitAudioContext', 112 'AudioContext': 'AudioContext,webkitAudioContext',
113 113
114 'ChannelMergerNode': 'ChannelMergerNode,AudioChannelMerger', 114 'ChannelMergerNode': 'ChannelMergerNode,AudioChannelMerger',
115 'ChannelSplitterNode': 'ChannelSplitterNode,AudioChannelSplitter', 115 'ChannelSplitterNode': 'ChannelSplitterNode,AudioChannelSplitter',
116 116
117 'ClientRect': 'ClientRect,DOMRect',
118 'ClientRectList': 'ClientRectList,DOMRectList', 117 'ClientRectList': 'ClientRectList,DOMRectList',
119 118
120 'CSSStyleDeclaration': 119 'CSSStyleDeclaration':
121 # IE Firefox 120 # IE Firefox
122 'CSSStyleDeclaration,MSStyleCSSProperties,CSS2Properties', 121 'CSSStyleDeclaration,MSStyleCSSProperties,CSS2Properties',
123 122
124 'Clipboard': 'Clipboard,DataTransfer', 123 'Clipboard': 'Clipboard,DataTransfer',
125 124
126 'ApplicationCache': 125 'ApplicationCache':
127 'ApplicationCache,DOMApplicationCache,OfflineResourceList', 126 'ApplicationCache,DOMApplicationCache,OfflineResourceList',
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after
232 return argument.optional 231 return argument.optional
233 if 'DartForceOptional' in argument.ext_attrs: 232 if 'DartForceOptional' in argument.ext_attrs:
234 return True 233 return True
235 return False 234 return False
236 235
237 # Given a list of overloaded arguments, choose a suitable name. 236 # Given a list of overloaded arguments, choose a suitable name.
238 def OverloadedName(args): 237 def OverloadedName(args):
239 return '_OR_'.join(sorted(set(arg.id for arg in args))) 238 return '_OR_'.join(sorted(set(arg.id for arg in args)))
240 239
241 def DartType(idl_type_name): 240 def DartType(idl_type_name):
242 if idl_type_name in _idl_type_registry: 241 if idl_type_name in _idl_type_registry:
243 return _idl_type_registry[idl_type_name].dart_type or idl_type_name 242 return _idl_type_registry[idl_type_name].dart_type or idl_type_name
244 return idl_type_name 243 return idl_type_name
245 244
246 # Given a list of overloaded arguments, choose a suitable type. 245 # Given a list of overloaded arguments, choose a suitable type.
247 def OverloadedType(args): 246 def OverloadedType(args):
248 type_ids = sorted(set(arg.type.id for arg in args)) 247 type_ids = sorted(set(arg.type.id for arg in args))
249 if len(set(DartType(arg.type.id) for arg in args)) == 1: 248 if len(set(DartType(arg.type.id) for arg in args)) == 1:
250 return type_ids[0] 249 return type_ids[0]
251 else: 250 else:
252 return None 251 return None
253 252
254 result = [] 253 result = []
255 254
256 is_optional = False 255 is_optional = False
257 for arg_tuple in map(lambda *x: x, *args): 256 for arg_tuple in map(lambda *x: x, *args):
258 is_optional = is_optional or any(arg is None or IsOptional(arg) for arg in a rg_tuple) 257 is_optional = is_optional or any(arg is None or IsOptional(arg) for arg in a rg_tuple)
259 258
260 filtered = filter(None, arg_tuple) 259 filtered = filter(None, arg_tuple)
261 type_id = OverloadedType(filtered) 260 type_id = OverloadedType(filtered)
262 name = OverloadedName(filtered) 261 name = OverloadedName(filtered)
263 result.append(ParamInfo(name, type_id, is_optional)) 262 result.append(ParamInfo(name, type_id, is_optional))
264 263
265 return result 264 return result
266 265
267 # Argument default value set (literal value or null). 266 # Argument default value is one that we suppress
268 def HasDefault(argument): 267 # FIXME(leafp) We may wish to eliminate this special treatment of optional
269 return (argument.default_value != None) or argument.default_value_is_null 268 # arguments entirely, since default values are being used more pervasively
269 # in the IDL now.
270 def HasSuppressedOptionalDefault(argument):
271 return (argument.default_value == 'Undefined') or argument.default_value_is_nu ll
270 272
271 def IsOptional(argument): 273 def IsOptional(argument):
272 return argument.optional and (not(HasDefault(argument))) \ 274 return argument.optional and (not(HasSuppressedOptionalDefault(argument))) \
273 or 'DartForceOptional' in argument.ext_attrs 275 or 'DartForceOptional' in argument.ext_attrs
274 276
275 def AnalyzeOperation(interface, operations): 277 def AnalyzeOperation(interface, operations):
276 """Makes operation calling convention decision for a set of overloads. 278 """Makes operation calling convention decision for a set of overloads.
277 279
278 Returns: An OperationInfo object. 280 Returns: An OperationInfo object.
279 """ 281 """
280 282
281 # split operations with optional args into multiple operations 283 # split operations with optional args into multiple operations
282 split_operations = [] 284 split_operations = []
(...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after
443 dart_type = rename_type(param.type_id) if param.type_id else 'dynamic' 445 dart_type = rename_type(param.type_id) if param.type_id else 'dynamic'
444 return (TypeOrNothing(dart_type, param.type_id), param.name) 446 return (TypeOrNothing(dart_type, param.type_id), param.name)
445 required = [] 447 required = []
446 optional = [] 448 optional = []
447 for param_info in self.param_infos: 449 for param_info in self.param_infos:
448 if param_info.is_optional: 450 if param_info.is_optional:
449 optional.append(FormatParam(param_info)) 451 optional.append(FormatParam(param_info))
450 else: 452 else:
451 if optional: 453 if optional:
452 raise Exception('Optional parameters cannot precede required ones: ' 454 raise Exception('Optional parameters cannot precede required ones: '
453 + str(params)) 455 + str(param_info))
454 required.append(FormatParam(param_info)) 456 required.append(FormatParam(param_info))
455 needs_named = optional and self.requires_named_arguments and not force_optio nal 457 needs_named = optional and self.requires_named_arguments and not force_optio nal
456 return (required, optional, needs_named) 458 return (required, optional, needs_named)
457 459
458 def ParametersAsDecStringList(self, rename_type, force_optional=False): 460 def ParametersAsDecStringList(self, rename_type, force_optional=False):
459 """Returns a list of strings where each string corresponds to a parameter 461 """Returns a list of strings where each string corresponds to a parameter
460 declaration. All of the optional/named parameters if any will appear as 462 declaration. All of the optional/named parameters if any will appear as
461 a single entry at the end of the list. 463 a single entry at the end of the list.
462 """ 464 """
463 (required, optional, needs_named) = \ 465 (required, optional, needs_named) = \
(...skipping 802 matching lines...) Expand 10 before | Expand all | Expand 10 after
1266 1268
1267 def TypeInfo(self, type_name): 1269 def TypeInfo(self, type_name):
1268 if not type_name in self._cache: 1270 if not type_name in self._cache:
1269 self._cache[type_name] = self._TypeInfo(type_name) 1271 self._cache[type_name] = self._TypeInfo(type_name)
1270 return self._cache[type_name] 1272 return self._cache[type_name]
1271 1273
1272 def DartType(self, type_name): 1274 def DartType(self, type_name):
1273 return self.TypeInfo(type_name).dart_type() 1275 return self.TypeInfo(type_name).dart_type()
1274 1276
1275 def _TypeInfo(self, type_name): 1277 def _TypeInfo(self, type_name):
1276 match = re.match(r'(?:sequence<(\w+)>|(\w+)\[\])$', type_name) 1278 match = re.match(r'(?:sequence<([\w ]+)>|(\w+)\[\])$', type_name)
1277 if match: 1279 if match:
1278 type_data = TypeData('Sequence') 1280 type_data = TypeData('Sequence')
1279 item_info = self.TypeInfo(match.group(1) or match.group(2)) 1281 item_info = self.TypeInfo(match.group(1) or match.group(2))
1280 # TODO(vsm): Generalize this code. 1282 # TODO(vsm): Generalize this code.
1281 if 'SourceInfo' in type_name: 1283 if 'SourceInfo' in type_name:
1282 type_data.native_type = 'const Vector<RefPtr<SourceInfo> >& ' 1284 type_data.native_type = 'const Vector<RefPtr<SourceInfo> >& '
1283 return SequenceIDLTypeInfo(type_name, type_data, item_info) 1285 return SequenceIDLTypeInfo(type_name, type_data, item_info)
1284 1286
1285 if not type_name in _idl_type_registry: 1287 if not type_name in _idl_type_registry:
1286 if self._database.HasEnum(type_name): 1288 if self._database.HasEnum(type_name):
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
1323 if type_data.clazz == 'BasicTypedList': 1325 if type_data.clazz == 'BasicTypedList':
1324 if type_name == 'ArrayBuffer': 1326 if type_name == 'ArrayBuffer':
1325 dart_interface_name = 'ByteBuffer' 1327 dart_interface_name = 'ByteBuffer'
1326 else: 1328 else:
1327 dart_interface_name = self._renamer.RenameInterfaceId(type_name) 1329 dart_interface_name = self._renamer.RenameInterfaceId(type_name)
1328 return BasicTypedListIDLTypeInfo( 1330 return BasicTypedListIDLTypeInfo(
1329 type_name, type_data, dart_interface_name, self) 1331 type_name, type_data, dart_interface_name, self)
1330 1332
1331 class_name = '%sIDLTypeInfo' % type_data.clazz 1333 class_name = '%sIDLTypeInfo' % type_data.clazz
1332 return globals()[class_name](type_name, type_data) 1334 return globals()[class_name](type_name, type_data)
OLDNEW
« no previous file with comments | « tools/dom/scripts/databasebuilder.py ('k') | tools/dom/scripts/htmlrenamer.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698