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 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 563 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 585 return _html_event_names[event_name] | 599 return _html_event_names[event_name] |
| 586 | 600 |
| 587 # ------------------------------------------------------------------------------ | 601 # ------------------------------------------------------------------------------ |
| 588 class HtmlSystemShared(object): | 602 class HtmlSystemShared(object): |
| 589 | 603 |
| 590 def __init__(self, database): | 604 def __init__(self, database): |
| 591 self._event_classes = set() | 605 self._event_classes = set() |
| 592 self._seen_event_names = {} | 606 self._seen_event_names = {} |
| 593 self._database = database | 607 self._database = database |
| 594 self._inheritance_closure = _ComputeInheritanceClosure(database) | 608 self._inheritance_closure = _ComputeInheritanceClosure(database) |
| 609 self._html_renames = self._MakeHtmlRenames() | |
| 610 | |
| 611 def _HasAncestor(self, interface, names_to_match): | |
| 612 for parent in interface.parents: | |
| 613 if (parent.type.id in names_to_match or | |
|
Anton Muhin
2012/06/07 11:43:47
up to you, but I find it somewhat hard to read, wh
podivilov
2012/06/08 18:03:25
Done.
| |
| 614 (self._database.HasInterface(parent.type.id) and | |
| 615 self._HasAncestor(self._database.GetInterface(parent.type.id), | |
| 616 names_to_match))): | |
| 617 return True | |
| 618 return False | |
| 619 | |
| 620 def _MakeHtmlRenames(self): | |
| 621 html_renames = {} | |
| 622 | |
| 623 for interface in self._database.GetInterfaces(): | |
| 624 if (interface.id.startswith("HTML") and | |
|
Anton Muhin
2012/06/07 11:43:47
nit: single quote strings, please
podivilov
2012/06/08 18:03:25
Done.
| |
| 625 self._HasAncestor(interface, ['Element', 'Document'])): | |
| 626 html_renames[interface.id] = interface.id[4:] | |
| 627 | |
| 628 for subclass in _html_strip_webkit_prefix_classes: | |
| 629 html_renames['WebKit' + subclass] = subclass | |
| 630 | |
| 631 # TODO(jacobr): we almost want to add this commented out line back. | |
| 632 # html_renames['HTMLCollection'] = 'ElementList' | |
| 633 # html_renames['NodeList'] = 'ElementList' | |
| 634 # html_renames['HTMLOptionsCollection'] = 'ElementList' | |
| 635 html_renames['DOMWindow'] = 'Window' | |
| 636 | |
| 637 return html_renames | |
| 638 | |
| 639 def _HTMLInterfaceName(self, interface_name): | |
| 640 return self._html_renames.get(interface_name, interface_name) | |
| 595 | 641 |
| 596 def _FindMatch(self, interface_name, member, member_prefix, candidates): | 642 def _FindMatch(self, interface_name, member, member_prefix, candidates): |
| 597 for ancestor_name in self._AllAncestorInterfaces(interface_name): | 643 for ancestor_name in self._AllAncestorInterfaces(interface_name): |
| 598 name = ancestor_name + '.' + member | 644 name = self._HTMLInterfaceName(ancestor_name) + '.' + member |
| 599 if name in candidates: | 645 if name in candidates: |
| 600 return name | 646 return name |
| 601 name = interface_name + '.' + member_prefix + member | 647 name = self._HTMLInterfaceName(interface_name) + '.' + member_prefix + |
| 648 member | |
| 602 if name in candidates: | 649 if name in candidates: |
| 603 return name | 650 return name |
| 604 return None | 651 return None |
| 605 | 652 |
| 606 def _AllAncestorInterfaces(self, interface_name): | 653 def _AllAncestorInterfaces(self, interface_name): |
| 607 return [interface_name] + self._inheritance_closure[interface_name] | 654 return [interface_name] + self._inheritance_closure[interface_name] |
| 608 | 655 |
| 609 def RenameInHtmlLibrary(self, interface_name, member, member_prefix='', | 656 def RenameInHtmlLibrary(self, interface_name, member, member_prefix='', |
| 610 implementation_class=False): | 657 implementation_class=False): |
| 611 """ | 658 """ |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 679 if attr.type.id == 'EventListener']) | 726 if attr.type.id == 'EventListener']) |
| 680 | 727 |
| 681 if events or interface.id in _html_explicit_event_classes: | 728 if events or interface.id in _html_explicit_event_classes: |
| 682 return True, events | 729 return True, events |
| 683 else: | 730 else: |
| 684 return False, None | 731 return False, None |
| 685 | 732 |
| 686 def IsPrivate(self, name): | 733 def IsPrivate(self, name): |
| 687 return name.startswith('_') | 734 return name.startswith('_') |
| 688 | 735 |
| 736 def DartType(self, idl_type): | |
| 737 type_info = GetIDLTypeInfo(idl_type) | |
| 738 return self._HTMLInterfaceName(type_info.dart_type()) | |
| 739 | |
| 689 class HtmlSystem(System): | 740 class HtmlSystem(System): |
| 690 | 741 |
| 691 def __init__(self, templates, database, emitters, output_dir): | 742 def __init__(self, templates, database, emitters, output_dir): |
| 692 super(HtmlSystem, self).__init__( | 743 super(HtmlSystem, self).__init__( |
| 693 templates, database, emitters, output_dir) | 744 templates, database, emitters, output_dir) |
| 694 self._shared = HtmlSystemShared(database) | 745 self._shared = HtmlSystemShared(database) |
| 695 | 746 |
| 696 class HtmlInterfacesSystem(HtmlSystem): | 747 class HtmlInterfacesSystem(HtmlSystem): |
| 697 | 748 |
| 698 def __init__(self, templates, database, emitters, output_dir): | 749 def __init__(self, templates, database, emitters, output_dir): |
| 699 super(HtmlInterfacesSystem, self).__init__( | 750 super(HtmlInterfacesSystem, self).__init__( |
| 700 templates, database, emitters, output_dir) | 751 templates, database, emitters, output_dir) |
| 701 self._dart_interface_file_paths = [] | 752 self._dart_interface_file_paths = [] |
| 702 self._factory_provider_emitters = {} | 753 self._factory_provider_emitters = {} |
| 703 | 754 |
| 704 def InterfaceGenerator(self, | 755 def InterfaceGenerator(self, |
| 705 interface, | 756 interface, |
| 706 common_prefix, | 757 common_prefix, |
| 707 super_interface_name, | 758 super_interface_name, |
| 708 source_filter): | 759 source_filter): |
| 709 """.""" | 760 """.""" |
| 710 if interface.id in _merged_html_interfaces.values(): | 761 if interface.id in _merged_html_interfaces.values(): |
| 711 return None | 762 return None |
| 712 | 763 |
| 713 interface_name = interface.id | 764 html_interface_name = self._shared._HTMLInterfaceName(interface.id) |
| 714 dart_interface_file_path = self._FilePathForDartInterface(interface_name) | 765 dart_interface_file_path = |
| 766 self._FilePathForDartInterface(html_interface_name) | |
| 715 | 767 |
| 716 self._dart_interface_file_paths.append(dart_interface_file_path) | 768 self._dart_interface_file_paths.append(dart_interface_file_path) |
| 717 | 769 |
| 718 dart_interface_code = self._emitters.FileEmitter(dart_interface_file_path) | 770 dart_interface_code = self._emitters.FileEmitter(dart_interface_file_path) |
| 719 | 771 |
| 720 template_file = 'interface_%s.darttemplate' % interface_name | 772 template_file = 'interface_%s.darttemplate' % html_interface_name |
| 721 template = self._templates.TryLoad(template_file) | 773 template = self._templates.TryLoad(template_file) |
| 722 if not template: | 774 if not template: |
| 723 template = self._templates.Load('interface.darttemplate') | 775 template = self._templates.Load('interface.darttemplate') |
| 724 | 776 |
| 725 return HtmlDartInterfaceGenerator( | 777 return HtmlDartInterfaceGenerator( |
| 726 self, interface, dart_interface_code, | 778 self, interface, dart_interface_code, |
| 727 template, | 779 template, |
| 728 common_prefix, super_interface_name, | 780 common_prefix, super_interface_name, |
| 729 source_filter, self._shared) | 781 source_filter, self._shared) |
| 730 | 782 |
| (...skipping 18 matching lines...) Expand all Loading... | |
| 749 # TODO(jmesserly): inheritance is probably not the right way to factor this long | 801 # TODO(jmesserly): inheritance is probably not the right way to factor this long |
| 750 # term, but it makes merging better for now. | 802 # term, but it makes merging better for now. |
| 751 class HtmlDartInterfaceGenerator(DartInterfaceGenerator): | 803 class HtmlDartInterfaceGenerator(DartInterfaceGenerator): |
| 752 """Generates Dart Interface definition for one DOM IDL interface.""" | 804 """Generates Dart Interface definition for one DOM IDL interface.""" |
| 753 | 805 |
| 754 def __init__(self, system, interface, emitter, template, | 806 def __init__(self, system, interface, emitter, template, |
| 755 common_prefix, super_interface, source_filter, shared): | 807 common_prefix, super_interface, source_filter, shared): |
| 756 super(HtmlDartInterfaceGenerator, self).__init__(system, interface, | 808 super(HtmlDartInterfaceGenerator, self).__init__(system, interface, |
| 757 emitter, template, common_prefix, super_interface, source_filter) | 809 emitter, template, common_prefix, super_interface, source_filter) |
| 758 self._shared = shared | 810 self._shared = shared |
| 811 self._html_interface_name = | |
| 812 self._shared._HTMLInterfaceName(self._interface.id) | |
| 759 | 813 |
| 760 def StartInterface(self): | 814 def StartInterface(self): |
| 761 typename = self._interface.id | 815 typename = self._html_interface_name |
| 762 | 816 |
| 763 extends = [] | 817 extends = [] |
| 764 suppressed_extends = [] | 818 suppressed_extends = [] |
| 765 | 819 |
| 766 for parent in self._interface.parents: | 820 for parent in self._interface.parents: |
| 767 # TODO(vsm): Remove source_filter. | 821 # TODO(vsm): Remove source_filter. |
| 768 if MatchSourceFilter(self._source_filter, parent): | 822 if MatchSourceFilter(self._source_filter, parent): |
| 769 # Parent is a DOM type. | 823 # Parent is a DOM type. |
| 770 extends.append(DartType(parent.type.id)) | 824 extends.append(self._shared.DartType(parent.type.id)) |
| 771 elif '<' in parent.type.id: | 825 elif '<' in parent.type.id: |
| 772 # Parent is a Dart collection type. | 826 # Parent is a Dart collection type. |
| 773 # TODO(vsm): Make this check more robust. | 827 # TODO(vsm): Make this check more robust. |
| 774 extends.append(DartType(parent.type.id)) | 828 extends.append(self._shared.DartType(parent.type.id)) |
| 775 else: | 829 else: |
| 776 suppressed_extends.append('%s.%s' % | 830 suppressed_extends.append('%s.%s' % |
| 777 (self._common_prefix, DartType(parent.type.id))) | 831 (self._common_prefix, self._shared.DartType(parent.type.id))) |
| 778 | 832 |
| 779 comment = ' extends' | 833 comment = ' extends' |
| 780 extends_str = '' | 834 extends_str = '' |
| 781 if extends: | 835 if extends: |
| 782 extends_str += ' extends ' + ', '.join(extends) | 836 extends_str += ' extends ' + ', '.join(extends) |
| 783 comment = ',' | 837 comment = ',' |
| 784 if suppressed_extends: | 838 if suppressed_extends: |
| 785 extends_str += ' /*%s %s */' % (comment, ', '.join(suppressed_extends)) | 839 extends_str += ' /*%s %s */' % (comment, ', '.join(suppressed_extends)) |
| 786 | 840 |
| 787 factory_provider = None | 841 factory_provider = None |
| (...skipping 25 matching lines...) Expand all Loading... | |
| 813 ID=typename, | 867 ID=typename, |
| 814 EXTENDS=extends_str) | 868 EXTENDS=extends_str) |
| 815 | 869 |
| 816 self._type_comment_emitter.Emit("/// @domName $DOMNAME", | 870 self._type_comment_emitter.Emit("/// @domName $DOMNAME", |
| 817 DOMNAME=self._interface.doc_js_name) | 871 DOMNAME=self._interface.doc_js_name) |
| 818 | 872 |
| 819 for constructor_info in constructors: | 873 for constructor_info in constructors: |
| 820 self._members_emitter.Emit( | 874 self._members_emitter.Emit( |
| 821 '\n' | 875 '\n' |
| 822 ' $CTOR($PARAMS);\n', | 876 ' $CTOR($PARAMS);\n', |
| 823 CTOR=constructor_info.ConstructorFullName(), | 877 CTOR=self._shared.DartType(constructor_info.ConstructorFullName()), |
| 824 PARAMS=constructor_info.ParametersInterfaceDeclaration()); | 878 PARAMS=constructor_info.ParametersInterfaceDeclaration( |
| 879 self._shared.DartType)); | |
| 825 | 880 |
| 826 element_type = MaybeTypedArrayElementTypeInHierarchy( | 881 element_type = MaybeTypedArrayElementTypeInHierarchy( |
| 827 self._interface, self._system._database) | 882 self._interface, self._system._database) |
| 828 if element_type: | 883 if element_type: |
| 829 self._members_emitter.Emit( | 884 self._members_emitter.Emit( |
| 830 '\n' | 885 '\n' |
| 831 ' $CTOR(int length);\n' | 886 ' $CTOR(int length);\n' |
| 832 '\n' | 887 '\n' |
| 833 ' $CTOR.fromList(List<$TYPE> list);\n' | 888 ' $CTOR.fromList(List<$TYPE> list);\n' |
| 834 '\n' | 889 '\n' |
| 835 ' $CTOR.fromBuffer(ArrayBuffer buffer,' | 890 ' $CTOR.fromBuffer(ArrayBuffer buffer,' |
| 836 ' [int byteOffset, int length]);\n', | 891 ' [int byteOffset, int length]);\n', |
| 837 CTOR=self._interface.id, | 892 CTOR=self._interface.id, |
| 838 TYPE=DartType(element_type)) | 893 TYPE=self._shared.DartType(element_type)) |
| 839 | 894 |
| 840 emit_events, events = self._shared.GetEventAttributes(self._interface) | 895 emit_events, events = self._shared.GetEventAttributes(self._interface) |
| 841 if not emit_events: | 896 if not emit_events: |
| 842 return | 897 return |
| 843 elif events: | 898 elif events: |
| 844 self.AddEventAttributes(events) | 899 self.AddEventAttributes(events) |
| 845 else: | 900 else: |
| 846 self._EmitEventGetter(self._shared.GetParentEventsClass(self._interface)) | 901 self._EmitEventGetter(self._shared.GetParentEventsClass(self._interface)) |
| 847 | 902 |
| 848 if self._interface.id in _merged_html_interfaces: | 903 if self._interface.id in _merged_html_interfaces: |
| (...skipping 15 matching lines...) Expand all Loading... | |
| 864 return | 919 return |
| 865 | 920 |
| 866 # We don't yet handle inconsistent renames of the getter and setter yet. | 921 # We don't yet handle inconsistent renames of the getter and setter yet. |
| 867 if html_getter_name and html_setter_name: | 922 if html_getter_name and html_setter_name: |
| 868 assert html_getter_name == html_setter_name | 923 assert html_getter_name == html_setter_name |
| 869 | 924 |
| 870 self._members_emitter.Emit('\n /** @domName $DOMINTERFACE.$DOMNAME */', | 925 self._members_emitter.Emit('\n /** @domName $DOMINTERFACE.$DOMNAME */', |
| 871 DOMINTERFACE=getter.doc_js_interface_name, | 926 DOMINTERFACE=getter.doc_js_interface_name, |
| 872 DOMNAME=dom_name) | 927 DOMNAME=dom_name) |
| 873 if (getter and setter and | 928 if (getter and setter and |
| 874 DartType(getter.type.id) == DartType(setter.type.id)): | 929 getter.type.id == setter.type.id): |
| 875 self._members_emitter.Emit('\n $TYPE $NAME;\n', | 930 self._members_emitter.Emit('\n $TYPE $NAME;\n', |
| 876 NAME=html_getter_name, | 931 NAME=html_getter_name, |
| 877 TYPE=DartType(getter.type.id)); | 932 TYPE=self._shared.DartType(getter.type.id)); |
| 878 return | 933 return |
| 879 if getter and not setter: | 934 if getter and not setter: |
| 880 self._members_emitter.Emit('\n final $TYPE $NAME;\n', | 935 self._members_emitter.Emit('\n final $TYPE $NAME;\n', |
| 881 NAME=html_getter_name, | 936 NAME=html_getter_name, |
| 882 TYPE=DartType(getter.type.id)); | 937 TYPE=self._shared.DartType(getter.type.id)); |
| 883 return | 938 return |
| 884 raise Exception('Unexpected getter/setter combination %s %s' % | 939 raise Exception('Unexpected getter/setter combination %s %s' % |
| 885 (getter, setter)) | 940 (getter, setter)) |
| 886 | 941 |
| 887 def AddOperation(self, info): | 942 def AddOperation(self, info): |
| 888 """ | 943 """ |
| 889 Arguments: | 944 Arguments: |
| 890 operations - contains the overloads, one or more operations with the same | 945 operations - contains the overloads, one or more operations with the same |
| 891 name. | 946 name. |
| 892 """ | 947 """ |
| 893 html_name = self._shared.RenameInHtmlLibrary( | 948 html_name = self._shared.RenameInHtmlLibrary( |
| 894 self._interface.id, info.name) | 949 self._interface.id, info.name) |
| 895 if html_name and not self._shared.IsPrivate(html_name): | 950 if html_name and not self._shared.IsPrivate(html_name): |
| 896 self._members_emitter.Emit('\n /** @domName $DOMINTERFACE.$DOMNAME */', | 951 self._members_emitter.Emit('\n /** @domName $DOMINTERFACE.$DOMNAME */', |
| 897 DOMINTERFACE=info.overloads[0].doc_js_interface_name, | 952 DOMINTERFACE=info.overloads[0].doc_js_interface_name, |
| 898 DOMNAME=info.name) | 953 DOMNAME=info.name) |
| 899 | 954 |
| 900 self._members_emitter.Emit('\n' | 955 self._members_emitter.Emit('\n' |
| 901 ' $TYPE $NAME($PARAMS);\n', | 956 ' $TYPE $NAME($PARAMS);\n', |
| 902 TYPE=info.type_name, | 957 TYPE=self._shared.DartType(info.type_name), |
| 903 NAME=html_name, | 958 NAME=html_name, |
| 904 PARAMS=info.ParametersInterfaceDeclaration()) | 959 PARAMS=info.ParametersInterfaceDeclaration( |
| 960 self._shared.DartType)) | |
| 905 | 961 |
| 906 def FinishInterface(self): | 962 def FinishInterface(self): |
| 907 pass | 963 pass |
| 908 | 964 |
| 909 def AddConstant(self, constant): | 965 def AddConstant(self, constant): |
| 910 self._EmitConstant(self._members_emitter, constant) | 966 self._EmitConstant(self._members_emitter, constant) |
| 911 | 967 |
| 912 def AddEventAttributes(self, event_attrs): | 968 def AddEventAttributes(self, event_attrs): |
| 913 event_attrs = DomToHtmlEvents(self._interface.id, event_attrs) | 969 event_attrs = DomToHtmlEvents(self._html_interface_name, event_attrs) |
| 914 self._shared._event_classes.add(self._interface.id) | 970 self._shared._event_classes.add(self._interface.id) |
| 915 events_interface = self._interface.id + 'Events' | 971 events_interface = self._html_interface_name + 'Events' |
| 916 self._EmitEventGetter(events_interface) | 972 self._EmitEventGetter(events_interface) |
| 917 | 973 |
| 918 events_members = self._emitter.Emit( | 974 events_members = self._emitter.Emit( |
| 919 '\ninterface $INTERFACE extends $PARENTS {\n$!MEMBERS}\n', | 975 '\ninterface $INTERFACE extends $PARENTS {\n$!MEMBERS}\n', |
| 920 INTERFACE=events_interface, | 976 INTERFACE=events_interface, |
| 921 PARENTS=', '.join( | 977 PARENTS=', '.join( |
| 922 self._shared.GetParentsEventsClasses(self._interface))) | 978 self._shared.GetParentsEventsClasses(self._interface))) |
| 923 | 979 |
| 924 for event_name in event_attrs: | 980 for event_name in event_attrs: |
| 925 if event_name in _html_event_names: | 981 if event_name in _html_event_names: |
| (...skipping 18 matching lines...) Expand all Loading... | |
| 944 class HtmlFrogClassGenerator(FrogInterfaceGenerator): | 1000 class HtmlFrogClassGenerator(FrogInterfaceGenerator): |
| 945 """Generates a Frog class for the dart:html library from a DOM IDL | 1001 """Generates a Frog class for the dart:html library from a DOM IDL |
| 946 interface. | 1002 interface. |
| 947 """ | 1003 """ |
| 948 | 1004 |
| 949 def __init__(self, system, interface, template, super_interface, dart_code, | 1005 def __init__(self, system, interface, template, super_interface, dart_code, |
| 950 shared): | 1006 shared): |
| 951 super(HtmlFrogClassGenerator, self).__init__( | 1007 super(HtmlFrogClassGenerator, self).__init__( |
| 952 system, interface, template, super_interface, dart_code) | 1008 system, interface, template, super_interface, dart_code) |
| 953 self._shared = shared | 1009 self._shared = shared |
| 1010 self._html_interface_name = | |
| 1011 self._shared._HTMLInterfaceName(self._interface.id) | |
| 954 | 1012 |
| 955 def _ImplClassName(self, type_name): | 1013 def _ImplClassName(self, type_name): |
| 956 return self._shared._ImplClassName(type_name) | 1014 return self._shared._ImplClassName(type_name) |
| 957 | 1015 |
| 1016 def _NarrowToImplementationType(self, type_name): | |
| 1017 if self._ShouldNarrowToImplementationType(type_name): | |
| 1018 return self._ImplClassName(self._shared.DartType(type_name)) | |
| 1019 return self._shared.DartType(type_name) | |
| 1020 | |
| 958 def StartInterface(self): | 1021 def StartInterface(self): |
| 959 interface = self._interface | 1022 interface = self._interface |
| 960 interface_name = interface.id | 1023 interface_name = interface.id |
| 961 | 1024 |
| 962 self._class_name = self._ImplClassName(interface_name) | 1025 self._class_name = self._ImplClassName(self._html_interface_name) |
| 963 | 1026 |
| 964 base = None | 1027 base = None |
| 965 if interface.parents: | 1028 if interface.parents: |
| 966 supertype = interface.parents[0].type.id | 1029 supertype = interface.parents[0].type.id |
| 967 if IsDartCollectionType(supertype): | 1030 if IsDartCollectionType(supertype): |
| 968 # List methods are injected in AddIndexer. | 1031 # List methods are injected in AddIndexer. |
| 969 pass | 1032 pass |
| 970 elif IsPureInterface(supertype): | 1033 elif IsPureInterface(supertype): |
| 971 pass | 1034 pass |
| 972 else: | 1035 else: |
| 973 base = self._ImplClassName(supertype) | 1036 base = self._ImplClassName(self._shared._HTMLInterfaceName(supertype)) |
| 974 | 1037 |
| 975 native_spec = MakeNativeSpec(interface.javascript_binding_name) | 1038 native_spec = MakeNativeSpec(interface.javascript_binding_name) |
| 976 | 1039 |
| 977 extends = ' extends ' + base if base else '' | 1040 extends = ' extends ' + base if base else '' |
| 978 | 1041 |
| 979 # TODO: Include all implemented interfaces, including other Lists. | 1042 # TODO: Include all implemented interfaces, including other Lists. |
| 980 implements = [interface_name] | 1043 implements = [self._html_interface_name] |
| 981 element_type = MaybeTypedArrayElementType(self._interface) | 1044 element_type = MaybeTypedArrayElementType(self._interface) |
| 982 if element_type: | 1045 if element_type: |
| 983 implements.append('List<%s>' % DartType(element_type)) | 1046 implements.append('List<%s>' % self._shared.DartType(element_type)) |
| 984 | 1047 |
| 985 self._members_emitter = self._dart_code.Emit( | 1048 self._members_emitter = self._dart_code.Emit( |
| 986 self._template, | 1049 self._template, |
| 987 #class $CLASSNAME$EXTENDS$IMPLEMENTS$NATIVESPEC { | 1050 #class $CLASSNAME$EXTENDS$IMPLEMENTS$NATIVESPEC { |
| 988 #$!MEMBERS | 1051 #$!MEMBERS |
| 989 #} | 1052 #} |
| 990 CLASSNAME=self._class_name, | 1053 CLASSNAME=self._class_name, |
| 991 EXTENDS=extends, | 1054 EXTENDS=extends, |
| 992 IMPLEMENTS=' implements ' + ', '.join(implements), | 1055 IMPLEMENTS=' implements ' + ', '.join(implements), |
| 993 NATIVESPEC=' native "' + native_spec + '"') | 1056 NATIVESPEC=' native "' + native_spec + '"') |
| 994 if self._members_emitter == None: | 1057 if self._members_emitter == None: |
| 995 raise Exception("Class %s doesn't use the $!MEMBERS variable" % | 1058 raise Exception("Class %s doesn't use the $!MEMBERS variable" % |
| 996 self._class_name) | 1059 self._class_name) |
| 997 | 1060 |
| 998 # Emit a factory provider class for the constructor. | 1061 # Emit a factory provider class for the constructor. |
| 999 constructor_info = AnalyzeConstructor(interface) | 1062 constructor_info = AnalyzeConstructor(interface) |
| 1000 if constructor_info: | 1063 if constructor_info: |
| 1001 self._EmitFactoryProvider(interface_name, constructor_info) | 1064 self._EmitFactoryProvider(constructor_info) |
| 1002 | 1065 |
| 1003 infos = HtmlElementConstructorInfos(interface_name) | 1066 infos = HtmlElementConstructorInfos(self._html_interface_name) |
| 1004 if infos: | 1067 if infos: |
| 1005 self._EmitHtmlElementFactoryConstructors(infos) | 1068 self._EmitHtmlElementFactoryConstructors(infos) |
| 1006 | 1069 |
| 1007 emit_events, events = self._shared.GetEventAttributes(self._interface) | 1070 emit_events, events = self._shared.GetEventAttributes(self._interface) |
| 1008 if not emit_events: | 1071 if not emit_events: |
| 1009 return | 1072 return |
| 1010 elif events: | 1073 elif events: |
| 1011 self.AddEventAttributes(events) | 1074 self.AddEventAttributes(events) |
| 1012 else: | 1075 else: |
| 1013 parent_events_class = self._shared.GetParentEventsClass(self._interface) | 1076 parent_events_class = self._shared.GetParentEventsClass(self._interface) |
| 1014 self._EmitEventGetter('_' + parent_events_class + 'Impl') | 1077 self._EmitEventGetter('_' + parent_events_class + 'Impl') |
| 1015 | 1078 |
| 1016 if self._interface.id in _merged_html_interfaces: | 1079 if self._interface.id in _merged_html_interfaces: |
| 1017 merged_interface = _merged_html_interfaces[self._interface.id] | 1080 merged_interface = _merged_html_interfaces[self._interface.id] |
| 1018 self.AddMembers(self._database.GetInterface(merged_interface)) | 1081 self.AddMembers(self._database.GetInterface(merged_interface)) |
| 1019 | 1082 |
| 1020 def _EmitFactoryProvider(self, interface_name, constructor_info): | 1083 def _EmitFactoryProvider(self, constructor_info): |
| 1021 template_file = 'factoryprovider_%s.darttemplate' % interface_name | 1084 template_file = 'factoryprovider_%s.darttemplate' % |
| 1085 self._html_interface_name | |
| 1022 template = self._system._templates.TryLoad(template_file) | 1086 template = self._system._templates.TryLoad(template_file) |
| 1023 if not template: | 1087 if not template: |
| 1024 template = self._system._templates.Load('factoryprovider.darttemplate') | 1088 template = self._system._templates.Load('factoryprovider.darttemplate') |
| 1025 | 1089 |
| 1026 factory_provider = '_' + interface_name + 'FactoryProvider' | 1090 factory_provider = '_' + self._html_interface_name + 'FactoryProvider' |
| 1027 emitter = self._system._ImplFileEmitter(factory_provider) | 1091 emitter = self._system._ImplFileEmitter(factory_provider) |
| 1028 emitter.Emit( | 1092 emitter.Emit( |
| 1029 template, | 1093 template, |
| 1030 FACTORYPROVIDER=factory_provider, | 1094 FACTORYPROVIDER=factory_provider, |
| 1031 CONSTRUCTOR=interface_name, | 1095 CONSTRUCTOR=self._html_interface_name, |
| 1032 PARAMETERS=constructor_info.ParametersImplementationDeclaration(), | 1096 PARAMETERS=constructor_info.ParametersImplementationDeclaration(), |
| 1033 NAMED_CONSTRUCTOR=constructor_info.name or interface_name, | 1097 NAMED_CONSTRUCTOR=constructor_info.name or self._html_interface_name, |
| 1034 ARGUMENTS=constructor_info.ParametersAsArgumentList()) | 1098 ARGUMENTS=constructor_info.ParametersAsArgumentList()) |
| 1035 | 1099 |
| 1036 def _EmitHtmlElementFactoryConstructors(self, infos): | 1100 def _EmitHtmlElementFactoryConstructors(self, infos): |
| 1037 EmitHtmlElementFactoryConstructors( | 1101 EmitHtmlElementFactoryConstructors( |
| 1038 self._system._EmitterForFactoryProviderBody( | 1102 self._system._EmitterForFactoryProviderBody( |
| 1039 infos[0].factory_provider_name), | 1103 infos[0].factory_provider_name), |
| 1040 infos, | 1104 infos, |
| 1041 self._interface.id, self._class_name) | 1105 self._html_interface_name, self._class_name) |
| 1042 | 1106 |
| 1043 def AddIndexer(self, element_type): | 1107 def AddIndexer(self, element_type): |
| 1044 """Adds all the methods required to complete implementation of List.""" | 1108 """Adds all the methods required to complete implementation of List.""" |
| 1045 # We would like to simply inherit the implementation of everything except | 1109 # We would like to simply inherit the implementation of everything except |
| 1046 # get length(), [], and maybe []=. It is possible to extend from a base | 1110 # get length(), [], and maybe []=. It is possible to extend from a base |
| 1047 # array implementation class only when there is no other implementation | 1111 # array implementation class only when there is no other implementation |
| 1048 # inheritance. There might be no implementation inheritance other than | 1112 # inheritance. There might be no implementation inheritance other than |
| 1049 # DOMBaseWrapper for many classes, but there might be some where the | 1113 # DOMBaseWrapper for many classes, but there might be some where the |
| 1050 # array-ness is introduced by a non-root interface: | 1114 # array-ness is introduced by a non-root interface: |
| 1051 # | 1115 # |
| (...skipping 27 matching lines...) Expand all Loading... | |
| 1079 ' void operator[]=(int index, $TYPE value) {\n' | 1143 ' void operator[]=(int index, $TYPE value) {\n' |
| 1080 ' throw new UnsupportedOperationException("Cannot assign element of immutable List.");\n' | 1144 ' throw new UnsupportedOperationException("Cannot assign element of immutable List.");\n' |
| 1081 ' }\n', | 1145 ' }\n', |
| 1082 TYPE=self._NarrowInputType(element_type)) | 1146 TYPE=self._NarrowInputType(element_type)) |
| 1083 | 1147 |
| 1084 # TODO(sra): Use separate mixins for mutable implementations of List<T>. | 1148 # TODO(sra): Use separate mixins for mutable implementations of List<T>. |
| 1085 # TODO(sra): Use separate mixins for typed array implementations of List<T>. | 1149 # TODO(sra): Use separate mixins for typed array implementations of List<T>. |
| 1086 if self._interface.id != 'NodeList': | 1150 if self._interface.id != 'NodeList': |
| 1087 template_file = 'immutable_list_mixin.darttemplate' | 1151 template_file = 'immutable_list_mixin.darttemplate' |
| 1088 template = self._system._templates.Load(template_file) | 1152 template = self._system._templates.Load(template_file) |
| 1089 self._members_emitter.Emit(template, E=DartType(element_type)) | 1153 self._members_emitter.Emit(template, E=self._shared.DartType(element_type) ) |
| 1090 | 1154 |
| 1091 def AddAttribute(self, getter, setter): | 1155 def AddAttribute(self, getter, setter): |
| 1092 dom_name = DartDomNameOfAttribute(getter or setter) | 1156 dom_name = DartDomNameOfAttribute(getter or setter) |
| 1093 html_getter_name = None | 1157 html_getter_name = None |
| 1094 if not self._shared.IsCustomInHtmlLibrary( | 1158 if not self._shared.IsCustomInHtmlLibrary( |
| 1095 self._interface, dom_name, 'get:'): | 1159 self._interface, dom_name, 'get:'): |
| 1096 html_getter_name = self._shared.RenameInHtmlLibrary( | 1160 html_getter_name = self._shared.RenameInHtmlLibrary( |
| 1097 self._interface.id, dom_name, 'get:', | 1161 self._interface.id, dom_name, 'get:', |
| 1098 implementation_class=True) | 1162 implementation_class=True) |
| 1099 html_setter_name = None | 1163 html_setter_name = None |
| (...skipping 18 matching lines...) Expand all Loading... | |
| 1118 if setter: | 1182 if setter: |
| 1119 self._AddRenamingSetter(setter, html_setter_name) | 1183 self._AddRenamingSetter(setter, html_setter_name) |
| 1120 return | 1184 return |
| 1121 | 1185 |
| 1122 # If the (getter, setter) pair is shadowing, we can't generate a shadowing | 1186 # If the (getter, setter) pair is shadowing, we can't generate a shadowing |
| 1123 # field (Issue 1633). | 1187 # field (Issue 1633). |
| 1124 (super_getter, super_getter_interface) = self._FindShadowedAttribute(getter) | 1188 (super_getter, super_getter_interface) = self._FindShadowedAttribute(getter) |
| 1125 (super_setter, super_setter_interface) = self._FindShadowedAttribute(setter) | 1189 (super_setter, super_setter_interface) = self._FindShadowedAttribute(setter) |
| 1126 if super_getter or super_setter: | 1190 if super_getter or super_setter: |
| 1127 if getter and not setter and super_getter and not super_setter: | 1191 if getter and not setter and super_getter and not super_setter: |
| 1128 if DartType(getter.type.id) == DartType(super_getter.type.id): | 1192 if getter.type.id == super_getter.type.id: |
| 1129 # Compatible getter, use the superclass property. This works because | 1193 # Compatible getter, use the superclass property. This works because |
| 1130 # JavaScript will do its own dynamic dispatch. | 1194 # JavaScript will do its own dynamic dispatch. |
| 1131 output_type = getter and self._NarrowOutputType(getter.type.id) | 1195 output_type = getter and self._NarrowOutputType(getter.type.id) |
| 1132 self._members_emitter.Emit( | 1196 self._members_emitter.Emit( |
| 1133 '\n' | 1197 '\n' |
| 1134 ' // Use implementation from $SUPER.\n' | 1198 ' // Use implementation from $SUPER.\n' |
| 1135 ' // final $TYPE $NAME;\n', | 1199 ' // final $TYPE $NAME;\n', |
| 1136 SUPER=super_getter_interface.id, | 1200 SUPER=super_getter_interface.id, |
| 1137 NAME=DartDomNameOfAttribute(getter), | 1201 NAME=DartDomNameOfAttribute(getter), |
| 1138 TYPE=output_type) | 1202 TYPE=output_type) |
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1216 else: | 1280 else: |
| 1217 self._members_emitter.Emit( | 1281 self._members_emitter.Emit( |
| 1218 '\n' | 1282 '\n' |
| 1219 ' $TYPE $NAME($PARAMS) native;\n', | 1283 ' $TYPE $NAME($PARAMS) native;\n', |
| 1220 TYPE=self._NarrowOutputType(info.type_name), | 1284 TYPE=self._NarrowOutputType(info.type_name), |
| 1221 NAME=info.name, | 1285 NAME=info.name, |
| 1222 PARAMS=info.ParametersImplementationDeclaration( | 1286 PARAMS=info.ParametersImplementationDeclaration( |
| 1223 lambda type_name: self._NarrowInputType(type_name))) | 1287 lambda type_name: self._NarrowInputType(type_name))) |
| 1224 | 1288 |
| 1225 def AddEventAttributes(self, event_attrs): | 1289 def AddEventAttributes(self, event_attrs): |
| 1226 event_attrs = DomToHtmlEvents(self._interface.id, event_attrs) | 1290 event_attrs = DomToHtmlEvents(self._html_interface_name, event_attrs) |
| 1227 events_class = '_' + self._interface.id + 'EventsImpl' | 1291 events_class = '_' + self._html_interface_name + 'EventsImpl' |
| 1228 events_interface = self._interface.id + 'Events' | 1292 events_interface = self._html_interface_name + 'Events' |
| 1229 self._EmitEventGetter(events_class) | 1293 self._EmitEventGetter(events_class) |
| 1230 | 1294 |
| 1231 self._shared._event_classes.add(self._interface.id) | 1295 self._shared._event_classes.add(self._interface.id) |
| 1232 | 1296 |
| 1233 parent_event_class = self._shared.GetParentEventsClass(self._interface) | 1297 parent_event_class = self._shared.GetParentEventsClass(self._interface) |
| 1234 | 1298 |
| 1235 # TODO(jacobr): specify the type of _ptr as EventTarget | 1299 # TODO(jacobr): specify the type of _ptr as EventTarget |
| 1236 events_members = self._dart_code.Emit( | 1300 events_members = self._dart_code.Emit( |
| 1237 '\n' | 1301 '\n' |
| 1238 'class $CLASSNAME extends $SUPER implements $INTERFACE {\n' | 1302 'class $CLASSNAME extends $SUPER implements $INTERFACE {\n' |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1271 interface, | 1335 interface, |
| 1272 common_prefix, | 1336 common_prefix, |
| 1273 super_interface_name, | 1337 super_interface_name, |
| 1274 source_filter): | 1338 source_filter): |
| 1275 """.""" | 1339 """.""" |
| 1276 if interface.id in _merged_html_interfaces.values(): | 1340 if interface.id in _merged_html_interfaces.values(): |
| 1277 return None | 1341 return None |
| 1278 | 1342 |
| 1279 if IsPureInterface(interface.id): | 1343 if IsPureInterface(interface.id): |
| 1280 return | 1344 return |
| 1281 template_file = 'impl_%s.darttemplate' % interface.id | 1345 |
| 1346 html_interface_name = self._shared._HTMLInterfaceName(interface.id) | |
| 1347 template_file = 'impl_%s.darttemplate' % html_interface_name | |
| 1282 template = self._templates.TryLoad(template_file) | 1348 template = self._templates.TryLoad(template_file) |
| 1283 if not template: | 1349 if not template: |
| 1284 template = self._templates.Load('frog_impl.darttemplate') | 1350 template = self._templates.Load('frog_impl.darttemplate') |
| 1285 | 1351 |
| 1286 dart_code = self._ImplFileEmitter(interface.id) | 1352 dart_code = self._ImplFileEmitter(html_interface_name) |
| 1287 return HtmlFrogClassGenerator(self, interface, template, | 1353 return HtmlFrogClassGenerator(self, interface, template, |
| 1288 super_interface_name, dart_code, self._shared) | 1354 super_interface_name, dart_code, self._shared) |
| 1289 | 1355 |
| 1290 def GenerateLibraries(self): | 1356 def GenerateLibraries(self): |
| 1291 self._GenerateLibFile( | 1357 self._GenerateLibFile( |
| 1292 'html_frog.darttemplate', | 1358 'html_frog.darttemplate', |
| 1293 os.path.join(self._output_dir, 'html_frog.dart'), | 1359 os.path.join(self._output_dir, 'html_frog.dart'), |
| 1294 (self._interface_system._dart_interface_file_paths + | 1360 (self._interface_system._dart_interface_file_paths + |
| 1295 self._interface_system._dart_callback_file_paths + | 1361 self._interface_system._dart_callback_file_paths + |
| 1296 self._dart_frog_file_paths)) | 1362 self._dart_frog_file_paths)) |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1370 Collect(database.GetInterface(parent.type.id), | 1436 Collect(database.GetInterface(parent.type.id), |
| 1371 seen, collected) | 1437 seen, collected) |
| 1372 | 1438 |
| 1373 inheritance_closure = {} | 1439 inheritance_closure = {} |
| 1374 for interface in database.GetInterfaces(): | 1440 for interface in database.GetInterfaces(): |
| 1375 seen = set() | 1441 seen = set() |
| 1376 collected = [] | 1442 collected = [] |
| 1377 Collect(interface, seen, collected) | 1443 Collect(interface, seen, collected) |
| 1378 inheritance_closure[interface.id] = collected | 1444 inheritance_closure[interface.id] = collected |
| 1379 return inheritance_closure | 1445 return inheritance_closure |
| OLD | NEW |