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

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
« no previous file with comments | « lib/dom/scripts/systemfrog.py ('k') | lib/dom/scripts/systemnative.py » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 577 matching lines...) Expand 10 before | Expand all | Expand 10 after
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
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
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
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
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
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « lib/dom/scripts/systemfrog.py ('k') | lib/dom/scripts/systemnative.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698