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 os | 9 import os |
10 from generator import * | 10 from generator import * |
(...skipping 424 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
435 | 435 |
436 self._TraverseParents(interface, visit) | 436 self._TraverseParents(interface, visit) |
437 if len(interfaces_with_events) == 0: | 437 if len(interfaces_with_events) == 0: |
438 return ['Events'] | 438 return ['Events'] |
439 else: | 439 else: |
440 names = [] | 440 names = [] |
441 for interface in interfaces_with_events: | 441 for interface in interfaces_with_events: |
442 names.append(interface.id + 'Events') | 442 names.append(interface.id + 'Events') |
443 return names | 443 return names |
444 | 444 |
445 | |
445 class HtmlInterfacesSystem(HtmlSystem): | 446 class HtmlInterfacesSystem(HtmlSystem): |
446 | 447 |
447 def __init__(self, templates, database, emitters, output_dir, generator): | 448 def __init__(self, templates, database, emitters, output_dir, generator): |
448 super(HtmlInterfacesSystem, self).__init__( | 449 super(HtmlInterfacesSystem, self).__init__( |
449 templates, database, emitters, output_dir, generator) | 450 templates, database, emitters, output_dir, generator) |
450 self._dart_interface_file_paths = [] | 451 self._dart_interface_file_paths = [] |
451 | 452 |
452 def InterfaceGenerator(self, | 453 def InterfaceGenerator(self, |
453 interface, | 454 interface, |
454 common_prefix, | 455 common_prefix, |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
522 (self._common_prefix, parent.type.id)) | 523 (self._common_prefix, parent.type.id)) |
523 | 524 |
524 comment = ' extends' | 525 comment = ' extends' |
525 extends_str = '' | 526 extends_str = '' |
526 if extends: | 527 if extends: |
527 extends_str += ' extends ' + ', '.join(extends) | 528 extends_str += ' extends ' + ', '.join(extends) |
528 comment = ',' | 529 comment = ',' |
529 if suppressed_extends: | 530 if suppressed_extends: |
530 extends_str += ' /*%s %s */' % (comment, ', '.join(suppressed_extends)) | 531 extends_str += ' /*%s %s */' % (comment, ', '.join(suppressed_extends)) |
531 | 532 |
533 factory_provider = None | |
534 constructor_info = AnalyzeConstructor(self._interface) | |
535 if constructor_info: | |
536 factory_provider = '_' + typename + 'FactoryProvider'; | |
537 | |
532 if typename in interface_factories: | 538 if typename in interface_factories: |
533 extends_str += ' default ' + interface_factories[typename] | 539 factory_provider = interface_factories[typename] |
540 | |
541 if factory_provider: | |
542 extends_str += ' default ' + factory_provider | |
534 | 543 |
535 # TODO(vsm): Add appropriate package / namespace syntax. | 544 # TODO(vsm): Add appropriate package / namespace syntax. |
536 (self._members_emitter, | 545 (self._members_emitter, |
537 self._top_level_emitter) = self._emitter.Emit( | 546 self._top_level_emitter) = self._emitter.Emit( |
538 self._template + '$!TOP_LEVEL', | 547 self._template + '$!TOP_LEVEL', |
539 ID=typename, | 548 ID=typename, |
540 EXTENDS=extends_str) | 549 EXTENDS=extends_str) |
541 | 550 |
551 if constructor_info: | |
552 self._members_emitter.Emit( | |
553 '\n' | |
554 ' $CTOR($PARAMS);\n', | |
555 CTOR=typename, | |
556 PARAMS=constructor_info.ParametersInterfaceDeclaration()); | |
557 | |
542 element_type = MaybeTypedArrayElementType(self._interface) | 558 element_type = MaybeTypedArrayElementType(self._interface) |
543 if element_type: | 559 if element_type: |
544 self._members_emitter.Emit( | 560 self._members_emitter.Emit( |
545 '\n' | 561 '\n' |
546 ' $CTOR(int length);\n' | 562 ' $CTOR(int length);\n' |
547 '\n' | 563 '\n' |
548 ' $CTOR.fromList(List<$TYPE> list);\n' | 564 ' $CTOR.fromList(List<$TYPE> list);\n' |
549 '\n' | 565 '\n' |
550 ' $CTOR.fromBuffer(ArrayBuffer buffer);\n', | 566 ' $CTOR.fromBuffer(ArrayBuffer buffer);\n', |
551 CTOR=self._interface.id, | 567 CTOR=self._interface.id, |
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
670 #} | 686 #} |
671 CLASSNAME=self._class_name, | 687 CLASSNAME=self._class_name, |
672 EXTENDS=extends, | 688 EXTENDS=extends, |
673 IMPLEMENTS=' implements ' + ', '.join(implements), | 689 IMPLEMENTS=' implements ' + ', '.join(implements), |
674 NATIVESPEC=' native "' + native_spec + '"') | 690 NATIVESPEC=' native "' + native_spec + '"') |
675 | 691 |
676 element_type = MaybeTypedArrayElementType(interface) | 692 element_type = MaybeTypedArrayElementType(interface) |
677 if element_type: | 693 if element_type: |
678 self.AddTypedArrayConstructors(element_type) | 694 self.AddTypedArrayConstructors(element_type) |
679 | 695 |
696 # Emit a factory provider class for the constructor. | |
697 constructor_info = AnalyzeConstructor(interface) | |
698 if constructor_info: | |
699 self._EmitFactoryProvider(interface_name, constructor_info) | |
700 | |
701 | |
702 def _EmitFactoryProvider(self, interface_name, constructor_info): | |
703 template_file = 'factoryprovider_%s.darttemplate' % interface_name | |
704 template = self._system._templates.TryLoad(template_file) | |
705 if not template: | |
706 template = self._system._templates.Load('factoryprovider.darttemplate') | |
707 | |
708 factory_provider = '_' + interface_name + 'FactoryProvider' | |
709 emitter = self._system._ImplFileEmitter(factory_provider) | |
710 emitter.Emit( | |
711 template, | |
712 FACTORYPROVIDER=factory_provider, | |
713 CONSTRUCTOR=interface_name, | |
714 PARAMETERS=constructor_info.ParametersImplementationDeclaration(), | |
715 NAMEDCONSTRUCTOR=constructor_info.name or interface_name, | |
716 ARGUMENTS=constructor_info.ParametersAsArgumentList()) | |
717 | |
718 | |
680 def AddAttribute(self, getter, setter): | 719 def AddAttribute(self, getter, setter): |
681 | 720 |
682 if self._system._PrivateInHtmlLibrary(self._interface, getter.id): | 721 if self._system._PrivateInHtmlLibrary(self._interface, getter.id): |
683 if getter: | 722 self._AddAttributeUsingProperties(getter, setter, True) |
684 self._AddGetter(getter, True) | |
685 if setter: | |
Jacob
2012/02/25 03:50:03
can you revert this part?
| |
686 self._AddSetter(setter, True) | |
687 return | 723 return |
688 if getter and not self._system._AllowInHtmlLibrary(self._interface, | 724 if getter and not self._system._AllowInHtmlLibrary(self._interface, |
689 'get:' + getter.id): | 725 'get:' + getter.id): |
690 getter = None | 726 getter = None |
691 if setter and not self._system._AllowInHtmlLibrary(self._interface, | 727 if setter and not self._system._AllowInHtmlLibrary(self._interface, |
692 'set:' + setter.id): | 728 'set:' + setter.id): |
693 setter = None | 729 setter = None |
694 if not getter and not setter: | 730 if not getter and not setter: |
695 return | 731 return |
696 # If the (getter, setter) pair is shadowing, we can't generate a shadowing | 732 # If the (getter, setter) pair is shadowing, we can't generate a shadowing |
697 # field (Issue 1633). | 733 # field (Issue 1633). |
698 (super_getter, super_getter_interface) = self._FindShadowedAttribute(getter) | 734 (super_getter, super_getter_interface) = self._FindShadowedAttribute(getter) |
699 (super_setter, super_setter_interface) = self._FindShadowedAttribute(setter) | 735 (super_setter, super_setter_interface) = self._FindShadowedAttribute(setter) |
700 if super_getter or super_setter: | 736 if super_getter or super_setter: |
701 if getter and not setter and super_getter and not super_setter: | 737 if getter and not setter and super_getter and not super_setter: |
702 if getter.type.id == super_getter.type.id: | 738 if getter.type.id == super_getter.type.id: |
703 # Compatible getter, use the superclass property. This works because | 739 # Compatible getter, use the superclass property. This works because |
704 # JavaScript will do its own dynamic dispatch. | 740 # JavaScript will do its own dynamic dispatch. |
705 output_type = getter and self._NarrowOutputType(getter.type.id) | 741 output_type = getter and self._NarrowOutputType(getter.type.id) |
706 self._members_emitter.Emit( | 742 self._members_emitter.Emit( |
707 '\n' | 743 '\n' |
708 ' // Use implementation from $SUPER.\n' | 744 ' // Use implementation from $SUPER.\n' |
709 ' // final $TYPE $NAME;\n', | 745 ' // final $TYPE $NAME;\n', |
710 SUPER=super_getter_interface.id, | 746 SUPER=super_getter_interface.id, |
711 NAME=getter.id, TYPE=output_type) | 747 NAME=getter.id, TYPE=output_type) |
712 return | 748 return |
713 | 749 |
714 self._members_emitter.Emit('\n // Shadowing definition.') | 750 self._members_emitter.Emit('\n // Shadowing definition.') |
715 if getter: | 751 self._AddAttributeUsingProperties(getter, setter, False) |
716 self._AddGetter(getter, False) | |
717 if setter: | |
718 self._AddSetter(setter, False) | |
719 return | 752 return |
720 | 753 |
721 if self._interface.id != 'Document': | 754 if self._interface.id != 'Document': |
722 output_type = getter and self._NarrowOutputType(getter.type.id) | 755 output_type = getter and self._NarrowOutputType(getter.type.id) |
723 input_type = setter and self._NarrowInputType(setter.type.id) | 756 input_type = setter and self._NarrowInputType(setter.type.id) |
724 if getter and setter and input_type == output_type: | 757 if getter and setter and input_type == output_type: |
725 self._members_emitter.Emit( | 758 self._members_emitter.Emit( |
726 '\n $TYPE $NAME;\n', | 759 '\n $TYPE $NAME;\n', |
727 NAME=getter.id, TYPE=output_type) | 760 NAME=getter.id, TYPE=output_type) |
728 return | 761 return |
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
841 templates, database, emitters, output_dir, generator) | 874 templates, database, emitters, output_dir, generator) |
842 self._dart_frog_file_paths = [] | 875 self._dart_frog_file_paths = [] |
843 | 876 |
844 | 877 |
845 def InterfaceGenerator(self, | 878 def InterfaceGenerator(self, |
846 interface, | 879 interface, |
847 common_prefix, | 880 common_prefix, |
848 super_interface_name, | 881 super_interface_name, |
849 source_filter): | 882 source_filter): |
850 """.""" | 883 """.""" |
851 dart_frog_file_path = self._FilePathForFrogImpl(interface.id) | |
852 self._dart_frog_file_paths.append(dart_frog_file_path) | |
853 | |
854 template_file = 'impl_%s.darttemplate' % interface.id | 884 template_file = 'impl_%s.darttemplate' % interface.id |
855 template = self._templates.TryLoad(template_file) | 885 template = self._templates.TryLoad(template_file) |
856 if not template: | 886 if not template: |
857 template = self._templates.Load('frog_impl.darttemplate') | 887 template = self._templates.Load('frog_impl.darttemplate') |
858 | 888 |
859 dart_code = self._emitters.FileEmitter(dart_frog_file_path) | 889 dart_code = self._ImplFileEmitter(interface.id) |
860 return HtmlFrogClassGenerator(self, interface, template, | 890 return HtmlFrogClassGenerator(self, interface, template, |
861 super_interface_name, dart_code) | 891 super_interface_name, dart_code) |
862 | 892 |
863 def GenerateLibraries(self, lib_dir): | 893 def GenerateLibraries(self, lib_dir): |
864 self._GenerateLibFile( | 894 self._GenerateLibFile( |
865 'html_frog.darttemplate', | 895 'html_frog.darttemplate', |
866 os.path.join(lib_dir, 'html_frog.dart'), | 896 os.path.join(lib_dir, 'html_frog.dart'), |
867 (self._interface_system._dart_interface_file_paths + | 897 (self._interface_system._dart_interface_file_paths + |
868 self._interface_system._dart_callback_file_paths + | 898 self._interface_system._dart_callback_file_paths + |
869 self._dart_frog_file_paths)) | 899 self._dart_frog_file_paths)) |
870 | 900 |
871 def Finish(self): | 901 def Finish(self): |
872 pass | 902 pass |
873 | 903 |
874 def _FilePathForFrogImpl(self, interface_name): | 904 def _ImplFileEmitter(self, name): |
875 """Returns the file path of the Frog implementation.""" | 905 """Returns the file emitter of the Frog implementation file.""" |
876 # TODO(jmesserly): is this the right path | 906 # TODO(jmesserly): is this the right path |
877 return os.path.join(self._output_dir, 'html', 'frog', | 907 path = os.path.join(self._output_dir, 'html', 'frog', '%s.dart' % name) |
878 '%s.dart' % interface_name) | 908 self._dart_frog_file_paths.append(path) |
909 return self._emitters.FileEmitter(path) | |
879 | 910 |
880 # ------------------------------------------------------------------------------ | 911 # ------------------------------------------------------------------------------ |
881 | 912 |
882 class WrappingInterfaceGenerator(object): | 913 class WrappingInterfaceGenerator(object): |
883 """Generates Dart and JS implementation for one DOM IDL interface.""" | 914 """Generates Dart and JS implementation for one DOM IDL interface.""" |
884 | 915 |
885 def __init__(self, interface, super_interface, dart_code, base_members): | 916 def __init__(self, interface, super_interface, dart_code, base_members): |
886 """Generates Dart and JS code for the given interface. | 917 """Generates Dart and JS code for the given interface. |
887 | 918 |
888 Args: | 919 Args: |
(...skipping 437 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1326 # dispatch has removed f(X), leaving only f(Y), but there is no guarantee | 1357 # dispatch has removed f(X), leaving only f(Y), but there is no guarantee |
1327 # that Y = Z-X, so we need to check for Y. | 1358 # that Y = Z-X, so we need to check for Y. |
1328 true_code = emitter.Emit( | 1359 true_code = emitter.Emit( |
1329 '$(INDENT)if ($COND) {\n' | 1360 '$(INDENT)if ($COND) {\n' |
1330 '$!TRUE' | 1361 '$!TRUE' |
1331 '$(INDENT)}\n', | 1362 '$(INDENT)}\n', |
1332 COND=test, INDENT=indent) | 1363 COND=test, INDENT=indent) |
1333 self.GenerateDispatch( | 1364 self.GenerateDispatch( |
1334 true_code, info, indent + ' ', position + 1, positive) | 1365 true_code, info, indent + ' ', position + 1, positive) |
1335 return True | 1366 return True |
OLD | NEW |