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

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

Issue 10698049: Unfork html events generation in dart2js and dartium. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: . Created 8 years, 5 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 | « no previous file | 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 import emitter 9 import emitter
10 10
(...skipping 861 matching lines...) Expand 10 before | Expand all | Expand 10 after
872 (self._type_comment_emitter, 872 (self._type_comment_emitter,
873 self._members_emitter, 873 self._members_emitter,
874 self._top_level_emitter) = self._interface_emitter.Emit( 874 self._top_level_emitter) = self._interface_emitter.Emit(
875 interface_template + '$!TOP_LEVEL', 875 interface_template + '$!TOP_LEVEL',
876 ID=typename, 876 ID=typename,
877 EXTENDS=extends_str) 877 EXTENDS=extends_str)
878 878
879 self._type_comment_emitter.Emit("/// @domName $DOMNAME", 879 self._type_comment_emitter.Emit("/// @domName $DOMNAME",
880 DOMNAME=self._interface.doc_js_name) 880 DOMNAME=self._interface.doc_js_name)
881 881
882 if self._backend.HasImplementation():
883 path = self._backend.FilePathForDartImplementation()
884 self._system._dart_interface_file_paths.append(path)
885 self._implementation_emitter = self._system._emitters.FileEmitter(path)
886 else:
887 self._implementation_emitter = emitter.Emitter()
888 self._backend.SetImplementationEmitter(self._implementation_emitter)
889 self._implementation_members_emitter = self._backend.StartInterface()
890
882 for constructor_info in constructors: 891 for constructor_info in constructors:
883 self._members_emitter.Emit( 892 self._members_emitter.Emit(
884 '\n' 893 '\n'
885 ' $CTOR($PARAMS);\n', 894 ' $CTOR($PARAMS);\n',
886 CTOR=self._shared.DartType(constructor_info.ConstructorFullName()), 895 CTOR=self._shared.DartType(constructor_info.ConstructorFullName()),
887 PARAMS=constructor_info.ParametersInterfaceDeclaration( 896 PARAMS=constructor_info.ParametersInterfaceDeclaration(
888 self._shared.DartType)); 897 self._shared.DartType));
889 898
890 if infos: 899 if infos:
891 EmitHtmlElementFactoryConstructors( 900 EmitHtmlElementFactoryConstructors(
(...skipping 10 matching lines...) Expand all
902 '\n' 911 '\n'
903 ' $CTOR(int length);\n' 912 ' $CTOR(int length);\n'
904 '\n' 913 '\n'
905 ' $CTOR.fromList(List<$TYPE> list);\n' 914 ' $CTOR.fromList(List<$TYPE> list);\n'
906 '\n' 915 '\n'
907 ' $CTOR.fromBuffer(ArrayBuffer buffer,' 916 ' $CTOR.fromBuffer(ArrayBuffer buffer,'
908 ' [int byteOffset, int length]);\n', 917 ' [int byteOffset, int length]);\n',
909 CTOR=self._interface.id, 918 CTOR=self._interface.id,
910 TYPE=self._shared.DartType(element_type)) 919 TYPE=self._shared.DartType(element_type))
911 920
912 emit_events, events = self._shared.GetEventAttributes(self._interface) 921 self._GenerateEvents()
913 if emit_events:
914 if events:
915 self.AddEventAttributes(events)
916 else:
917 self._EmitEventGetter(self._shared.GetParentEventsClass(self._interface) )
918 922
919 for merged_interface in _merged_html_interfaces: 923 for merged_interface in _merged_html_interfaces:
920 if _merged_html_interfaces[merged_interface] == self._interface.id: 924 if _merged_html_interfaces[merged_interface] == self._interface.id:
921 self.AddMembers(self._database.GetInterface(merged_interface)) 925 merged_interface = self._database.GetInterface(merged_interface)
926 self.AddMembers(merged_interface)
927 self._backend.AddMergedMembers(merged_interface)
922 928
923 # Generate implementation. 929 self._backend.AddMembers(self._interface)
924 if self._backend.HasImplementation(): 930 self._backend.AddSecondaryMembers(self._interface)
925 path = self._backend.FilePathForDartImplementation() 931 self._backend.FinishInterface()
926 self._system._dart_interface_file_paths.append(path)
927 implementation_emitter = self._system._emitters.FileEmitter(path)
928 else:
929 implementation_emitter = emitter.Emitter()
930 self._backend.SetImplementationEmitter(implementation_emitter)
931 self._backend.Generate()
932 932
933 def AddAttribute(self, getter, setter): 933 def AddAttribute(self, getter, setter):
934 dom_name = DartDomNameOfAttribute(getter) 934 dom_name = DartDomNameOfAttribute(getter)
935 html_getter_name = self._shared.RenameInHtmlLibrary( 935 html_getter_name = self._shared.RenameInHtmlLibrary(
936 self._interface.id, dom_name, 'get:') 936 self._interface.id, dom_name, 'get:')
937 html_setter_name = self._shared.RenameInHtmlLibrary( 937 html_setter_name = self._shared.RenameInHtmlLibrary(
938 self._interface.id, dom_name, 'set:') 938 self._interface.id, dom_name, 'set:')
939 939
940 if not html_getter_name or self._shared.IsPrivate(html_getter_name): 940 if not html_getter_name or self._shared.IsPrivate(html_getter_name):
941 getter = None 941 getter = None
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
988 def FinishInterface(self): 988 def FinishInterface(self):
989 pass 989 pass
990 990
991 def AddConstant(self, constant): 991 def AddConstant(self, constant):
992 type = TypeOrNothing(DartType(constant.type.id), constant.type.id) 992 type = TypeOrNothing(DartType(constant.type.id), constant.type.id)
993 self._members_emitter.Emit('\n static final $TYPE$NAME = $VALUE;\n', 993 self._members_emitter.Emit('\n static final $TYPE$NAME = $VALUE;\n',
994 NAME=constant.id, 994 NAME=constant.id,
995 TYPE=type, 995 TYPE=type,
996 VALUE=constant.value) 996 VALUE=constant.value)
997 997
998 def AddEventAttributes(self, event_attrs): 998 def _GenerateEvents(self):
999 event_attrs = DomToHtmlEvents(self._html_interface_name, event_attrs) 999 emit_events, event_attrs = self._shared.GetEventAttributes(self._interface)
1000 if not emit_events:
1001 return
1002
1000 self._shared._event_classes.add(self._interface.id) 1003 self._shared._event_classes.add(self._interface.id)
1001 events_interface = self._html_interface_name + 'Events' 1004 events_interface = self._html_interface_name + 'Events'
1002 self._EmitEventGetter(events_interface) 1005 events_class = '_%sImpl' % events_interface
1006 parent_events_interface = self._shared.GetParentEventsClass(self._interface)
1007 parent_events_class = '_%sImpl' % parent_events_interface
1008
1009 if not event_attrs:
1010 self._EmitEventGetter(parent_events_interface, parent_events_class)
1011 return
1012
1013 self._EmitEventGetter(events_interface, events_class)
1003 1014
1004 events_members = self._interface_emitter.Emit( 1015 events_members = self._interface_emitter.Emit(
1005 '\ninterface $INTERFACE extends $PARENTS {\n$!MEMBERS}\n', 1016 '\ninterface $INTERFACE extends $PARENTS {\n$!MEMBERS}\n',
1006 INTERFACE=events_interface, 1017 INTERFACE=events_interface,
1007 PARENTS=', '.join( 1018 PARENTS=', '.join(
1008 self._shared.GetParentsEventsClasses(self._interface))) 1019 self._shared.GetParentsEventsClasses(self._interface)))
1009 1020
1021 # TODO(jacobr): specify the type of _ptr as EventTarget
1022 implementation_events_members = self._implementation_emitter.Emit(
1023 '\n'
1024 'class $CLASSNAME extends $SUPER implements $INTERFACE {\n'
1025 ' $CLASSNAME(_ptr) : super(_ptr);\n'
1026 '$!MEMBERS}\n',
1027 CLASSNAME=events_class,
1028 INTERFACE=events_interface,
1029 SUPER=parent_events_class)
1030
1031 event_attrs = DomToHtmlEvents(self._html_interface_name, event_attrs)
1010 for event_name in event_attrs: 1032 for event_name in event_attrs:
1011 if event_name in _html_event_names: 1033 if event_name in _html_event_names:
1012 events_members.Emit('\n EventListenerList get $NAME();\n', 1034 events_members.Emit('\n EventListenerList get $NAME();\n',
1013 NAME=_html_event_names[event_name]) 1035 NAME=_html_event_names[event_name])
1036 implementation_events_members.Emit(
1037 "\n"
1038 " EventListenerList get $NAME() => this['$DOM_NAME'];\n",
1039 NAME=_html_event_names[event_name],
1040 DOM_NAME=event_name)
1014 else: 1041 else:
1015 raise Exception('No known html even name for event: ' + event_name) 1042 raise Exception('No known html even name for event: ' + event_name)
1016 1043
1017 def _EmitEventGetter(self, events_interface): 1044 def _EmitEventGetter(self, events_interface, events_class):
1018 self._members_emitter.Emit( 1045 self._members_emitter.Emit(
1019 '\n /**' 1046 '\n /**'
1020 '\n * @domName EventTarget.addEventListener, ' 1047 '\n * @domName EventTarget.addEventListener, '
1021 'EventTarget.removeEventListener, EventTarget.dispatchEvent' 1048 'EventTarget.removeEventListener, EventTarget.dispatchEvent'
1022 '\n */' 1049 '\n */'
1023 '\n $TYPE get on();\n', 1050 '\n $TYPE get on();\n',
1024 TYPE=events_interface) 1051 TYPE=events_interface)
1025 1052
1053 self._implementation_members_emitter.Emit(
1054 '\n $TYPE get on() =>\n new $TYPE(this);\n',
1055 TYPE=events_class)
1056
1057
1026 # ------------------------------------------------------------------------------ 1058 # ------------------------------------------------------------------------------
1027 1059
1028 # TODO(jmesserly): inheritance is probably not the right way to factor this long 1060 # TODO(jmesserly): inheritance is probably not the right way to factor this long
1029 # term, but it makes merging better for now. 1061 # term, but it makes merging better for now.
1030 class HtmlFrogClassGenerator(FrogInterfaceGenerator): 1062 class HtmlFrogClassGenerator(FrogInterfaceGenerator):
1031 """Generates a Frog class for the dart:html library from a DOM IDL 1063 """Generates a Frog class for the dart:html library from a DOM IDL
1032 interface. 1064 interface.
1033 """ 1065 """
1034 1066
1035 def __init__(self, system, interface): 1067 def __init__(self, system, interface):
(...skipping 10 matching lines...) Expand all
1046 def ImplementationClassName(self): 1078 def ImplementationClassName(self):
1047 return self._ImplClassName(self._html_interface_name) 1079 return self._ImplClassName(self._html_interface_name)
1048 1080
1049 def FilePathForDartImplementation(self): 1081 def FilePathForDartImplementation(self):
1050 return os.path.join(self._system._output_dir, 'html', 'frog', 1082 return os.path.join(self._system._output_dir, 'html', 'frog',
1051 '%s.dart' % self._html_interface_name) 1083 '%s.dart' % self._html_interface_name)
1052 1084
1053 def SetImplementationEmitter(self, implementation_emitter): 1085 def SetImplementationEmitter(self, implementation_emitter):
1054 self._dart_code = implementation_emitter 1086 self._dart_code = implementation_emitter
1055 1087
1088 def AddMergedMembers(self, merged_interface):
1089 self.AddMembers(merged_interface)
1090
1056 def _ImplClassName(self, type_name): 1091 def _ImplClassName(self, type_name):
1057 return self._shared._ImplClassName(type_name) 1092 return self._shared._ImplClassName(type_name)
1058 1093
1059 def _NarrowToImplementationType(self, type_name): 1094 def _NarrowToImplementationType(self, type_name):
1060 if self._ShouldNarrowToImplementationType(type_name): 1095 if self._ShouldNarrowToImplementationType(type_name):
1061 return self._ImplClassName(self._shared.DartType(type_name)) 1096 return self._ImplClassName(self._shared.DartType(type_name))
1062 return self._shared.DartType(type_name) 1097 return self._shared.DartType(type_name)
1063 1098
1064 def StartInterface(self): 1099 def StartInterface(self):
1065 interface = self._interface 1100 interface = self._interface
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
1103 NATIVESPEC=' native "' + native_spec + '"') 1138 NATIVESPEC=' native "' + native_spec + '"')
1104 if self._members_emitter == None: 1139 if self._members_emitter == None:
1105 raise Exception("Class %s doesn't use the $!MEMBERS variable" % 1140 raise Exception("Class %s doesn't use the $!MEMBERS variable" %
1106 self._class_name) 1141 self._class_name)
1107 1142
1108 # Emit a factory provider class for the constructor. 1143 # Emit a factory provider class for the constructor.
1109 constructor_info = AnalyzeConstructor(interface) 1144 constructor_info = AnalyzeConstructor(interface)
1110 if constructor_info: 1145 if constructor_info:
1111 self._EmitFactoryProvider(constructor_info) 1146 self._EmitFactoryProvider(constructor_info)
1112 1147
1113 emit_events, events = self._shared.GetEventAttributes(self._interface) 1148 return self._members_emitter
1114 if not emit_events:
1115 return
1116 elif events:
1117 self.AddEventAttributes(events)
1118 else:
1119 parent_events_class = self._shared.GetParentEventsClass(self._interface)
1120 self._EmitEventGetter('_' + parent_events_class + 'Impl')
1121
1122 for merged_interface in _merged_html_interfaces:
1123 if _merged_html_interfaces[merged_interface] == self._interface.id:
1124 self.AddMembers(self._database.GetInterface(merged_interface))
1125 1149
1126 def _EmitFactoryProvider(self, constructor_info): 1150 def _EmitFactoryProvider(self, constructor_info):
1127 template_file = ('factoryprovider_%s.darttemplate' % 1151 template_file = ('factoryprovider_%s.darttemplate' %
1128 self._html_interface_name) 1152 self._html_interface_name)
1129 template = self._system._templates.TryLoad(template_file) 1153 template = self._system._templates.TryLoad(template_file)
1130 if not template: 1154 if not template:
1131 template = self._system._templates.Load('factoryprovider.darttemplate') 1155 template = self._system._templates.Load('factoryprovider.darttemplate')
1132 1156
1133 factory_provider = '_' + self._html_interface_name + 'FactoryProvider' 1157 factory_provider = '_' + self._html_interface_name + 'FactoryProvider'
1134 emitter = self._system._ImplFileEmitter(factory_provider) 1158 emitter = self._system._ImplFileEmitter(factory_provider)
(...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after
1315 ' $TYPE $(HTML_NAME)($PARAMS) native "$NAME";\n') 1339 ' $TYPE $(HTML_NAME)($PARAMS) native "$NAME";\n')
1316 else: 1340 else:
1317 self._members_emitter.Emit( 1341 self._members_emitter.Emit(
1318 '\n' 1342 '\n'
1319 ' $TYPE $NAME($PARAMS) native;\n', 1343 ' $TYPE $NAME($PARAMS) native;\n',
1320 TYPE=self._NarrowOutputType(info.type_name), 1344 TYPE=self._NarrowOutputType(info.type_name),
1321 NAME=info.name, 1345 NAME=info.name,
1322 PARAMS=info.ParametersImplementationDeclaration( 1346 PARAMS=info.ParametersImplementationDeclaration(
1323 lambda type_name: self._NarrowInputType(type_name))) 1347 lambda type_name: self._NarrowInputType(type_name)))
1324 1348
1325 def AddEventAttributes(self, event_attrs):
1326 event_attrs = DomToHtmlEvents(self._html_interface_name, event_attrs)
1327 events_class = '_' + self._html_interface_name + 'EventsImpl'
1328 events_interface = self._html_interface_name + 'Events'
1329 self._EmitEventGetter(events_class)
1330
1331 self._shared._event_classes.add(self._interface.id)
1332
1333 parent_event_class = self._shared.GetParentEventsClass(self._interface)
1334
1335 # TODO(jacobr): specify the type of _ptr as EventTarget
1336 events_members = self._dart_code.Emit(
1337 '\n'
1338 'class $CLASSNAME extends $SUPER implements $INTERFACE {\n'
1339 ' $CLASSNAME(_ptr) : super(_ptr);\n'
1340 '$!MEMBERS}\n',
1341 CLASSNAME=events_class,
1342 INTERFACE=events_interface,
1343 SUPER='_' + parent_event_class + 'Impl')
1344
1345 for event_name in event_attrs:
1346 if event_name in _html_event_names:
1347 events_members.Emit(
1348 "\n"
1349 " EventListenerList get $NAME() => this['$RAWNAME'];\n",
1350 RAWNAME=event_name,
1351 NAME=_html_event_names[event_name])
1352 else:
1353 raise Exception('No known html even name for event: ' + event_name)
1354
1355 def _EmitEventGetter(self, events_class):
1356 self._members_emitter.Emit(
1357 '\n $TYPE get on() =>\n new $TYPE(this);\n',
1358 TYPE=events_class)
1359
1360 # ------------------------------------------------------------------------------ 1349 # ------------------------------------------------------------------------------
1361 1350
1362 class HtmlFrogSystem(HtmlSystem): 1351 class HtmlFrogSystem(HtmlSystem):
1363 1352
1364 def __init__(self, templates, database, emitters, output_dir): 1353 def __init__(self, templates, database, emitters, output_dir):
1365 super(HtmlFrogSystem, self).__init__( 1354 super(HtmlFrogSystem, self).__init__(
1366 templates, database, emitters, output_dir) 1355 templates, database, emitters, output_dir)
1367 self._dart_frog_file_paths = [] 1356 self._dart_frog_file_paths = []
1368 self._factory_provider_emitters = {} 1357 self._factory_provider_emitters = {}
1369 1358
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
1410 Collect(database.GetInterface(parent.type.id), 1399 Collect(database.GetInterface(parent.type.id),
1411 seen, collected) 1400 seen, collected)
1412 1401
1413 inheritance_closure = {} 1402 inheritance_closure = {}
1414 for interface in database.GetInterfaces(): 1403 for interface in database.GetInterfaces():
1415 seen = set() 1404 seen = set()
1416 collected = [] 1405 collected = []
1417 Collect(interface, seen, collected) 1406 Collect(interface, seen, collected)
1418 inheritance_closure[interface.id] = collected 1407 inheritance_closure[interface.id] = collected
1419 return inheritance_closure 1408 return inheritance_closure
OLDNEW
« no previous file with comments | « no previous file | lib/dom/scripts/systemnative.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698