Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(25)

Side by Side Diff: lib/dom/scripts/systemhtml.py

Issue 10542036: Use original WebKit IDL database for dart:html generation. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 8 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
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
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
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
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
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
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
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698