| 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 monitored | 10 import monitored |
| (...skipping 408 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 419 self._database = options.database | 419 self._database = options.database |
| 420 self._template_loader = options.templates | 420 self._template_loader = options.templates |
| 421 self._type_registry = options.type_registry | 421 self._type_registry = options.type_registry |
| 422 self._options = options | 422 self._options = options |
| 423 self._library_emitter = library_emitter | 423 self._library_emitter = library_emitter |
| 424 self._event_generator = event_generator | 424 self._event_generator = event_generator |
| 425 self._interface = interface | 425 self._interface = interface |
| 426 self._backend = backend | 426 self._backend = backend |
| 427 self._interface_type_info = self._type_registry.TypeInfo(self._interface.id) | 427 self._interface_type_info = self._type_registry.TypeInfo(self._interface.id) |
| 428 self._library_name = self._renamer.GetLibraryName(self._interface) | 428 self._library_name = self._renamer.GetLibraryName(self._interface) |
| 429 self._metadata = options.metadata |
| 429 | 430 |
| 430 def Generate(self): | 431 def Generate(self): |
| 431 if IsCustomType(self._interface.id): | 432 if IsCustomType(self._interface.id): |
| 432 pass | 433 pass |
| 433 elif 'Callback' in self._interface.ext_attrs: | 434 elif 'Callback' in self._interface.ext_attrs: |
| 434 self.GenerateCallback() | 435 self.GenerateCallback() |
| 435 else: | 436 else: |
| 436 self.GenerateInterface() | 437 self.GenerateInterface() |
| 437 | 438 |
| 438 def GenerateCallback(self): | 439 def GenerateCallback(self): |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 511 implements.append(parent_type_info.interface_name()) | 512 implements.append(parent_type_info.interface_name()) |
| 512 | 513 |
| 513 secure_base_name = self._backend.SecureBaseName(interface_name) | 514 secure_base_name = self._backend.SecureBaseName(interface_name) |
| 514 if secure_base_name: | 515 if secure_base_name: |
| 515 implements.append(secure_base_name) | 516 implements.append(secure_base_name) |
| 516 | 517 |
| 517 implements_str = '' | 518 implements_str = '' |
| 518 if implements: | 519 if implements: |
| 519 implements_str = ' implements ' + ', '.join(set(implements)) | 520 implements_str = ' implements ' + ', '.join(set(implements)) |
| 520 | 521 |
| 521 annotations = FormatAnnotationsAndComments( | 522 annotations = self._metadata.GetFormattedMetadata( |
| 522 GetAnnotationsAndComments(self._library_name, | 523 self._library_name, self._interface.doc_js_name, '') |
| 523 self._interface.doc_js_name), '') | |
| 524 | 524 |
| 525 class_modifiers = '' | 525 class_modifiers = '' |
| 526 if self._renamer.ShouldSuppressInterface(self._interface): | 526 if self._renamer.ShouldSuppressInterface(self._interface): |
| 527 class_modifiers = 'abstract ' | 527 class_modifiers = 'abstract ' |
| 528 | 528 |
| 529 self._implementation_members_emitter = implementation_emitter.Emit( | 529 self._implementation_members_emitter = implementation_emitter.Emit( |
| 530 self._backend.ImplementationTemplate(), | 530 self._backend.ImplementationTemplate(), |
| 531 LIBRARYNAME='dart.dom.%s' % self._library_name, | 531 LIBRARYNAME='dart.dom.%s' % self._library_name, |
| 532 ANNOTATIONS=annotations, | 532 ANNOTATIONS=annotations, |
| 533 CLASS_MODIFIERS=class_modifiers, | 533 CLASS_MODIFIERS=class_modifiers, |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 582 interface. | 582 interface. |
| 583 """ | 583 """ |
| 584 | 584 |
| 585 def __init__(self, interface, options): | 585 def __init__(self, interface, options): |
| 586 super(Dart2JSBackend, self).__init__(interface, options) | 586 super(Dart2JSBackend, self).__init__(interface, options) |
| 587 | 587 |
| 588 self._database = options.database | 588 self._database = options.database |
| 589 self._template_loader = options.templates | 589 self._template_loader = options.templates |
| 590 self._type_registry = options.type_registry | 590 self._type_registry = options.type_registry |
| 591 self._renamer = options.renamer | 591 self._renamer = options.renamer |
| 592 self._metadata = options.metadata |
| 592 self._interface_type_info = self._type_registry.TypeInfo(self._interface.id) | 593 self._interface_type_info = self._type_registry.TypeInfo(self._interface.id) |
| 593 self._current_secondary_parent = None | 594 self._current_secondary_parent = None |
| 594 self._library_name = self._renamer.GetLibraryName(self._interface) | 595 self._library_name = self._renamer.GetLibraryName(self._interface) |
| 595 | 596 |
| 596 def ImplementsMergedMembers(self): | 597 def ImplementsMergedMembers(self): |
| 597 return True | 598 return True |
| 598 | 599 |
| 599 def GenerateCallback(self, info): | 600 def GenerateCallback(self, info): |
| 600 pass | 601 pass |
| 601 | 602 |
| (...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 766 | 767 |
| 767 # If the type has a conversion we need a getter or setter to contain the | 768 # If the type has a conversion we need a getter or setter to contain the |
| 768 # conversion code. | 769 # conversion code. |
| 769 if (self._OutputConversion(attribute.type.id, attribute.id) or | 770 if (self._OutputConversion(attribute.type.id, attribute.id) or |
| 770 self._InputConversion(attribute.type.id, attribute.id)): | 771 self._InputConversion(attribute.type.id, attribute.id)): |
| 771 self._AddAttributeUsingProperties(attribute, html_name, read_only) | 772 self._AddAttributeUsingProperties(attribute, html_name, read_only) |
| 772 return | 773 return |
| 773 | 774 |
| 774 output_type = self.SecureOutputType(attribute.type.id) | 775 output_type = self.SecureOutputType(attribute.type.id) |
| 775 input_type = self._NarrowInputType(attribute.type.id) | 776 input_type = self._NarrowInputType(attribute.type.id) |
| 776 annotations = self._Annotations(attribute.type.id, attribute.id) | 777 metadata = self._Metadata(attribute.type.id, attribute.id) |
| 777 rename = self._RenamingAnnotation(attribute.id, html_name) | 778 rename = self._RenamingAnnotation(attribute.id, html_name) |
| 778 if not read_only: | 779 if not read_only: |
| 779 self._members_emitter.Emit( | 780 self._members_emitter.Emit( |
| 780 '\n $RENAME$ANNOTATIONS$TYPE $NAME;' | 781 '\n $RENAME$METADATA$TYPE $NAME;' |
| 781 '\n', | 782 '\n', |
| 782 RENAME=rename, | 783 RENAME=rename, |
| 783 ANNOTATIONS=annotations, | 784 METADATA=metadata, |
| 784 NAME=html_name, | 785 NAME=html_name, |
| 785 TYPE=output_type) | 786 TYPE=output_type) |
| 786 else: | 787 else: |
| 787 template = '\n $RENAME$(ANNOTATIONS)final $TYPE $NAME;\n' | 788 template = '\n $RENAME$(ANNOTATIONS)final $TYPE $NAME;\n' |
| 788 # Need to use a getter for list.length properties so we can add a | 789 # Need to use a getter for list.length properties so we can add a |
| 789 # setter which throws an exception, satisfying List API. | 790 # setter which throws an exception, satisfying List API. |
| 790 if self._interface_type_info.list_item_type() and html_name == 'length': | 791 if self._interface_type_info.list_item_type() and html_name == 'length': |
| 791 template = ('\n $RENAME$(ANNOTATIONS)$TYPE get $NAME => ' + | 792 template = ('\n $RENAME$(ANNOTATIONS)$TYPE get $NAME => ' + |
| 792 'JS("$TYPE", "#.$NAME", this);\n') | 793 'JS("$TYPE", "#.$NAME", this);\n') |
| 793 self._members_emitter.Emit( | 794 self._members_emitter.Emit( |
| 794 template, | 795 template, |
| 795 RENAME=rename, | 796 RENAME=rename, |
| 796 ANNOTATIONS=annotations, | 797 ANNOTATIONS=metadata, |
| 797 NAME=html_name, | 798 NAME=html_name, |
| 798 TYPE=output_type) | 799 TYPE=output_type) |
| 799 | 800 |
| 800 def _AddAttributeUsingProperties(self, attribute, html_name, read_only): | 801 def _AddAttributeUsingProperties(self, attribute, html_name, read_only): |
| 801 self._AddRenamingGetter(attribute, html_name) | 802 self._AddRenamingGetter(attribute, html_name) |
| 802 if not read_only: | 803 if not read_only: |
| 803 self._AddRenamingSetter(attribute, html_name) | 804 self._AddRenamingSetter(attribute, html_name) |
| 804 | 805 |
| 805 def _AddInterfaceAttribute(self, attribute, html_name): | 806 def _AddInterfaceAttribute(self, attribute, html_name): |
| 806 self._members_emitter.Emit( | 807 self._members_emitter.Emit( |
| (...skipping 30 matching lines...) Expand all Loading... |
| 837 '\n }' | 838 '\n }' |
| 838 '\n', | 839 '\n', |
| 839 HTML_NAME=html_name, | 840 HTML_NAME=html_name, |
| 840 NAME=attr.id, | 841 NAME=attr.id, |
| 841 TYPE=self._NarrowInputType(attr.type.id)) | 842 TYPE=self._NarrowInputType(attr.type.id)) |
| 842 | 843 |
| 843 def _AddConvertingGetter(self, attr, html_name, conversion): | 844 def _AddConvertingGetter(self, attr, html_name, conversion): |
| 844 self._members_emitter.Emit( | 845 self._members_emitter.Emit( |
| 845 '\n $RETURN_TYPE get $HTML_NAME => $CONVERT(this._get_$(HTML_NAME));' | 846 '\n $RETURN_TYPE get $HTML_NAME => $CONVERT(this._get_$(HTML_NAME));' |
| 846 "\n @JSName('$NAME')" | 847 "\n @JSName('$NAME')" |
| 847 '\n $(ANNOTATIONS)final $NATIVE_TYPE _get_$HTML_NAME;' | 848 '\n $(METADATA)final $NATIVE_TYPE _get_$HTML_NAME;' |
| 848 '\n', | 849 '\n', |
| 849 ANNOTATIONS=self._Annotations(attr.type.id, html_name), | 850 METADATA=self._Metadata(attr.type.id, html_name), |
| 850 CONVERT=conversion.function_name, | 851 CONVERT=conversion.function_name, |
| 851 HTML_NAME=html_name, | 852 HTML_NAME=html_name, |
| 852 NAME=attr.id, | 853 NAME=attr.id, |
| 853 RETURN_TYPE=conversion.output_type, | 854 RETURN_TYPE=conversion.output_type, |
| 854 NATIVE_TYPE=conversion.input_type) | 855 NATIVE_TYPE=conversion.input_type) |
| 855 | 856 |
| 856 def _AddConvertingSetter(self, attr, html_name, conversion): | 857 def _AddConvertingSetter(self, attr, html_name, conversion): |
| 857 self._members_emitter.Emit( | 858 self._members_emitter.Emit( |
| 858 # TODO(sra): Use metadata to provide native name. | 859 # TODO(sra): Use metadata to provide native name. |
| 859 '\n void set $HTML_NAME($INPUT_TYPE value) {' | 860 '\n void set $HTML_NAME($INPUT_TYPE value) {' |
| (...skipping 26 matching lines...) Expand all Loading... |
| 886 self._AddFutureifiedOperation(info, html_name) | 887 self._AddFutureifiedOperation(info, html_name) |
| 887 elif any(self._OperationRequiresConversions(op) for op in info.overloads): | 888 elif any(self._OperationRequiresConversions(op) for op in info.overloads): |
| 888 # Any conversions needed? | 889 # Any conversions needed? |
| 889 self._AddOperationWithConversions(info, html_name) | 890 self._AddOperationWithConversions(info, html_name) |
| 890 else: | 891 else: |
| 891 self._AddDirectNativeOperation(info, html_name) | 892 self._AddDirectNativeOperation(info, html_name) |
| 892 | 893 |
| 893 def _AddDirectNativeOperation(self, info, html_name): | 894 def _AddDirectNativeOperation(self, info, html_name): |
| 894 self._members_emitter.Emit( | 895 self._members_emitter.Emit( |
| 895 '\n' | 896 '\n' |
| 896 ' $RENAME$ANNOTATIONS$MODIFIERS$TYPE $NAME($PARAMS) native;\n', | 897 ' $RENAME$METADATA$MODIFIERS$TYPE $NAME($PARAMS) native;\n', |
| 897 RENAME=self._RenamingAnnotation(info.declared_name, html_name), | 898 RENAME=self._RenamingAnnotation(info.declared_name, html_name), |
| 898 ANNOTATIONS=self._Annotations(info.type_name, info.declared_name), | 899 METADATA=self._Metadata(info.type_name, info.declared_name), |
| 899 MODIFIERS='static ' if info.IsStatic() else '', | 900 MODIFIERS='static ' if info.IsStatic() else '', |
| 900 TYPE=self.SecureOutputType(info.type_name), | 901 TYPE=self.SecureOutputType(info.type_name), |
| 901 NAME=html_name, | 902 NAME=html_name, |
| 902 PARAMS=info.ParametersDeclaration(self._NarrowInputType)) | 903 PARAMS=info.ParametersDeclaration(self._NarrowInputType)) |
| 903 | 904 |
| 904 def _AddOperationWithConversions(self, info, html_name): | 905 def _AddOperationWithConversions(self, info, html_name): |
| 905 # Assert all operations have same return type. | 906 # Assert all operations have same return type. |
| 906 assert len(set([op.type.id for op in info.operations])) == 1 | 907 assert len(set([op.type.id for op in info.operations])) == 1 |
| 907 output_conversion = self._OutputConversion(info.type_name, | 908 output_conversion = self._OutputConversion(info.type_name, |
| 908 info.declared_name) | 909 info.declared_name) |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 968 # TODO(sra): If the native method has zero type checks, we can 'inline' is | 969 # TODO(sra): If the native method has zero type checks, we can 'inline' is |
| 969 # and call it directly with a JS-expression. | 970 # and call it directly with a JS-expression. |
| 970 call = '%s(%s)' % (target, argument_list) | 971 call = '%s(%s)' % (target, argument_list) |
| 971 | 972 |
| 972 if output_conversion: | 973 if output_conversion: |
| 973 call = '%s(%s)' % (output_conversion.function_name, call) | 974 call = '%s(%s)' % (output_conversion.function_name, call) |
| 974 | 975 |
| 975 call_emitter.Emit(call) | 976 call_emitter.Emit(call) |
| 976 | 977 |
| 977 self._members_emitter.Emit( | 978 self._members_emitter.Emit( |
| 978 ' $RENAME$ANNOTATIONS$MODIFIERS$TYPE$TARGET($PARAMS) native;\n', | 979 ' $RENAME$METADATA$MODIFIERS$TYPE$TARGET($PARAMS) native;\n', |
| 979 RENAME=self._RenamingAnnotation(info.declared_name, target), | 980 RENAME=self._RenamingAnnotation(info.declared_name, target), |
| 980 ANNOTATIONS=self._Annotations(info.type_name, info.declared_name), | 981 METADATA=self._Metadata(info.type_name, info.declared_name), |
| 981 MODIFIERS='static ' if info.IsStatic() else '', | 982 MODIFIERS='static ' if info.IsStatic() else '', |
| 982 TYPE=TypeOrNothing(native_return_type), | 983 TYPE=TypeOrNothing(native_return_type), |
| 983 TARGET=target, | 984 TARGET=target, |
| 984 PARAMS=', '.join(target_parameters)) | 985 PARAMS=', '.join(target_parameters)) |
| 985 | 986 |
| 986 declaration = '%s%s%s %s(%s)' % ( | 987 declaration = '%s%s%s %s(%s)' % ( |
| 987 self._Annotations(info.type_name, info.declared_name), | 988 self._Metadata(info.type_name, info.declared_name), |
| 988 'static ' if info.IsStatic() else '', | 989 'static ' if info.IsStatic() else '', |
| 989 return_type, | 990 return_type, |
| 990 html_name, | 991 html_name, |
| 991 info.ParametersDeclaration(InputType)) | 992 info.ParametersDeclaration(InputType)) |
| 992 self._GenerateDispatcherBody( | 993 self._GenerateDispatcherBody( |
| 993 operations, | 994 operations, |
| 994 parameter_names, | 995 parameter_names, |
| 995 declaration, | 996 declaration, |
| 996 GenerateCall, | 997 GenerateCall, |
| 997 lambda _, argument: IsOptional(argument), | 998 lambda _, argument: IsOptional(argument), |
| (...skipping 27 matching lines...) Expand all Loading... |
| 1025 | 1026 |
| 1026 def _HasCustomImplementation(self, member_name): | 1027 def _HasCustomImplementation(self, member_name): |
| 1027 member_name = '%s.%s' % (self._interface.doc_js_name, member_name) | 1028 member_name = '%s.%s' % (self._interface.doc_js_name, member_name) |
| 1028 return member_name in _js_custom_members | 1029 return member_name in _js_custom_members |
| 1029 | 1030 |
| 1030 def _RenamingAnnotation(self, idl_name, member_name): | 1031 def _RenamingAnnotation(self, idl_name, member_name): |
| 1031 if member_name != idl_name: | 1032 if member_name != idl_name: |
| 1032 return "@JSName('%s')\n " % idl_name | 1033 return "@JSName('%s')\n " % idl_name |
| 1033 return '' | 1034 return '' |
| 1034 | 1035 |
| 1035 def _Annotations(self, idl_type, idl_member_name, indent=' '): | 1036 def _Metadata(self, idl_type, idl_member_name, indent=' '): |
| 1036 anns = FindDart2JSAnnotationsAndComments(idl_type, self._library_name, | 1037 anns = self._metadata.GetDart2JSMetadata( |
| 1037 self._interface.id, | 1038 idl_type, self._library_name, self._interface.id, idl_member_name) |
| 1038 idl_member_name) | |
| 1039 | 1039 |
| 1040 if not AnyConversionAnnotations(idl_type, self._interface.id, | 1040 if not self._metadata.AnyConversionAnnotations( |
| 1041 idl_member_name): | 1041 idl_type, self._interface.id, idl_member_name): |
| 1042 return_type = self.SecureOutputType(idl_type) | 1042 return_type = self.SecureOutputType(idl_type) |
| 1043 native_type = self._NarrowToImplementationType(idl_type) | 1043 native_type = self._NarrowToImplementationType(idl_type) |
| 1044 if native_type != return_type: | 1044 if native_type != return_type: |
| 1045 anns = anns + [ | 1045 anns = anns + [ |
| 1046 "@Returns('%s')" % native_type, | 1046 "@Returns('%s')" % native_type, |
| 1047 "@Creates('%s')" % native_type, | 1047 "@Creates('%s')" % native_type, |
| 1048 ] | 1048 ] |
| 1049 return FormatAnnotationsAndComments(anns, indent); | 1049 return self._metadata.FormatMetadata(anns, indent); |
| 1050 | 1050 |
| 1051 def CustomJSMembers(self): | 1051 def CustomJSMembers(self): |
| 1052 return _js_custom_members | 1052 return _js_custom_members |
| 1053 | 1053 |
| 1054 def _NarrowToImplementationType(self, type_name): | 1054 def _NarrowToImplementationType(self, type_name): |
| 1055 return self._type_registry.TypeInfo(type_name).narrow_dart_type() | 1055 return self._type_registry.TypeInfo(type_name).narrow_dart_type() |
| 1056 | 1056 |
| 1057 def _NarrowInputType(self, type_name): | 1057 def _NarrowInputType(self, type_name): |
| 1058 return self._NarrowToImplementationType(type_name) | 1058 return self._NarrowToImplementationType(type_name) |
| 1059 | 1059 |
| (...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1156 for library_name in libraries: | 1156 for library_name in libraries: |
| 1157 self._libraries[library_name] = DartLibrary( | 1157 self._libraries[library_name] = DartLibrary( |
| 1158 library_name, template_loader, library_type, output_dir) | 1158 library_name, template_loader, library_type, output_dir) |
| 1159 | 1159 |
| 1160 def AddFile(self, basename, library_name, path): | 1160 def AddFile(self, basename, library_name, path): |
| 1161 self._libraries[library_name].AddFile(path) | 1161 self._libraries[library_name].AddFile(path) |
| 1162 | 1162 |
| 1163 def Emit(self, emitter, auxiliary_dir): | 1163 def Emit(self, emitter, auxiliary_dir): |
| 1164 for lib in self._libraries.values(): | 1164 for lib in self._libraries.values(): |
| 1165 lib.Emit(emitter, auxiliary_dir) | 1165 lib.Emit(emitter, auxiliary_dir) |
| OLD | NEW |