OLD | NEW |
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 re | 9 import re |
10 | 10 |
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
124 # against dart:dom to load in a worker isolate. | 124 # against dart:dom to load in a worker isolate. |
125 return '*' + javascript_binding_name | 125 return '*' + javascript_binding_name |
126 | 126 |
127 | 127 |
128 def MatchSourceFilter(filter, thing): | 128 def MatchSourceFilter(filter, thing): |
129 if not filter: | 129 if not filter: |
130 return True | 130 return True |
131 else: | 131 else: |
132 return any(token in thing.annotations for token in filter) | 132 return any(token in thing.annotations for token in filter) |
133 | 133 |
| 134 |
134 def DartType(idl_type_name): | 135 def DartType(idl_type_name): |
135 return GetIDLTypeInfo(idl_type_name).dart_type() | 136 return GetIDLTypeInfo(idl_type_name).dart_type() |
136 | 137 |
| 138 |
| 139 class ParamInfo(object): |
| 140 """Holder for various information about a parameter of a Dart operation. |
| 141 |
| 142 Attributes: |
| 143 name: Name of parameter. |
| 144 type_id: Original type id. None for merged types. |
| 145 dart_type: DartType of parameter. |
| 146 default_value: String holding the expression. None for mandatory parameter. |
| 147 """ |
| 148 def __init__(self, name, type_id, dart_type, default_value): |
| 149 self.name = name |
| 150 self.type_id = type_id |
| 151 self.dart_type = dart_type |
| 152 self.default_value = default_value |
| 153 |
| 154 |
137 # Given a list of overloaded arguments, render a dart argument. | 155 # Given a list of overloaded arguments, render a dart argument. |
138 def _DartArg(args, interface): | 156 def _DartArg(args, interface): |
139 # Given a list of overloaded arguments, choose a suitable name. | 157 # Given a list of overloaded arguments, choose a suitable name. |
140 def OverloadedName(args): | 158 def OverloadedName(args): |
141 return '_OR_'.join(sorted(set(arg.id for arg in args))) | 159 return '_OR_'.join(sorted(set(arg.id for arg in args))) |
142 | 160 |
143 # Given a list of overloaded arguments, choose a suitable type. | 161 # Given a list of overloaded arguments, choose a suitable type. |
144 def OverloadedType(args): | 162 def OverloadedType(args): |
145 typeIds = sorted(set(DartType(arg.type.id) for arg in args)) | 163 type_ids = sorted(set(arg.type.id for arg in args)) |
146 if len(typeIds) == 1: | 164 dart_types = sorted(set(DartType(arg.type.id) for arg in args)) |
147 return typeIds[0] | 165 if len(dart_types) == 1: |
| 166 if len(type_ids) == 1: |
| 167 return (type_ids[0], dart_types[0]) |
| 168 else: |
| 169 return (None, dart_types[0]) |
148 else: | 170 else: |
149 return TypeName(typeIds, interface) | 171 return (None, TypeName(type_ids, interface)) |
150 | 172 |
151 filtered = filter(None, args) | 173 filtered = filter(None, args) |
152 optional = any(not arg or arg.is_optional for arg in args) | 174 optional = any(not arg or arg.is_optional for arg in args) |
153 type = OverloadedType(filtered) | 175 (type_id, dart_type) = OverloadedType(filtered) |
154 name = OverloadedName(filtered) | 176 name = OverloadedName(filtered) |
155 if optional: | 177 if optional: |
156 return (name, type, 'null') | 178 return ParamInfo(name, type_id, dart_type, 'null') |
157 else: | 179 else: |
158 return (name, type, None) | 180 return ParamInfo(name, type_id, dart_type, None) |
159 | 181 |
160 | 182 |
161 def AnalyzeOperation(interface, operations): | 183 def AnalyzeOperation(interface, operations): |
162 """Makes operation calling convention decision for a set of overloads. | 184 """Makes operation calling convention decision for a set of overloads. |
163 | 185 |
164 Returns: An OperationInfo object. | 186 Returns: An OperationInfo object. |
165 """ | 187 """ |
166 | 188 |
167 # Zip together arguments from each overload by position, then convert | 189 # Zip together arguments from each overload by position, then convert |
168 # to a dart argument. | 190 # to a dart argument. |
169 args = map(lambda *args: _DartArg(args, interface), | 191 args = map(lambda *args: _DartArg(args, interface), |
170 *(op.arguments for op in operations)) | 192 *(op.arguments for op in operations)) |
171 | 193 |
172 info = OperationInfo() | 194 info = OperationInfo() |
173 info.overloads = operations | 195 info.overloads = operations |
174 info.declared_name = operations[0].id | 196 info.declared_name = operations[0].id |
175 info.name = operations[0].ext_attrs.get('DartName', info.declared_name) | 197 info.name = operations[0].ext_attrs.get('DartName', info.declared_name) |
176 info.js_name = info.declared_name | 198 info.js_name = info.declared_name |
177 info.type_name = DartType(operations[0].type.id) # TODO: widen. | 199 info.type_name = DartType(operations[0].type.id) # TODO: widen. |
178 info.arg_infos = args | 200 info.param_infos = args |
179 return info | 201 return info |
180 | 202 |
181 | 203 |
182 def AnalyzeConstructor(interface): | 204 def AnalyzeConstructor(interface): |
183 """Returns an OperationInfo object for the constructor. | 205 """Returns an OperationInfo object for the constructor. |
184 | 206 |
185 Returns None if the interface has no Constructor. | 207 Returns None if the interface has no Constructor. |
186 """ | 208 """ |
187 def GetArgs(func_value): | 209 def GetArgs(func_value): |
188 return map(lambda arg: _DartArg([arg], interface), func_value.arguments) | 210 return map(lambda arg: _DartArg([arg], interface), func_value.arguments) |
(...skipping 17 matching lines...) Expand all Loading... |
206 else: | 228 else: |
207 return None | 229 return None |
208 | 230 |
209 info = OperationInfo() | 231 info = OperationInfo() |
210 info.overloads = None | 232 info.overloads = None |
211 info.idl_args = idl_args | 233 info.idl_args = idl_args |
212 info.declared_name = name | 234 info.declared_name = name |
213 info.name = name | 235 info.name = name |
214 info.js_name = name | 236 info.js_name = name |
215 info.type_name = interface.id | 237 info.type_name = interface.id |
216 info.arg_infos = args | 238 info.param_infos = args |
217 return info | 239 return info |
218 | 240 |
219 | 241 |
220 def RecognizeCallback(interface): | 242 def RecognizeCallback(interface): |
221 """Returns the info for the callback method if the interface smells like a | 243 """Returns the info for the callback method if the interface smells like a |
222 callback. | 244 callback. |
223 """ | 245 """ |
224 if 'Callback' not in interface.ext_attrs: return None | 246 if 'Callback' not in interface.ext_attrs: return None |
225 handlers = [op for op in interface.operations if op.id == 'handleEvent'] | 247 handlers = [op for op in interface.operations if op.id == 'handleEvent'] |
226 if not handlers: return None | 248 if not handlers: return None |
(...skipping 23 matching lines...) Expand all Loading... |
250 attr.id is the 'native' or JavaScript name. | 272 attr.id is the 'native' or JavaScript name. |
251 | 273 |
252 To ensure uniformity, work with the true IDL name until as late a possible, | 274 To ensure uniformity, work with the true IDL name until as late a possible, |
253 e.g. translate to the Dart name when generating Dart code. | 275 e.g. translate to the Dart name when generating Dart code. |
254 """ | 276 """ |
255 name = attr.id | 277 name = attr.id |
256 name = _dart_attribute_renames.get(name, name) | 278 name = _dart_attribute_renames.get(name, name) |
257 name = attr.ext_attrs.get('DartName', None) or name | 279 name = attr.ext_attrs.get('DartName', None) or name |
258 return name | 280 return name |
259 | 281 |
| 282 |
| 283 def TypeOrNothing(dart_type, comment=None): |
| 284 """Returns string for declaring something with |dart_type| in a context |
| 285 where a type may be omitted. |
| 286 The string is empty or has a trailing space. |
| 287 """ |
| 288 if dart_type == 'Dynamic': |
| 289 if comment: |
| 290 return '/*%s*/ ' % comment # Just a comment foo(/*T*/ x) |
| 291 else: |
| 292 return '' # foo(x) looks nicer than foo(Dynamic x) |
| 293 else: |
| 294 return dart_type + ' ' |
| 295 |
| 296 |
| 297 def TypeOrVar(dart_type, comment=None): |
| 298 """Returns string for declaring something with |dart_type| in a context |
| 299 where if a type is omitted, 'var' must be used instead.""" |
| 300 if dart_type == 'Dynamic': |
| 301 if comment: |
| 302 return 'var /*%s*/' % comment # e.g. var /*T*/ x; |
| 303 else: |
| 304 return 'var' # e.g. var x; |
| 305 else: |
| 306 return dart_type |
| 307 |
| 308 |
260 class OperationInfo(object): | 309 class OperationInfo(object): |
261 """Holder for various derived information from a set of overloaded operations. | 310 """Holder for various derived information from a set of overloaded operations. |
262 | 311 |
263 Attributes: | 312 Attributes: |
264 overloads: A list of IDL operation overloads with the same name. | 313 overloads: A list of IDL operation overloads with the same name. |
265 name: A string, the simple name of the operation. | 314 name: A string, the simple name of the operation. |
266 type_name: A string, the name of the return type of the operation. | 315 type_name: A string, the name of the return type of the operation. |
267 arg_infos: A list of (name, type, default_value) tuples. | 316 param_infos: A list of ParamInfo. |
268 default_value is None for mandatory arguments. | |
269 """ | 317 """ |
270 | 318 |
271 def ParametersInterfaceDeclaration(self): | 319 def ParametersInterfaceDeclaration(self): |
272 """Returns a formatted string declaring the parameters for the interface.""" | 320 """Returns a formatted string declaring the parameters for the interface.""" |
273 return self._FormatArgs(self.arg_infos, True) | 321 return self._FormatParams( |
| 322 self.param_infos, True, |
| 323 lambda param: TypeOrNothing(param.dart_type, param.type_id)) |
274 | 324 |
275 def ParametersImplementationDeclaration(self, rename_type=None): | 325 def ParametersImplementationDeclaration(self, rename_type=None): |
276 """Returns a formatted string declaring the parameters for the | 326 """Returns a formatted string declaring the parameters for the |
277 implementation. | 327 implementation. |
278 | 328 |
279 Args: | 329 Args: |
280 rename_type: A function that allows the types to be renamed. | 330 rename_type: A function that allows the types to be renamed. |
| 331 The function is applied to the parameter's dart_type. |
281 """ | 332 """ |
282 args = self.arg_infos | |
283 if rename_type: | 333 if rename_type: |
284 args = [(name, rename_type(type), default) | 334 def renamer(param_info): |
285 for (name, type, default) in args] | 335 return TypeOrNothing(rename_type(param_info.dart_type)) |
286 return self._FormatArgs(args, False) | 336 return self._FormatParams(self.param_infos, False, renamer) |
| 337 else: |
| 338 def type_fn(param_info): |
| 339 if param_info.dart_type == 'Dynamic': |
| 340 if param_info.type_id: |
| 341 # It is more informative to use a comment IDL type. |
| 342 return '/*%s*/' % param_info.type_id |
| 343 else: |
| 344 return 'var' |
| 345 else: |
| 346 return param_info.dart_type |
| 347 return self._FormatParams( |
| 348 self.param_infos, False, |
| 349 lambda param: TypeOrNothing(param.dart_type, param.type_id)) |
287 | 350 |
288 def ParametersAsArgumentList(self): | 351 def ParametersAsArgumentList(self): |
289 """Returns a formatted string declaring the parameters names as an argument | 352 """Returns a string of the parameter names suitable for passing the |
290 list. | 353 parameters as arguments. |
291 """ | 354 """ |
292 return ', '.join(map(lambda arg_info: arg_info[0], self.arg_infos)) | 355 return ', '.join(map(lambda param_info: param_info.name, self.param_infos)) |
293 | 356 |
294 def _FormatArgs(self, args, is_interface): | 357 def _FormatParams(self, params, is_interface, type_fn): |
295 def FormatArg(arg_info): | 358 def FormatParam(param): |
296 """Returns an argument declaration fragment for an argument info tuple.""" | 359 """Returns a parameter declaration fragment for an ParamInfo.""" |
297 (name, type, default) = arg_info | 360 type = type_fn(param) |
298 if default: | 361 if is_interface or param.default_value is None: |
299 return '%s %s = %s' % (type, name, default) | 362 return '%s%s' % (type, param.name) |
300 else: | 363 else: |
301 return '%s %s' % (type, name) | 364 return '%s%s = %s' % (type, param.name, param.default_value) |
302 | 365 |
303 required = [] | 366 required = [] |
304 optional = [] | 367 optional = [] |
305 for (name, type, default) in args: | 368 for param_info in params: |
306 if default: | 369 if param_info.default_value: |
307 if is_interface: | 370 optional.append(param_info) |
308 optional.append((name, type, None)) # Default values illegal. | |
309 else: | |
310 optional.append((name, type, default)) | |
311 else: | 371 else: |
312 if optional: | 372 if optional: |
313 raise Exception('Optional arguments cannot precede required ones: ' | 373 raise Exception('Optional parameters cannot precede required ones: ' |
314 + str(args)) | 374 + str(args)) |
315 required.append((name, type, None)) | 375 required.append(param_info) |
316 argtexts = map(FormatArg, required) | 376 argtexts = map(FormatParam, required) |
317 if optional: | 377 if optional: |
318 argtexts.append('[' + ', '.join(map(FormatArg, optional)) + ']') | 378 argtexts.append('[' + ', '.join(map(FormatParam, optional)) + ']') |
319 return ', '.join(argtexts) | 379 return ', '.join(argtexts) |
320 | 380 |
321 | 381 |
322 def AttributeOutputOrder(a, b): | 382 def AttributeOutputOrder(a, b): |
323 """Canonical output ordering for attributes.""" | 383 """Canonical output ordering for attributes.""" |
324 # Getters before setters: | 384 # Getters before setters: |
325 if a.id < b.id: return -1 | 385 if a.id < b.id: return -1 |
326 if a.id > b.id: return 1 | 386 if a.id > b.id: return 1 |
327 if a.is_fc_setter < b.is_fc_setter: return -1 | 387 if a.is_fc_setter < b.is_fc_setter: return -1 |
328 if a.is_fc_setter > b.is_fc_setter: return 1 | 388 if a.is_fc_setter > b.is_fc_setter: return 1 |
(...skipping 21 matching lines...) Expand all Loading... |
350 """Format lines of text with indent.""" | 410 """Format lines of text with indent.""" |
351 def FormatLine(line): | 411 def FormatLine(line): |
352 if line.strip(): | 412 if line.strip(): |
353 return '%s%s\n' % (indent, line) | 413 return '%s%s\n' % (indent, line) |
354 else: | 414 else: |
355 return '\n' | 415 return '\n' |
356 return ''.join(FormatLine(line) for line in text.split('\n')) | 416 return ''.join(FormatLine(line) for line in text.split('\n')) |
357 | 417 |
358 # Given a sorted sequence of type identifiers, return an appropriate type | 418 # Given a sorted sequence of type identifiers, return an appropriate type |
359 # name | 419 # name |
360 def TypeName(typeIds, interface): | 420 def TypeName(type_ids, interface): |
361 # Dynamically type this field for now. | 421 # Dynamically type this field for now. |
362 return 'var' | 422 return 'Dynamic' |
363 | 423 |
364 # ------------------------------------------------------------------------------ | 424 # ------------------------------------------------------------------------------ |
365 | 425 |
366 class IDLTypeInfo(object): | 426 class IDLTypeInfo(object): |
367 def __init__(self, idl_type, dart_type=None, native_type=None, ref_counted=Tru
e, | 427 def __init__(self, idl_type, dart_type=None, |
| 428 native_type=None, ref_counted=True, |
368 has_dart_wrapper=True, conversion_template=None, | 429 has_dart_wrapper=True, conversion_template=None, |
369 custom_to_dart=False, conversion_includes=[]): | 430 custom_to_dart=False, conversion_includes=[]): |
370 self._idl_type = idl_type | 431 self._idl_type = idl_type |
371 self._dart_type = dart_type | 432 self._dart_type = dart_type |
372 self._native_type = native_type | 433 self._native_type = native_type |
373 self._ref_counted = ref_counted | 434 self._ref_counted = ref_counted |
374 self._has_dart_wrapper = has_dart_wrapper | 435 self._has_dart_wrapper = has_dart_wrapper |
375 self._conversion_template = conversion_template | 436 self._conversion_template = conversion_template |
376 self._custom_to_dart = custom_to_dart | 437 self._custom_to_dart = custom_to_dart |
377 self._conversion_includes = conversion_includes | 438 self._conversion_includes = conversion_includes |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
434 include = self._idl_type.replace('Abs', '').replace('Rel', '') | 495 include = self._idl_type.replace('Abs', '').replace('Rel', '') |
435 else: | 496 else: |
436 include = self._idl_type | 497 include = self._idl_type |
437 return ['"%s.h"' % include] + _svg_supplemental_includes | 498 return ['"%s.h"' % include] + _svg_supplemental_includes |
438 | 499 |
439 def receiver(self): | 500 def receiver(self): |
440 return 'receiver->' | 501 return 'receiver->' |
441 | 502 |
442 def conversion_includes(self): | 503 def conversion_includes(self): |
443 def NeededDartTypes(type_name): | 504 def NeededDartTypes(type_name): |
| 505 if re.match(r'Dynamic(\/.*)?$', type_name): return [] |
444 match = re.match(r'List<(\w*)>$', type_name) | 506 match = re.match(r'List<(\w*)>$', type_name) |
445 if match: | 507 if match: |
446 return NeededDartTypes(match.group(1)) | 508 return NeededDartTypes(match.group(1)) |
447 return [type_name] | 509 return [type_name] |
448 | 510 |
449 return ['"Dart%s.h"' % include for include in NeededDartTypes(self.dart_type
()) + self._conversion_includes] | 511 return ['"Dart%s.h"' % include |
| 512 for include in |
| 513 NeededDartTypes(self.dart_type()) + self._conversion_includes] |
450 | 514 |
451 def conversion_cast(self, expression): | 515 def conversion_cast(self, expression): |
452 if self._conversion_template: | 516 if self._conversion_template: |
453 return self._conversion_template % expression | 517 return self._conversion_template % expression |
454 return expression | 518 return expression |
455 | 519 |
456 def custom_to_dart(self): | 520 def custom_to_dart(self): |
457 return self._custom_to_dart | 521 return self._custom_to_dart |
458 | 522 |
459 class PrimitiveIDLTypeInfo(IDLTypeInfo): | 523 class PrimitiveIDLTypeInfo(IDLTypeInfo): |
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
561 'sequence': PrimitiveIDLTypeInfo('sequence', dart_type='List'), | 625 'sequence': PrimitiveIDLTypeInfo('sequence', dart_type='List'), |
562 'void': PrimitiveIDLTypeInfo('void', dart_type='void'), | 626 'void': PrimitiveIDLTypeInfo('void', dart_type='void'), |
563 | 627 |
564 'CSSRule': IDLTypeInfo('CSSRule', conversion_includes=['CSSImportRule']), | 628 'CSSRule': IDLTypeInfo('CSSRule', conversion_includes=['CSSImportRule']), |
565 'DOMException': IDLTypeInfo('DOMCoreException', dart_type='DOMException'), | 629 'DOMException': IDLTypeInfo('DOMCoreException', dart_type='DOMException'), |
566 'DOMWindow': IDLTypeInfo('DOMWindow', custom_to_dart=True), | 630 'DOMWindow': IDLTypeInfo('DOMWindow', custom_to_dart=True), |
567 'Element': IDLTypeInfo('Element', custom_to_dart=True), | 631 'Element': IDLTypeInfo('Element', custom_to_dart=True), |
568 'EventListener': IDLTypeInfo('EventListener', has_dart_wrapper=False), | 632 'EventListener': IDLTypeInfo('EventListener', has_dart_wrapper=False), |
569 'EventTarget': IDLTypeInfo('EventTarget', has_dart_wrapper=False), | 633 'EventTarget': IDLTypeInfo('EventTarget', has_dart_wrapper=False), |
570 'HTMLElement': IDLTypeInfo('HTMLElement', custom_to_dart=True), | 634 'HTMLElement': IDLTypeInfo('HTMLElement', custom_to_dart=True), |
571 'IDBKey': IDLTypeInfo('IDBKey', has_dart_wrapper=False), | 635 'IDBAny': IDLTypeInfo('IDBAny', dart_type='Dynamic', |
| 636 native_type='IDBAny', |
| 637 has_dart_wrapper=False, |
| 638 conversion_includes=['IDBAny']), |
| 639 'IDBKey': IDLTypeInfo('IDBKey', dart_type='Dynamic', |
| 640 native_type='IDBKey', |
| 641 has_dart_wrapper=False, |
| 642 conversion_includes=['IDBKey']), |
572 'MediaQueryListListener': IDLTypeInfo('MediaQueryListListener', has_dart_wra
pper=False), | 643 'MediaQueryListListener': IDLTypeInfo('MediaQueryListListener', has_dart_wra
pper=False), |
573 'OptionsObject': IDLTypeInfo('OptionsObject', has_dart_wrapper=False), | 644 'OptionsObject': IDLTypeInfo('OptionsObject', has_dart_wrapper=False), |
574 'StyleSheet': IDLTypeInfo('StyleSheet', conversion_includes=['CSSStyleSheet'
]), | 645 'StyleSheet': IDLTypeInfo('StyleSheet', conversion_includes=['CSSStyleSheet'
]), |
575 'SVGElement': IDLTypeInfo('SVGElement', custom_to_dart=True), | 646 'SVGElement': IDLTypeInfo('SVGElement', custom_to_dart=True), |
576 | 647 |
577 'SVGAngle': SVGTearOffIDLTypeInfo('SVGAngle'), | 648 'SVGAngle': SVGTearOffIDLTypeInfo('SVGAngle'), |
578 'SVGLength': SVGTearOffIDLTypeInfo('SVGLength'), | 649 'SVGLength': SVGTearOffIDLTypeInfo('SVGLength'), |
579 'SVGLengthList': SVGTearOffIDLTypeInfo('SVGLengthList', ref_counted=False), | 650 'SVGLengthList': SVGTearOffIDLTypeInfo('SVGLengthList', ref_counted=False), |
580 'SVGMatrix': SVGTearOffIDLTypeInfo('SVGMatrix'), | 651 'SVGMatrix': SVGTearOffIDLTypeInfo('SVGMatrix'), |
581 'SVGNumber': SVGTearOffIDLTypeInfo('SVGNumber', native_type='SVGPropertyTear
Off<float>'), | 652 'SVGNumber': SVGTearOffIDLTypeInfo('SVGNumber', native_type='SVGPropertyTear
Off<float>'), |
(...skipping 12 matching lines...) Expand all Loading... |
594 '"SVGAnimatedPropertyTearOff.h"', | 665 '"SVGAnimatedPropertyTearOff.h"', |
595 '"SVGAnimatedListPropertyTearOff.h"', | 666 '"SVGAnimatedListPropertyTearOff.h"', |
596 '"SVGStaticListPropertyTearOff.h"', | 667 '"SVGStaticListPropertyTearOff.h"', |
597 '"SVGAnimatedListPropertyTearOff.h"', | 668 '"SVGAnimatedListPropertyTearOff.h"', |
598 '"SVGTransformListPropertyTearOff.h"', | 669 '"SVGTransformListPropertyTearOff.h"', |
599 '"SVGPathSegListPropertyTearOff.h"', | 670 '"SVGPathSegListPropertyTearOff.h"', |
600 ] | 671 ] |
601 | 672 |
602 def GetIDLTypeInfo(idl_type_name): | 673 def GetIDLTypeInfo(idl_type_name): |
603 return _idl_type_registry.get(idl_type_name, IDLTypeInfo(idl_type_name)) | 674 return _idl_type_registry.get(idl_type_name, IDLTypeInfo(idl_type_name)) |
OLD | NEW |