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 536 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
547 if factory_provider and factory_provider != info.factory_provider_name: | 547 if factory_provider and factory_provider != info.factory_provider_name: |
548 _logger.warn('Conflicting factory provider names: %s != %s' % | 548 _logger.warn('Conflicting factory provider names: %s != %s' % |
549 (factory_provider, info.factory_provider_name)) | 549 (factory_provider, info.factory_provider_name)) |
550 factory_provider = info.factory_provider_name | 550 factory_provider = info.factory_provider_name |
551 | 551 |
552 implementation_emitter = self._ImplementationEmitter() | 552 implementation_emitter = self._ImplementationEmitter() |
553 | 553 |
554 base_type_info = None | 554 base_type_info = None |
555 if self._interface.parents: | 555 if self._interface.parents: |
556 supertype = self._interface.parents[0].type.id | 556 supertype = self._interface.parents[0].type.id |
557 if not IsDartCollectionType(supertype) and not IsPureInterface(supertype): | 557 if not IsDartCollectionType(supertype) and not IsPureInterface(supertype,
self._database): |
558 base_type_info = self._type_registry.TypeInfo(supertype) | 558 base_type_info = self._type_registry.TypeInfo(supertype) |
559 | 559 |
560 if base_type_info: | 560 if base_type_info: |
561 base_class = base_type_info.implementation_name() | 561 base_class = base_type_info.implementation_name() |
562 else: | 562 else: |
563 base_class = self._backend.RootClassName() | 563 base_class = self._backend.RootClassName() |
564 | 564 |
565 implements = self._backend.AdditionalImplementedInterfaces() | 565 implements = self._backend.AdditionalImplementedInterfaces() |
566 for parent in self._interface.parents: | 566 for parent in self._interface.parents: |
567 parent_type_info = self._type_registry.TypeInfo(parent.type.id) | 567 parent_type_info = self._type_registry.TypeInfo(parent.type.id) |
(...skipping 19 matching lines...) Expand all Loading... |
587 elif (base_class == 'NativeFieldWrapperClass2' and | 587 elif (base_class == 'NativeFieldWrapperClass2' and |
588 self._options.dart_js_interop and | 588 self._options.dart_js_interop and |
589 not(isinstance(self._backend, Dart2JSBackend))): | 589 not(isinstance(self._backend, Dart2JSBackend))): |
590 base_class = 'DartHtmlDomObject' | 590 base_class = 'DartHtmlDomObject' |
591 | 591 |
592 annotations = self._metadata.GetFormattedMetadata( | 592 annotations = self._metadata.GetFormattedMetadata( |
593 self._library_name, self._interface, None, '') | 593 self._library_name, self._interface, None, '') |
594 | 594 |
595 class_modifiers = '' | 595 class_modifiers = '' |
596 if (self._renamer.ShouldSuppressInterface(self._interface) or | 596 if (self._renamer.ShouldSuppressInterface(self._interface) or |
597 IsPureInterface(self._interface.id)): | 597 IsPureInterface(self._interface.id, self._database)): |
598 # XMLHttpRequestProgressEvent can't be abstract we need to instantiate | 598 # XMLHttpRequestProgressEvent can't be abstract we need to instantiate |
599 # for JsInterop. | 599 # for JsInterop. |
600 if (not(isinstance(self._backend, Dart2JSBackend)) and | 600 if (not(isinstance(self._backend, Dart2JSBackend)) and |
601 (self._interface.id == 'XMLHttpRequestProgressEvent' or | 601 (self._interface.id == 'XMLHttpRequestProgressEvent' or |
602 self._interface.id == 'DOMStringMap')): | 602 self._interface.id == 'DOMStringMap')): |
603 # Suppress abstract for XMLHttpRequestProgressEvent and DOMStringMap | 603 # Suppress abstract for XMLHttpRequestProgressEvent and DOMStringMap |
604 # for Dartium. Need to be able to instantiate the class; can't be abstr
act. | 604 # for Dartium. Need to be able to instantiate the class; can't be abstr
act. |
605 class_modifiers = '' | 605 class_modifiers = '' |
606 else: | 606 else: |
607 # For Dartium w/ JsInterop these suppressed interfaces are needed to | 607 # For Dartium w/ JsInterop these suppressed interfaces are needed to |
608 # instanciate the internal classes. | 608 # instanciate the internal classes. |
609 if (self._renamer.ShouldSuppressInterface(self._interface) and | 609 if (self._renamer.ShouldSuppressInterface(self._interface) and |
610 not(isinstance(self._backend, Dart2JSBackend)) and | 610 not(isinstance(self._backend, Dart2JSBackend)) and |
611 self._options.dart_js_interop): | 611 self._options.dart_js_interop): |
612 class_modifiers = '' | 612 class_modifiers = '' |
613 else: | 613 else: |
614 class_modifiers = 'abstract ' | 614 class_modifiers = 'abstract ' |
615 | 615 |
616 native_spec = '' | 616 native_spec = '' |
617 if not IsPureInterface(self._interface.id): | 617 if not IsPureInterface(self._interface.id, self._database): |
618 native_spec = self._backend.NativeSpec() | 618 native_spec = self._backend.NativeSpec() |
619 | 619 |
620 class_name = self._interface_type_info.implementation_name() | 620 class_name = self._interface_type_info.implementation_name() |
621 | 621 |
622 js_interop_wrapper = ''' | 622 js_interop_wrapper = ''' |
623 | 623 |
624 @Deprecated("Internal Use Only") | 624 @Deprecated("Internal Use Only") |
625 external static Type get instanceRuntimeType; | 625 external static Type get instanceRuntimeType; |
626 | 626 |
627 @Deprecated("Internal Use Only") | 627 @Deprecated("Internal Use Only") |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
682 | 682 |
683 isElement = False | 683 isElement = False |
684 for parent in self._database.Hierarchy(self._interface): | 684 for parent in self._database.Hierarchy(self._interface): |
685 if parent.id == 'Element': | 685 if parent.id == 'Element': |
686 isElement = True | 686 isElement = True |
687 | 687 |
688 # Write out the JsInterop code. | 688 # Write out the JsInterop code. |
689 if (implementation_members_emitter and | 689 if (implementation_members_emitter and |
690 self._options.templates._conditions['DARTIUM'] and | 690 self._options.templates._conditions['DARTIUM'] and |
691 self._options.dart_js_interop and | 691 self._options.dart_js_interop and |
692 not IsPureInterface(self._interface.id)): | 692 not IsPureInterface(self._interface.id, self._database)): |
693 implementation_members_emitter.Emit(js_interop_wrapper) | 693 implementation_members_emitter.Emit(js_interop_wrapper) |
694 | 694 |
695 if isElement and self._interface.id != 'Element': | 695 if isElement and self._interface.id != 'Element': |
696 implementation_members_emitter.Emit( | 696 implementation_members_emitter.Emit( |
697 ' /**\n' | 697 ' /**\n' |
698 ' * Constructor instantiated by the DOM when a custom element has be
en created.\n' | 698 ' * Constructor instantiated by the DOM when a custom element has be
en created.\n' |
699 ' *\n' | 699 ' *\n' |
700 ' * This can only be called by subclasses from their created constru
ctor.\n' | 700 ' * This can only be called by subclasses from their created constru
ctor.\n' |
701 ' */\n' | 701 ' */\n' |
702 ' $CLASSNAME.created() : super.created();\n', | 702 ' $CLASSNAME.created() : super.created();\n', |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
753 | 753 |
754 def ImplementsMergedMembers(self): | 754 def ImplementsMergedMembers(self): |
755 return True | 755 return True |
756 | 756 |
757 def GenerateCallback(self, info): | 757 def GenerateCallback(self, info): |
758 pass | 758 pass |
759 | 759 |
760 def AdditionalImplementedInterfaces(self): | 760 def AdditionalImplementedInterfaces(self): |
761 implements = super(Dart2JSBackend, self).AdditionalImplementedInterfaces() | 761 implements = super(Dart2JSBackend, self).AdditionalImplementedInterfaces() |
762 if self._interface_type_info.list_item_type() and self.HasIndexedGetter(): | 762 if self._interface_type_info.list_item_type() and self.HasIndexedGetter(): |
763 implements.append('JavaScriptIndexingBehavior') | 763 item_type = self._type_registry.TypeInfo( |
| 764 self._interface_type_info.list_item_type()).dart_type() |
| 765 implements.append('JavaScriptIndexingBehavior<%s>' % item_type) |
764 return implements | 766 return implements |
765 | 767 |
766 def NativeSpec(self): | 768 def NativeSpec(self): |
767 native_spec = MakeNativeSpec(self._interface.javascript_binding_name) | 769 native_spec = MakeNativeSpec(self._interface.javascript_binding_name) |
768 return '@Native("%s")\n' % native_spec | 770 return '@Native("%s")\n' % native_spec |
769 | 771 |
770 def ImplementationTemplate(self): | 772 def ImplementationTemplate(self): |
771 template_file = ('impl_%s.darttemplate' % | 773 template_file = ('impl_%s.darttemplate' % |
772 self._interface.doc_js_name) | 774 self._interface.doc_js_name) |
773 return (self._template_loader.TryLoad(template_file) or | 775 return (self._template_loader.TryLoad(template_file) or |
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
891 ' throw new UnsupportedError("Cannot assign element of immutable Li
st.");\n' | 893 ' throw new UnsupportedError("Cannot assign element of immutable Li
st.");\n' |
892 ' }\n', | 894 ' }\n', |
893 TYPE=self._NarrowInputType(element_type)) | 895 TYPE=self._NarrowInputType(element_type)) |
894 | 896 |
895 self.EmitListMixin(self._DartType(element_type)) | 897 self.EmitListMixin(self._DartType(element_type)) |
896 | 898 |
897 def EmitAttribute(self, attribute, html_name, read_only): | 899 def EmitAttribute(self, attribute, html_name, read_only): |
898 if self._HasCustomImplementation(attribute.id): | 900 if self._HasCustomImplementation(attribute.id): |
899 return | 901 return |
900 | 902 |
901 if IsPureInterface(self._interface.id): | 903 if IsPureInterface(self._interface.id, self._database): |
902 self._AddInterfaceAttribute(attribute, html_name, read_only) | 904 self._AddInterfaceAttribute(attribute, html_name, read_only) |
903 return | 905 return |
904 | 906 |
905 # If the attribute is shadowing, we can't generate a shadowing | 907 # If the attribute is shadowing, we can't generate a shadowing |
906 # field (Issue 1633). | 908 # field (Issue 1633). |
907 # TODO(sra): _FindShadowedAttribute does not take into account the html | 909 # TODO(sra): _FindShadowedAttribute does not take into account the html |
908 # renaming. we should be looking for another attribute that has the same | 910 # renaming. we should be looking for another attribute that has the same |
909 # html_name. Two attributes with the same IDL name might not match if one | 911 # html_name. Two attributes with the same IDL name might not match if one |
910 # is renamed. | 912 # is renamed. |
911 (super_attribute, super_attribute_interface) = self._FindShadowedAttribute( | 913 (super_attribute, super_attribute_interface) = self._FindShadowedAttribute( |
(...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1061 return True | 1063 return True |
1062 | 1064 |
1063 def EmitOperation(self, info, html_name, dart_js_interop=False): | 1065 def EmitOperation(self, info, html_name, dart_js_interop=False): |
1064 """ | 1066 """ |
1065 Arguments: | 1067 Arguments: |
1066 info: An OperationInfo object. | 1068 info: An OperationInfo object. |
1067 """ | 1069 """ |
1068 if self._HasCustomImplementation(info.name): | 1070 if self._HasCustomImplementation(info.name): |
1069 return | 1071 return |
1070 | 1072 |
1071 if IsPureInterface(self._interface.id): | 1073 if IsPureInterface(self._interface.id, self._database): |
1072 self._AddInterfaceOperation(info, html_name) | 1074 self._AddInterfaceOperation(info, html_name) |
1073 elif info.callback_args: | 1075 elif info.callback_args: |
1074 self._AddFutureifiedOperation(info, html_name) | 1076 self._AddFutureifiedOperation(info, html_name) |
1075 elif any(self._OperationRequiresConversions(op) for op in info.overloads): | 1077 elif any(self._OperationRequiresConversions(op) for op in info.overloads): |
1076 # Any conversions needed? | 1078 # Any conversions needed? |
1077 self._AddOperationWithConversions(info, html_name) | 1079 self._AddOperationWithConversions(info, html_name) |
1078 else: | 1080 else: |
1079 self._AddDirectNativeOperation(info, html_name) | 1081 self._AddDirectNativeOperation(info, html_name) |
1080 | 1082 |
1081 def _AddDirectNativeOperation(self, info, html_name): | 1083 def _AddDirectNativeOperation(self, info, html_name): |
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1195 return '' | 1197 return '' |
1196 | 1198 |
1197 def _Metadata(self, idl_type, idl_member_name, dart_type, indent=' '): | 1199 def _Metadata(self, idl_type, idl_member_name, dart_type, indent=' '): |
1198 anns = self._metadata.GetDart2JSMetadata( | 1200 anns = self._metadata.GetDart2JSMetadata( |
1199 idl_type, self._library_name, self._interface, idl_member_name) | 1201 idl_type, self._library_name, self._interface, idl_member_name) |
1200 | 1202 |
1201 if not self._metadata.AnyConversionAnnotations( | 1203 if not self._metadata.AnyConversionAnnotations( |
1202 idl_type, self._interface.id, idl_member_name): | 1204 idl_type, self._interface.id, idl_member_name): |
1203 return_type = self.SecureOutputType(idl_type) | 1205 return_type = self.SecureOutputType(idl_type) |
1204 native_type = self._NarrowToImplementationType(idl_type) | 1206 native_type = self._NarrowToImplementationType(idl_type) |
| 1207 |
1205 if native_type != return_type: | 1208 if native_type != return_type: |
1206 anns = anns + [ | 1209 anns = anns + [ |
1207 "@Returns('%s')" % native_type, | 1210 "@Returns('%s')" % native_type, |
1208 "@Creates('%s')" % native_type, | 1211 "@Creates('%s')" % native_type, |
1209 ] | 1212 ] |
1210 if dart_type == 'dynamic' or dart_type == 'Object': | 1213 if dart_type == 'dynamic' or dart_type == 'Object': |
1211 def js_type_annotation(ann): | 1214 def js_type_annotation(ann): |
1212 return re.search('^@.*Returns', ann) or re.search('^@.*Creates', ann) | 1215 return re.search('^@.*Returns', ann) or re.search('^@.*Creates', ann) |
1213 if not filter(js_type_annotation, anns): | 1216 if not filter(js_type_annotation, anns): |
1214 _logger.warn('Member with wildcard native type: %s.%s' % | 1217 _logger.warn('Member with wildcard native type: %s.%s' % |
1215 (self._interface.id, idl_member_name)) | 1218 (self._interface.id, idl_member_name)) |
1216 | 1219 |
1217 return self._metadata.FormatMetadata(anns, indent); | 1220 return self._metadata.FormatMetadata(anns, indent); |
1218 | 1221 |
1219 def CustomJSMembers(self): | 1222 def CustomJSMembers(self): |
1220 return _js_custom_members | 1223 return _js_custom_members |
1221 | 1224 |
1222 def _FindShadowedAttribute(self, attr): | 1225 def _FindShadowedAttribute(self, attr): |
1223 """Returns (attribute, superinterface) or (None, None).""" | 1226 """Returns (attribute, superinterface) or (None, None).""" |
1224 def FindInParent(interface): | 1227 def FindInParent(interface): |
1225 """Returns matching attribute in parent, or None.""" | 1228 """Returns matching attribute in parent, or None.""" |
1226 if interface.parents: | 1229 if interface.parents: |
1227 parent = interface.parents[0] | 1230 parent = interface.parents[0] |
1228 if IsDartCollectionType(parent.type.id): | 1231 if IsDartCollectionType(parent.type.id): |
1229 return (None, None) | 1232 return (None, None) |
1230 if IsPureInterface(parent.type.id): | 1233 if IsPureInterface(parent.type.id, self._database): |
1231 return (None, None) | 1234 return (None, None) |
1232 if self._database.HasInterface(parent.type.id): | 1235 if self._database.HasInterface(parent.type.id): |
1233 interfaces_to_search_in = [] | 1236 interfaces_to_search_in = [] |
1234 parent_interface_name = parent.type.id | 1237 parent_interface_name = parent.type.id |
1235 interfaces_to_search_in.append(parent_interface_name) | 1238 interfaces_to_search_in.append(parent_interface_name) |
1236 parent_type_info = self._type_registry.TypeInfo(parent_interface_name) | 1239 parent_type_info = self._type_registry.TypeInfo(parent_interface_name) |
1237 if parent_type_info.merged_into(): | 1240 if parent_type_info.merged_into(): |
1238 # IDL parent was merged into another interface, which became a | 1241 # IDL parent was merged into another interface, which became a |
1239 # parent interface in Dart. | 1242 # parent interface in Dart. |
1240 parent_interface_name = parent_type_info.merged_into() | 1243 parent_interface_name = parent_type_info.merged_into() |
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1341 | 1344 |
1342 def AddFile(self, basename, library_name, path): | 1345 def AddFile(self, basename, library_name, path): |
1343 self._libraries[library_name].AddFile(path) | 1346 self._libraries[library_name].AddFile(path) |
1344 | 1347 |
1345 def AddTypeEntry(self, library_name, idl_name, dart_name): | 1348 def AddTypeEntry(self, library_name, idl_name, dart_name): |
1346 self._libraries[library_name].AddTypeEntry(idl_name, dart_name) | 1349 self._libraries[library_name].AddTypeEntry(idl_name, dart_name) |
1347 | 1350 |
1348 def Emit(self, emitter, auxiliary_dir): | 1351 def Emit(self, emitter, auxiliary_dir): |
1349 for lib in self._libraries.values(): | 1352 for lib in self._libraries.values(): |
1350 lib.Emit(emitter, auxiliary_dir) | 1353 lib.Emit(emitter, auxiliary_dir) |
OLD | NEW |