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

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

Issue 10704096: Extract common FactoryProviders generation logic. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 8 years, 5 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 | « lib/dom/scripts/dartdomgenerator.py ('k') | lib/dom/scripts/systemnative.py » ('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 import emitter 9 import emitter
10 10
(...skipping 757 matching lines...) Expand 10 before | Expand all | Expand 10 after
768 templates, database, emitters, output_dir) 768 templates, database, emitters, output_dir)
769 self._shared = HtmlSystemShared(database) 769 self._shared = HtmlSystemShared(database)
770 770
771 class HtmlInterfacesSystem(HtmlSystem): 771 class HtmlInterfacesSystem(HtmlSystem):
772 772
773 def __init__(self, templates, database, emitters, output_dir, backend): 773 def __init__(self, templates, database, emitters, output_dir, backend):
774 super(HtmlInterfacesSystem, self).__init__( 774 super(HtmlInterfacesSystem, self).__init__(
775 templates, database, emitters, output_dir) 775 templates, database, emitters, output_dir)
776 self._backend = backend 776 self._backend = backend
777 self._dart_interface_file_paths = [] 777 self._dart_interface_file_paths = []
778 self._factory_provider_emitters = {} 778 self._elements_factory_emitter = None
779 779
780 def ProcessInterface(self, interface): 780 def ProcessInterface(self, interface):
781 HtmlDartInterfaceGenerator(self, interface).Generate() 781 HtmlDartInterfaceGenerator(self, interface).Generate()
782 782
783 def ProcessCallback(self, interface, info): 783 def ProcessCallback(self, interface, info):
784 """Generates a typedef for the callback interface.""" 784 """Generates a typedef for the callback interface."""
785 interface_name = interface.id 785 interface_name = interface.id
786 file_path = self._FilePathForDartInterface(interface_name) 786 file_path = self._FilePathForDartInterface(interface_name)
787 self._ProcessCallback(interface, info, file_path) 787 self._ProcessCallback(interface, info, file_path)
788 self._backend.ProcessCallback(interface, info) 788 self._backend.ProcessCallback(interface, info)
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
850 850
851 factory_provider = None 851 factory_provider = None
852 if typename in interface_factories: 852 if typename in interface_factories:
853 factory_provider = interface_factories[typename] 853 factory_provider = interface_factories[typename]
854 854
855 constructors = [] 855 constructors = []
856 constructor_info = AnalyzeConstructor(self._interface) 856 constructor_info = AnalyzeConstructor(self._interface)
857 if constructor_info: 857 if constructor_info:
858 constructors.append(constructor_info) 858 constructors.append(constructor_info)
859 factory_provider = '_' + typename + 'FactoryProvider' 859 factory_provider = '_' + typename + 'FactoryProvider'
860 path = self._backend.FilePathForDartFactoryProviderImplementation()
861 self._system._dart_interface_file_paths.append(path)
862 factory_provider_emitter = self._system._emitters.FileEmitter(path)
863 self._backend.EmitFactoryProvider(
864 constructor_info, factory_provider, factory_provider_emitter)
860 865
861 infos = HtmlElementConstructorInfos(typename) 866 infos = HtmlElementConstructorInfos(typename)
867 if infos:
868 if not self._system._elements_factory_emitter:
869 path = self._backend.FilePathForDartElementsFactoryProviderImplementatio n()
870 self._system._dart_interface_file_paths.append(path)
871 file_emitter = self._system._emitters.FileEmitter(path)
872 template = self._system._templates.Load(
873 'factoryprovider_Elements.darttemplate')
874 self._system._elements_factory_emitter = file_emitter.Emit(template)
875 EmitHtmlElementFactoryConstructors(
876 self._system._elements_factory_emitter,
877 infos,
878 self._html_interface_name,
879 self._backend.ImplementationClassName())
880
862 for info in infos: 881 for info in infos:
863 constructors.append(info.ConstructorInfo(typename)) 882 constructors.append(info.ConstructorInfo(typename))
864 if factory_provider: 883 if factory_provider:
865 assert factory_provider == info.factory_provider_name 884 assert factory_provider == info.factory_provider_name
866 else: 885 else:
867 factory_provider = info.factory_provider_name 886 factory_provider = info.factory_provider_name
868 887
869 if factory_provider: 888 if factory_provider:
870 extends_str += ' default ' + factory_provider 889 extends_str += ' default ' + factory_provider
871 890
(...skipping 18 matching lines...) Expand all
890 self._implementation_members_emitter = self._backend.StartInterface() 909 self._implementation_members_emitter = self._backend.StartInterface()
891 910
892 for constructor_info in constructors: 911 for constructor_info in constructors:
893 self._members_emitter.Emit( 912 self._members_emitter.Emit(
894 '\n' 913 '\n'
895 ' $CTOR($PARAMS);\n', 914 ' $CTOR($PARAMS);\n',
896 CTOR=self._shared.DartType(constructor_info.ConstructorFullName()), 915 CTOR=self._shared.DartType(constructor_info.ConstructorFullName()),
897 PARAMS=constructor_info.ParametersInterfaceDeclaration( 916 PARAMS=constructor_info.ParametersInterfaceDeclaration(
898 self._shared.DartType)) 917 self._shared.DartType))
899 918
900 if infos:
901 EmitHtmlElementFactoryConstructors(
902 self._system._backend._EmitterForFactoryProviderBody(
903 infos[0].factory_provider_name),
904 infos,
905 self._html_interface_name,
906 self._backend.ImplementationClassName())
907
908 element_type = MaybeTypedArrayElementTypeInHierarchy( 919 element_type = MaybeTypedArrayElementTypeInHierarchy(
909 self._interface, self._system._database) 920 self._interface, self._system._database)
910 if element_type: 921 if element_type:
911 self._members_emitter.Emit( 922 self._members_emitter.Emit(
912 '\n' 923 '\n'
913 ' $CTOR(int length);\n' 924 ' $CTOR(int length);\n'
914 '\n' 925 '\n'
915 ' $CTOR.fromList(List<$TYPE> list);\n' 926 ' $CTOR.fromList(List<$TYPE> list);\n'
916 '\n' 927 '\n'
917 ' $CTOR.fromBuffer(ArrayBuffer buffer,' 928 ' $CTOR.fromBuffer(ArrayBuffer buffer,'
(...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after
1076 return not (IsPureInterface(self._interface.id) or 1087 return not (IsPureInterface(self._interface.id) or
1077 self._interface.id in _merged_html_interfaces) 1088 self._interface.id in _merged_html_interfaces)
1078 1089
1079 def ImplementationClassName(self): 1090 def ImplementationClassName(self):
1080 return self._ImplClassName(self._html_interface_name) 1091 return self._ImplClassName(self._html_interface_name)
1081 1092
1082 def FilePathForDartImplementation(self): 1093 def FilePathForDartImplementation(self):
1083 return os.path.join(self._system._output_dir, 'html', 'frog', 1094 return os.path.join(self._system._output_dir, 'html', 'frog',
1084 '%s.dart' % self._html_interface_name) 1095 '%s.dart' % self._html_interface_name)
1085 1096
1097 def FilePathForDartFactoryProviderImplementation(self):
1098 return os.path.join(self._system._output_dir, 'html', 'frog',
1099 '_%sFactoryProvider.dart' % self._html_interface_name)
1100
1101 def FilePathForDartElementsFactoryProviderImplementation(self):
1102 return os.path.join(self._system._output_dir, 'html', 'frog',
1103 '_Elements.dart')
1104
1086 def SetImplementationEmitter(self, implementation_emitter): 1105 def SetImplementationEmitter(self, implementation_emitter):
1087 self._dart_code = implementation_emitter 1106 self._dart_code = implementation_emitter
1088 1107
1089 def AddMergedMembers(self, merged_interface): 1108 def AddMergedMembers(self, merged_interface):
1090 self.AddMembers(merged_interface) 1109 self.AddMembers(merged_interface)
1091 1110
1092 def _ImplClassName(self, type_name): 1111 def _ImplClassName(self, type_name):
1093 return self._shared._ImplClassName(type_name) 1112 return self._shared._ImplClassName(type_name)
1094 1113
1095 def _NarrowToImplementationType(self, type_name): 1114 def _NarrowToImplementationType(self, type_name):
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
1134 #$!MEMBERS 1153 #$!MEMBERS
1135 #} 1154 #}
1136 CLASSNAME=self._class_name, 1155 CLASSNAME=self._class_name,
1137 EXTENDS=extends, 1156 EXTENDS=extends,
1138 IMPLEMENTS=' implements ' + ', '.join(implements), 1157 IMPLEMENTS=' implements ' + ', '.join(implements),
1139 NATIVESPEC=' native "' + native_spec + '"') 1158 NATIVESPEC=' native "' + native_spec + '"')
1140 if self._members_emitter == None: 1159 if self._members_emitter == None:
1141 raise Exception("Class %s doesn't use the $!MEMBERS variable" % 1160 raise Exception("Class %s doesn't use the $!MEMBERS variable" %
1142 self._class_name) 1161 self._class_name)
1143 1162
1144 # Emit a factory provider class for the constructor.
1145 constructor_info = AnalyzeConstructor(interface)
1146 if constructor_info:
1147 self._EmitFactoryProvider(constructor_info)
1148
1149 return self._members_emitter 1163 return self._members_emitter
1150 1164
1151 def _EmitFactoryProvider(self, constructor_info): 1165 def EmitFactoryProvider(self, constructor_info, factory_provider, emitter):
1152 template_file = ('factoryprovider_%s.darttemplate' % 1166 template_file = ('factoryprovider_%s.darttemplate' %
1153 self._html_interface_name) 1167 self._html_interface_name)
1154 template = self._system._templates.TryLoad(template_file) 1168 template = self._system._templates.TryLoad(template_file)
1155 if not template: 1169 if not template:
1156 template = self._system._templates.Load('factoryprovider.darttemplate') 1170 template = self._system._templates.Load('factoryprovider.darttemplate')
1157 1171
1158 factory_provider = '_' + self._html_interface_name + 'FactoryProvider'
1159 emitter = self._system._ImplFileEmitter(factory_provider)
1160 emitter.Emit( 1172 emitter.Emit(
1161 template, 1173 template,
1162 FACTORYPROVIDER=factory_provider, 1174 FACTORYPROVIDER=factory_provider,
1163 CONSTRUCTOR=self._html_interface_name, 1175 CONSTRUCTOR=self._html_interface_name,
1164 PARAMETERS=constructor_info.ParametersImplementationDeclaration(), 1176 PARAMETERS=constructor_info.ParametersImplementationDeclaration(),
1165 NAMED_CONSTRUCTOR=constructor_info.name or self._html_interface_name, 1177 NAMED_CONSTRUCTOR=constructor_info.name or self._html_interface_name,
1166 ARGUMENTS=constructor_info.ParametersAsArgumentList()) 1178 ARGUMENTS=constructor_info.ParametersAsArgumentList())
1167 1179
1168 def AddIndexer(self, element_type): 1180 def AddIndexer(self, element_type):
1169 """Adds all the methods required to complete implementation of List.""" 1181 """Adds all the methods required to complete implementation of List."""
(...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after
1347 PARAMS=info.ParametersImplementationDeclaration( 1359 PARAMS=info.ParametersImplementationDeclaration(
1348 lambda type_name: self._NarrowInputType(type_name))) 1360 lambda type_name: self._NarrowInputType(type_name)))
1349 1361
1350 # ------------------------------------------------------------------------------ 1362 # ------------------------------------------------------------------------------
1351 1363
1352 class HtmlFrogSystem(HtmlSystem): 1364 class HtmlFrogSystem(HtmlSystem):
1353 1365
1354 def __init__(self, templates, database, emitters, output_dir): 1366 def __init__(self, templates, database, emitters, output_dir):
1355 super(HtmlFrogSystem, self).__init__( 1367 super(HtmlFrogSystem, self).__init__(
1356 templates, database, emitters, output_dir) 1368 templates, database, emitters, output_dir)
1357 self._dart_frog_file_paths = []
1358 self._factory_provider_emitters = {}
1359 1369
1360 def ImplementationGenerator(self, interface): 1370 def ImplementationGenerator(self, interface):
1361 return HtmlFrogClassGenerator(self, interface) 1371 return HtmlFrogClassGenerator(self, interface)
1362 1372
1363 def GenerateLibraries(self, interface_files): 1373 def GenerateLibraries(self, dart_files):
1364 self._GenerateLibFile( 1374 self._GenerateLibFile(
1365 'html_frog.darttemplate', 1375 'html_frog.darttemplate',
1366 os.path.join(self._output_dir, 'html_frog.dart'), 1376 os.path.join(self._output_dir, 'html_frog.dart'),
1367 interface_files + self._dart_frog_file_paths) 1377 dart_files)
1368 1378
1369 def Finish(self): 1379 def Finish(self):
1370 pass 1380 pass
1371 1381
1372 def _ImplFileEmitter(self, name):
1373 """Returns the file emitter of the Frog implementation file."""
1374 path = os.path.join(self._output_dir, 'html', 'frog', '%s.dart' % name)
1375 self._dart_frog_file_paths.append(path)
1376 return self._emitters.FileEmitter(path)
1377
1378 def _EmitterForFactoryProviderBody(self, name):
1379 if name not in self._factory_provider_emitters:
1380 template = self._templates.Load('factoryprovider_%s.darttemplate' % name)
1381 file_emitter = self._ImplFileEmitter(name)
1382 self._factory_provider_emitters[name] = file_emitter.Emit(template)
1383 return self._factory_provider_emitters[name]
1384
1385 # ----------------------------------------------------------------------------- 1382 # -----------------------------------------------------------------------------
1386 1383
1387 def _ComputeInheritanceClosure(database): 1384 def _ComputeInheritanceClosure(database):
1388 def Collect(interface, seen, collected): 1385 def Collect(interface, seen, collected):
1389 name = interface.id 1386 name = interface.id
1390 if '<' in name: 1387 if '<' in name:
1391 # TODO(sra): Handle parameterized types. 1388 # TODO(sra): Handle parameterized types.
1392 return 1389 return
1393 if not name in seen: 1390 if not name in seen:
1394 seen.add(name) 1391 seen.add(name)
1395 collected.append(name) 1392 collected.append(name)
1396 for parent in interface.parents: 1393 for parent in interface.parents:
1397 # TODO(sra): Handle parameterized types. 1394 # TODO(sra): Handle parameterized types.
1398 if not '<' in parent.type.id: 1395 if not '<' in parent.type.id:
1399 if database.HasInterface(parent.type.id): 1396 if database.HasInterface(parent.type.id):
1400 Collect(database.GetInterface(parent.type.id), 1397 Collect(database.GetInterface(parent.type.id),
1401 seen, collected) 1398 seen, collected)
1402 1399
1403 inheritance_closure = {} 1400 inheritance_closure = {}
1404 for interface in database.GetInterfaces(): 1401 for interface in database.GetInterfaces():
1405 seen = set() 1402 seen = set()
1406 collected = [] 1403 collected = []
1407 Collect(interface, seen, collected) 1404 Collect(interface, seen, collected)
1408 inheritance_closure[interface.id] = collected 1405 inheritance_closure[interface.id] = collected
1409 return inheritance_closure 1406 return inheritance_closure
OLDNEW
« no previous file with comments | « lib/dom/scripts/dartdomgenerator.py ('k') | lib/dom/scripts/systemnative.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698