| 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 from systemfrog import * | 9 from systemfrog import * |
| 10 from systeminterface import * | 10 from systeminterface import * |
| 11 | 11 |
| 12 _html_strip_webkit_prefix_classes = [ |
| 13 'Animation', |
| 14 'AnimationEvent', |
| 15 'AnimationList', |
| 16 'BlobBuilder', |
| 17 'CSSKeyframeRule', |
| 18 'CSSKeyframesRule', |
| 19 'CSSMatrix', |
| 20 'CSSTransformValue', |
| 21 'Flags', |
| 22 'LoseContext', |
| 23 'Point', |
| 24 'TransitionEvent'] |
| 25 |
| 12 # Members from the standard dom that should not be exposed publicly in dart:html | 26 # Members from the standard dom that should not be exposed publicly in dart:html |
| 13 # but need to be exposed internally to implement dart:html on top of a standard | 27 # but need to be exposed internally to implement dart:html on top of a standard |
| 14 # browser. | 28 # browser. |
| 15 _private_html_members = set([ | 29 _private_html_members = set([ |
| 16 'Document.createElement', | 30 'Document.createElement', |
| 17 'Document.createElementNS', | 31 'Document.createElementNS', |
| 18 'Document.createEvent', | 32 'Document.createEvent', |
| 19 'Document.createTextNode', | 33 'Document.createTextNode', |
| 20 'Document.createTouchList', | 34 'Document.createTouchList', |
| 21 'Document.getElementById', | 35 'Document.getElementById', |
| (...skipping 577 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 599 return _html_event_names[event_name] | 613 return _html_event_names[event_name] |
| 600 | 614 |
| 601 # ------------------------------------------------------------------------------ | 615 # ------------------------------------------------------------------------------ |
| 602 class HtmlSystemShared(object): | 616 class HtmlSystemShared(object): |
| 603 | 617 |
| 604 def __init__(self, database): | 618 def __init__(self, database): |
| 605 self._event_classes = set() | 619 self._event_classes = set() |
| 606 self._seen_event_names = {} | 620 self._seen_event_names = {} |
| 607 self._database = database | 621 self._database = database |
| 608 self._inheritance_closure = _ComputeInheritanceClosure(database) | 622 self._inheritance_closure = _ComputeInheritanceClosure(database) |
| 623 self._html_renames = self._MakeHtmlRenames() |
| 624 |
| 625 def _HasAncestor(self, interface, names_to_match): |
| 626 for parent in interface.parents: |
| 627 if parent.type.id in names_to_match: |
| 628 return True |
| 629 if not self._database.HasInterface(parent.type.id): |
| 630 continue |
| 631 parent_interface = self._database.GetInterface(parent.type.id) |
| 632 if self._HasAncestor(parent_interface, names_to_match): |
| 633 return True |
| 634 return False |
| 635 |
| 636 def _MakeHtmlRenames(self): |
| 637 html_renames = {} |
| 638 |
| 639 for interface in self._database.GetInterfaces(): |
| 640 if (interface.id.startswith('HTML') and |
| 641 self._HasAncestor(interface, ['Element', 'Document'])): |
| 642 html_renames[interface.id] = interface.id[4:] |
| 643 |
| 644 for subclass in _html_strip_webkit_prefix_classes: |
| 645 html_renames['WebKit' + subclass] = subclass |
| 646 |
| 647 # TODO(jacobr): we almost want to add this commented out line back. |
| 648 # html_renames['HTMLCollection'] = 'ElementList' |
| 649 # html_renames['NodeList'] = 'ElementList' |
| 650 # html_renames['HTMLOptionsCollection'] = 'ElementList' |
| 651 html_renames['DOMWindow'] = 'Window' |
| 652 |
| 653 return html_renames |
| 654 |
| 655 def _HTMLInterfaceName(self, interface_name): |
| 656 return self._html_renames.get(interface_name, interface_name) |
| 609 | 657 |
| 610 def _FindMatch(self, interface_name, member, member_prefix, candidates): | 658 def _FindMatch(self, interface_name, member, member_prefix, candidates): |
| 611 for ancestor_name in self._AllAncestorInterfaces(interface_name): | 659 for ancestor_name in self._AllAncestorInterfaces(interface_name): |
| 612 name = ancestor_name + '.' + member | 660 name = self._HTMLInterfaceName(ancestor_name) + '.' + member |
| 613 if name in candidates: | 661 if name in candidates: |
| 614 return name | 662 return name |
| 615 name = interface_name + '.' + member_prefix + member | 663 name = (self._HTMLInterfaceName(interface_name) + '.' + member_prefix + |
| 664 member) |
| 616 if name in candidates: | 665 if name in candidates: |
| 617 return name | 666 return name |
| 618 return None | 667 return None |
| 619 | 668 |
| 620 def _AllAncestorInterfaces(self, interface_name): | 669 def _AllAncestorInterfaces(self, interface_name): |
| 621 return [interface_name] + self._inheritance_closure[interface_name] | 670 return [interface_name] + self._inheritance_closure[interface_name] |
| 622 | 671 |
| 623 def RenameInHtmlLibrary(self, interface_name, member, member_prefix='', | 672 def RenameInHtmlLibrary(self, interface_name, member, member_prefix='', |
| 624 implementation_class=False): | 673 implementation_class=False): |
| 625 """ | 674 """ |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 693 if attr.type.id == 'EventListener']) | 742 if attr.type.id == 'EventListener']) |
| 694 | 743 |
| 695 if events or interface.id in _html_explicit_event_classes: | 744 if events or interface.id in _html_explicit_event_classes: |
| 696 return True, events | 745 return True, events |
| 697 else: | 746 else: |
| 698 return False, None | 747 return False, None |
| 699 | 748 |
| 700 def IsPrivate(self, name): | 749 def IsPrivate(self, name): |
| 701 return name.startswith('_') | 750 return name.startswith('_') |
| 702 | 751 |
| 752 def DartType(self, idl_type): |
| 753 type_info = GetIDLTypeInfo(idl_type) |
| 754 return self._HTMLInterfaceName(type_info.dart_type()) |
| 755 |
| 703 class HtmlSystem(System): | 756 class HtmlSystem(System): |
| 704 | 757 |
| 705 def __init__(self, templates, database, emitters, output_dir): | 758 def __init__(self, templates, database, emitters, output_dir): |
| 706 super(HtmlSystem, self).__init__( | 759 super(HtmlSystem, self).__init__( |
| 707 templates, database, emitters, output_dir) | 760 templates, database, emitters, output_dir) |
| 708 self._shared = HtmlSystemShared(database) | 761 self._shared = HtmlSystemShared(database) |
| 709 | 762 |
| 710 class HtmlInterfacesSystem(HtmlSystem): | 763 class HtmlInterfacesSystem(HtmlSystem): |
| 711 | 764 |
| 712 def __init__(self, templates, database, emitters, output_dir): | 765 def __init__(self, templates, database, emitters, output_dir): |
| 713 super(HtmlInterfacesSystem, self).__init__( | 766 super(HtmlInterfacesSystem, self).__init__( |
| 714 templates, database, emitters, output_dir) | 767 templates, database, emitters, output_dir) |
| 715 self._dart_interface_file_paths = [] | 768 self._dart_interface_file_paths = [] |
| 716 self._factory_provider_emitters = {} | 769 self._factory_provider_emitters = {} |
| 717 | 770 |
| 718 def InterfaceGenerator(self, | 771 def InterfaceGenerator(self, |
| 719 interface, | 772 interface, |
| 720 common_prefix, | 773 common_prefix, |
| 721 super_interface_name, | 774 super_interface_name, |
| 722 source_filter): | 775 source_filter): |
| 723 """.""" | 776 """.""" |
| 724 if interface.id in _merged_html_interfaces: | 777 if interface.id in _merged_html_interfaces: |
| 725 return None | 778 return None |
| 726 | 779 |
| 727 interface_name = interface.id | 780 html_interface_name = self._shared._HTMLInterfaceName(interface.id) |
| 728 dart_interface_file_path = self._FilePathForDartInterface(interface_name) | 781 dart_interface_file_path = self._FilePathForDartInterface( |
| 782 html_interface_name) |
| 729 | 783 |
| 730 self._dart_interface_file_paths.append(dart_interface_file_path) | 784 self._dart_interface_file_paths.append(dart_interface_file_path) |
| 731 | 785 |
| 732 dart_interface_code = self._emitters.FileEmitter(dart_interface_file_path) | 786 dart_interface_code = self._emitters.FileEmitter(dart_interface_file_path) |
| 733 | 787 |
| 734 template_file = 'interface_%s.darttemplate' % interface_name | 788 template_file = 'interface_%s.darttemplate' % html_interface_name |
| 735 template = self._templates.TryLoad(template_file) | 789 template = self._templates.TryLoad(template_file) |
| 736 if not template: | 790 if not template: |
| 737 template = self._templates.Load('interface.darttemplate') | 791 template = self._templates.Load('interface.darttemplate') |
| 738 | 792 |
| 739 return HtmlDartInterfaceGenerator( | 793 return HtmlDartInterfaceGenerator( |
| 740 self, interface, dart_interface_code, | 794 self, interface, dart_interface_code, |
| 741 template, | 795 template, |
| 742 common_prefix, super_interface_name, | 796 common_prefix, super_interface_name, |
| 743 source_filter, self._shared) | 797 source_filter, self._shared) |
| 744 | 798 |
| (...skipping 18 matching lines...) Expand all Loading... |
| 763 # TODO(jmesserly): inheritance is probably not the right way to factor this long | 817 # TODO(jmesserly): inheritance is probably not the right way to factor this long |
| 764 # term, but it makes merging better for now. | 818 # term, but it makes merging better for now. |
| 765 class HtmlDartInterfaceGenerator(DartInterfaceGenerator): | 819 class HtmlDartInterfaceGenerator(DartInterfaceGenerator): |
| 766 """Generates Dart Interface definition for one DOM IDL interface.""" | 820 """Generates Dart Interface definition for one DOM IDL interface.""" |
| 767 | 821 |
| 768 def __init__(self, system, interface, emitter, template, | 822 def __init__(self, system, interface, emitter, template, |
| 769 common_prefix, super_interface, source_filter, shared): | 823 common_prefix, super_interface, source_filter, shared): |
| 770 super(HtmlDartInterfaceGenerator, self).__init__(system, interface, | 824 super(HtmlDartInterfaceGenerator, self).__init__(system, interface, |
| 771 emitter, template, common_prefix, super_interface, source_filter) | 825 emitter, template, common_prefix, super_interface, source_filter) |
| 772 self._shared = shared | 826 self._shared = shared |
| 827 self._html_interface_name = self._shared._HTMLInterfaceName( |
| 828 self._interface.id) |
| 773 | 829 |
| 774 def StartInterface(self): | 830 def StartInterface(self): |
| 775 typename = self._interface.id | 831 typename = self._html_interface_name |
| 776 | 832 |
| 777 extends = [] | 833 extends = [] |
| 778 suppressed_extends = [] | 834 suppressed_extends = [] |
| 779 | 835 |
| 780 for parent in self._interface.parents: | 836 for parent in self._interface.parents: |
| 781 # TODO(vsm): Remove source_filter. | 837 # TODO(vsm): Remove source_filter. |
| 782 if MatchSourceFilter(self._source_filter, parent): | 838 if MatchSourceFilter(self._source_filter, parent): |
| 783 # Parent is a DOM type. | 839 # Parent is a DOM type. |
| 784 extends.append(DartType(parent.type.id)) | 840 extends.append(self._shared.DartType(parent.type.id)) |
| 785 elif '<' in parent.type.id: | 841 elif '<' in parent.type.id: |
| 786 # Parent is a Dart collection type. | 842 # Parent is a Dart collection type. |
| 787 # TODO(vsm): Make this check more robust. | 843 # TODO(vsm): Make this check more robust. |
| 788 extends.append(DartType(parent.type.id)) | 844 extends.append(self._shared.DartType(parent.type.id)) |
| 789 else: | 845 else: |
| 790 suppressed_extends.append('%s.%s' % | 846 suppressed_extends.append('%s.%s' % |
| 791 (self._common_prefix, DartType(parent.type.id))) | 847 (self._common_prefix, self._shared.DartType(parent.type.id))) |
| 792 | 848 |
| 793 comment = ' extends' | 849 comment = ' extends' |
| 794 extends_str = '' | 850 extends_str = '' |
| 795 if extends: | 851 if extends: |
| 796 extends_str += ' extends ' + ', '.join(extends) | 852 extends_str += ' extends ' + ', '.join(extends) |
| 797 comment = ',' | 853 comment = ',' |
| 798 if suppressed_extends: | 854 if suppressed_extends: |
| 799 extends_str += ' /*%s %s */' % (comment, ', '.join(suppressed_extends)) | 855 extends_str += ' /*%s %s */' % (comment, ', '.join(suppressed_extends)) |
| 800 | 856 |
| 801 factory_provider = None | 857 factory_provider = None |
| (...skipping 25 matching lines...) Expand all Loading... |
| 827 ID=typename, | 883 ID=typename, |
| 828 EXTENDS=extends_str) | 884 EXTENDS=extends_str) |
| 829 | 885 |
| 830 self._type_comment_emitter.Emit("/// @domName $DOMNAME", | 886 self._type_comment_emitter.Emit("/// @domName $DOMNAME", |
| 831 DOMNAME=self._interface.doc_js_name) | 887 DOMNAME=self._interface.doc_js_name) |
| 832 | 888 |
| 833 for constructor_info in constructors: | 889 for constructor_info in constructors: |
| 834 self._members_emitter.Emit( | 890 self._members_emitter.Emit( |
| 835 '\n' | 891 '\n' |
| 836 ' $CTOR($PARAMS);\n', | 892 ' $CTOR($PARAMS);\n', |
| 837 CTOR=constructor_info.ConstructorFullName(), | 893 CTOR=self._shared.DartType(constructor_info.ConstructorFullName()), |
| 838 PARAMS=constructor_info.ParametersInterfaceDeclaration()); | 894 PARAMS=constructor_info.ParametersInterfaceDeclaration( |
| 895 self._shared.DartType)); |
| 839 | 896 |
| 840 element_type = MaybeTypedArrayElementTypeInHierarchy( | 897 element_type = MaybeTypedArrayElementTypeInHierarchy( |
| 841 self._interface, self._system._database) | 898 self._interface, self._system._database) |
| 842 if element_type: | 899 if element_type: |
| 843 self._members_emitter.Emit( | 900 self._members_emitter.Emit( |
| 844 '\n' | 901 '\n' |
| 845 ' $CTOR(int length);\n' | 902 ' $CTOR(int length);\n' |
| 846 '\n' | 903 '\n' |
| 847 ' $CTOR.fromList(List<$TYPE> list);\n' | 904 ' $CTOR.fromList(List<$TYPE> list);\n' |
| 848 '\n' | 905 '\n' |
| 849 ' $CTOR.fromBuffer(ArrayBuffer buffer,' | 906 ' $CTOR.fromBuffer(ArrayBuffer buffer,' |
| 850 ' [int byteOffset, int length]);\n', | 907 ' [int byteOffset, int length]);\n', |
| 851 CTOR=self._interface.id, | 908 CTOR=self._interface.id, |
| 852 TYPE=DartType(element_type)) | 909 TYPE=self._shared.DartType(element_type)) |
| 853 | 910 |
| 854 emit_events, events = self._shared.GetEventAttributes(self._interface) | 911 emit_events, events = self._shared.GetEventAttributes(self._interface) |
| 855 if not emit_events: | 912 if not emit_events: |
| 856 return | 913 return |
| 857 elif events: | 914 elif events: |
| 858 self.AddEventAttributes(events) | 915 self.AddEventAttributes(events) |
| 859 else: | 916 else: |
| 860 self._EmitEventGetter(self._shared.GetParentEventsClass(self._interface)) | 917 self._EmitEventGetter(self._shared.GetParentEventsClass(self._interface)) |
| 861 | 918 |
| 862 for merged_interface in _merged_html_interfaces: | 919 for merged_interface in _merged_html_interfaces: |
| (...skipping 15 matching lines...) Expand all Loading... |
| 878 return | 935 return |
| 879 | 936 |
| 880 # We don't yet handle inconsistent renames of the getter and setter yet. | 937 # We don't yet handle inconsistent renames of the getter and setter yet. |
| 881 if html_getter_name and html_setter_name: | 938 if html_getter_name and html_setter_name: |
| 882 assert html_getter_name == html_setter_name | 939 assert html_getter_name == html_setter_name |
| 883 | 940 |
| 884 self._members_emitter.Emit('\n /** @domName $DOMINTERFACE.$DOMNAME */', | 941 self._members_emitter.Emit('\n /** @domName $DOMINTERFACE.$DOMNAME */', |
| 885 DOMINTERFACE=getter.doc_js_interface_name, | 942 DOMINTERFACE=getter.doc_js_interface_name, |
| 886 DOMNAME=dom_name) | 943 DOMNAME=dom_name) |
| 887 if (getter and setter and | 944 if (getter and setter and |
| 888 DartType(getter.type.id) == DartType(setter.type.id)): | 945 getter.type.id == setter.type.id): |
| 889 self._members_emitter.Emit('\n $TYPE $NAME;\n', | 946 self._members_emitter.Emit('\n $TYPE $NAME;\n', |
| 890 NAME=html_getter_name, | 947 NAME=html_getter_name, |
| 891 TYPE=DartType(getter.type.id)); | 948 TYPE=self._shared.DartType(getter.type.id)); |
| 892 return | 949 return |
| 893 if getter and not setter: | 950 if getter and not setter: |
| 894 self._members_emitter.Emit('\n final $TYPE $NAME;\n', | 951 self._members_emitter.Emit('\n final $TYPE $NAME;\n', |
| 895 NAME=html_getter_name, | 952 NAME=html_getter_name, |
| 896 TYPE=DartType(getter.type.id)); | 953 TYPE=self._shared.DartType(getter.type.id)); |
| 897 return | 954 return |
| 898 raise Exception('Unexpected getter/setter combination %s %s' % | 955 raise Exception('Unexpected getter/setter combination %s %s' % |
| 899 (getter, setter)) | 956 (getter, setter)) |
| 900 | 957 |
| 901 def AddOperation(self, info): | 958 def AddOperation(self, info): |
| 902 """ | 959 """ |
| 903 Arguments: | 960 Arguments: |
| 904 operations - contains the overloads, one or more operations with the same | 961 operations - contains the overloads, one or more operations with the same |
| 905 name. | 962 name. |
| 906 """ | 963 """ |
| 907 html_name = self._shared.RenameInHtmlLibrary( | 964 html_name = self._shared.RenameInHtmlLibrary( |
| 908 self._interface.id, info.name) | 965 self._interface.id, info.name) |
| 909 if html_name and not self._shared.IsPrivate(html_name): | 966 if html_name and not self._shared.IsPrivate(html_name): |
| 910 self._members_emitter.Emit('\n /** @domName $DOMINTERFACE.$DOMNAME */', | 967 self._members_emitter.Emit('\n /** @domName $DOMINTERFACE.$DOMNAME */', |
| 911 DOMINTERFACE=info.overloads[0].doc_js_interface_name, | 968 DOMINTERFACE=info.overloads[0].doc_js_interface_name, |
| 912 DOMNAME=info.name) | 969 DOMNAME=info.name) |
| 913 | 970 |
| 914 self._members_emitter.Emit('\n' | 971 self._members_emitter.Emit('\n' |
| 915 ' $TYPE $NAME($PARAMS);\n', | 972 ' $TYPE $NAME($PARAMS);\n', |
| 916 TYPE=info.type_name, | 973 TYPE=self._shared.DartType(info.type_name), |
| 917 NAME=html_name, | 974 NAME=html_name, |
| 918 PARAMS=info.ParametersInterfaceDeclaration()) | 975 PARAMS=info.ParametersInterfaceDeclaration( |
| 976 self._shared.DartType)) |
| 919 | 977 |
| 920 def FinishInterface(self): | 978 def FinishInterface(self): |
| 921 pass | 979 pass |
| 922 | 980 |
| 923 def AddConstant(self, constant): | 981 def AddConstant(self, constant): |
| 924 self._EmitConstant(self._members_emitter, constant) | 982 self._EmitConstant(self._members_emitter, constant) |
| 925 | 983 |
| 926 def AddEventAttributes(self, event_attrs): | 984 def AddEventAttributes(self, event_attrs): |
| 927 event_attrs = DomToHtmlEvents(self._interface.id, event_attrs) | 985 event_attrs = DomToHtmlEvents(self._html_interface_name, event_attrs) |
| 928 self._shared._event_classes.add(self._interface.id) | 986 self._shared._event_classes.add(self._interface.id) |
| 929 events_interface = self._interface.id + 'Events' | 987 events_interface = self._html_interface_name + 'Events' |
| 930 self._EmitEventGetter(events_interface) | 988 self._EmitEventGetter(events_interface) |
| 931 | 989 |
| 932 events_members = self._emitter.Emit( | 990 events_members = self._emitter.Emit( |
| 933 '\ninterface $INTERFACE extends $PARENTS {\n$!MEMBERS}\n', | 991 '\ninterface $INTERFACE extends $PARENTS {\n$!MEMBERS}\n', |
| 934 INTERFACE=events_interface, | 992 INTERFACE=events_interface, |
| 935 PARENTS=', '.join( | 993 PARENTS=', '.join( |
| 936 self._shared.GetParentsEventsClasses(self._interface))) | 994 self._shared.GetParentsEventsClasses(self._interface))) |
| 937 | 995 |
| 938 for event_name in event_attrs: | 996 for event_name in event_attrs: |
| 939 if event_name in _html_event_names: | 997 if event_name in _html_event_names: |
| (...skipping 18 matching lines...) Expand all Loading... |
| 958 class HtmlFrogClassGenerator(FrogInterfaceGenerator): | 1016 class HtmlFrogClassGenerator(FrogInterfaceGenerator): |
| 959 """Generates a Frog class for the dart:html library from a DOM IDL | 1017 """Generates a Frog class for the dart:html library from a DOM IDL |
| 960 interface. | 1018 interface. |
| 961 """ | 1019 """ |
| 962 | 1020 |
| 963 def __init__(self, system, interface, template, super_interface, dart_code, | 1021 def __init__(self, system, interface, template, super_interface, dart_code, |
| 964 shared): | 1022 shared): |
| 965 super(HtmlFrogClassGenerator, self).__init__( | 1023 super(HtmlFrogClassGenerator, self).__init__( |
| 966 system, interface, template, super_interface, dart_code) | 1024 system, interface, template, super_interface, dart_code) |
| 967 self._shared = shared | 1025 self._shared = shared |
| 1026 self._html_interface_name = self._shared._HTMLInterfaceName( |
| 1027 self._interface.id) |
| 968 | 1028 |
| 969 def _ImplClassName(self, type_name): | 1029 def _ImplClassName(self, type_name): |
| 970 return self._shared._ImplClassName(type_name) | 1030 return self._shared._ImplClassName(type_name) |
| 971 | 1031 |
| 1032 def _NarrowToImplementationType(self, type_name): |
| 1033 if self._ShouldNarrowToImplementationType(type_name): |
| 1034 return self._ImplClassName(self._shared.DartType(type_name)) |
| 1035 return self._shared.DartType(type_name) |
| 1036 |
| 972 def StartInterface(self): | 1037 def StartInterface(self): |
| 973 interface = self._interface | 1038 interface = self._interface |
| 974 interface_name = interface.id | 1039 interface_name = interface.id |
| 975 | 1040 |
| 976 self._class_name = self._ImplClassName(interface_name) | 1041 self._class_name = self._ImplClassName(self._html_interface_name) |
| 977 | 1042 |
| 978 base = None | 1043 base = None |
| 979 if interface.parents: | 1044 if interface.parents: |
| 980 supertype = interface.parents[0].type.id | 1045 supertype = interface.parents[0].type.id |
| 981 if IsDartCollectionType(supertype): | 1046 if IsDartCollectionType(supertype): |
| 982 # List methods are injected in AddIndexer. | 1047 # List methods are injected in AddIndexer. |
| 983 pass | 1048 pass |
| 984 elif IsPureInterface(supertype): | 1049 elif IsPureInterface(supertype): |
| 985 pass | 1050 pass |
| 986 else: | 1051 else: |
| 987 base = self._ImplClassName(supertype) | 1052 base = self._ImplClassName(self._shared._HTMLInterfaceName(supertype)) |
| 988 | 1053 |
| 989 native_spec = MakeNativeSpec(interface.javascript_binding_name) | 1054 native_spec = MakeNativeSpec(interface.javascript_binding_name) |
| 990 | 1055 |
| 991 extends = ' extends ' + base if base else '' | 1056 extends = ' extends ' + base if base else '' |
| 992 | 1057 |
| 993 # TODO: Include all implemented interfaces, including other Lists. | 1058 # TODO: Include all implemented interfaces, including other Lists. |
| 994 implements = [interface_name] | 1059 implements = [self._html_interface_name] |
| 995 element_type = MaybeTypedArrayElementType(self._interface) | 1060 element_type = MaybeTypedArrayElementType(self._interface) |
| 996 if element_type: | 1061 if element_type: |
| 997 implements.append('List<%s>' % DartType(element_type)) | 1062 implements.append('List<%s>' % self._shared.DartType(element_type)) |
| 998 | 1063 |
| 999 self._members_emitter = self._dart_code.Emit( | 1064 self._members_emitter = self._dart_code.Emit( |
| 1000 self._template, | 1065 self._template, |
| 1001 #class $CLASSNAME$EXTENDS$IMPLEMENTS$NATIVESPEC { | 1066 #class $CLASSNAME$EXTENDS$IMPLEMENTS$NATIVESPEC { |
| 1002 #$!MEMBERS | 1067 #$!MEMBERS |
| 1003 #} | 1068 #} |
| 1004 CLASSNAME=self._class_name, | 1069 CLASSNAME=self._class_name, |
| 1005 EXTENDS=extends, | 1070 EXTENDS=extends, |
| 1006 IMPLEMENTS=' implements ' + ', '.join(implements), | 1071 IMPLEMENTS=' implements ' + ', '.join(implements), |
| 1007 NATIVESPEC=' native "' + native_spec + '"') | 1072 NATIVESPEC=' native "' + native_spec + '"') |
| 1008 if self._members_emitter == None: | 1073 if self._members_emitter == None: |
| 1009 raise Exception("Class %s doesn't use the $!MEMBERS variable" % | 1074 raise Exception("Class %s doesn't use the $!MEMBERS variable" % |
| 1010 self._class_name) | 1075 self._class_name) |
| 1011 | 1076 |
| 1012 # Emit a factory provider class for the constructor. | 1077 # Emit a factory provider class for the constructor. |
| 1013 constructor_info = AnalyzeConstructor(interface) | 1078 constructor_info = AnalyzeConstructor(interface) |
| 1014 if constructor_info: | 1079 if constructor_info: |
| 1015 self._EmitFactoryProvider(interface_name, constructor_info) | 1080 self._EmitFactoryProvider(constructor_info) |
| 1016 | 1081 |
| 1017 infos = HtmlElementConstructorInfos(interface_name) | 1082 infos = HtmlElementConstructorInfos(self._html_interface_name) |
| 1018 if infos: | 1083 if infos: |
| 1019 self._EmitHtmlElementFactoryConstructors(infos) | 1084 self._EmitHtmlElementFactoryConstructors(infos) |
| 1020 | 1085 |
| 1021 emit_events, events = self._shared.GetEventAttributes(self._interface) | 1086 emit_events, events = self._shared.GetEventAttributes(self._interface) |
| 1022 if not emit_events: | 1087 if not emit_events: |
| 1023 return | 1088 return |
| 1024 elif events: | 1089 elif events: |
| 1025 self.AddEventAttributes(events) | 1090 self.AddEventAttributes(events) |
| 1026 else: | 1091 else: |
| 1027 parent_events_class = self._shared.GetParentEventsClass(self._interface) | 1092 parent_events_class = self._shared.GetParentEventsClass(self._interface) |
| 1028 self._EmitEventGetter('_' + parent_events_class + 'Impl') | 1093 self._EmitEventGetter('_' + parent_events_class + 'Impl') |
| 1029 | 1094 |
| 1030 for merged_interface in _merged_html_interfaces: | 1095 for merged_interface in _merged_html_interfaces: |
| 1031 if _merged_html_interfaces[merged_interface] == self._interface.id: | 1096 if _merged_html_interfaces[merged_interface] == self._interface.id: |
| 1032 self.AddMembers(self._database.GetInterface(merged_interface)) | 1097 self.AddMembers(self._database.GetInterface(merged_interface)) |
| 1033 | 1098 |
| 1034 def _EmitFactoryProvider(self, interface_name, constructor_info): | 1099 def _EmitFactoryProvider(self, constructor_info): |
| 1035 template_file = 'factoryprovider_%s.darttemplate' % interface_name | 1100 template_file = ('factoryprovider_%s.darttemplate' % |
| 1101 self._html_interface_name) |
| 1036 template = self._system._templates.TryLoad(template_file) | 1102 template = self._system._templates.TryLoad(template_file) |
| 1037 if not template: | 1103 if not template: |
| 1038 template = self._system._templates.Load('factoryprovider.darttemplate') | 1104 template = self._system._templates.Load('factoryprovider.darttemplate') |
| 1039 | 1105 |
| 1040 factory_provider = '_' + interface_name + 'FactoryProvider' | 1106 factory_provider = '_' + self._html_interface_name + 'FactoryProvider' |
| 1041 emitter = self._system._ImplFileEmitter(factory_provider) | 1107 emitter = self._system._ImplFileEmitter(factory_provider) |
| 1042 emitter.Emit( | 1108 emitter.Emit( |
| 1043 template, | 1109 template, |
| 1044 FACTORYPROVIDER=factory_provider, | 1110 FACTORYPROVIDER=factory_provider, |
| 1045 CONSTRUCTOR=interface_name, | 1111 CONSTRUCTOR=self._html_interface_name, |
| 1046 PARAMETERS=constructor_info.ParametersImplementationDeclaration(), | 1112 PARAMETERS=constructor_info.ParametersImplementationDeclaration(), |
| 1047 NAMED_CONSTRUCTOR=constructor_info.name or interface_name, | 1113 NAMED_CONSTRUCTOR=constructor_info.name or self._html_interface_name, |
| 1048 ARGUMENTS=constructor_info.ParametersAsArgumentList()) | 1114 ARGUMENTS=constructor_info.ParametersAsArgumentList()) |
| 1049 | 1115 |
| 1050 def _EmitHtmlElementFactoryConstructors(self, infos): | 1116 def _EmitHtmlElementFactoryConstructors(self, infos): |
| 1051 EmitHtmlElementFactoryConstructors( | 1117 EmitHtmlElementFactoryConstructors( |
| 1052 self._system._EmitterForFactoryProviderBody( | 1118 self._system._EmitterForFactoryProviderBody( |
| 1053 infos[0].factory_provider_name), | 1119 infos[0].factory_provider_name), |
| 1054 infos, | 1120 infos, |
| 1055 self._interface.id, self._class_name) | 1121 self._html_interface_name, self._class_name) |
| 1056 | 1122 |
| 1057 def AddIndexer(self, element_type): | 1123 def AddIndexer(self, element_type): |
| 1058 """Adds all the methods required to complete implementation of List.""" | 1124 """Adds all the methods required to complete implementation of List.""" |
| 1059 # We would like to simply inherit the implementation of everything except | 1125 # We would like to simply inherit the implementation of everything except |
| 1060 # get length(), [], and maybe []=. It is possible to extend from a base | 1126 # get length(), [], and maybe []=. It is possible to extend from a base |
| 1061 # array implementation class only when there is no other implementation | 1127 # array implementation class only when there is no other implementation |
| 1062 # inheritance. There might be no implementation inheritance other than | 1128 # inheritance. There might be no implementation inheritance other than |
| 1063 # DOMBaseWrapper for many classes, but there might be some where the | 1129 # DOMBaseWrapper for many classes, but there might be some where the |
| 1064 # array-ness is introduced by a non-root interface: | 1130 # array-ness is introduced by a non-root interface: |
| 1065 # | 1131 # |
| (...skipping 27 matching lines...) Expand all Loading... |
| 1093 ' void operator[]=(int index, $TYPE value) {\n' | 1159 ' void operator[]=(int index, $TYPE value) {\n' |
| 1094 ' throw new UnsupportedOperationException("Cannot assign element
of immutable List.");\n' | 1160 ' throw new UnsupportedOperationException("Cannot assign element
of immutable List.");\n' |
| 1095 ' }\n', | 1161 ' }\n', |
| 1096 TYPE=self._NarrowInputType(element_type)) | 1162 TYPE=self._NarrowInputType(element_type)) |
| 1097 | 1163 |
| 1098 # TODO(sra): Use separate mixins for mutable implementations of List<T>. | 1164 # TODO(sra): Use separate mixins for mutable implementations of List<T>. |
| 1099 # TODO(sra): Use separate mixins for typed array implementations of List<T>. | 1165 # TODO(sra): Use separate mixins for typed array implementations of List<T>. |
| 1100 if self._interface.id != 'NodeList': | 1166 if self._interface.id != 'NodeList': |
| 1101 template_file = 'immutable_list_mixin.darttemplate' | 1167 template_file = 'immutable_list_mixin.darttemplate' |
| 1102 template = self._system._templates.Load(template_file) | 1168 template = self._system._templates.Load(template_file) |
| 1103 self._members_emitter.Emit(template, E=DartType(element_type)) | 1169 self._members_emitter.Emit(template, E=self._shared.DartType(element_type)
) |
| 1104 | 1170 |
| 1105 def AddAttribute(self, getter, setter): | 1171 def AddAttribute(self, getter, setter): |
| 1106 dom_name = DartDomNameOfAttribute(getter or setter) | 1172 dom_name = DartDomNameOfAttribute(getter or setter) |
| 1107 html_getter_name = None | 1173 html_getter_name = None |
| 1108 if not self._shared.IsCustomInHtmlLibrary( | 1174 if not self._shared.IsCustomInHtmlLibrary( |
| 1109 self._interface, dom_name, 'get:'): | 1175 self._interface, dom_name, 'get:'): |
| 1110 html_getter_name = self._shared.RenameInHtmlLibrary( | 1176 html_getter_name = self._shared.RenameInHtmlLibrary( |
| 1111 self._interface.id, dom_name, 'get:', | 1177 self._interface.id, dom_name, 'get:', |
| 1112 implementation_class=True) | 1178 implementation_class=True) |
| 1113 html_setter_name = None | 1179 html_setter_name = None |
| (...skipping 18 matching lines...) Expand all Loading... |
| 1132 if setter: | 1198 if setter: |
| 1133 self._AddRenamingSetter(setter, html_setter_name) | 1199 self._AddRenamingSetter(setter, html_setter_name) |
| 1134 return | 1200 return |
| 1135 | 1201 |
| 1136 # If the (getter, setter) pair is shadowing, we can't generate a shadowing | 1202 # If the (getter, setter) pair is shadowing, we can't generate a shadowing |
| 1137 # field (Issue 1633). | 1203 # field (Issue 1633). |
| 1138 (super_getter, super_getter_interface) = self._FindShadowedAttribute(getter,
_merged_html_interfaces) | 1204 (super_getter, super_getter_interface) = self._FindShadowedAttribute(getter,
_merged_html_interfaces) |
| 1139 (super_setter, super_setter_interface) = self._FindShadowedAttribute(setter,
_merged_html_interfaces) | 1205 (super_setter, super_setter_interface) = self._FindShadowedAttribute(setter,
_merged_html_interfaces) |
| 1140 if super_getter or super_setter: | 1206 if super_getter or super_setter: |
| 1141 if getter and not setter and super_getter and not super_setter: | 1207 if getter and not setter and super_getter and not super_setter: |
| 1142 if DartType(getter.type.id) == DartType(super_getter.type.id): | 1208 if getter.type.id == super_getter.type.id: |
| 1143 # Compatible getter, use the superclass property. This works because | 1209 # Compatible getter, use the superclass property. This works because |
| 1144 # JavaScript will do its own dynamic dispatch. | 1210 # JavaScript will do its own dynamic dispatch. |
| 1145 output_type = getter and self._NarrowOutputType(getter.type.id) | 1211 output_type = getter and self._NarrowOutputType(getter.type.id) |
| 1146 self._members_emitter.Emit( | 1212 self._members_emitter.Emit( |
| 1147 '\n' | 1213 '\n' |
| 1148 ' // Use implementation from $SUPER.\n' | 1214 ' // Use implementation from $SUPER.\n' |
| 1149 ' // final $TYPE $NAME;\n', | 1215 ' // final $TYPE $NAME;\n', |
| 1150 SUPER=super_getter_interface, | 1216 SUPER=super_getter_interface, |
| 1151 NAME=DartDomNameOfAttribute(getter), | 1217 NAME=DartDomNameOfAttribute(getter), |
| 1152 TYPE=output_type) | 1218 TYPE=output_type) |
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1230 else: | 1296 else: |
| 1231 self._members_emitter.Emit( | 1297 self._members_emitter.Emit( |
| 1232 '\n' | 1298 '\n' |
| 1233 ' $TYPE $NAME($PARAMS) native;\n', | 1299 ' $TYPE $NAME($PARAMS) native;\n', |
| 1234 TYPE=self._NarrowOutputType(info.type_name), | 1300 TYPE=self._NarrowOutputType(info.type_name), |
| 1235 NAME=info.name, | 1301 NAME=info.name, |
| 1236 PARAMS=info.ParametersImplementationDeclaration( | 1302 PARAMS=info.ParametersImplementationDeclaration( |
| 1237 lambda type_name: self._NarrowInputType(type_name))) | 1303 lambda type_name: self._NarrowInputType(type_name))) |
| 1238 | 1304 |
| 1239 def AddEventAttributes(self, event_attrs): | 1305 def AddEventAttributes(self, event_attrs): |
| 1240 event_attrs = DomToHtmlEvents(self._interface.id, event_attrs) | 1306 event_attrs = DomToHtmlEvents(self._html_interface_name, event_attrs) |
| 1241 events_class = '_' + self._interface.id + 'EventsImpl' | 1307 events_class = '_' + self._html_interface_name + 'EventsImpl' |
| 1242 events_interface = self._interface.id + 'Events' | 1308 events_interface = self._html_interface_name + 'Events' |
| 1243 self._EmitEventGetter(events_class) | 1309 self._EmitEventGetter(events_class) |
| 1244 | 1310 |
| 1245 self._shared._event_classes.add(self._interface.id) | 1311 self._shared._event_classes.add(self._interface.id) |
| 1246 | 1312 |
| 1247 parent_event_class = self._shared.GetParentEventsClass(self._interface) | 1313 parent_event_class = self._shared.GetParentEventsClass(self._interface) |
| 1248 | 1314 |
| 1249 # TODO(jacobr): specify the type of _ptr as EventTarget | 1315 # TODO(jacobr): specify the type of _ptr as EventTarget |
| 1250 events_members = self._dart_code.Emit( | 1316 events_members = self._dart_code.Emit( |
| 1251 '\n' | 1317 '\n' |
| 1252 'class $CLASSNAME extends $SUPER implements $INTERFACE {\n' | 1318 'class $CLASSNAME extends $SUPER implements $INTERFACE {\n' |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1285 interface, | 1351 interface, |
| 1286 common_prefix, | 1352 common_prefix, |
| 1287 super_interface_name, | 1353 super_interface_name, |
| 1288 source_filter): | 1354 source_filter): |
| 1289 """.""" | 1355 """.""" |
| 1290 if interface.id in _merged_html_interfaces: | 1356 if interface.id in _merged_html_interfaces: |
| 1291 return None | 1357 return None |
| 1292 | 1358 |
| 1293 if IsPureInterface(interface.id): | 1359 if IsPureInterface(interface.id): |
| 1294 return | 1360 return |
| 1295 template_file = 'impl_%s.darttemplate' % interface.id | 1361 |
| 1362 html_interface_name = self._shared._HTMLInterfaceName(interface.id) |
| 1363 template_file = 'impl_%s.darttemplate' % html_interface_name |
| 1296 template = self._templates.TryLoad(template_file) | 1364 template = self._templates.TryLoad(template_file) |
| 1297 if not template: | 1365 if not template: |
| 1298 template = self._templates.Load('frog_impl.darttemplate') | 1366 template = self._templates.Load('frog_impl.darttemplate') |
| 1299 | 1367 |
| 1300 dart_code = self._ImplFileEmitter(interface.id) | 1368 dart_code = self._ImplFileEmitter(html_interface_name) |
| 1301 return HtmlFrogClassGenerator(self, interface, template, | 1369 return HtmlFrogClassGenerator(self, interface, template, |
| 1302 super_interface_name, dart_code, self._shared) | 1370 super_interface_name, dart_code, self._shared) |
| 1303 | 1371 |
| 1304 def GenerateLibraries(self): | 1372 def GenerateLibraries(self): |
| 1305 self._GenerateLibFile( | 1373 self._GenerateLibFile( |
| 1306 'html_frog.darttemplate', | 1374 'html_frog.darttemplate', |
| 1307 os.path.join(self._output_dir, 'html_frog.dart'), | 1375 os.path.join(self._output_dir, 'html_frog.dart'), |
| 1308 (self._interface_system._dart_interface_file_paths + | 1376 (self._interface_system._dart_interface_file_paths + |
| 1309 self._interface_system._dart_callback_file_paths + | 1377 self._interface_system._dart_callback_file_paths + |
| 1310 self._dart_frog_file_paths)) | 1378 self._dart_frog_file_paths)) |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1384 Collect(database.GetInterface(parent.type.id), | 1452 Collect(database.GetInterface(parent.type.id), |
| 1385 seen, collected) | 1453 seen, collected) |
| 1386 | 1454 |
| 1387 inheritance_closure = {} | 1455 inheritance_closure = {} |
| 1388 for interface in database.GetInterfaces(): | 1456 for interface in database.GetInterfaces(): |
| 1389 seen = set() | 1457 seen = set() |
| 1390 collected = [] | 1458 collected = [] |
| 1391 Collect(interface, seen, collected) | 1459 Collect(interface, seen, collected) |
| 1392 inheritance_closure[interface.id] = collected | 1460 inheritance_closure[interface.id] = collected |
| 1393 return inheritance_closure | 1461 return inheritance_closure |
| OLD | NEW |