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 |
| 11 from systembase import * | 11 from systembase import * |
| 12 from systeminterface import * | |
| 13 | 12 |
| 14 _js_custom_members = set([ | 13 _js_custom_members = set([ |
| 15 'CSSStyleDeclaration.setProperty', | 14 'CSSStyleDeclaration.setProperty', |
| 16 'Element.insertAdjacentElement', | 15 'Element.insertAdjacentElement', |
| 17 'Element.insertAdjacentHTML', | 16 'Element.insertAdjacentHTML', |
| 18 'Element.insertAdjacentText', | 17 'Element.insertAdjacentText', |
| 19 'Element.remove', | 18 'Element.remove', |
| 20 'ElementEvents.mouseWheel', | 19 'ElementEvents.mouseWheel', |
| 21 'IDBDatabase.transaction', | 20 'IDBDatabase.transaction', |
| 22 'IFrameElement.contentWindow', | 21 'IFrameElement.contentWindow', |
| (...skipping 351 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 374 event_names.add(manual_event_name) | 373 event_names.add(manual_event_name) |
| 375 | 374 |
| 376 return sorted(event_names, key=lambda name: _html_event_names[name]) | 375 return sorted(event_names, key=lambda name: _html_event_names[name]) |
| 377 | 376 |
| 378 def DomToHtmlEvent(event_name): | 377 def DomToHtmlEvent(event_name): |
| 379 assert event_name in _html_event_names, \ | 378 assert event_name in _html_event_names, \ |
| 380 'No known html event name for event: ' + event_name | 379 'No known html event name for event: ' + event_name |
| 381 return _html_event_names[event_name] | 380 return _html_event_names[event_name] |
| 382 | 381 |
| 383 # ------------------------------------------------------------------------------ | 382 # ------------------------------------------------------------------------------ |
| 384 class HtmlSystemShared(object): | 383 class HtmlSystemShared(object): |
|
Anton Muhin
2012/10/01 13:30:35
this class becomes pretty thin and many of methods
podivilov
2012/10/01 14:49:18
I have another cl to fix this: http://codereview.c
| |
| 385 | 384 |
| 386 def __init__(self, context): | 385 def __init__(self, database): |
| 387 self._event_classes = set() | 386 self._event_classes = set() |
| 388 self._seen_event_names = {} | 387 self._database = database |
| 389 self._database = context.database | |
| 390 | |
| 391 # TODO(jacobr): this already exists | |
| 392 def _TraverseParents(self, interface, callback): | |
| 393 for parent in interface.parents: | |
| 394 parent_id = parent.type.id | |
| 395 if self._database.HasInterface(parent_id): | |
| 396 parent_interface = self._database.GetInterface(parent_id) | |
| 397 callback(parent_interface) | |
| 398 self._TraverseParents(parent_interface, callback) | |
| 399 | 388 |
| 400 # TODO(jacobr): this isn't quite right.... | 389 # TODO(jacobr): this isn't quite right.... |
| 401 def GetParentsEventsClasses(self, interface): | 390 def GetParentsEventsClasses(self, interface): |
| 402 # Ugly hack as we don't specify that Document and DocumentFragment inherit | 391 # Ugly hack as we don't specify that Document and DocumentFragment inherit |
| 403 # from Element in our IDL. | 392 # from Element in our IDL. |
| 404 if interface.id == 'Document' or interface.id == 'DocumentFragment': | 393 if interface.id == 'Document' or interface.id == 'DocumentFragment': |
| 405 return ['ElementEvents'] | 394 return ['ElementEvents'] |
| 406 | 395 |
| 407 interfaces_with_events = set() | 396 interfaces_with_events = set() |
| 408 def visit(parent): | 397 for parent in self._database.Hierarchy(interface): |
| 409 if parent.id in self._event_classes: | 398 if parent != interface and parent.id in self._event_classes: |
|
Anton Muhin
2012/10/01 13:30:35
when parent can equal to some of interface in hiea
podivilov
2012/10/01 14:49:18
database.Hierarchy() includes the interface itself
| |
| 410 interfaces_with_events.add(parent) | 399 interfaces_with_events.add(parent) |
| 411 | 400 |
| 412 self._TraverseParents(interface, visit) | |
| 413 if len(interfaces_with_events) == 0: | 401 if len(interfaces_with_events) == 0: |
| 414 return ['Events'] | 402 return ['Events'] |
| 415 else: | 403 else: |
| 416 names = [] | 404 names = [] |
| 417 for interface in interfaces_with_events: | 405 for interface in interfaces_with_events: |
| 418 names.append(interface.id + 'Events') | 406 names.append(interface.id + 'Events') |
| 419 return names | 407 return names |
| 420 | 408 |
| 421 def GetParentEventsClass(self, interface): | 409 def GetParentEventsClass(self, interface): |
| 422 parent_event_classes = self.GetParentsEventsClasses(interface) | 410 parent_event_classes = self.GetParentsEventsClasses(interface) |
| 423 if len(parent_event_classes) != 1: | 411 if len(parent_event_classes) != 1: |
| 424 raise Exception('Only one parent event class allowed ' + interface.id) | 412 raise Exception('Only one parent event class allowed ' + interface.id) |
| 425 return parent_event_classes[0] | 413 return parent_event_classes[0] |
| 426 | 414 |
| 427 # This returns two values: the first is whether or not an "on" property should | 415 # This returns two values: the first is whether or not an "on" property should |
| 428 # be generated for the interface, and the second is the event attributes to | 416 # be generated for the interface, and the second is the event attributes to |
| 429 # generate if it should. | 417 # generate if it should. |
| 430 def GetEventAttributes(self, interface): | 418 def GetEventAttributes(self, interface): |
| 431 events = set([attr for attr in interface.attributes | 419 events = set([attr for attr in interface.attributes |
| 432 if attr.type.id == 'EventListener']) | 420 if attr.type.id == 'EventListener']) |
| 433 | 421 |
| 434 if events or interface.id in _html_explicit_event_classes: | 422 if events or interface.id in _html_explicit_event_classes: |
| 435 return True, events | 423 return True, events |
| 436 else: | 424 else: |
| 437 return False, None | 425 return False, None |
| 438 | 426 |
| 439 def IsPrivate(self, name): | 427 def IsPrivate(self, name): |
| 440 return name.startswith('_') | 428 return name.startswith('_') |
| 441 | 429 |
| 442 | |
| 443 class HtmlInterfacesSystem(System): | |
| 444 def __init__(self, options, dart_library_generator, backend_factory): | |
| 445 super(HtmlInterfacesSystem, self).__init__(options) | |
| 446 self._dart_library_generator = dart_library_generator | |
| 447 self._backend_factory = backend_factory | |
| 448 self._shared = HtmlSystemShared(options) | |
| 449 self._elements_factory_emitter = None | |
| 450 | |
| 451 def ProcessInterface(self, interface): | |
| 452 backend = self._backend_factory(interface) | |
| 453 HtmlDartInterfaceGenerator(self, interface, backend).Generate() | |
| 454 | |
| 455 def _CreateEmitter(self, filename): | |
| 456 return self._dart_library_generator.CreateFileEmitter(filename) | |
| 457 | |
| 458 # ------------------------------------------------------------------------------ | 430 # ------------------------------------------------------------------------------ |
| 459 | 431 |
| 460 class HtmlDartInterfaceGenerator(BaseGenerator): | 432 class HtmlDartInterfaceGenerator(BaseGenerator): |
| 461 """Generates dart interface and implementation for the DOM IDL interface.""" | 433 """Generates dart interface and implementation for the DOM IDL interface.""" |
| 462 | 434 |
| 463 def __init__(self, system, interface, backend): | 435 def __init__(self, shared, options, library_emitter, interface, backend): |
| 464 super(HtmlDartInterfaceGenerator, self).__init__( | 436 super(HtmlDartInterfaceGenerator, self).__init__(None, None, interface) |
| 465 system._database, system._type_registry, interface) | 437 self._renamer = options.renamer |
| 466 self._system = system | 438 self._database = options.database |
| 439 self._template_loader = options.templates | |
| 440 self._type_registry = options.type_registry | |
| 441 self._library_emitter = library_emitter | |
| 467 self._backend = backend | 442 self._backend = backend |
| 468 self._shared = system._shared | 443 self._shared = shared |
| 469 self._html_interface_name = system._renamer.RenameInterface(self._interface) | 444 self._html_interface_name = options.renamer.RenameInterface(self._interface) |
| 470 | 445 |
| 471 def GenerateCallback(self, info): | 446 def GenerateCallback(self, info): |
| 472 """Generates a typedef for the callback interface.""" | 447 """Generates a typedef for the callback interface.""" |
| 473 code = self._system._CreateEmitter('%s.dart' % self._interface.id) | 448 code = self._library_emitter.FileEmitter(self._interface.id) |
| 474 code.Emit(self._system._templates.Load('callback.darttemplate')) | 449 code.Emit(self._template_loader.Load('callback.darttemplate')) |
| 475 code.Emit('typedef $TYPE $NAME($PARAMS);\n', | 450 code.Emit('typedef $TYPE $NAME($PARAMS);\n', |
| 476 NAME=self._interface.id, | 451 NAME=self._interface.id, |
| 477 TYPE=DartType(info.type_name), | 452 TYPE=DartType(info.type_name), |
| 478 PARAMS=info.ParametersImplementationDeclaration(DartType)) | 453 PARAMS=info.ParametersImplementationDeclaration(DartType)) |
| 479 self._backend.GenerateCallback(info) | 454 self._backend.GenerateCallback(info) |
| 480 | 455 |
| 481 def StartInterface(self): | 456 def StartInterface(self): |
| 482 if (not self._interface.id in _merged_html_interfaces and | 457 if (not self._interface.id in _merged_html_interfaces and |
| 483 # Don't re-generate types that have been converted to native dart types. | 458 # Don't re-generate types that have been converted to native dart types. |
| 484 self._html_interface_name not in nativified_classes): | 459 self._html_interface_name not in nativified_classes): |
| 485 path = '%s.dart' % self._html_interface_name | 460 self._interface_emitter = self._library_emitter.FileEmitter( |
| 486 self._interface_emitter = self._system._CreateEmitter(path) | 461 self._html_interface_name) |
| 487 else: | 462 else: |
| 488 self._interface_emitter = emitter.Emitter() | 463 self._interface_emitter = emitter.Emitter() |
| 489 | 464 |
| 490 template_file = 'interface_%s.darttemplate' % self._html_interface_name | 465 template_file = 'interface_%s.darttemplate' % self._html_interface_name |
| 491 interface_template = (self._system._templates.TryLoad(template_file) or | 466 interface_template = (self._template_loader.TryLoad(template_file) or |
| 492 self._system._templates.Load('interface.darttemplate') ) | 467 self._template_loader.Load('interface.darttemplate')) |
| 493 | 468 |
| 494 typename = self._html_interface_name | 469 typename = self._html_interface_name |
| 495 | 470 |
| 496 implements = [] | 471 implements = [] |
| 497 suppressed_implements = [] | 472 suppressed_implements = [] |
| 498 | 473 |
| 499 for parent in self._interface.parents: | 474 for parent in self._interface.parents: |
| 500 # TODO(vsm): Remove source_filter. | 475 # TODO(vsm): Remove source_filter. |
| 501 if MatchSourceFilter(parent): | 476 if MatchSourceFilter(parent): |
| 502 # Parent is a DOM type. | 477 # Parent is a DOM type. |
| (...skipping 17 matching lines...) Expand all Loading... | |
| 520 | 495 |
| 521 factory_provider = None | 496 factory_provider = None |
| 522 if typename in interface_factories: | 497 if typename in interface_factories: |
| 523 factory_provider = interface_factories[typename] | 498 factory_provider = interface_factories[typename] |
| 524 | 499 |
| 525 constructors = [] | 500 constructors = [] |
| 526 constructor_info = AnalyzeConstructor(self._interface) | 501 constructor_info = AnalyzeConstructor(self._interface) |
| 527 if constructor_info: | 502 if constructor_info: |
| 528 constructors.append(constructor_info) | 503 constructors.append(constructor_info) |
| 529 factory_provider = '_' + typename + 'FactoryProvider' | 504 factory_provider = '_' + typename + 'FactoryProvider' |
| 530 factory_provider_emitter = self._system._CreateEmitter( | 505 factory_provider_emitter = self._library_emitter.FileEmitter( |
| 531 '_%sFactoryProvider.dart' % self._html_interface_name) | 506 '_%sFactoryProvider' % self._html_interface_name) |
| 532 self._backend.EmitFactoryProvider( | 507 self._backend.EmitFactoryProvider( |
| 533 constructor_info, factory_provider, factory_provider_emitter) | 508 constructor_info, factory_provider, factory_provider_emitter) |
| 534 | 509 |
| 535 infos = HtmlElementConstructorInfos(typename) | 510 infos = HtmlElementConstructorInfos(typename) |
| 536 if infos: | 511 if infos: |
| 537 if not self._system._elements_factory_emitter: | 512 template = self._template_loader.Load( |
| 538 file_emitter = self._system._CreateEmitter('_Elements.dart') | 513 'factoryprovider_Elements.darttemplate') |
| 539 template = self._system._templates.Load( | |
| 540 'factoryprovider_Elements.darttemplate') | |
| 541 self._system._elements_factory_emitter = file_emitter.Emit(template) | |
| 542 EmitHtmlElementFactoryConstructors( | 514 EmitHtmlElementFactoryConstructors( |
| 543 self._system._elements_factory_emitter, | 515 self._library_emitter.FileEmitter('_Elements', template), |
| 544 infos, | 516 infos, |
| 545 self._html_interface_name, | 517 self._html_interface_name, |
| 546 self._backend.ImplementationClassName()) | 518 self._backend.ImplementationClassName()) |
| 547 | 519 |
| 548 for info in infos: | 520 for info in infos: |
| 549 constructors.append(info.ConstructorInfo(typename)) | 521 constructors.append(info.ConstructorInfo(typename)) |
| 550 if factory_provider: | 522 if factory_provider: |
| 551 assert factory_provider == info.factory_provider_name | 523 assert factory_provider == info.factory_provider_name |
| 552 else: | 524 else: |
| 553 factory_provider = info.factory_provider_name | 525 factory_provider = info.factory_provider_name |
| 554 | 526 |
| 555 # TODO(vsm): Add appropriate package / namespace syntax. | 527 # TODO(vsm): Add appropriate package / namespace syntax. |
| 556 (self._type_comment_emitter, | 528 (self._type_comment_emitter, |
| 557 self._members_emitter, | 529 self._members_emitter, |
| 558 self._top_level_emitter) = self._interface_emitter.Emit( | 530 self._top_level_emitter) = self._interface_emitter.Emit( |
| 559 interface_template + '$!TOP_LEVEL', | 531 interface_template + '$!TOP_LEVEL', |
| 560 ID=typename, | 532 ID=typename, |
| 561 EXTENDS=implements_str) | 533 EXTENDS=implements_str) |
| 562 | 534 |
| 563 self._type_comment_emitter.Emit("/// @domName $DOMNAME", | 535 self._type_comment_emitter.Emit("/// @domName $DOMNAME", |
| 564 DOMNAME=self._interface.doc_js_name) | 536 DOMNAME=self._interface.doc_js_name) |
| 565 | 537 |
| 566 if self._backend.HasImplementation(): | 538 if self._backend.HasImplementation(): |
| 567 if not self._interface.id in _merged_html_interfaces: | 539 if not self._interface.id in _merged_html_interfaces: |
| 568 name = self._html_interface_name | 540 name = self._html_interface_name |
| 569 if self._html_interface_name in nativified_classes: | 541 if self._html_interface_name in nativified_classes: |
| 570 name = nativified_classes[self._html_interface_name] | 542 name = nativified_classes[self._html_interface_name] |
| 571 filename = '%sImpl.dart' % name | 543 basename = '%sImpl' % name |
| 572 else: | 544 else: |
| 573 filename = '%sImpl_Merged.dart' % self._html_interface_name | 545 basename = '%sImpl_Merged' % self._html_interface_name |
| 574 self._implementation_emitter = self._system._CreateEmitter(filename) | 546 self._implementation_emitter = self._library_emitter.FileEmitter(basename) |
| 575 else: | 547 else: |
| 576 self._implementation_emitter = emitter.Emitter() | 548 self._implementation_emitter = emitter.Emitter() |
| 577 self._backend.SetImplementationEmitter(self._implementation_emitter) | 549 self._backend.SetImplementationEmitter(self._implementation_emitter) |
| 578 self._implementation_members_emitter = self._backend.StartInterface() | 550 self._implementation_members_emitter = self._backend.StartInterface() |
| 579 | 551 |
| 580 for constructor_info in constructors: | 552 for constructor_info in constructors: |
| 581 constructor_info.GenerateFactoryInvocation( | 553 constructor_info.GenerateFactoryInvocation( |
| 582 self._DartType, self._members_emitter, factory_provider) | 554 self._DartType, self._members_emitter, factory_provider) |
| 583 | 555 |
| 584 element_type = MaybeTypedArrayElementTypeInHierarchy( | 556 element_type = MaybeTypedArrayElementTypeInHierarchy( |
| 585 self._interface, self._system._database) | 557 self._interface, self._database) |
| 586 if element_type: | 558 if element_type: |
| 587 self._members_emitter.Emit( | 559 self._members_emitter.Emit( |
| 588 '\n' | 560 '\n' |
| 589 ' factory $CTOR(int length) =>\n' | 561 ' factory $CTOR(int length) =>\n' |
| 590 ' $FACTORY.create$(CTOR)(length);\n' | 562 ' $FACTORY.create$(CTOR)(length);\n' |
| 591 '\n' | 563 '\n' |
| 592 ' factory $CTOR.fromList(List<$TYPE> list) =>\n' | 564 ' factory $CTOR.fromList(List<$TYPE> list) =>\n' |
| 593 ' $FACTORY.create$(CTOR)_fromList(list);\n' | 565 ' $FACTORY.create$(CTOR)_fromList(list);\n' |
| 594 '\n' | 566 '\n' |
| 595 ' factory $CTOR.fromBuffer(ArrayBuffer buffer, [int byteOffset, int l ength]) => \n' | 567 ' factory $CTOR.fromBuffer(ArrayBuffer buffer, [int byteOffset, int l ength]) => \n' |
| (...skipping 14 matching lines...) Expand all Loading... | |
| 610 self._backend = old_backend | 582 self._backend = old_backend |
| 611 | 583 |
| 612 def AddIndexer(self, element_type): | 584 def AddIndexer(self, element_type): |
| 613 self._backend.AddIndexer(element_type) | 585 self._backend.AddIndexer(element_type) |
| 614 | 586 |
| 615 def AmendIndexer(self, element_type): | 587 def AmendIndexer(self, element_type): |
| 616 self._backend.AmendIndexer(element_type) | 588 self._backend.AmendIndexer(element_type) |
| 617 | 589 |
| 618 def AddAttribute(self, attribute, is_secondary=False): | 590 def AddAttribute(self, attribute, is_secondary=False): |
| 619 dom_name = DartDomNameOfAttribute(attribute) | 591 dom_name = DartDomNameOfAttribute(attribute) |
| 620 html_name = self._system._renamer.RenameMember( | 592 html_name = self._renamer.RenameMember( |
| 621 self._interface.id, dom_name, 'get:') | 593 self._interface.id, dom_name, 'get:') |
| 622 if not html_name or self._shared.IsPrivate(html_name): | 594 if not html_name or self._shared.IsPrivate(html_name): |
| 623 return | 595 return |
| 624 | 596 |
| 625 | 597 |
| 626 html_setter_name = self._system._renamer.RenameMember( | 598 html_setter_name = self._renamer.RenameMember( |
| 627 self._interface.id, dom_name, 'set:') | 599 self._interface.id, dom_name, 'set:') |
| 628 read_only = IsReadOnly(attribute) or not html_setter_name | 600 read_only = IsReadOnly(attribute) or not html_setter_name |
| 629 | 601 |
| 630 # We don't yet handle inconsistent renames of the getter and setter yet. | 602 # We don't yet handle inconsistent renames of the getter and setter yet. |
| 631 assert(not html_setter_name or html_name == html_setter_name) | 603 assert(not html_setter_name or html_name == html_setter_name) |
| 632 | 604 |
| 633 if not is_secondary: | 605 if not is_secondary: |
| 634 self._members_emitter.Emit('\n /** @domName $DOMINTERFACE.$DOMNAME */', | 606 self._members_emitter.Emit('\n /** @domName $DOMINTERFACE.$DOMNAME */', |
| 635 DOMINTERFACE=attribute.doc_js_interface_name, | 607 DOMINTERFACE=attribute.doc_js_interface_name, |
| 636 DOMNAME=dom_name) | 608 DOMNAME=dom_name) |
| (...skipping 11 matching lines...) Expand all Loading... | |
| 648 def AddSecondaryAttribute(self, interface, attribute): | 620 def AddSecondaryAttribute(self, interface, attribute): |
| 649 self._backend.SecondaryContext(interface) | 621 self._backend.SecondaryContext(interface) |
| 650 self.AddAttribute(attribute, True) | 622 self.AddAttribute(attribute, True) |
| 651 | 623 |
| 652 def AddOperation(self, info, skip_declaration=False): | 624 def AddOperation(self, info, skip_declaration=False): |
| 653 """ | 625 """ |
| 654 Arguments: | 626 Arguments: |
| 655 operations - contains the overloads, one or more operations with the same | 627 operations - contains the overloads, one or more operations with the same |
| 656 name. | 628 name. |
| 657 """ | 629 """ |
| 658 html_name = self._system._renamer.RenameMember(self._interface.id, info.name ) | 630 html_name = self._renamer.RenameMember(self._interface.id, info.name) |
| 659 if not html_name: | 631 if not html_name: |
| 660 if info.name == 'item': | 632 if info.name == 'item': |
| 661 # FIXME: item should be renamed to operator[], not removed. | 633 # FIXME: item should be renamed to operator[], not removed. |
| 662 self._backend.AddOperation(info, '_item') | 634 self._backend.AddOperation(info, '_item') |
| 663 return | 635 return |
| 664 | 636 |
| 665 if not self._shared.IsPrivate(html_name) and not skip_declaration: | 637 if not self._shared.IsPrivate(html_name) and not skip_declaration: |
| 666 self._members_emitter.Emit('\n /** @domName $DOMINTERFACE.$DOMNAME */', | 638 self._members_emitter.Emit('\n /** @domName $DOMINTERFACE.$DOMNAME */', |
| 667 DOMINTERFACE=info.overloads[0].doc_js_interface_name, | 639 DOMINTERFACE=info.overloads[0].doc_js_interface_name, |
| 668 DOMNAME=info.name) | 640 DOMNAME=info.name) |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 713 | 685 |
| 714 self._EmitEventGetter(events_interface, events_class) | 686 self._EmitEventGetter(events_interface, events_class) |
| 715 | 687 |
| 716 events_members = self._interface_emitter.Emit( | 688 events_members = self._interface_emitter.Emit( |
| 717 '\nabstract class $INTERFACE implements $PARENTS {\n$!MEMBERS}\n', | 689 '\nabstract class $INTERFACE implements $PARENTS {\n$!MEMBERS}\n', |
| 718 INTERFACE=events_interface, | 690 INTERFACE=events_interface, |
| 719 PARENTS=', '.join( | 691 PARENTS=', '.join( |
| 720 self._shared.GetParentsEventsClasses(self._interface))) | 692 self._shared.GetParentsEventsClasses(self._interface))) |
| 721 | 693 |
| 722 template_file = 'impl_%s.darttemplate' % events_interface | 694 template_file = 'impl_%s.darttemplate' % events_interface |
| 723 template = (self._system._templates.TryLoad(template_file) or | 695 template = (self._template_loader.TryLoad(template_file) or |
| 724 '\n' | 696 '\n' |
| 725 'class $CLASSNAME extends $SUPER implements $INTERFACE {\n' | 697 'class $CLASSNAME extends $SUPER implements $INTERFACE {\n' |
| 726 ' $CLASSNAME(_ptr) : super(_ptr);\n' | 698 ' $CLASSNAME(_ptr) : super(_ptr);\n' |
| 727 '$!MEMBERS}\n') | 699 '$!MEMBERS}\n') |
| 728 | 700 |
| 729 # TODO(jacobr): specify the type of _ptr as EventTarget | 701 # TODO(jacobr): specify the type of _ptr as EventTarget |
| 730 implementation_events_members = self._implementation_emitter.Emit( | 702 implementation_events_members = self._implementation_emitter.Emit( |
| 731 template, | 703 template, |
| 732 CLASSNAME=events_class, | 704 CLASSNAME=events_class, |
| 733 INTERFACE=events_interface, | 705 INTERFACE=events_interface, |
| (...skipping 579 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1313 | 1285 |
| 1314 return FindInParent( | 1286 return FindInParent( |
| 1315 self._database.GetInterface(parent_interface_name)) | 1287 self._database.GetInterface(parent_interface_name)) |
| 1316 return (None, None) | 1288 return (None, None) |
| 1317 | 1289 |
| 1318 return FindInParent(self._interface) if attr else (None, None) | 1290 return FindInParent(self._interface) if attr else (None, None) |
| 1319 | 1291 |
| 1320 # ------------------------------------------------------------------------------ | 1292 # ------------------------------------------------------------------------------ |
| 1321 | 1293 |
| 1322 class DartLibraryEmitter(): | 1294 class DartLibraryEmitter(): |
| 1323 def __init__(self, emitters, template, dart_sources_dir): | 1295 def __init__(self, multiemitter, template, dart_sources_dir): |
| 1324 self._emitters = emitters | 1296 self._multiemitter = multiemitter |
| 1325 self._template = template | 1297 self._template = template |
| 1326 self._dart_sources_dir = dart_sources_dir | 1298 self._dart_sources_dir = dart_sources_dir |
| 1327 self._dart_sources_list = [] | 1299 self._path_to_emitter = {} |
| 1328 | 1300 |
| 1329 def CreateFileEmitter(self, filename): | 1301 def FileEmitter(self, basename, template=None): |
| 1330 path = os.path.join(self._dart_sources_dir, filename) | 1302 path = os.path.join(self._dart_sources_dir, '%s.dart' % basename) |
| 1331 self._dart_sources_list.append(path) | 1303 emitter = self._path_to_emitter.get(path) |
| 1332 return self._emitters.FileEmitter(path) | 1304 if not emitter: |
|
Anton Muhin
2012/10/01 13:30:35
emitter is None might be slightly more robust, or
podivilov
2012/10/01 14:49:18
Done.
| |
| 1305 emitter = self._multiemitter.FileEmitter(path) | |
| 1306 if template: | |
|
Anton Muhin
2012/10/01 13:30:35
ditto for is None check
podivilov
2012/10/01 14:49:18
Done.
| |
| 1307 emitter = emitter.Emit(template) | |
| 1308 self._path_to_emitter[path] = emitter | |
| 1309 return emitter | |
| 1333 | 1310 |
| 1334 def EmitLibrary(self, library_file_path, auxiliary_dir): | 1311 def EmitLibrary(self, library_file_path, auxiliary_dir): |
| 1335 def massage_path(path): | 1312 def massage_path(path): |
| 1336 # The most robust way to emit path separators is to use / always. | 1313 # The most robust way to emit path separators is to use / always. |
| 1337 return path.replace('\\', '/') | 1314 return path.replace('\\', '/') |
| 1338 | 1315 |
| 1339 library_emitter = self._emitters.FileEmitter(library_file_path) | 1316 library_emitter = self._multiemitter.FileEmitter(library_file_path) |
| 1340 library_file_dir = os.path.dirname(library_file_path) | 1317 library_file_dir = os.path.dirname(library_file_path) |
| 1341 auxiliary_dir = os.path.relpath(auxiliary_dir, library_file_dir) | 1318 auxiliary_dir = os.path.relpath(auxiliary_dir, library_file_dir) |
| 1342 imports_emitter = library_emitter.Emit( | 1319 imports_emitter = library_emitter.Emit( |
| 1343 self._template, AUXILIARY_DIR=massage_path(auxiliary_dir)) | 1320 self._template, AUXILIARY_DIR=massage_path(auxiliary_dir)) |
| 1344 for path in sorted(self._dart_sources_list): | 1321 for path in sorted(self._path_to_emitter.keys()): |
| 1345 relpath = os.path.relpath(path, library_file_dir) | 1322 relpath = os.path.relpath(path, library_file_dir) |
| 1346 imports_emitter.Emit( | 1323 imports_emitter.Emit( |
| 1347 "#source('$PATH');\n", PATH=massage_path(relpath)) | 1324 "#source('$PATH');\n", PATH=massage_path(relpath)) |
| OLD | NEW |