| 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 204 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 215 code.Emit('typedef $TYPE $NAME($PARAMS);\n', | 215 code.Emit('typedef $TYPE $NAME($PARAMS);\n', |
| 216 NAME=self._interface.id, | 216 NAME=self._interface.id, |
| 217 TYPE=DartType(info.type_name), | 217 TYPE=DartType(info.type_name), |
| 218 PARAMS=info.ParametersImplementationDeclaration(DartType)) | 218 PARAMS=info.ParametersImplementationDeclaration(DartType)) |
| 219 self._backend.GenerateCallback(info) | 219 self._backend.GenerateCallback(info) |
| 220 | 220 |
| 221 def GenerateInterface(self): | 221 def GenerateInterface(self): |
| 222 if (not self._interface.id in _merged_html_interfaces and | 222 if (not self._interface.id in _merged_html_interfaces and |
| 223 # Don't re-generate types that have been converted to native dart types. | 223 # Don't re-generate types that have been converted to native dart types. |
| 224 self._html_interface_name not in nativified_classes): | 224 self._html_interface_name not in nativified_classes): |
| 225 self._interface_emitter = self._library_emitter.FileEmitter( | 225 interface_emitter = self._library_emitter.FileEmitter( |
| 226 self._html_interface_name) | 226 self._html_interface_name) |
| 227 else: | 227 else: |
| 228 self._interface_emitter = emitter.Emitter() | 228 interface_emitter = emitter.Emitter() |
| 229 | 229 |
| 230 template_file = 'interface_%s.darttemplate' % self._html_interface_name | 230 template_file = 'interface_%s.darttemplate' % self._html_interface_name |
| 231 interface_template = (self._template_loader.TryLoad(template_file) or | 231 interface_template = (self._template_loader.TryLoad(template_file) or |
| 232 self._template_loader.Load('interface.darttemplate')) | 232 self._template_loader.Load('interface.darttemplate')) |
| 233 | 233 |
| 234 typename = self._html_interface_name | 234 typename = self._html_interface_name |
| 235 | 235 |
| 236 implements = [] | 236 implements = [] |
| 237 suppressed_implements = [] | 237 suppressed_implements = [] |
| 238 | 238 |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 285 for info in infos: | 285 for info in infos: |
| 286 constructors.append(info.ConstructorInfo(typename)) | 286 constructors.append(info.ConstructorInfo(typename)) |
| 287 if factory_provider: | 287 if factory_provider: |
| 288 assert factory_provider == info.factory_provider_name | 288 assert factory_provider == info.factory_provider_name |
| 289 else: | 289 else: |
| 290 factory_provider = info.factory_provider_name | 290 factory_provider = info.factory_provider_name |
| 291 | 291 |
| 292 # TODO(vsm): Add appropriate package / namespace syntax. | 292 # TODO(vsm): Add appropriate package / namespace syntax. |
| 293 (self._type_comment_emitter, | 293 (self._type_comment_emitter, |
| 294 self._members_emitter, | 294 self._members_emitter, |
| 295 self._top_level_emitter) = self._interface_emitter.Emit( | 295 self._top_level_emitter) = interface_emitter.Emit( |
| 296 interface_template + '$!TOP_LEVEL', | 296 interface_template + '$!TOP_LEVEL', |
| 297 ID=typename, | 297 ID=typename, |
| 298 EXTENDS=implements_str) | 298 EXTENDS=implements_str) |
| 299 | 299 |
| 300 self._type_comment_emitter.Emit("/// @domName $DOMNAME", | 300 self._type_comment_emitter.Emit("/// @domName $DOMNAME", |
| 301 DOMNAME=self._interface.doc_js_name) | 301 DOMNAME=self._interface.doc_js_name) |
| 302 | 302 |
| 303 if self._backend.HasImplementation(): | 303 if self._backend.HasImplementation(): |
| 304 if not self._interface.id in _merged_html_interfaces: | 304 if not self._interface.id in _merged_html_interfaces: |
| 305 name = self._html_interface_name | 305 name = self._html_interface_name |
| 306 if self._html_interface_name in nativified_classes: | 306 if self._html_interface_name in nativified_classes: |
| 307 name = nativified_classes[self._html_interface_name] | 307 name = nativified_classes[self._html_interface_name] |
| 308 basename = '%sImpl' % name | 308 basename = '%sImpl' % name |
| 309 else: | 309 else: |
| 310 basename = '%sImpl_Merged' % self._html_interface_name | 310 basename = '%sImpl_Merged' % self._html_interface_name |
| 311 self._implementation_emitter = self._library_emitter.FileEmitter(basename) | 311 implementation_emitter = self._library_emitter.FileEmitter(basename) |
| 312 else: | 312 else: |
| 313 self._implementation_emitter = emitter.Emitter() | 313 implementation_emitter = emitter.Emitter() |
| 314 self._backend.SetImplementationEmitter(self._implementation_emitter) | 314 |
| 315 self._implementation_members_emitter = self._backend.StartInterface() | 315 base_class = self._backend.BaseClassName() |
| 316 implemented_interfaces = [self._html_interface_name] +\ |
| 317 self._backend.AdditionalImplementedInterfaces() |
| 318 self._implementation_members_emitter = implementation_emitter.Emit( |
| 319 self._backend.ImplementationTemplate(), |
| 320 CLASSNAME=self._backend.ImplementationClassName(), |
| 321 EXTENDS=' extends %s' % base_class if base_class else '', |
| 322 IMPLEMENTS=' implements ' + ', '.join(implemented_interfaces), |
| 323 NATIVESPEC=self._backend.NativeSpec()) |
| 324 self._backend.StartInterface(self._implementation_members_emitter) |
| 316 | 325 |
| 317 for constructor_info in constructors: | 326 for constructor_info in constructors: |
| 318 constructor_info.GenerateFactoryInvocation( | 327 constructor_info.GenerateFactoryInvocation( |
| 319 self._DartType, self._members_emitter, factory_provider) | 328 self._DartType, self._members_emitter, factory_provider) |
| 320 | 329 |
| 321 element_type = MaybeTypedArrayElementTypeInHierarchy( | 330 element_type = MaybeTypedArrayElementTypeInHierarchy( |
| 322 self._interface, self._database) | 331 self._interface, self._database) |
| 323 if element_type: | 332 if element_type: |
| 324 self._members_emitter.Emit( | 333 self._members_emitter.Emit( |
| 325 '\n' | 334 '\n' |
| 326 ' factory $CTOR(int length) =>\n' | 335 ' factory $CTOR(int length) =>\n' |
| 327 ' $FACTORY.create$(CTOR)(length);\n' | 336 ' $FACTORY.create$(CTOR)(length);\n' |
| 328 '\n' | 337 '\n' |
| 329 ' factory $CTOR.fromList(List<$TYPE> list) =>\n' | 338 ' factory $CTOR.fromList(List<$TYPE> list) =>\n' |
| 330 ' $FACTORY.create$(CTOR)_fromList(list);\n' | 339 ' $FACTORY.create$(CTOR)_fromList(list);\n' |
| 331 '\n' | 340 '\n' |
| 332 ' factory $CTOR.fromBuffer(ArrayBuffer buffer, [int byteOffset, int l
ength]) => \n' | 341 ' factory $CTOR.fromBuffer(ArrayBuffer buffer, [int byteOffset, int l
ength]) => \n' |
| 333 ' $FACTORY.create$(CTOR)_fromBuffer(buffer, byteOffset, length);\n'
, | 342 ' $FACTORY.create$(CTOR)_fromBuffer(buffer, byteOffset, length);\n'
, |
| 334 CTOR=self._interface.id, | 343 CTOR=self._interface.id, |
| 335 TYPE=self._DartType(element_type), | 344 TYPE=self._DartType(element_type), |
| 336 FACTORY=factory_provider) | 345 FACTORY=factory_provider) |
| 337 | 346 |
| 338 events_interface = self._event_generator.ProcessInterface( | 347 events_interface = self._event_generator.ProcessInterface( |
| 339 self._interface, self._html_interface_name, | 348 self._interface, self._html_interface_name, |
| 340 self._backend.CustomJSMembers(), | 349 self._backend.CustomJSMembers(), |
| 341 self._interface_emitter, self._implementation_emitter) | 350 interface_emitter, implementation_emitter) |
| 342 if events_interface: | 351 if events_interface: |
| 343 self._EmitEventGetter(events_interface, '_%sImpl' % events_interface) | 352 self._EmitEventGetter(events_interface, '_%sImpl' % events_interface) |
| 344 | 353 |
| 345 old_backend = self._backend | 354 old_backend = self._backend |
| 346 if not self._backend.ImplementsMergedMembers(): | 355 if not self._backend.ImplementsMergedMembers(): |
| 347 self._backend = HtmlGeneratorDummyBackend() | 356 self._backend = HtmlGeneratorDummyBackend() |
| 348 for merged_interface in _merged_html_interfaces: | 357 for merged_interface in _merged_html_interfaces: |
| 349 if _merged_html_interfaces[merged_interface] == self._interface.id: | 358 if _merged_html_interfaces[merged_interface] == self._interface.id: |
| 350 merged_interface = self._database.GetInterface(merged_interface) | 359 merged_interface = self._database.GetInterface(merged_interface) |
| 351 self.AddMembers(merged_interface) | 360 self.AddMembers(merged_interface) |
| (...skipping 212 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 564 self._html_interface_name = options.renamer.RenameInterface(self._interface) | 573 self._html_interface_name = options.renamer.RenameInterface(self._interface) |
| 565 self._current_secondary_parent = None | 574 self._current_secondary_parent = None |
| 566 | 575 |
| 567 def HasImplementation(self): | 576 def HasImplementation(self): |
| 568 return not (IsPureInterface(self._interface.id) or | 577 return not (IsPureInterface(self._interface.id) or |
| 569 self._interface.id in _merged_html_interfaces) | 578 self._interface.id in _merged_html_interfaces) |
| 570 | 579 |
| 571 def ImplementationClassName(self): | 580 def ImplementationClassName(self): |
| 572 return self._ImplClassName(self._html_interface_name) | 581 return self._ImplClassName(self._html_interface_name) |
| 573 | 582 |
| 574 def SetImplementationEmitter(self, implementation_emitter): | |
| 575 self._dart_code = implementation_emitter | |
| 576 | |
| 577 def ImplementsMergedMembers(self): | 583 def ImplementsMergedMembers(self): |
| 578 return True | 584 return True |
| 579 | 585 |
| 580 def _ImplClassName(self, type_name): | 586 def _ImplClassName(self, type_name): |
| 581 name = type_name | 587 name = type_name |
| 582 if type_name in nativified_classes: | 588 if type_name in nativified_classes: |
| 583 name = nativified_classes[type_name] | 589 name = nativified_classes[type_name] |
| 584 return '_%sImpl' % name | 590 return '_%sImpl' % name |
| 585 | 591 |
| 586 def GenerateCallback(self, info): | 592 def GenerateCallback(self, info): |
| 587 pass | 593 pass |
| 588 | 594 |
| 589 def StartInterface(self): | 595 def BaseClassName(self): |
| 590 interface = self._interface | 596 if not self._interface.parents: |
| 591 interface_name = interface.id | 597 return None |
| 598 supertype = self._interface.parents[0].type.id |
| 599 if IsDartCollectionType(supertype): |
| 600 # List methods are injected in AddIndexer. |
| 601 return None |
| 602 if IsPureInterface(supertype): |
| 603 return None |
| 604 return self._ImplClassName(self._DartType(supertype)) |
| 592 | 605 |
| 593 self._class_name = self._ImplClassName(self._html_interface_name) | 606 def AdditionalImplementedInterfaces(self): |
| 594 | |
| 595 base = None | |
| 596 if interface.parents: | |
| 597 supertype = interface.parents[0].type.id | |
| 598 if IsDartCollectionType(supertype): | |
| 599 # List methods are injected in AddIndexer. | |
| 600 pass | |
| 601 elif IsPureInterface(supertype): | |
| 602 pass | |
| 603 else: | |
| 604 base = self._ImplClassName(self._DartType(supertype)) | |
| 605 | |
| 606 native_spec = MakeNativeSpec(interface.javascript_binding_name) | |
| 607 | |
| 608 extends = ' extends ' + base if base else '' | |
| 609 | |
| 610 # TODO: Include all implemented interfaces, including other Lists. | 607 # TODO: Include all implemented interfaces, including other Lists. |
| 611 implements = [self._html_interface_name] | 608 implements = [] |
| 612 element_type = MaybeTypedArrayElementType(self._interface) | 609 element_type = MaybeTypedArrayElementType(self._interface) |
| 613 if element_type: | 610 if element_type: |
| 614 implements.append('List<%s>' % self._DartType(element_type)) | 611 implements.append('List<%s>' % self._DartType(element_type)) |
| 615 | |
| 616 if self._HasJavaScriptIndexingBehaviour(): | 612 if self._HasJavaScriptIndexingBehaviour(): |
| 617 implements.append('JavaScriptIndexingBehavior') | 613 implements.append('JavaScriptIndexingBehavior') |
| 614 return implements |
| 618 | 615 |
| 616 def NativeSpec(self): |
| 617 native_spec = MakeNativeSpec(self._interface.javascript_binding_name) |
| 618 return ' native "%s"' % native_spec |
| 619 |
| 620 def ImplementationTemplate(self): |
| 619 template_file = 'impl_%s.darttemplate' % self._html_interface_name | 621 template_file = 'impl_%s.darttemplate' % self._html_interface_name |
| 620 template = (self._template_loader.TryLoad(template_file) or | 622 return (self._template_loader.TryLoad(template_file) or |
| 621 self._template_loader.Load('dart2js_impl.darttemplate')) | 623 self._template_loader.Load('dart2js_impl.darttemplate')) |
| 622 self._members_emitter = self._dart_code.Emit( | |
| 623 template, | |
| 624 #class $CLASSNAME$EXTENDS$IMPLEMENTS$NATIVESPEC { | |
| 625 #$!MEMBERS | |
| 626 #} | |
| 627 CLASSNAME=self._class_name, | |
| 628 EXTENDS=extends, | |
| 629 IMPLEMENTS=' implements ' + ', '.join(implements), | |
| 630 NATIVESPEC=' native "' + native_spec + '"') | |
| 631 if self._members_emitter == None: | |
| 632 raise Exception("Class %s doesn't use the $!MEMBERS variable" % | |
| 633 self._class_name) | |
| 634 | 624 |
| 635 return self._members_emitter | 625 def StartInterface(self, emitter): |
| 626 self._members_emitter = emitter |
| 636 | 627 |
| 637 def FinishInterface(self): | 628 def FinishInterface(self): |
| 638 pass | 629 pass |
| 639 | 630 |
| 640 def EmitFactoryProvider(self, constructor_info, factory_provider, emitter): | 631 def EmitFactoryProvider(self, constructor_info, factory_provider, emitter): |
| 641 template_file = ('factoryprovider_%s.darttemplate' % | 632 template_file = ('factoryprovider_%s.darttemplate' % |
| 642 self._html_interface_name) | 633 self._html_interface_name) |
| 643 template = self._template_loader.TryLoad(template_file) | 634 template = self._template_loader.TryLoad(template_file) |
| 644 if not template: | 635 if not template: |
| 645 template = self._template_loader.Load('factoryprovider.darttemplate') | 636 template = self._template_loader.Load('factoryprovider.darttemplate') |
| (...skipping 473 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1119 | 1110 |
| 1120 library_emitter = self._multiemitter.FileEmitter(library_file_path) | 1111 library_emitter = self._multiemitter.FileEmitter(library_file_path) |
| 1121 library_file_dir = os.path.dirname(library_file_path) | 1112 library_file_dir = os.path.dirname(library_file_path) |
| 1122 auxiliary_dir = os.path.relpath(auxiliary_dir, library_file_dir) | 1113 auxiliary_dir = os.path.relpath(auxiliary_dir, library_file_dir) |
| 1123 imports_emitter = library_emitter.Emit( | 1114 imports_emitter = library_emitter.Emit( |
| 1124 self._template, AUXILIARY_DIR=massage_path(auxiliary_dir)) | 1115 self._template, AUXILIARY_DIR=massage_path(auxiliary_dir)) |
| 1125 for path in sorted(self._path_to_emitter.keys()): | 1116 for path in sorted(self._path_to_emitter.keys()): |
| 1126 relpath = os.path.relpath(path, library_file_dir) | 1117 relpath = os.path.relpath(path, library_file_dir) |
| 1127 imports_emitter.Emit( | 1118 imports_emitter.Emit( |
| 1128 "#source('$PATH');\n", PATH=massage_path(relpath)) | 1119 "#source('$PATH');\n", PATH=massage_path(relpath)) |
| OLD | NEW |