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 os | 10 import os |
(...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
192 self._renamer = options.renamer | 192 self._renamer = options.renamer |
193 self._database = options.database | 193 self._database = options.database |
194 self._template_loader = options.templates | 194 self._template_loader = options.templates |
195 self._type_registry = options.type_registry | 195 self._type_registry = options.type_registry |
196 self._options = options | 196 self._options = options |
197 self._library_emitter = library_emitter | 197 self._library_emitter = library_emitter |
198 self._event_generator = event_generator | 198 self._event_generator = event_generator |
199 self._interface = interface | 199 self._interface = interface |
200 self._backend = backend | 200 self._backend = backend |
201 self._interface_type_info = self._type_registry.TypeInfo(self._interface.id) | 201 self._interface_type_info = self._type_registry.TypeInfo(self._interface.id) |
202 self._library_name = self._renamer.GetLibraryName(self._interface) | |
202 | 203 |
203 def Generate(self): | 204 def Generate(self): |
204 if 'Callback' in self._interface.ext_attrs: | 205 if 'Callback' in self._interface.ext_attrs: |
205 self.GenerateCallback() | 206 self.GenerateCallback() |
206 else: | 207 else: |
207 self.GenerateInterface() | 208 self.GenerateInterface() |
208 | 209 |
209 def GenerateCallback(self): | 210 def GenerateCallback(self): |
210 """Generates a typedef for the callback interface.""" | 211 """Generates a typedef for the callback interface.""" |
211 handlers = [operation for operation in self._interface.operations | 212 handlers = [operation for operation in self._interface.operations |
212 if operation.id == 'handleEvent'] | 213 if operation.id == 'handleEvent'] |
213 info = AnalyzeOperation(self._interface, handlers) | 214 info = AnalyzeOperation(self._interface, handlers) |
214 code = self._library_emitter.FileEmitter(self._interface.id) | 215 code = self._library_emitter.FileEmitter(self._interface.id, |
216 self._library_name) | |
215 code.Emit(self._template_loader.Load('callback.darttemplate')) | 217 code.Emit(self._template_loader.Load('callback.darttemplate')) |
216 code.Emit('typedef void $NAME($PARAMS);\n', | 218 code.Emit('typedef void $NAME($PARAMS);\n', |
217 NAME=self._interface.id, | 219 NAME=self._interface.id, |
218 PARAMS=info.ParametersDeclaration(self._DartType)) | 220 PARAMS=info.ParametersDeclaration(self._DartType)) |
219 self._backend.GenerateCallback(info) | 221 self._backend.GenerateCallback(info) |
220 | 222 |
221 def GenerateInterface(self): | 223 def GenerateInterface(self): |
222 interface_name = self._interface_type_info.interface_name() | 224 interface_name = self._interface_type_info.interface_name() |
223 | 225 |
224 factory_provider = None | 226 factory_provider = None |
225 if interface_name in interface_factories: | 227 if interface_name in interface_factories: |
226 factory_provider = interface_factories[interface_name] | 228 factory_provider = interface_factories[interface_name] |
227 | 229 |
228 constructors = [] | 230 constructors = [] |
229 if interface_name in _static_classes: | 231 if interface_name in _static_classes: |
230 constructor_info = None | 232 constructor_info = None |
231 else: | 233 else: |
232 constructor_info = AnalyzeConstructor(self._interface) | 234 constructor_info = AnalyzeConstructor(self._interface) |
233 if constructor_info: | 235 if constructor_info: |
234 constructors.append(constructor_info) | 236 constructors.append(constructor_info) |
235 factory_provider = '_' + interface_name + 'FactoryProvider' | 237 factory_provider = '_' + interface_name + 'FactoryProvider' |
236 factory_provider_emitter = self._library_emitter.FileEmitter( | 238 factory_provider_emitter = self._library_emitter.FileEmitter( |
237 '_%sFactoryProvider' % interface_name) | 239 '_%sFactoryProvider' % interface_name, self._library_name) |
238 self._backend.EmitFactoryProvider( | 240 self._backend.EmitFactoryProvider( |
239 constructor_info, factory_provider, factory_provider_emitter) | 241 constructor_info, factory_provider, factory_provider_emitter) |
240 | 242 |
241 infos = HtmlElementConstructorInfos(interface_name) | 243 infos = HtmlElementConstructorInfos(interface_name) |
242 if infos: | 244 if infos: |
243 template = self._template_loader.Load( | 245 template = self._template_loader.Load( |
244 'factoryprovider_Elements.darttemplate') | 246 'factoryprovider_Elements.darttemplate') |
245 EmitHtmlElementFactoryConstructors( | 247 EmitHtmlElementFactoryConstructors( |
246 self._library_emitter.FileEmitter('_Elements', template), | 248 self._library_emitter.FileEmitter('_Elements', self._library_name, |
249 template), | |
247 infos, | 250 infos, |
248 self._interface.id, | 251 self._interface.id, |
249 self._interface_type_info.implementation_name(), | 252 self._interface_type_info.implementation_name(), |
250 self._DartType) | 253 self._DartType) |
251 | 254 |
252 for info in infos: | 255 for info in infos: |
253 constructors.append(info.ConstructorInfo(self._interface.id)) | 256 constructors.append(info.ConstructorInfo(self._interface.id)) |
254 if factory_provider: | 257 if factory_provider: |
255 assert factory_provider == info.factory_provider_name | 258 assert factory_provider == info.factory_provider_name |
256 else: | 259 else: |
(...skipping 25 matching lines...) Expand all Loading... | |
282 secure_base_name = self._backend.SecureBaseName(interface_name) | 285 secure_base_name = self._backend.SecureBaseName(interface_name) |
283 if secure_base_name: | 286 if secure_base_name: |
284 implements.append(secure_base_name) | 287 implements.append(secure_base_name) |
285 | 288 |
286 implements_str = '' | 289 implements_str = '' |
287 if implements: | 290 if implements: |
288 implements_str = ' implements ' + ', '.join(set(implements)) | 291 implements_str = ' implements ' + ', '.join(set(implements)) |
289 | 292 |
290 self._implementation_members_emitter = implementation_emitter.Emit( | 293 self._implementation_members_emitter = implementation_emitter.Emit( |
291 self._backend.ImplementationTemplate(), | 294 self._backend.ImplementationTemplate(), |
295 LIBRARYNAME=self._renamer.GetLibraryName(self._interface), | |
Anton Muhin
2012/11/09 13:13:23
LIBRARYNAME=self._library_name?
blois
2012/11/09 18:21:56
Done.
| |
292 CLASSNAME=self._interface_type_info.implementation_name(), | 296 CLASSNAME=self._interface_type_info.implementation_name(), |
293 EXTENDS=' extends %s' % base_class if base_class else '', | 297 EXTENDS=' extends %s' % base_class if base_class else '', |
294 IMPLEMENTS=implements_str, | 298 IMPLEMENTS=implements_str, |
295 DOMNAME=self._interface.doc_js_name, | 299 DOMNAME=self._interface.doc_js_name, |
296 NATIVESPEC=self._backend.NativeSpec()) | 300 NATIVESPEC=self._backend.NativeSpec()) |
297 self._backend.StartInterface(self._implementation_members_emitter) | 301 self._backend.StartInterface(self._implementation_members_emitter) |
298 | 302 |
299 self._backend.AddConstructors(constructors, factory_provider, | 303 self._backend.AddConstructors(constructors, factory_provider, |
300 self._interface_type_info.implementation_name(), | 304 self._interface_type_info.implementation_name(), |
301 base_class) | 305 base_class) |
(...skipping 13 matching lines...) Expand all Loading... | |
315 self._backend.AddMembers(self._interface) | 319 self._backend.AddMembers(self._interface) |
316 self._backend.AddSecondaryMembers(self._interface) | 320 self._backend.AddSecondaryMembers(self._interface) |
317 self._backend.FinishInterface() | 321 self._backend.FinishInterface() |
318 | 322 |
319 def _ImplementationEmitter(self): | 323 def _ImplementationEmitter(self): |
320 basename = self._interface_type_info.implementation_name() | 324 basename = self._interface_type_info.implementation_name() |
321 if (self._interface_type_info.merged_into() and | 325 if (self._interface_type_info.merged_into() and |
322 self._backend.ImplementsMergedMembers()): | 326 self._backend.ImplementsMergedMembers()): |
323 # Merged members are implemented in target interface implementation. | 327 # Merged members are implemented in target interface implementation. |
324 return emitter.Emitter() | 328 return emitter.Emitter() |
325 return self._library_emitter.FileEmitter(basename) | 329 return self._library_emitter.FileEmitter(basename, self._library_name) |
326 | 330 |
327 def _DartType(self, type_name): | 331 def _DartType(self, type_name): |
328 return self._type_registry.DartType(type_name) | 332 return self._type_registry.DartType(type_name) |
329 | 333 |
330 | 334 |
331 # ------------------------------------------------------------------------------ | 335 # ------------------------------------------------------------------------------ |
332 | 336 |
333 class Dart2JSBackend(HtmlDartGenerator): | 337 class Dart2JSBackend(HtmlDartGenerator): |
334 """Generates a dart2js class for the dart:html library from a DOM IDL | 338 """Generates a dart2js class for the dart:html library from a DOM IDL |
335 interface. | 339 interface. |
(...skipping 522 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
858 return (None, None) | 862 return (None, None) |
859 | 863 |
860 return FindInParent(self._interface) if attr else (None, None) | 864 return FindInParent(self._interface) if attr else (None, None) |
861 | 865 |
862 def _DartType(self, type_name): | 866 def _DartType(self, type_name): |
863 return self._type_registry.DartType(type_name) | 867 return self._type_registry.DartType(type_name) |
864 | 868 |
865 # ------------------------------------------------------------------------------ | 869 # ------------------------------------------------------------------------------ |
866 | 870 |
867 class DartLibraryEmitter(): | 871 class DartLibraryEmitter(): |
868 def __init__(self, multiemitter, template, dart_sources_dir): | 872 def __init__(self, multiemitter, template, dart_sources_dir, dart_libraries): |
869 self._multiemitter = multiemitter | 873 self._multiemitter = multiemitter |
870 self._template = template | 874 self._template = template |
871 self._dart_sources_dir = dart_sources_dir | 875 self._dart_sources_dir = dart_sources_dir |
872 self._path_to_emitter = {} | 876 self._path_to_emitter = {} |
877 self._dart_libraries = dart_libraries | |
873 | 878 |
874 def FileEmitter(self, basename, template=None): | 879 def FileEmitter(self, basename, library_name, template=None): |
875 path = os.path.join(self._dart_sources_dir, '%s.dart' % basename) | 880 path = os.path.join(self._dart_sources_dir, '%s.dart' % basename) |
876 if not path in self._path_to_emitter: | 881 if not path in self._path_to_emitter: |
877 emitter = self._multiemitter.FileEmitter(path) | 882 emitter = self._multiemitter.FileEmitter(path) |
878 if not template is None: | 883 if not template is None: |
879 emitter = emitter.Emit(template) | 884 emitter = emitter.Emit(template) |
880 self._path_to_emitter[path] = emitter | 885 self._path_to_emitter[path] = emitter |
886 | |
887 self._dart_libraries.AddFile(basename, library_name, path) | |
881 return self._path_to_emitter[path] | 888 return self._path_to_emitter[path] |
882 | 889 |
883 def EmitLibrary(self, library_file_path, auxiliary_dir): | 890 def EmitLibraries(self, auxiliary_dir): |
891 self._dart_libraries.Emit(self._multiemitter, auxiliary_dir) | |
892 | |
893 # ------------------------------------------------------------------------------ | |
894 class DartLibrary(): | |
895 def __init__(self, name, template_loader, library_type, output_dir): | |
896 self._template = template_loader.Load( | |
897 '%s_%s.darttemplate' % (name, library_type)) | |
898 self._dart_path = os.path.join( | |
899 output_dir, '%s_%s.dart' % (name, library_type)) | |
900 self._paths = [] | |
901 | |
902 def AddFile(self, path): | |
903 self._paths.append(path) | |
904 | |
905 def Emit(self, emitter, auxiliary_dir): | |
884 def massage_path(path): | 906 def massage_path(path): |
885 # The most robust way to emit path separators is to use / always. | 907 # The most robust way to emit path separators is to use / always. |
886 return path.replace('\\', '/') | 908 return path.replace('\\', '/') |
887 | 909 |
888 library_emitter = self._multiemitter.FileEmitter(library_file_path) | 910 library_emitter = emitter.FileEmitter(self._dart_path) |
889 library_file_dir = os.path.dirname(library_file_path) | 911 library_file_dir = os.path.dirname(self._dart_path) |
890 auxiliary_dir = os.path.relpath(auxiliary_dir, library_file_dir) | 912 auxiliary_dir = os.path.relpath(auxiliary_dir, library_file_dir) |
891 imports_emitter = library_emitter.Emit( | 913 imports_emitter = library_emitter.Emit( |
892 self._template, AUXILIARY_DIR=massage_path(auxiliary_dir)) | 914 self._template, AUXILIARY_DIR=massage_path(auxiliary_dir)) |
893 for path in sorted(self._path_to_emitter.keys()): | 915 |
916 for path in sorted(self._paths): | |
894 relpath = os.path.relpath(path, library_file_dir) | 917 relpath = os.path.relpath(path, library_file_dir) |
895 imports_emitter.Emit( | 918 imports_emitter.Emit( |
896 "part '$PATH';\n", PATH=massage_path(relpath)) | 919 "part '$PATH';\n", PATH=massage_path(relpath)) |
920 | |
921 # ------------------------------------------------------------------------------ | |
922 | |
923 class DartLibraries(): | |
924 def __init__(self, template_loader, library_type, output_dir): | |
Anton Muhin
2012/11/09 13:13:23
it might be more natural to use a dictionary here:
blois
2012/11/09 18:21:56
Good point, I had more logic here where the member
| |
925 self._svg_lib = DartLibrary( | |
926 'svg', template_loader, library_type, output_dir) | |
927 self._html_lib = DartLibrary( | |
928 'html', template_loader, library_type, output_dir) | |
929 | |
930 def AddFile(self, basename, library_name, path): | |
931 if library_name == 'svg': | |
932 self._svg_lib.AddFile(path) | |
933 else: | |
934 self._html_lib.AddFile(path) | |
935 | |
936 def Emit(self, emitter, auxiliary_dir): | |
937 self._html_lib.Emit(emitter, auxiliary_dir) | |
938 self._svg_lib.Emit(emitter, auxiliary_dir) | |
OLD | NEW |