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 |