Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(5)

Side by Side Diff: tools/dom/scripts/systemhtml.py

Issue 14455007: Refactoring DOM annotations and comment generation, adding DOM API triage list (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 7 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
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
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
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
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
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
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
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
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
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)
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698