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 if type(implementation_members_emitter) == tuple: |
582 # We add event stream getters for both Element and ElementList, so in | 582 # We add event stream getters for both Element and ElementList, so in |
583 # impl_Element.darttemplate, we have two additional "holes" for emitters | 583 # impl_Element.darttemplate, we have two additional "holes" for emitters |
584 # to fill in, with small variations. These store these specialized | 584 # to fill in, with small variations. These store these specialized |
585 # emitters. | 585 # emitters. |
586 stream_getter_signatures_emitter = self._implementation_members_emitter[0] | 586 assert len(implementation_members_emitter) == 3; |
587 element_stream_getters_emitter = self._implementation_members_emitter[1] | 587 stream_getter_signatures_emitter = \ |
588 self._implementation_members_emitter = \ | 588 implementation_members_emitter[0] |
589 self._implementation_members_emitter[2] | 589 element_stream_getters_emitter = implementation_members_emitter[1] |
590 self._backend.StartInterface(self._implementation_members_emitter) | 590 implementation_members_emitter = \ |
591 | 591 implementation_members_emitter[2] |
| 592 self._backend.StartInterface(implementation_members_emitter) |
592 self._backend.EmitHelpers(base_class) | 593 self._backend.EmitHelpers(base_class) |
593 self._event_generator.EmitStreamProviders( | 594 self._event_generator.EmitStreamProviders( |
594 self._interface, | 595 self._interface, |
595 self._backend.CustomJSMembers(), | 596 self._backend.CustomJSMembers(), |
596 self._implementation_members_emitter, | 597 implementation_members_emitter, |
597 self._library_name) | 598 self._library_name) |
598 self._backend.AddConstructors( | 599 self._backend.AddConstructors( |
599 constructors, factory_provider, factory_constructor_name) | 600 constructors, factory_provider, factory_constructor_name) |
600 | 601 |
601 isElement = False | 602 isElement = False |
602 for parent in self._database.Hierarchy(self._interface): | 603 for parent in self._database.Hierarchy(self._interface): |
603 if parent.id == 'Element': | 604 if parent.id == 'Element': |
604 isElement = True | 605 isElement = True |
605 if isElement and self._interface.id != 'Element': | 606 if isElement and self._interface.id != 'Element': |
606 self._implementation_members_emitter.Emit( | 607 implementation_members_emitter.Emit( |
607 ' /**\n' | 608 ' /**\n' |
608 ' * Constructor instantiated by the DOM when a custom element has be
en created.\n' | 609 ' * Constructor instantiated by the DOM when a custom element has be
en created.\n' |
609 ' *\n' | 610 ' *\n' |
610 ' * This can only be called by subclasses from their created constru
ctor.\n' | 611 ' * This can only be called by subclasses from their created constru
ctor.\n' |
611 ' */\n' | 612 ' */\n' |
612 ' $CLASSNAME.created() : super.created();\n', | 613 ' $CLASSNAME.created() : super.created();\n', |
613 CLASSNAME=self._interface_type_info.implementation_name()) | 614 CLASSNAME=self._interface_type_info.implementation_name()) |
614 | 615 |
615 self._backend.EmitSupportCheck() | 616 self._backend.EmitSupportCheck() |
616 | 617 |
617 merged_interface = self._interface_type_info.merged_interface() | 618 merged_interface = self._interface_type_info.merged_interface() |
618 if merged_interface: | 619 if merged_interface: |
619 self._backend.AddMembers(self._database.GetInterface(merged_interface), | 620 self._backend.AddMembers(self._database.GetInterface(merged_interface), |
620 not self._backend.ImplementsMergedMembers()) | 621 not self._backend.ImplementsMergedMembers()) |
621 | 622 |
622 self._backend.AddMembers(self._interface) | 623 self._backend.AddMembers(self._interface) |
623 self._backend.AddSecondaryMembers(self._interface) | 624 self._backend.AddSecondaryMembers(self._interface) |
624 self._event_generator.EmitStreamGetters( | 625 self._event_generator.EmitStreamGetters( |
625 self._interface, | 626 self._interface, |
626 [], | 627 [], |
627 self._implementation_members_emitter, | 628 implementation_members_emitter, |
628 self._library_name, stream_getter_signatures_emitter, | 629 self._library_name, stream_getter_signatures_emitter, |
629 element_stream_getters_emitter) | 630 element_stream_getters_emitter) |
630 self._backend.FinishInterface() | 631 self._backend.FinishInterface() |
631 | 632 |
632 def _ImplementationEmitter(self): | 633 def _ImplementationEmitter(self): |
633 basename = self._interface_type_info.implementation_name() | 634 basename = self._interface_type_info.implementation_name() |
634 if (self._interface_type_info.merged_into() and | 635 if (self._interface_type_info.merged_into() and |
635 self._backend.ImplementsMergedMembers()): | 636 self._backend.ImplementsMergedMembers()): |
636 # Merged members are implemented in target interface implementation. | 637 # Merged members are implemented in target interface implementation. |
637 return emitter.Emitter() | 638 return emitter.Emitter() |
(...skipping 336 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
974 def _AddDirectNativeOperation(self, info, html_name): | 975 def _AddDirectNativeOperation(self, info, html_name): |
975 self._members_emitter.Emit( | 976 self._members_emitter.Emit( |
976 '\n' | 977 '\n' |
977 ' $RENAME$METADATA$MODIFIERS$TYPE $NAME($PARAMS) native;\n', | 978 ' $RENAME$METADATA$MODIFIERS$TYPE $NAME($PARAMS) native;\n', |
978 RENAME=self._RenamingAnnotation(info.declared_name, html_name), | 979 RENAME=self._RenamingAnnotation(info.declared_name, html_name), |
979 METADATA=self._Metadata(info.type_name, info.declared_name, | 980 METADATA=self._Metadata(info.type_name, info.declared_name, |
980 self.SecureOutputType(info.type_name)), | 981 self.SecureOutputType(info.type_name)), |
981 MODIFIERS='static ' if info.IsStatic() else '', | 982 MODIFIERS='static ' if info.IsStatic() else '', |
982 TYPE=self.SecureOutputType(info.type_name, False, True), | 983 TYPE=self.SecureOutputType(info.type_name, False, True), |
983 NAME=html_name, | 984 NAME=html_name, |
984 PARAMS=info.ParametersDeclaration(self._NarrowInputType)) | 985 PARAMS=info.ParametersAsDeclaration(self._NarrowInputType)) |
985 | 986 |
986 def _AddOperationWithConversions(self, info, html_name): | 987 def _AddOperationWithConversions(self, info, html_name): |
987 # Assert all operations have same return type. | 988 # Assert all operations have same return type. |
988 assert len(set([op.type.id for op in info.operations])) == 1 | 989 assert len(set([op.type.id for op in info.operations])) == 1 |
989 output_conversion = self._OutputConversion(info.type_name, | 990 output_conversion = self._OutputConversion(info.type_name, |
990 info.declared_name) | 991 info.declared_name) |
991 if output_conversion: | 992 if output_conversion: |
992 return_type = output_conversion.output_type | 993 return_type = output_conversion.output_type |
993 native_return_type = output_conversion.input_type | 994 native_return_type = output_conversion.input_type |
994 else: | 995 else: |
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1064 MODIFIERS='static ' if info.IsStatic() else '', | 1065 MODIFIERS='static ' if info.IsStatic() else '', |
1065 TYPE=TypeOrNothing(native_return_type), | 1066 TYPE=TypeOrNothing(native_return_type), |
1066 TARGET=target, | 1067 TARGET=target, |
1067 PARAMS=', '.join(target_parameters)) | 1068 PARAMS=', '.join(target_parameters)) |
1068 | 1069 |
1069 declaration = '%s%s%s %s(%s)' % ( | 1070 declaration = '%s%s%s %s(%s)' % ( |
1070 self._Metadata(info.type_name, info.declared_name, return_type), | 1071 self._Metadata(info.type_name, info.declared_name, return_type), |
1071 'static ' if info.IsStatic() else '', | 1072 'static ' if info.IsStatic() else '', |
1072 return_type, | 1073 return_type, |
1073 html_name, | 1074 html_name, |
1074 info.ParametersDeclaration(InputType)) | 1075 info.ParametersAsDeclaration(InputType)) |
1075 self._GenerateDispatcherBody( | 1076 self._GenerateDispatcherBody( |
1076 info, | 1077 info, |
1077 operations, | 1078 operations, |
1078 declaration, | 1079 declaration, |
1079 GenerateCall, | 1080 GenerateCall, |
1080 lambda _, argument: IsOptional(argument), | 1081 lambda _, argument: IsOptional(argument), |
1081 can_omit_type_check=lambda type, pos: type == parameter_types[pos]) | 1082 can_omit_type_check=lambda type, pos: type == parameter_types[pos]) |
1082 | 1083 |
1083 def _AddInterfaceOperation(self, info, html_name): | 1084 def _AddInterfaceOperation(self, info, html_name): |
1084 self._members_emitter.Emit( | 1085 self._members_emitter.Emit( |
1085 '\n' | 1086 '\n' |
1086 ' $TYPE $NAME($PARAMS);\n', | 1087 ' $TYPE $NAME($PARAMS);\n', |
1087 TYPE=self.SecureOutputType(info.type_name, False, True), | 1088 TYPE=self.SecureOutputType(info.type_name, False, True), |
1088 NAME=html_name, | 1089 NAME=html_name, |
1089 PARAMS=info.ParametersDeclaration(self._NarrowInputType)) | 1090 PARAMS=info.ParametersAsDeclaration(self._NarrowInputType)) |
1090 | 1091 |
1091 | 1092 |
1092 def _OperationRequiresConversions(self, operation): | 1093 def _OperationRequiresConversions(self, operation): |
1093 return (self._OperationRequiresOutputConversion(operation) or | 1094 return (self._OperationRequiresOutputConversion(operation) or |
1094 self._OperationRequiresInputConversions(operation)) | 1095 self._OperationRequiresInputConversions(operation)) |
1095 | 1096 |
1096 def _OperationRequiresOutputConversion(self, operation): | 1097 def _OperationRequiresOutputConversion(self, operation): |
1097 return self._OutputConversion(operation.type.id, operation.id) | 1098 return self._OutputConversion(operation.type.id, operation.id) |
1098 | 1099 |
1099 def _OperationRequiresInputConversions(self, operation): | 1100 def _OperationRequiresInputConversions(self, operation): |
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1242 for library_name in libraries: | 1243 for library_name in libraries: |
1243 self._libraries[library_name] = DartLibrary( | 1244 self._libraries[library_name] = DartLibrary( |
1244 library_name, template_loader, library_type, output_dir) | 1245 library_name, template_loader, library_type, output_dir) |
1245 | 1246 |
1246 def AddFile(self, basename, library_name, path): | 1247 def AddFile(self, basename, library_name, path): |
1247 self._libraries[library_name].AddFile(path) | 1248 self._libraries[library_name].AddFile(path) |
1248 | 1249 |
1249 def Emit(self, emitter, auxiliary_dir): | 1250 def Emit(self, emitter, auxiliary_dir): |
1250 for lib in self._libraries.values(): | 1251 for lib in self._libraries.values(): |
1251 lib.Emit(emitter, auxiliary_dir) | 1252 lib.Emit(emitter, auxiliary_dir) |
OLD | NEW |