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 the system to generate | 6 """This module provides shared functionality for the system to generate |
7 dart:html APIs from the IDL database.""" | 7 dart:html APIs from the IDL database.""" |
8 | 8 |
9 import emitter | 9 import emitter |
10 from generator import AnalyzeOperation, ConstantOutputOrder, \ | 10 from generator import AnalyzeOperation, ConstantOutputOrder, \ |
11 DartDomNameOfAttribute, FindMatchingAttribute, IsDartCollectionType, \ | 11 DartDomNameOfAttribute, FindMatchingAttribute, IsDartCollectionType, \ |
12 IsPureInterface, TypeOrNothing, GetAnnotationsAndComments, \ | 12 IsPureInterface, TypeOrNothing, GetAnnotationsAndComments, \ |
13 FormatAnnotationsAndComments, ConvertToFuture, GetCallbackInfo | 13 FormatAnnotationsAndComments |
14 from htmlrenamer import convert_to_future_members | |
15 | 14 |
16 # Types that are accessible cross-frame in a limited fashion. | 15 # Types that are accessible cross-frame in a limited fashion. |
17 # In these cases, the base type (e.g., WindowBase) provides restricted access | 16 # In these cases, the base type (e.g., WindowBase) provides restricted access |
18 # while the subtype (e.g., Window) provides full access to the | 17 # while the subtype (e.g., Window) provides full access to the |
19 # corresponding objects if there are from the same frame. | 18 # corresponding objects if there are from the same frame. |
20 _secure_base_types = { | 19 _secure_base_types = { |
21 'Window': 'WindowBase', | 20 'Window': 'WindowBase', |
22 'Location': 'LocationBase', | 21 'Location': 'LocationBase', |
23 'History': 'HistoryBase', | 22 'History': 'HistoryBase', |
24 } | 23 } |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
83 for operation in interface.operations: | 82 for operation in interface.operations: |
84 if operation.id not in operationsById: | 83 if operation.id not in operationsById: |
85 operationsById[operation.id] = [] | 84 operationsById[operation.id] = [] |
86 operationsById[operation.id].append(operation) | 85 operationsById[operation.id].append(operation) |
87 | 86 |
88 # Generate operations. | 87 # Generate operations. |
89 for id in sorted(operationsById.keys()): | 88 for id in sorted(operationsById.keys()): |
90 operations = operationsById[id] | 89 operations = operationsById[id] |
91 info = AnalyzeOperation(interface, operations) | 90 info = AnalyzeOperation(interface, operations) |
92 self.AddOperation(info, declare_only) | 91 self.AddOperation(info, declare_only) |
93 if ('%s.%s' % (interface.id, info.declared_name) in | |
94 convert_to_future_members): | |
95 self.AddOperation(ConvertToFuture(info), declare_only) | |
96 | 92 |
97 def AddSecondaryMembers(self, interface): | 93 def AddSecondaryMembers(self, interface): |
98 # With multiple inheritance, attributes and operations of non-first | 94 # With multiple inheritance, attributes and operations of non-first |
99 # interfaces need to be added. Sometimes the attribute or operation is | 95 # interfaces need to be added. Sometimes the attribute or operation is |
100 # defined in the current interface as well as a parent. In that case we | 96 # defined in the current interface as well as a parent. In that case we |
101 # avoid making a duplicate definition and pray that the signatures match. | 97 # avoid making a duplicate definition and pray that the signatures match. |
102 secondary_parents = self._TransitiveSecondaryParents(interface) | 98 secondary_parents = self._TransitiveSecondaryParents(interface) |
103 for parent_interface in sorted(secondary_parents): | 99 for parent_interface in sorted(secondary_parents): |
104 if isinstance(parent_interface, str): | 100 if isinstance(parent_interface, str): |
105 continue | 101 continue |
(...skipping 345 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
451 constructor_info.idl_args, | 447 constructor_info.idl_args, |
452 False, | 448 False, |
453 [info.name for info in constructor_info.param_infos], | 449 [info.name for info in constructor_info.param_infos], |
454 emitter.Format('$(ANNOTATIONS)factory $CTOR($PARAMS)', | 450 emitter.Format('$(ANNOTATIONS)factory $CTOR($PARAMS)', |
455 CTOR=constructor_info._ConstructorFullName(self._DartType), | 451 CTOR=constructor_info._ConstructorFullName(self._DartType), |
456 ANNOTATIONS=annotations, | 452 ANNOTATIONS=annotations, |
457 PARAMS=constructor_info.ParametersDeclaration(self._DartType)), | 453 PARAMS=constructor_info.ParametersDeclaration(self._DartType)), |
458 GenerateCall, | 454 GenerateCall, |
459 IsOptional) | 455 IsOptional) |
460 | 456 |
461 def _AddFutureifiedOperation(self, info, html_name): | |
462 """Given a API function that uses callbacks, convert it to using Futures. | |
463 | |
464 This conversion assumes the success callback is always provided before the | |
465 error callback (and so far in the DOM API, this is the case).""" | |
466 callback_info = GetCallbackInfo( | |
467 self._database.GetInterface(info.callback_args[0].type_id)) | |
468 | |
469 param_list = info.ParametersAsArgumentList() | |
470 annotations = '' | |
471 if '_RenamingAnnotation' in dir(self): | |
472 annotations = (self._RenamingAnnotation(info.declared_name, html_name) + | |
473 self._Annotations(info.type_name, info.declared_name)) | |
474 self._members_emitter.Emit( | |
475 '\n' | |
476 ' $ANNOTATIONS$MODIFIERS$TYPE$FUTURE_GENERIC $NAME($PARAMS) {\n' | |
477 ' var completer = new Completer$(FUTURE_GENERIC)();\n' | |
478 ' $ORIGINAL_FUNCTION($PARAMS_LIST\n' | |
479 ' $NAMED_PARAM($VARIABLE_NAME) { ' | |
480 'completer.complete($VARIABLE_NAME); }' | |
481 '$ERROR_CALLBACK);\n' | |
482 ' return completer.future;\n' | |
483 ' }\n', | |
484 ANNOTATIONS=annotations, | |
485 MODIFIERS='static ' if info.IsStatic() else '', | |
486 TYPE=self.SecureOutputType(info.type_name), | |
487 NAME=html_name[1:], | |
488 PARAMS=info.ParametersDeclaration(self._NarrowInputType | |
489 if '_NarrowInputType' in dir(self) else self._DartType), | |
490 PARAMS_LIST='' if param_list == '' else param_list + ',', | |
491 NAMED_PARAM=('%s : ' % info.callback_args[0].name | |
492 if info.requires_named_arguments and | |
493 info.callback_args[0].is_optional else ''), | |
494 VARIABLE_NAME= '' if len(callback_info.param_infos) == 0 else 'value', | |
495 ERROR_CALLBACK=('' if len(info.callback_args) == 1 else | |
496 (',\n %s(error) { completer.completeError(error); }' % | |
497 ('%s : ' % info.callback_args[1].name | |
498 if info.requires_named_arguments and | |
499 info.callback_args[1].is_optional else ''))), | |
500 FUTURE_GENERIC = ('' if len(callback_info.param_infos) == 0 or | |
501 not callback_info.param_infos[0].type_id else | |
502 '<%s>' % self._DartType(callback_info.param_infos[0].type_id)), | |
503 ORIGINAL_FUNCTION = html_name) | |
504 | |
505 def EmitHelpers(self, base_class): | 457 def EmitHelpers(self, base_class): |
506 pass | 458 pass |
507 | 459 |
508 def DeclareAttribute(self, attribute, type_name, attr_name, read_only): | 460 def DeclareAttribute(self, attribute, type_name, attr_name, read_only): |
509 """ Declares an attribute but does not include the code to invoke it. | 461 """ Declares an attribute but does not include the code to invoke it. |
510 """ | 462 """ |
511 if read_only: | 463 if read_only: |
512 template = '\n $TYPE get $NAME;\n' | 464 template = '\n $TYPE get $NAME;\n' |
513 else: | 465 else: |
514 template = '\n $TYPE $NAME;\n' | 466 template = '\n $TYPE $NAME;\n' |
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
603 walk(interface.parents) | 555 walk(interface.parents) |
604 else: | 556 else: |
605 walk(interface.parents[1:]) | 557 walk(interface.parents[1:]) |
606 return result | 558 return result |
607 | 559 |
608 def _DartType(self, type_name): | 560 def _DartType(self, type_name): |
609 return self._type_registry.DartType(type_name) | 561 return self._type_registry.DartType(type_name) |
610 | 562 |
611 def _IsPrivate(self, name): | 563 def _IsPrivate(self, name): |
612 return name.startswith('_') | 564 return name.startswith('_') |
OLD | NEW |