| OLD | NEW |
| 1 #!/usr/bin/python | 1 #!/usr/bin/python |
| 2 # Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 2 # Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
| 3 # for details. All rights reserved. Use of this source code is governed by a | 3 # for details. All rights reserved. Use of this source code is governed by a |
| 4 # BSD-style license that can be found in the LICENSE file. | 4 # BSD-style license that can be found in the LICENSE file. |
| 5 | 5 |
| 6 """This module provides shared functionality for the system to generate | 6 """This module provides shared functionality for the system to generate |
| 7 Dart:html APIs from the IDL database.""" | 7 Dart:html APIs from the IDL database.""" |
| 8 | 8 |
| 9 import emitter | 9 import emitter |
| 10 | 10 |
| (...skipping 861 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |