| 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 |