| 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 | 10 |
| (...skipping 757 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |