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

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

Issue 9464002: Implement automatically generated constructors for frog and dartium dart:html (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: address code review comments Created 8 years, 9 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
« no previous file with comments | « no previous file | client/dom/src/_XMLHttpRequestUtils.dart » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 from systemfrog import * 9 from systemfrog import *
10 from systeminterface import * 10 from systeminterface import *
(...skipping 573 matching lines...) Expand 10 before | Expand all | Expand 10 after
584 (self._common_prefix, DartType(parent.type.id))) 584 (self._common_prefix, DartType(parent.type.id)))
585 585
586 comment = ' extends' 586 comment = ' extends'
587 extends_str = '' 587 extends_str = ''
588 if extends: 588 if extends:
589 extends_str += ' extends ' + ', '.join(extends) 589 extends_str += ' extends ' + ', '.join(extends)
590 comment = ',' 590 comment = ','
591 if suppressed_extends: 591 if suppressed_extends:
592 extends_str += ' /*%s %s */' % (comment, ', '.join(suppressed_extends)) 592 extends_str += ' /*%s %s */' % (comment, ', '.join(suppressed_extends))
593 593
594 factory_provider = None
595 constructor_info = AnalyzeConstructor(self._interface)
596 if constructor_info:
597 factory_provider = '_' + typename + 'FactoryProvider';
598
594 if typename in interface_factories: 599 if typename in interface_factories:
595 extends_str += ' default ' + interface_factories[typename] 600 factory_provider = interface_factories[typename]
601
602 if factory_provider:
603 extends_str += ' default ' + factory_provider
596 604
597 # TODO(vsm): Add appropriate package / namespace syntax. 605 # TODO(vsm): Add appropriate package / namespace syntax.
598 (self._members_emitter, 606 (self._members_emitter,
599 self._top_level_emitter) = self._emitter.Emit( 607 self._top_level_emitter) = self._emitter.Emit(
600 self._template + '$!TOP_LEVEL', 608 self._template + '$!TOP_LEVEL',
601 ID=typename, 609 ID=typename,
602 EXTENDS=extends_str) 610 EXTENDS=extends_str)
603 611
612 if constructor_info:
613 self._members_emitter.Emit(
614 '\n'
615 ' $CTOR($PARAMS);\n',
616 CTOR=typename,
617 PARAMS=constructor_info.ParametersInterfaceDeclaration());
618
604 element_type = MaybeTypedArrayElementType(self._interface) 619 element_type = MaybeTypedArrayElementType(self._interface)
605 if element_type: 620 if element_type:
606 self._members_emitter.Emit( 621 self._members_emitter.Emit(
607 '\n' 622 '\n'
608 ' $CTOR(int length);\n' 623 ' $CTOR(int length);\n'
609 '\n' 624 '\n'
610 ' $CTOR.fromList(List<$TYPE> list);\n' 625 ' $CTOR.fromList(List<$TYPE> list);\n'
611 '\n' 626 '\n'
612 ' $CTOR.fromBuffer(ArrayBuffer buffer);\n', 627 ' $CTOR.fromBuffer(ArrayBuffer buffer);\n',
613 CTOR=self._interface.id, 628 CTOR=self._interface.id,
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after
731 #$!MEMBERS 746 #$!MEMBERS
732 #} 747 #}
733 CLASSNAME=self._class_name, 748 CLASSNAME=self._class_name,
734 EXTENDS=extends, 749 EXTENDS=extends,
735 IMPLEMENTS=' implements ' + ', '.join(implements), 750 IMPLEMENTS=' implements ' + ', '.join(implements),
736 NATIVESPEC=' native "' + native_spec + '"') 751 NATIVESPEC=' native "' + native_spec + '"')
737 752
738 if element_type: 753 if element_type:
739 self.AddTypedArrayConstructors(element_type) 754 self.AddTypedArrayConstructors(element_type)
740 755
756 # Emit a factory provider class for the constructor.
757 constructor_info = AnalyzeConstructor(interface)
758 if constructor_info:
759 self._EmitFactoryProvider(interface_name, constructor_info)
760
761 def _EmitFactoryProvider(self, interface_name, constructor_info):
762 template_file = 'factoryprovider_%s.darttemplate' % interface_name
763 template = self._system._templates.TryLoad(template_file)
764 if not template:
765 template = self._system._templates.Load('factoryprovider.darttemplate')
766
767 factory_provider = '_' + interface_name + 'FactoryProvider'
768 emitter = self._system._ImplFileEmitter(factory_provider)
769 emitter.Emit(
770 template,
771 FACTORYPROVIDER=factory_provider,
772 CONSTRUCTOR=interface_name,
773 PARAMETERS=constructor_info.ParametersImplementationDeclaration(),
774 NAMED_CONSTRUCTOR=constructor_info.name or interface_name,
775 ARGUMENTS=constructor_info.ParametersAsArgumentList())
776
741 def AddIndexer(self, element_type): 777 def AddIndexer(self, element_type):
742 """Adds all the methods required to complete implementation of List.""" 778 """Adds all the methods required to complete implementation of List."""
743 # We would like to simply inherit the implementation of everything except 779 # We would like to simply inherit the implementation of everything except
744 # get length(), [], and maybe []=. It is possible to extend from a base 780 # get length(), [], and maybe []=. It is possible to extend from a base
745 # array implementation class only when there is no other implementation 781 # array implementation class only when there is no other implementation
746 # inheritance. There might be no implementation inheritance other than 782 # inheritance. There might be no implementation inheritance other than
747 # DOMBaseWrapper for many classes, but there might be some where the 783 # DOMBaseWrapper for many classes, but there might be some where the
748 # array-ness is introduced by a non-root interface: 784 # array-ness is introduced by a non-root interface:
749 # 785 #
750 # interface Y extends X, List<T> ... 786 # interface Y extends X, List<T> ...
(...skipping 242 matching lines...) Expand 10 before | Expand all | Expand 10 after
993 templates, database, emitters, output_dir, generator) 1029 templates, database, emitters, output_dir, generator)
994 self._dart_frog_file_paths = [] 1030 self._dart_frog_file_paths = []
995 1031
996 1032
997 def InterfaceGenerator(self, 1033 def InterfaceGenerator(self,
998 interface, 1034 interface,
999 common_prefix, 1035 common_prefix,
1000 super_interface_name, 1036 super_interface_name,
1001 source_filter): 1037 source_filter):
1002 """.""" 1038 """."""
1003 dart_frog_file_path = self._FilePathForFrogImpl(interface.id)
1004 self._dart_frog_file_paths.append(dart_frog_file_path)
1005
1006 template_file = 'impl_%s.darttemplate' % interface.id 1039 template_file = 'impl_%s.darttemplate' % interface.id
1007 template = self._templates.TryLoad(template_file) 1040 template = self._templates.TryLoad(template_file)
1008 if not template: 1041 if not template:
1009 template = self._templates.Load('frog_impl.darttemplate') 1042 template = self._templates.Load('frog_impl.darttemplate')
1010 1043
1011 dart_code = self._emitters.FileEmitter(dart_frog_file_path) 1044 dart_code = self._ImplFileEmitter(interface.id)
1012 return HtmlFrogClassGenerator(self, interface, template, 1045 return HtmlFrogClassGenerator(self, interface, template,
1013 super_interface_name, dart_code, self._shared) 1046 super_interface_name, dart_code, self._shared)
1014 1047
1015 def GenerateLibraries(self, lib_dir): 1048 def GenerateLibraries(self, lib_dir):
1016 self._GenerateLibFile( 1049 self._GenerateLibFile(
1017 'html_frog.darttemplate', 1050 'html_frog.darttemplate',
1018 os.path.join(lib_dir, 'html_frog.dart'), 1051 os.path.join(lib_dir, 'html_frog.dart'),
1019 (self._interface_system._dart_interface_file_paths + 1052 (self._interface_system._dart_interface_file_paths +
1020 self._interface_system._dart_callback_file_paths + 1053 self._interface_system._dart_callback_file_paths +
1021 self._dart_frog_file_paths)) 1054 self._dart_frog_file_paths))
1022 1055
1023 def Finish(self): 1056 def Finish(self):
1024 pass 1057 pass
1025 1058
1026 def _FilePathForFrogImpl(self, interface_name): 1059 def _ImplFileEmitter(self, name):
1027 """Returns the file path of the Frog implementation.""" 1060 """Returns the file emitter of the Frog implementation file."""
1028 # TODO(jmesserly): is this the right path 1061 # TODO(jmesserly): is this the right path
1029 return os.path.join(self._output_dir, 'html', 'frog', 1062 path = os.path.join(self._output_dir, 'html', 'frog', '%s.dart' % name)
1030 '%s.dart' % interface_name) 1063 self._dart_frog_file_paths.append(path)
1064 return self._emitters.FileEmitter(path)
1031 1065
1032 # ----------------------------------------------------------------------------- 1066 # -----------------------------------------------------------------------------
1033 1067
1034 class HtmlDartiumSystem(HtmlSystem): 1068 class HtmlDartiumSystem(HtmlSystem):
1035 1069
1036 def __init__(self, templates, database, emitters, output_dir, generator): 1070 def __init__(self, templates, database, emitters, output_dir, generator):
1037 """Prepared for generating wrapping implementation. 1071 """Prepared for generating wrapping implementation.
1038 1072
1039 - Creates emitter for Dart code. 1073 - Creates emitter for Dart code.
1040 """ 1074 """
1041 super(HtmlDartiumSystem, self).__init__( 1075 super(HtmlDartiumSystem, self).__init__(
1042 templates, database, emitters, output_dir, generator) 1076 templates, database, emitters, output_dir, generator)
1043 self._shared = HtmlSystemShared(database, generator) 1077 self._shared = HtmlSystemShared(database, generator)
1044 self._dart_dartium_file_paths = [] 1078 self._dart_dartium_file_paths = []
1045 self._wrap_cases = [] 1079 self._wrap_cases = []
1046 1080
1047 def InterfaceGenerator(self, 1081 def InterfaceGenerator(self,
1048 interface, 1082 interface,
1049 common_prefix, 1083 common_prefix,
1050 super_interface_name, 1084 super_interface_name,
1051 source_filter): 1085 source_filter):
1052 """.""" 1086 """."""
1053 dart_dartium_file_path = self._FilePathForImpl(interface.id)
1054 self._dart_dartium_file_paths.append(dart_dartium_file_path)
1055
1056 template_file = 'impl_%s.darttemplate' % interface.id 1087 template_file = 'impl_%s.darttemplate' % interface.id
1057 template = self._templates.TryLoad(template_file) 1088 template = self._templates.TryLoad(template_file)
1058 # TODO(jacobr): change this name as it is confusing. 1089 # TODO(jacobr): change this name as it is confusing.
1059 if not template: 1090 if not template:
1060 template = self._templates.Load('frog_impl.darttemplate') 1091 template = self._templates.Load('frog_impl.darttemplate')
1061 1092
1062 dart_code = self._emitters.FileEmitter(dart_dartium_file_path) 1093 dart_code = self._ImplFileEmitter(interface.id)
1063 return HtmlDartiumInterfaceGenerator(self, interface, template, 1094 return HtmlDartiumInterfaceGenerator(self, interface, template,
1064 super_interface_name, dart_code, self._BaseDefines(interface), 1095 super_interface_name, dart_code, self._BaseDefines(interface),
1065 self._shared) 1096 self._shared)
1066 1097
1067 def _FilePathForImpl(self, interface_name): 1098 def _ImplFileEmitter(self, name):
1068 """Returns the file path of the Frog implementation.""" 1099 """Returns the file emitter of the Dartium implementation file."""
1069 # TODO(jmesserly): is this the right path 1100 path = os.path.join(self._output_dir, 'html', 'dartium', '%s.dart' % name)
1070 return os.path.join(self._output_dir, 'html', 'dartium', 1101 self._dart_dartium_file_paths.append(path)
1071 '%s.dart' % interface_name) 1102 return self._emitters.FileEmitter(path);
1072 1103
1073 def ProcessCallback(self, interface, info): 1104 def ProcessCallback(self, interface, info):
1074 pass 1105 pass
1075 1106
1076 def GenerateLibraries(self, lib_dir): 1107 def GenerateLibraries(self, lib_dir):
1077 # Library generated for implementation. 1108 # Library generated for implementation.
1078 self._GenerateLibFile( 1109 self._GenerateLibFile(
1079 'html_dartium.darttemplate', 1110 'html_dartium.darttemplate',
1080 os.path.join(lib_dir, 'html_dartium.dart'), 1111 os.path.join(lib_dir, 'html_dartium.dart'),
1081 (self._interface_system._dart_interface_file_paths + 1112 (self._interface_system._dart_interface_file_paths +
1082 self._interface_system._dart_callback_file_paths + 1113 self._interface_system._dart_callback_file_paths +
1083 # FIXME: Move the implementation to a separate library.
1084 self._dart_dartium_file_paths 1114 self._dart_dartium_file_paths
1085 ), 1115 ),
1086 WRAPCASES='\n'.join(self._wrap_cases)) 1116 WRAPCASES='\n'.join(self._wrap_cases))
1087 1117
1088 def Finish(self): 1118 def Finish(self):
1089 pass 1119 pass
1090 1120
1091 # ------------------------------------------------------------------------------ 1121 # ------------------------------------------------------------------------------
1092 1122
1093 # TODO(jacobr): there is far too much duplicated code between these bindings 1123 # TODO(jacobr): there is far too much duplicated code between these bindings
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after
1195 CLASSNAME=self._class_name, 1225 CLASSNAME=self._class_name,
1196 EXTENDS=extends, 1226 EXTENDS=extends,
1197 IMPLEMENTS=' implements ' + implements_str) 1227 IMPLEMENTS=' implements ' + implements_str)
1198 1228
1199 # Document requires a custom wrapper. 1229 # Document requires a custom wrapper.
1200 if dom_name != 'Document': 1230 if dom_name != 'Document':
1201 self._members_emitter.Emit( 1231 self._members_emitter.Emit(
1202 ' $(CLASSNAME)._wrap(ptr) : super._wrap(ptr);\n', 1232 ' $(CLASSNAME)._wrap(ptr) : super._wrap(ptr);\n',
1203 CLASSNAME=self._class_name) 1233 CLASSNAME=self._class_name)
1204 1234
1235 # Emit a factory provider class for the constructor.
1236 constructor_info = AnalyzeConstructor(interface)
1237 if constructor_info:
1238 self._EmitFactoryProvider(interface_name, constructor_info)
1239
1240 def _EmitFactoryProvider(self, interface_name, constructor_info):
1241 template_file = 'factoryprovider_%s.darttemplate' % interface_name
1242 template = self._system._templates.TryLoad(template_file)
1243 if not template:
1244 template = self._system._templates.Load('factoryprovider.darttemplate')
1245
1246 factory_provider = '_' + interface_name + 'FactoryProvider'
1247 emitter = self._system._ImplFileEmitter(factory_provider)
1248 emitter.Emit(
1249 template,
1250 FACTORYPROVIDER=factory_provider,
1251 CONSTRUCTOR=interface_name,
1252 PARAMETERS=constructor_info.ParametersImplementationDeclaration(),
1253 NAMED_CONSTRUCTOR=constructor_info.name or interface_name,
1254 ARGUMENTS=constructor_info.ParametersAsArgumentList())
1255
1205 def _BaseClassName(self, interface): 1256 def _BaseClassName(self, interface):
1206 if not interface.parents: 1257 if not interface.parents:
1207 return '_DOMTypeBase' 1258 return '_DOMTypeBase'
1208 1259
1209 supertype = DartType(interface.parents[0].type.id) 1260 supertype = DartType(interface.parents[0].type.id)
1210 1261
1211 if IsDartListType(supertype) or IsDartCollectionType(supertype): 1262 if IsDartListType(supertype) or IsDartCollectionType(supertype):
1212 return 'DOMWrapperBase' 1263 return 'DOMWrapperBase'
1213 1264
1214 if supertype == 'EventTarget': 1265 if supertype == 'EventTarget':
(...skipping 450 matching lines...) Expand 10 before | Expand all | Expand 10 after
1665 # dispatch has removed f(X), leaving only f(Y), but there is no guarantee 1716 # dispatch has removed f(X), leaving only f(Y), but there is no guarantee
1666 # that Y = Z-X, so we need to check for Y. 1717 # that Y = Z-X, so we need to check for Y.
1667 true_code = emitter.Emit( 1718 true_code = emitter.Emit(
1668 '$(INDENT)if ($COND) {\n' 1719 '$(INDENT)if ($COND) {\n'
1669 '$!TRUE' 1720 '$!TRUE'
1670 '$(INDENT)}\n', 1721 '$(INDENT)}\n',
1671 COND=test, INDENT=indent) 1722 COND=test, INDENT=indent)
1672 self.GenerateDispatch( 1723 self.GenerateDispatch(
1673 true_code, info, indent + ' ', position + 1, positive) 1724 true_code, info, indent + ' ', position + 1, positive)
1674 return True 1725 return True
OLDNEW
« no previous file with comments | « no previous file | client/dom/src/_XMLHttpRequestUtils.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698