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

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

Issue 10698108: Stop passing HtmlSystemShared around and move html renaming to IDLTypeInfo. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: . Created 8 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 unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « lib/dom/scripts/dartgenerator.py ('k') | lib/dom/scripts/systembase.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 re 10 import re
(...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after
161 # is useful not only for browser compat, but to allow code that links 161 # is useful not only for browser compat, but to allow code that links
162 # against dart:dom_deprecated to load in a worker isolate. 162 # against dart:dom_deprecated to load in a worker isolate.
163 return '*' + javascript_binding_name 163 return '*' + javascript_binding_name
164 164
165 165
166 def MatchSourceFilter(thing): 166 def MatchSourceFilter(thing):
167 return 'WebKit' in thing.annotations or 'Dart' in thing.annotations 167 return 'WebKit' in thing.annotations or 'Dart' in thing.annotations
168 168
169 169
170 def DartType(idl_type_name): 170 def DartType(idl_type_name):
171 return TypeRegistry().TypeInfo(idl_type_name).dart_type() 171 if idl_type_name in _idl_type_registry:
172 return _idl_type_registry[idl_type_name].get('dart_type', idl_type_name)
173 return idl_type_name
172 174
173 175
174 class ParamInfo(object): 176 class ParamInfo(object):
175 """Holder for various information about a parameter of a Dart operation. 177 """Holder for various information about a parameter of a Dart operation.
176 178
177 Attributes: 179 Attributes:
178 name: Name of parameter. 180 name: Name of parameter.
179 type_id: Original type id. None for merged types. 181 type_id: Original type id. None for merged types.
180 dart_type: DartType of parameter. 182 dart_type: DartType of parameter.
181 is_optional: Parameter optionality. 183 is_optional: Parameter optionality.
(...skipping 15 matching lines...) Expand all
197 # Given a list of overloaded arguments, choose a suitable name. 199 # Given a list of overloaded arguments, choose a suitable name.
198 def OverloadedName(args): 200 def OverloadedName(args):
199 return '_OR_'.join(sorted(set(arg.id for arg in args))) 201 return '_OR_'.join(sorted(set(arg.id for arg in args)))
200 202
201 # Given a list of overloaded arguments, choose a suitable type. 203 # Given a list of overloaded arguments, choose a suitable type.
202 def OverloadedType(args): 204 def OverloadedType(args):
203 type_ids = sorted(set(arg.type.id for arg in args)) 205 type_ids = sorted(set(arg.type.id for arg in args))
204 dart_types = sorted(set(DartType(arg.type.id) for arg in args)) 206 dart_types = sorted(set(DartType(arg.type.id) for arg in args))
205 if len(dart_types) == 1: 207 if len(dart_types) == 1:
206 if len(type_ids) == 1: 208 if len(type_ids) == 1:
207 return (type_ids[0], dart_types[0]) 209 return (type_ids[0], type_ids[0])
208 else: 210 else:
209 return (None, dart_types[0]) 211 return (None, type_ids[0])
210 else: 212 else:
211 return (None, TypeName(type_ids, interface)) 213 return (None, TypeName(type_ids, interface))
212 214
213 def IsOptional(argument): 215 def IsOptional(argument):
214 if not argument: 216 if not argument:
215 return True 217 return True
216 if 'Callback' in argument.ext_attrs: 218 if 'Callback' in argument.ext_attrs:
217 # Callbacks with 'Optional=XXX' are treated as optional arguments. 219 # Callbacks with 'Optional=XXX' are treated as optional arguments.
218 return 'Optional' in argument.ext_attrs 220 return 'Optional' in argument.ext_attrs
219 if constructor: 221 if constructor:
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
253 args = map(lambda *args: _DartArg(args, interface), 255 args = map(lambda *args: _DartArg(args, interface),
254 *(op.arguments for op in split_operations)) 256 *(op.arguments for op in split_operations))
255 257
256 info = OperationInfo() 258 info = OperationInfo()
257 info.operations = operations 259 info.operations = operations
258 info.overloads = split_operations 260 info.overloads = split_operations
259 info.declared_name = operations[0].id 261 info.declared_name = operations[0].id
260 info.name = operations[0].ext_attrs.get('DartName', info.declared_name) 262 info.name = operations[0].ext_attrs.get('DartName', info.declared_name)
261 info.constructor_name = None 263 info.constructor_name = None
262 info.js_name = info.declared_name 264 info.js_name = info.declared_name
263 info.type_name = DartType(operations[0].type.id) # TODO: widen. 265 info.type_name = operations[0].type.id # TODO: widen.
264 info.param_infos = args 266 info.param_infos = args
265 return info 267 return info
266 268
267 269
268 def AnalyzeConstructor(interface): 270 def AnalyzeConstructor(interface):
269 """Returns an OperationInfo object for the constructor. 271 """Returns an OperationInfo object for the constructor.
270 272
271 Returns None if the interface has no Constructor. 273 Returns None if the interface has no Constructor.
272 """ 274 """
273 def GetArgs(func_value): 275 def GetArgs(func_value):
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after
375 377
376 Attributes: 378 Attributes:
377 overloads: A list of IDL operation overloads with the same name. 379 overloads: A list of IDL operation overloads with the same name.
378 name: A string, the simple name of the operation. 380 name: A string, the simple name of the operation.
379 constructor_name: A string, the name of the constructor iff the constructor 381 constructor_name: A string, the name of the constructor iff the constructor
380 is named, e.g. 'fromList' in Int8Array.fromList(list). 382 is named, e.g. 'fromList' in Int8Array.fromList(list).
381 type_name: A string, the name of the return type of the operation. 383 type_name: A string, the name of the return type of the operation.
382 param_infos: A list of ParamInfo. 384 param_infos: A list of ParamInfo.
383 """ 385 """
384 386
385 def ParametersInterfaceDeclaration(self, rename_type=lambda x: x): 387 def ParametersInterfaceDeclaration(self, rename_type):
386 """Returns a formatted string declaring the parameters for the interface.""" 388 """Returns a formatted string declaring the parameters for the interface."""
387 return self._FormatParams( 389 return self._FormatParams(
388 self.param_infos, None, 390 self.param_infos, None,
389 lambda param: TypeOrNothing(rename_type(param.dart_type), param.type_id) ) 391 lambda param: TypeOrNothing(rename_type(param.dart_type), param.type_id) )
390 392
391 def ParametersImplementationDeclaration( 393 def ParametersImplementationDeclaration(
392 self, rename_type=None, default_value='null'): 394 self, rename_type, default_value='null'):
393 """Returns a formatted string declaring the parameters for the 395 """Returns a formatted string declaring the parameters for the
394 implementation. 396 implementation.
395 397
396 Args: 398 Args:
397 rename_type: A function that allows the types to be renamed. 399 rename_type: A function that allows the types to be renamed.
398 The function is applied to the parameter's dart_type. 400 The function is applied to the parameter's dart_type.
399 """ 401 """
400 if rename_type: 402 return self._FormatParams(
401 def renamer(param_info): 403 self.param_infos, default_value,
402 return TypeOrNothing(rename_type(param_info.dart_type)) 404 lambda param: TypeOrNothing(rename_type(param.dart_type)))
403 return self._FormatParams(self.param_infos, default_value, renamer)
404 else:
405 def type_fn(param_info):
406 if param_info.dart_type == 'Dynamic':
407 if param_info.type_id:
408 # It is more informative to use a comment IDL type.
409 return '/*%s*/' % param_info.type_id
410 else:
411 return 'var'
412 else:
413 return param_info.dart_type
414 return self._FormatParams(
415 self.param_infos, default_value,
416 lambda param: TypeOrNothing(param.dart_type, param.type_id))
417 405
418 def ParametersAsArgumentList(self): 406 def ParametersAsArgumentList(self):
419 """Returns a string of the parameter names suitable for passing the 407 """Returns a string of the parameter names suitable for passing the
420 parameters as arguments. 408 parameters as arguments.
421 """ 409 """
422 return ', '.join(map(lambda param_info: param_info.name, self.param_infos)) 410 return ', '.join(map(lambda param_info: param_info.name, self.param_infos))
423 411
424 def _FormatParams(self, params, default_value, type_fn): 412 def _FormatParams(self, params, default_value, type_fn):
425 def FormatParam(param): 413 def FormatParam(param):
426 """Returns a parameter declaration fragment for an ParamInfo.""" 414 """Returns a parameter declaration fragment for an ParamInfo."""
(...skipping 387 matching lines...) Expand 10 before | Expand all | Expand 10 after
814 _svg_supplemental_includes = [ 802 _svg_supplemental_includes = [
815 '"SVGAnimatedPropertyTearOff.h"', 803 '"SVGAnimatedPropertyTearOff.h"',
816 '"SVGAnimatedListPropertyTearOff.h"', 804 '"SVGAnimatedListPropertyTearOff.h"',
817 '"SVGStaticListPropertyTearOff.h"', 805 '"SVGStaticListPropertyTearOff.h"',
818 '"SVGAnimatedListPropertyTearOff.h"', 806 '"SVGAnimatedListPropertyTearOff.h"',
819 '"SVGTransformListPropertyTearOff.h"', 807 '"SVGTransformListPropertyTearOff.h"',
820 '"SVGPathSegListPropertyTearOff.h"', 808 '"SVGPathSegListPropertyTearOff.h"',
821 ] 809 ]
822 810
823 class TypeRegistry(object): 811 class TypeRegistry(object):
824 def __init__(self): 812 def __init__(self, interface_renames):
813 self._interface_renames = interface_renames
825 self._cache = {} 814 self._cache = {}
826 815
827 def TypeInfo(self, type_name): 816 def TypeInfo(self, type_name):
828 if not type_name in self._cache: 817 if not type_name in self._cache:
829 self._cache[type_name] = self._TypeInfo(type_name) 818 self._cache[type_name] = self._TypeInfo(type_name)
830 return self._cache[type_name] 819 return self._cache[type_name]
831 820
821 def DartType(self, type_name):
822 dart_type = self.TypeInfo(type_name).dart_type()
823 return self._interface_renames.get(dart_type, dart_type)
824
825 def InterfaceName(self, type_name):
826 return self._interface_renames.get(type_name, type_name)
827
832 def _TypeInfo(self, type_name): 828 def _TypeInfo(self, type_name):
833 match = re.match(r'(?:sequence<(\w+)>|(\w+)\[\])$', type_name) 829 match = re.match(r'(?:sequence<(\w+)>|(\w+)\[\])$', type_name)
834 if match: 830 if match:
835 if type_name == 'DOMString[]': 831 if type_name == 'DOMString[]':
836 return DOMStringArrayTypeInfo(self.TypeInfo('DOMString')) 832 return DOMStringArrayTypeInfo(self.TypeInfo('DOMString'))
837 return SequenceIDLTypeInfo(type_name, self.TypeInfo(match.group(1) or matc h.group(2))) 833 return SequenceIDLTypeInfo(type_name, self.TypeInfo(match.group(1) or matc h.group(2)))
838 if not type_name in _idl_type_registry: 834 if not type_name in _idl_type_registry:
839 return InterfaceIDLTypeInfo(type_name, {}) 835 return InterfaceIDLTypeInfo(type_name, {})
840 type_data = _idl_type_registry.get(type_name) 836 type_data = _idl_type_registry.get(type_name)
841 class_name = '%sIDLTypeInfo' % type_data['type'] 837 class_name = '%sIDLTypeInfo' % type_data['type']
842 return globals()[class_name](type_name, type_data) 838 return globals()[class_name](type_name, type_data)
OLDNEW
« no previous file with comments | « lib/dom/scripts/dartgenerator.py ('k') | lib/dom/scripts/systembase.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698