| 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 import logging | 10 import logging |
| (...skipping 463 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 474 code = self._library_emitter.FileEmitter(self._interface.id, | 474 code = self._library_emitter.FileEmitter(self._interface.id, |
| 475 self._library_name) | 475 self._library_name) |
| 476 code.Emit(self._template_loader.Load('callback.darttemplate')) | 476 code.Emit(self._template_loader.Load('callback.darttemplate')) |
| 477 | 477 |
| 478 annotations = self._metadata.GetFormattedMetadata(self._library_name, | 478 annotations = self._metadata.GetFormattedMetadata(self._library_name, |
| 479 self._interface) | 479 self._interface) |
| 480 | 480 |
| 481 code.Emit('$(ANNOTATIONS)typedef void $NAME($PARAMS);\n', | 481 code.Emit('$(ANNOTATIONS)typedef void $NAME($PARAMS);\n', |
| 482 ANNOTATIONS=annotations, | 482 ANNOTATIONS=annotations, |
| 483 NAME=typedef_name, | 483 NAME=typedef_name, |
| 484 PARAMS=info.ParametersDeclaration(self._DartType)) | 484 PARAMS=info.ParametersAsDeclaration(self._DartType)) |
| 485 self._backend.GenerateCallback(info) | 485 self._backend.GenerateCallback(info) |
| 486 | 486 |
| 487 def GenerateInterface(self): | 487 def GenerateInterface(self): |
| 488 interface_name = self._interface_type_info.interface_name() | 488 interface_name = self._interface_type_info.interface_name() |
| 489 | 489 |
| 490 factory_provider = None | 490 factory_provider = None |
| 491 if interface_name in interface_factories: | 491 if interface_name in interface_factories: |
| 492 factory_provider = interface_factories[interface_name] | 492 factory_provider = interface_factories[interface_name] |
| 493 factory_constructor_name = None | 493 factory_constructor_name = None |
| 494 | 494 |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 558 | 558 |
| 559 class_modifiers = '' | 559 class_modifiers = '' |
| 560 if (self._renamer.ShouldSuppressInterface(self._interface) or | 560 if (self._renamer.ShouldSuppressInterface(self._interface) or |
| 561 IsPureInterface(self._interface.id)): | 561 IsPureInterface(self._interface.id)): |
| 562 class_modifiers = 'abstract ' | 562 class_modifiers = 'abstract ' |
| 563 | 563 |
| 564 native_spec = '' | 564 native_spec = '' |
| 565 if not IsPureInterface(self._interface.id): | 565 if not IsPureInterface(self._interface.id): |
| 566 native_spec = self._backend.NativeSpec() | 566 native_spec = self._backend.NativeSpec() |
| 567 | 567 |
| 568 self._implementation_members_emitter = implementation_emitter.Emit( | 568 implementation_members_emitter = implementation_emitter.Emit( |
| 569 self._backend.ImplementationTemplate(), | 569 self._backend.ImplementationTemplate(), |
| 570 LIBRARYNAME='dart.dom.%s' % self._library_name, | 570 LIBRARYNAME='dart.dom.%s' % self._library_name, |
| 571 ANNOTATIONS=annotations, | 571 ANNOTATIONS=annotations, |
| 572 CLASS_MODIFIERS=class_modifiers, | 572 CLASS_MODIFIERS=class_modifiers, |
| 573 CLASSNAME=self._interface_type_info.implementation_name(), | 573 CLASSNAME=self._interface_type_info.implementation_name(), |
| 574 EXTENDS=' extends %s' % base_class if base_class else '', | 574 EXTENDS=' extends %s' % base_class if base_class else '', |
| 575 IMPLEMENTS=implements_str, | 575 IMPLEMENTS=implements_str, |
| 576 MIXINS=mixins_str, | 576 MIXINS=mixins_str, |
| 577 DOMNAME=self._interface.doc_js_name, | 577 DOMNAME=self._interface.doc_js_name, |
| 578 NATIVESPEC=native_spec) | 578 NATIVESPEC=native_spec) |
| 579 stream_getter_signatures_emitter = None | 579 stream_getter_signatures_emitter = None |
| 580 element_stream_getters_emitter = None | 580 element_stream_getters_emitter = None |
| 581 if type(self._implementation_members_emitter) == tuple: | 581 toplevel_emitter = None |
| 582 # We add event stream getters for both Element and ElementList, so in | 582 if type(implementation_members_emitter) == tuple: |
| 583 # impl_Element.darttemplate, we have two additional "holes" for emitters | 583 if len(implementation_members_emitter) == 2: |
| 584 # to fill in, with small variations. These store these specialized | 584 # We have both a TOPLEVEL and MEMBERS field to fill in, but |
| 585 # emitters. | 585 # no additional stream fields. |
| 586 stream_getter_signatures_emitter = self._implementation_members_emitter[0] | 586 toplevel_emitter = implementation_members_emitter[0] |
| 587 element_stream_getters_emitter = self._implementation_members_emitter[1] | 587 implementation_members_emitter = \ |
| 588 self._implementation_members_emitter = \ | 588 implementation_members_emitter[1] |
| 589 self._implementation_members_emitter[2] | 589 else: |
| 590 self._backend.StartInterface(self._implementation_members_emitter) | 590 # We add event stream getters for both Element and ElementList, so in |
| 591 | 591 # impl_Element.darttemplate, we have two additional "holes" for emitters |
| 592 # to fill in, with small variations. These store these specialized |
| 593 # emitters. |
| 594 # We have both a TOPLEVEL and MEMBERS field to fill in as above |
| 595 assert len(implementation_members_emitter) == 4; |
| 596 toplevel_emitter = implementation_members_emitter[0] |
| 597 stream_getter_signatures_emitter = \ |
| 598 implementation_members_emitter[1] |
| 599 element_stream_getters_emitter = implementation_members_emitter[2] |
| 600 implementation_members_emitter = \ |
| 601 implementation_members_emitter[3] |
| 602 self._backend.StartInterface(implementation_members_emitter, |
| 603 toplevel_emitter) |
| 592 self._backend.EmitHelpers(base_class) | 604 self._backend.EmitHelpers(base_class) |
| 593 self._event_generator.EmitStreamProviders( | 605 self._event_generator.EmitStreamProviders( |
| 594 self._interface, | 606 self._interface, |
| 595 self._backend.CustomJSMembers(), | 607 self._backend.CustomJSMembers(), |
| 596 self._implementation_members_emitter, | 608 implementation_members_emitter, |
| 597 self._library_name) | 609 self._library_name) |
| 598 self._backend.AddConstructors( | 610 self._backend.AddConstructors( |
| 599 constructors, factory_provider, factory_constructor_name) | 611 constructors, factory_provider, factory_constructor_name) |
| 600 | 612 |
| 601 isElement = False | 613 isElement = False |
| 602 for parent in self._database.Hierarchy(self._interface): | 614 for parent in self._database.Hierarchy(self._interface): |
| 603 if parent.id == 'Element': | 615 if parent.id == 'Element': |
| 604 isElement = True | 616 isElement = True |
| 605 if isElement and self._interface.id != 'Element': | 617 if isElement and self._interface.id != 'Element': |
| 606 self._implementation_members_emitter.Emit( | 618 implementation_members_emitter.Emit( |
| 607 ' /**\n' | 619 ' /**\n' |
| 608 ' * Constructor instantiated by the DOM when a custom element has be
en created.\n' | 620 ' * Constructor instantiated by the DOM when a custom element has be
en created.\n' |
| 609 ' *\n' | 621 ' *\n' |
| 610 ' * This can only be called by subclasses from their created constru
ctor.\n' | 622 ' * This can only be called by subclasses from their created constru
ctor.\n' |
| 611 ' */\n' | 623 ' */\n' |
| 612 ' $CLASSNAME.created() : super.created();\n', | 624 ' $CLASSNAME.created() : super.created();\n', |
| 613 CLASSNAME=self._interface_type_info.implementation_name()) | 625 CLASSNAME=self._interface_type_info.implementation_name()) |
| 614 | 626 |
| 615 self._backend.EmitSupportCheck() | 627 self._backend.EmitSupportCheck() |
| 616 | 628 |
| 617 merged_interface = self._interface_type_info.merged_interface() | 629 merged_interface = self._interface_type_info.merged_interface() |
| 618 if merged_interface: | 630 if merged_interface: |
| 619 self._backend.AddMembers(self._database.GetInterface(merged_interface), | 631 self._backend.AddMembers(self._database.GetInterface(merged_interface), |
| 620 not self._backend.ImplementsMergedMembers()) | 632 not self._backend.ImplementsMergedMembers()) |
| 621 | 633 |
| 622 self._backend.AddMembers(self._interface) | 634 self._backend.AddMembers(self._interface) |
| 623 self._backend.AddSecondaryMembers(self._interface) | 635 self._backend.AddSecondaryMembers(self._interface) |
| 624 self._event_generator.EmitStreamGetters( | 636 self._event_generator.EmitStreamGetters( |
| 625 self._interface, | 637 self._interface, |
| 626 [], | 638 [], |
| 627 self._implementation_members_emitter, | 639 implementation_members_emitter, |
| 628 self._library_name, stream_getter_signatures_emitter, | 640 self._library_name, stream_getter_signatures_emitter, |
| 629 element_stream_getters_emitter) | 641 element_stream_getters_emitter) |
| 630 self._backend.FinishInterface() | 642 self._backend.FinishInterface() |
| 631 | 643 |
| 632 def _ImplementationEmitter(self): | 644 def _ImplementationEmitter(self): |
| 633 basename = self._interface_type_info.implementation_name() | 645 basename = self._interface_type_info.implementation_name() |
| 634 if (self._interface_type_info.merged_into() and | 646 if (self._interface_type_info.merged_into() and |
| 635 self._backend.ImplementsMergedMembers()): | 647 self._backend.ImplementsMergedMembers()): |
| 636 # Merged members are implemented in target interface implementation. | 648 # Merged members are implemented in target interface implementation. |
| 637 return emitter.Emitter() | 649 return emitter.Emitter() |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 675 def NativeSpec(self): | 687 def NativeSpec(self): |
| 676 native_spec = MakeNativeSpec(self._interface.javascript_binding_name) | 688 native_spec = MakeNativeSpec(self._interface.javascript_binding_name) |
| 677 return ' native "%s"' % native_spec | 689 return ' native "%s"' % native_spec |
| 678 | 690 |
| 679 def ImplementationTemplate(self): | 691 def ImplementationTemplate(self): |
| 680 template_file = ('impl_%s.darttemplate' % | 692 template_file = ('impl_%s.darttemplate' % |
| 681 self._interface.doc_js_name) | 693 self._interface.doc_js_name) |
| 682 return (self._template_loader.TryLoad(template_file) or | 694 return (self._template_loader.TryLoad(template_file) or |
| 683 self._template_loader.Load('dart2js_impl.darttemplate')) | 695 self._template_loader.Load('dart2js_impl.darttemplate')) |
| 684 | 696 |
| 685 def StartInterface(self, members_emitter): | 697 def StartInterface(self, members_emitter, toplevel_emitter): |
| 698 # We currently emit no top level members for dart2js |
| 686 self._members_emitter = members_emitter | 699 self._members_emitter = members_emitter |
| 687 | 700 |
| 688 def FinishInterface(self): | 701 def FinishInterface(self): |
| 689 pass | 702 pass |
| 690 | 703 |
| 691 def HasSupportCheck(self): | 704 def HasSupportCheck(self): |
| 692 return self._interface.doc_js_name in js_support_checks | 705 return self._interface.doc_js_name in js_support_checks |
| 693 | 706 |
| 694 def GetSupportCheck(self): | 707 def GetSupportCheck(self): |
| 695 """Return a tuple of the support check function signature and the support | 708 """Return a tuple of the support check function signature and the support |
| (...skipping 278 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 974 def _AddDirectNativeOperation(self, info, html_name): | 987 def _AddDirectNativeOperation(self, info, html_name): |
| 975 self._members_emitter.Emit( | 988 self._members_emitter.Emit( |
| 976 '\n' | 989 '\n' |
| 977 ' $RENAME$METADATA$MODIFIERS$TYPE $NAME($PARAMS) native;\n', | 990 ' $RENAME$METADATA$MODIFIERS$TYPE $NAME($PARAMS) native;\n', |
| 978 RENAME=self._RenamingAnnotation(info.declared_name, html_name), | 991 RENAME=self._RenamingAnnotation(info.declared_name, html_name), |
| 979 METADATA=self._Metadata(info.type_name, info.declared_name, | 992 METADATA=self._Metadata(info.type_name, info.declared_name, |
| 980 self.SecureOutputType(info.type_name)), | 993 self.SecureOutputType(info.type_name)), |
| 981 MODIFIERS='static ' if info.IsStatic() else '', | 994 MODIFIERS='static ' if info.IsStatic() else '', |
| 982 TYPE=self.SecureOutputType(info.type_name, False, True), | 995 TYPE=self.SecureOutputType(info.type_name, False, True), |
| 983 NAME=html_name, | 996 NAME=html_name, |
| 984 PARAMS=info.ParametersDeclaration(self._NarrowInputType)) | 997 PARAMS=info.ParametersAsDeclaration(self._NarrowInputType)) |
| 985 | 998 |
| 986 def _AddOperationWithConversions(self, info, html_name): | 999 def _AddOperationWithConversions(self, info, html_name): |
| 987 # Assert all operations have same return type. | 1000 # Assert all operations have same return type. |
| 988 assert len(set([op.type.id for op in info.operations])) == 1 | 1001 assert len(set([op.type.id for op in info.operations])) == 1 |
| 989 output_conversion = self._OutputConversion(info.type_name, | 1002 output_conversion = self._OutputConversion(info.type_name, |
| 990 info.declared_name) | 1003 info.declared_name) |
| 991 if output_conversion: | 1004 if output_conversion: |
| 992 return_type = output_conversion.output_type | 1005 return_type = output_conversion.output_type |
| 993 native_return_type = output_conversion.input_type | 1006 native_return_type = output_conversion.input_type |
| 994 else: | 1007 else: |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1064 MODIFIERS='static ' if info.IsStatic() else '', | 1077 MODIFIERS='static ' if info.IsStatic() else '', |
| 1065 TYPE=TypeOrNothing(native_return_type), | 1078 TYPE=TypeOrNothing(native_return_type), |
| 1066 TARGET=target, | 1079 TARGET=target, |
| 1067 PARAMS=', '.join(target_parameters)) | 1080 PARAMS=', '.join(target_parameters)) |
| 1068 | 1081 |
| 1069 declaration = '%s%s%s %s(%s)' % ( | 1082 declaration = '%s%s%s %s(%s)' % ( |
| 1070 self._Metadata(info.type_name, info.declared_name, return_type), | 1083 self._Metadata(info.type_name, info.declared_name, return_type), |
| 1071 'static ' if info.IsStatic() else '', | 1084 'static ' if info.IsStatic() else '', |
| 1072 return_type, | 1085 return_type, |
| 1073 html_name, | 1086 html_name, |
| 1074 info.ParametersDeclaration(InputType)) | 1087 info.ParametersAsDeclaration(InputType)) |
| 1075 self._GenerateDispatcherBody( | 1088 self._GenerateDispatcherBody( |
| 1076 info, | 1089 info, |
| 1077 operations, | 1090 operations, |
| 1078 declaration, | 1091 declaration, |
| 1079 GenerateCall, | 1092 GenerateCall, |
| 1080 lambda _, argument: IsOptional(argument), | 1093 lambda _, argument: IsOptional(argument), |
| 1081 can_omit_type_check=lambda type, pos: type == parameter_types[pos]) | 1094 can_omit_type_check=lambda type, pos: type == parameter_types[pos]) |
| 1082 | 1095 |
| 1083 def _AddInterfaceOperation(self, info, html_name): | 1096 def _AddInterfaceOperation(self, info, html_name): |
| 1084 self._members_emitter.Emit( | 1097 self._members_emitter.Emit( |
| 1085 '\n' | 1098 '\n' |
| 1086 ' $TYPE $NAME($PARAMS);\n', | 1099 ' $TYPE $NAME($PARAMS);\n', |
| 1087 TYPE=self.SecureOutputType(info.type_name, False, True), | 1100 TYPE=self.SecureOutputType(info.type_name, False, True), |
| 1088 NAME=html_name, | 1101 NAME=html_name, |
| 1089 PARAMS=info.ParametersDeclaration(self._NarrowInputType)) | 1102 PARAMS=info.ParametersAsDeclaration(self._NarrowInputType)) |
| 1090 | 1103 |
| 1091 | 1104 |
| 1092 def _OperationRequiresConversions(self, operation): | 1105 def _OperationRequiresConversions(self, operation): |
| 1093 return (self._OperationRequiresOutputConversion(operation) or | 1106 return (self._OperationRequiresOutputConversion(operation) or |
| 1094 self._OperationRequiresInputConversions(operation)) | 1107 self._OperationRequiresInputConversions(operation)) |
| 1095 | 1108 |
| 1096 def _OperationRequiresOutputConversion(self, operation): | 1109 def _OperationRequiresOutputConversion(self, operation): |
| 1097 return self._OutputConversion(operation.type.id, operation.id) | 1110 return self._OutputConversion(operation.type.id, operation.id) |
| 1098 | 1111 |
| 1099 def _OperationRequiresInputConversions(self, operation): | 1112 def _OperationRequiresInputConversions(self, operation): |
| (...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1242 for library_name in libraries: | 1255 for library_name in libraries: |
| 1243 self._libraries[library_name] = DartLibrary( | 1256 self._libraries[library_name] = DartLibrary( |
| 1244 library_name, template_loader, library_type, output_dir) | 1257 library_name, template_loader, library_type, output_dir) |
| 1245 | 1258 |
| 1246 def AddFile(self, basename, library_name, path): | 1259 def AddFile(self, basename, library_name, path): |
| 1247 self._libraries[library_name].AddFile(path) | 1260 self._libraries[library_name].AddFile(path) |
| 1248 | 1261 |
| 1249 def Emit(self, emitter, auxiliary_dir): | 1262 def Emit(self, emitter, auxiliary_dir): |
| 1250 for lib in self._libraries.values(): | 1263 for lib in self._libraries.values(): |
| 1251 lib.Emit(emitter, auxiliary_dir) | 1264 lib.Emit(emitter, auxiliary_dir) |
| OLD | NEW |