Chromium Code Reviews| 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 419 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 430 | 430 |
| 431 def IsPrivate(self, name): | 431 def IsPrivate(self, name): |
| 432 return name.startswith('_') | 432 return name.startswith('_') |
| 433 | 433 |
| 434 | 434 |
| 435 class HtmlInterfacesSystem(System): | 435 class HtmlInterfacesSystem(System): |
| 436 def __init__(self, options, backend): | 436 def __init__(self, options, backend): |
| 437 super(HtmlInterfacesSystem, self).__init__(options) | 437 super(HtmlInterfacesSystem, self).__init__(options) |
| 438 self._backend = backend | 438 self._backend = backend |
| 439 self._shared = HtmlSystemShared(options) | 439 self._shared = HtmlSystemShared(options) |
| 440 self._dart_interface_file_paths = [] | 440 self._dart_file_paths = [] |
| 441 self._elements_factory_emitter = None | 441 self._elements_factory_emitter = None |
| 442 | 442 |
| 443 def ProcessInterface(self, interface): | 443 def ProcessInterface(self, interface): |
| 444 HtmlDartInterfaceGenerator(self, interface).Generate() | 444 HtmlDartInterfaceGenerator(self, interface).Generate() |
| 445 | 445 |
| 446 def ProcessCallback(self, interface, info): | 446 def ProcessCallback(self, interface, info): |
| 447 """Generates a typedef for the callback interface.""" | 447 """Generates a typedef for the callback interface.""" |
| 448 interface_name = interface.id | 448 code = self._CreateEmitter('%s.dart' % interface.id) |
| 449 file_path = self._FilePathForDartInterface(interface_name) | 449 code.Emit(self._templates.Load('callback.darttemplate')) |
| 450 self._ProcessCallback(interface, info, file_path) | 450 code.Emit('typedef $TYPE $NAME($PARAMS);\n', |
| 451 NAME=interface.id, | |
| 452 TYPE=DartType(info.type_name), | |
| 453 PARAMS=info.ParametersImplementationDeclaration(DartType)) | |
| 451 self._backend.ProcessCallback(interface, info) | 454 self._backend.ProcessCallback(interface, info) |
| 452 | 455 |
| 453 def GenerateLibraries(self): | 456 def GenerateLibraries(self): |
| 454 self._backend.GenerateLibraries(self._dart_interface_file_paths) | 457 self._backend.GenerateLibraries(self._dart_file_paths) |
| 455 | 458 |
| 456 def _FilePathForDartInterface(self, interface_name): | 459 def _CreateEmitter(self, filename): |
| 457 """Returns the file path of the Dart interface definition.""" | 460 path = os.path.join(self._output_dir, 'dart', filename) |
| 458 # TODO(jmesserly): is this the right path | 461 self._dart_file_paths.append(path) |
| 459 return os.path.join(self._output_dir, 'html', 'interface', | 462 return self._emitters.FileEmitter(path) |
| 460 '%s.dart' % interface_name) | |
| 461 | 463 |
| 462 # ------------------------------------------------------------------------------ | 464 # ------------------------------------------------------------------------------ |
| 463 | 465 |
| 464 class HtmlDartInterfaceGenerator(BaseGenerator): | 466 class HtmlDartInterfaceGenerator(BaseGenerator): |
| 465 """Generates dart interface and implementation for the DOM IDL interface.""" | 467 """Generates dart interface and implementation for the DOM IDL interface.""" |
| 466 | 468 |
| 467 def __init__(self, system, interface): | 469 def __init__(self, system, interface): |
| 468 super(HtmlDartInterfaceGenerator, self).__init__( | 470 super(HtmlDartInterfaceGenerator, self).__init__( |
| 469 system._database, interface) | 471 system._database, interface) |
| 470 self._system = system | 472 self._system = system |
| 471 self._shared = system._shared | 473 self._shared = system._shared |
| 472 self._html_interface_name = system._renamer.RenameInterface(self._interface) | 474 self._html_interface_name = system._renamer.RenameInterface(self._interface) |
| 473 self._backend = system._backend.ImplementationGenerator(self._interface) | 475 self._backend = system._backend.ImplementationGenerator(self._interface) |
| 474 | 476 |
| 475 def StartInterface(self): | 477 def StartInterface(self): |
| 476 if not self._interface.id in _merged_html_interfaces: | 478 if not self._interface.id in _merged_html_interfaces: |
| 477 path = self._system._FilePathForDartInterface(self._html_interface_name) | 479 path = '%s.dart' % self._html_interface_name |
| 478 self._system._dart_interface_file_paths.append(path) | 480 self._interface_emitter = self._system._CreateEmitter(path) |
| 479 self._interface_emitter = self._system._emitters.FileEmitter(path) | |
| 480 else: | 481 else: |
| 481 self._interface_emitter = emitter.Emitter() | 482 self._interface_emitter = emitter.Emitter() |
| 482 | 483 |
| 483 template_file = 'interface_%s.darttemplate' % self._html_interface_name | 484 template_file = 'interface_%s.darttemplate' % self._html_interface_name |
| 484 interface_template = (self._system._templates.TryLoad(template_file) or | 485 interface_template = (self._system._templates.TryLoad(template_file) or |
| 485 self._system._templates.Load('interface.darttemplate') ) | 486 self._system._templates.Load('interface.darttemplate') ) |
| 486 | 487 |
| 487 typename = self._html_interface_name | 488 typename = self._html_interface_name |
| 488 | 489 |
| 489 extends = [] | 490 extends = [] |
| (...skipping 22 matching lines...) Expand all Loading... | |
| 512 | 513 |
| 513 factory_provider = None | 514 factory_provider = None |
| 514 if typename in interface_factories: | 515 if typename in interface_factories: |
| 515 factory_provider = interface_factories[typename] | 516 factory_provider = interface_factories[typename] |
| 516 | 517 |
| 517 constructors = [] | 518 constructors = [] |
| 518 constructor_info = AnalyzeConstructor(self._interface) | 519 constructor_info = AnalyzeConstructor(self._interface) |
| 519 if constructor_info: | 520 if constructor_info: |
| 520 constructors.append(constructor_info) | 521 constructors.append(constructor_info) |
| 521 factory_provider = '_' + typename + 'FactoryProvider' | 522 factory_provider = '_' + typename + 'FactoryProvider' |
| 522 path = self._backend.FilePathForDartFactoryProviderImplementation() | 523 factory_provider_emitter = self._system._CreateEmitter( |
| 523 self._system._dart_interface_file_paths.append(path) | 524 '_%sFactoryProvider.dart' % self._html_interface_name) |
| 524 factory_provider_emitter = self._system._emitters.FileEmitter(path) | |
| 525 self._backend.EmitFactoryProvider( | 525 self._backend.EmitFactoryProvider( |
| 526 constructor_info, factory_provider, factory_provider_emitter) | 526 constructor_info, factory_provider, factory_provider_emitter) |
| 527 | 527 |
| 528 infos = HtmlElementConstructorInfos(typename) | 528 infos = HtmlElementConstructorInfos(typename) |
| 529 if infos: | 529 if infos: |
| 530 if not self._system._elements_factory_emitter: | 530 if not self._system._elements_factory_emitter: |
| 531 path = self._backend.FilePathForDartElementsFactoryProviderImplementatio n() | 531 file_emitter = self._system._CreateEmitter('_Elements.dart') |
| 532 self._system._dart_interface_file_paths.append(path) | |
| 533 file_emitter = self._system._emitters.FileEmitter(path) | |
| 534 template = self._system._templates.Load( | 532 template = self._system._templates.Load( |
| 535 'factoryprovider_Elements.darttemplate') | 533 'factoryprovider_Elements.darttemplate') |
| 536 self._system._elements_factory_emitter = file_emitter.Emit(template) | 534 self._system._elements_factory_emitter = file_emitter.Emit(template) |
| 537 EmitHtmlElementFactoryConstructors( | 535 EmitHtmlElementFactoryConstructors( |
| 538 self._system._elements_factory_emitter, | 536 self._system._elements_factory_emitter, |
| 539 infos, | 537 infos, |
| 540 self._html_interface_name, | 538 self._html_interface_name, |
| 541 self._backend.ImplementationClassName()) | 539 self._backend.ImplementationClassName()) |
| 542 | 540 |
| 543 for info in infos: | 541 for info in infos: |
| (...skipping 11 matching lines...) Expand all Loading... | |
| 555 self._members_emitter, | 553 self._members_emitter, |
| 556 self._top_level_emitter) = self._interface_emitter.Emit( | 554 self._top_level_emitter) = self._interface_emitter.Emit( |
| 557 interface_template + '$!TOP_LEVEL', | 555 interface_template + '$!TOP_LEVEL', |
| 558 ID=typename, | 556 ID=typename, |
| 559 EXTENDS=extends_str) | 557 EXTENDS=extends_str) |
| 560 | 558 |
| 561 self._type_comment_emitter.Emit("/// @domName $DOMNAME", | 559 self._type_comment_emitter.Emit("/// @domName $DOMNAME", |
| 562 DOMNAME=self._interface.doc_js_name) | 560 DOMNAME=self._interface.doc_js_name) |
| 563 | 561 |
| 564 if self._backend.HasImplementation(): | 562 if self._backend.HasImplementation(): |
| 565 path = self._backend.FilePathForDartImplementation() | 563 if not self._interface.id in _merged_html_interfaces: |
| 566 self._system._dart_interface_file_paths.append(path) | 564 filename = '%sImpl.dart' % self._html_interface_name |
|
Anton Muhin
2012/09/14 15:48:13
as an option: filenameprefix = self._html_interfac
| |
| 567 self._implementation_emitter = self._system._emitters.FileEmitter(path) | 565 else: |
| 566 filename = '%sImpl.dart' % self._interface.id | |
| 567 self._implementation_emitter = self._system._CreateEmitter(filename) | |
| 568 else: | 568 else: |
| 569 self._implementation_emitter = emitter.Emitter() | 569 self._implementation_emitter = emitter.Emitter() |
| 570 self._backend.SetImplementationEmitter(self._implementation_emitter) | 570 self._backend.SetImplementationEmitter(self._implementation_emitter) |
| 571 self._implementation_members_emitter = self._backend.StartInterface() | 571 self._implementation_members_emitter = self._backend.StartInterface() |
| 572 | 572 |
| 573 for constructor_info in constructors: | 573 for constructor_info in constructors: |
| 574 self._members_emitter.Emit( | 574 self._members_emitter.Emit( |
| 575 '\n' | 575 '\n' |
| 576 ' $CTOR($PARAMS);\n', | 576 ' $CTOR($PARAMS);\n', |
| 577 CTOR=self._DartType(constructor_info.ConstructorFullName()), | 577 CTOR=self._DartType(constructor_info.ConstructorFullName()), |
| (...skipping 185 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 763 system, interface, None, None) | 763 system, interface, None, None) |
| 764 self._html_interface_name = system._renamer.RenameInterface(self._interface) | 764 self._html_interface_name = system._renamer.RenameInterface(self._interface) |
| 765 | 765 |
| 766 def HasImplementation(self): | 766 def HasImplementation(self): |
| 767 return not (IsPureInterface(self._interface.id) or | 767 return not (IsPureInterface(self._interface.id) or |
| 768 self._interface.id in _merged_html_interfaces) | 768 self._interface.id in _merged_html_interfaces) |
| 769 | 769 |
| 770 def ImplementationClassName(self): | 770 def ImplementationClassName(self): |
| 771 return self._ImplClassName(self._html_interface_name) | 771 return self._ImplClassName(self._html_interface_name) |
| 772 | 772 |
| 773 def FilePathForDartImplementation(self): | |
| 774 return os.path.join(self._system._output_dir, 'html', 'dart2js', | |
| 775 '%s.dart' % self._html_interface_name) | |
| 776 | |
| 777 def FilePathForDartFactoryProviderImplementation(self): | |
| 778 return os.path.join(self._system._output_dir, 'html', 'dart2js', | |
| 779 '_%sFactoryProvider.dart' % self._html_interface_name) | |
| 780 | |
| 781 def FilePathForDartElementsFactoryProviderImplementation(self): | |
| 782 return os.path.join(self._system._output_dir, 'html', 'dart2js', | |
| 783 '_Elements.dart') | |
| 784 | |
| 785 def SetImplementationEmitter(self, implementation_emitter): | 773 def SetImplementationEmitter(self, implementation_emitter): |
| 786 self._dart_code = implementation_emitter | 774 self._dart_code = implementation_emitter |
| 787 | 775 |
| 788 def ImplementsMergedMembers(self): | 776 def ImplementsMergedMembers(self): |
| 789 return True | 777 return True |
| 790 | 778 |
| 791 def _ImplClassName(self, type_name): | 779 def _ImplClassName(self, type_name): |
| 792 return '_%sImpl' % type_name | 780 return '_%sImpl' % type_name |
| 793 | 781 |
| 794 def StartInterface(self): | 782 def StartInterface(self): |
| (...skipping 439 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1234 return HtmlDart2JSClassGenerator(self, interface) | 1222 return HtmlDart2JSClassGenerator(self, interface) |
| 1235 | 1223 |
| 1236 def GenerateLibraries(self, dart_files): | 1224 def GenerateLibraries(self, dart_files): |
| 1237 self._GenerateLibFile( | 1225 self._GenerateLibFile( |
| 1238 'html_dart2js.darttemplate', | 1226 'html_dart2js.darttemplate', |
| 1239 os.path.join(self._output_dir, 'html_dart2js.dart'), | 1227 os.path.join(self._output_dir, 'html_dart2js.dart'), |
| 1240 dart_files) | 1228 dart_files) |
| 1241 | 1229 |
| 1242 def Finish(self): | 1230 def Finish(self): |
| 1243 pass | 1231 pass |
| OLD | NEW |