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._library_name, |
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 523 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
859 return (None, None) | 863 return (None, None) |
860 | 864 |
861 return FindInParent(self._interface) if attr else (None, None) | 865 return FindInParent(self._interface) if attr else (None, None) |
862 | 866 |
863 def _DartType(self, type_name): | 867 def _DartType(self, type_name): |
864 return self._type_registry.DartType(type_name) | 868 return self._type_registry.DartType(type_name) |
865 | 869 |
866 # ------------------------------------------------------------------------------ | 870 # ------------------------------------------------------------------------------ |
867 | 871 |
868 class DartLibraryEmitter(): | 872 class DartLibraryEmitter(): |
869 def __init__(self, multiemitter, template, dart_sources_dir): | 873 def __init__(self, multiemitter, dart_sources_dir, dart_libraries): |
870 self._multiemitter = multiemitter | 874 self._multiemitter = multiemitter |
871 self._template = template | |
872 self._dart_sources_dir = dart_sources_dir | 875 self._dart_sources_dir = dart_sources_dir |
873 self._path_to_emitter = {} | 876 self._path_to_emitter = {} |
| 877 self._dart_libraries = dart_libraries |
874 | 878 |
875 def FileEmitter(self, basename, template=None): | 879 def FileEmitter(self, basename, library_name, template=None): |
876 path = os.path.join(self._dart_sources_dir, '%s.dart' % basename) | 880 path = os.path.join(self._dart_sources_dir, '%s.dart' % basename) |
877 if not path in self._path_to_emitter: | 881 if not path in self._path_to_emitter: |
878 emitter = self._multiemitter.FileEmitter(path) | 882 emitter = self._multiemitter.FileEmitter(path) |
879 if not template is None: | 883 if not template is None: |
880 emitter = emitter.Emit(template) | 884 emitter = emitter.Emit(template) |
881 self._path_to_emitter[path] = emitter | 885 self._path_to_emitter[path] = emitter |
| 886 |
| 887 self._dart_libraries.AddFile(basename, library_name, path) |
882 return self._path_to_emitter[path] | 888 return self._path_to_emitter[path] |
883 | 889 |
884 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): |
885 def massage_path(path): | 906 def massage_path(path): |
886 # 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. |
887 return path.replace('\\', '/') | 908 return path.replace('\\', '/') |
888 | 909 |
889 library_emitter = self._multiemitter.FileEmitter(library_file_path) | 910 library_emitter = emitter.FileEmitter(self._dart_path) |
890 library_file_dir = os.path.dirname(library_file_path) | 911 library_file_dir = os.path.dirname(self._dart_path) |
891 auxiliary_dir = os.path.relpath(auxiliary_dir, library_file_dir) | 912 auxiliary_dir = os.path.relpath(auxiliary_dir, library_file_dir) |
892 imports_emitter = library_emitter.Emit( | 913 imports_emitter = library_emitter.Emit( |
893 self._template, AUXILIARY_DIR=massage_path(auxiliary_dir)) | 914 self._template, AUXILIARY_DIR=massage_path(auxiliary_dir)) |
894 for path in sorted(self._path_to_emitter.keys()): | 915 |
| 916 for path in sorted(self._paths): |
895 relpath = os.path.relpath(path, library_file_dir) | 917 relpath = os.path.relpath(path, library_file_dir) |
896 imports_emitter.Emit( | 918 imports_emitter.Emit( |
897 "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): |
| 925 self._libraries = { |
| 926 'svg': DartLibrary('svg', template_loader, library_type, output_dir), |
| 927 'html': DartLibrary('html', template_loader, library_type, output_dir), |
| 928 } |
| 929 |
| 930 def AddFile(self, basename, library_name, path): |
| 931 self._libraries[library_name].AddFile(path) |
| 932 |
| 933 def Emit(self, emitter, auxiliary_dir): |
| 934 for lib in self._libraries.values(): |
| 935 lib.Emit(emitter, auxiliary_dir) |
OLD | NEW |