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

Side by Side Diff: sdk/lib/html/scripts/htmleventgenerator.py

Issue 11365019: Merging dart:html interfaces and implementations (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Fixing merged classes in dartium not compiling under dartc. Created 8 years, 1 month 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 | « sdk/lib/html/scripts/htmldartgenerator.py ('k') | sdk/lib/html/scripts/systemhtml.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 functionality to generate dart:html event classes.""" 6 """This module provides functionality to generate dart:html event classes."""
7 7
8 import logging 8 import logging
9 9
10 _logger = logging.getLogger('dartgenerator') 10 _logger = logging.getLogger('dartgenerator')
(...skipping 184 matching lines...) Expand 10 before | Expand all | Expand 10 after
195 self._template_loader = template_loader 195 self._template_loader = template_loader
196 196
197 def ProcessInterface(self, interface, html_interface_name, custom_events, 197 def ProcessInterface(self, interface, html_interface_name, custom_events,
198 events_interface_emitter, events_implementation_emitter): 198 events_interface_emitter, events_implementation_emitter):
199 events = set([attr for attr in interface.attributes 199 events = set([attr for attr in interface.attributes
200 if attr.type.id == 'EventListener']) 200 if attr.type.id == 'EventListener'])
201 if not events and interface.id not in _html_explicit_event_classes: 201 if not events and interface.id not in _html_explicit_event_classes:
202 return None 202 return None
203 203
204 self._event_classes.add(interface.id) 204 self._event_classes.add(interface.id)
205 events_interface = html_interface_name + 'Events' 205 events_class_name = html_interface_name + 'Events'
206 parent_events_interface = self._GetParentEventsInterface(interface) 206 parent_events_interface = self._GetParentEventsInterface(interface)
207 207
208 if not events: 208 if not events:
209 return parent_events_interface 209 return parent_events_interface
210 210
211 interface_events_members = events_interface_emitter.Emit( 211 template_file = 'impl_%s.darttemplate' % events_class_name
212 '\nabstract class $INTERFACE implements $PARENT {\n$!MEMBERS}\n',
213 INTERFACE=events_interface,
214 PARENT=parent_events_interface)
215
216 template_file = 'impl_%s.darttemplate' % events_interface
217 template = (self._template_loader.TryLoad(template_file) or 212 template = (self._template_loader.TryLoad(template_file) or
218 '\n' 213 '\n'
219 'class $CLASSNAME extends $SUPER implements $INTERFACE {\n' 214 'class $CLASSNAME extends $SUPER {\n'
220 ' $CLASSNAME(_ptr) : super(_ptr);\n' 215 ' $CLASSNAME(EventTarget _ptr) : super(_ptr);\n'
221 '$!MEMBERS}\n') 216 '$!MEMBERS}\n')
222 217
223 # TODO(jacobr): specify the type of _ptr as EventTarget 218 # TODO(jacobr): specify the type of _ptr as EventTarget
224 implementation_events_members = events_implementation_emitter.Emit( 219 implementation_events_members = events_implementation_emitter.Emit(
225 template, 220 template,
226 CLASSNAME='_%sImpl' % events_interface, 221 CLASSNAME=events_class_name,
227 INTERFACE=events_interface, 222 SUPER='%s' % parent_events_interface)
228 SUPER='_%sImpl' % parent_events_interface)
229 223
230 dom_event_names = set() 224 dom_event_names = set()
231 for event in events: 225 for event in events:
232 dom_name = event.id[2:] 226 dom_name = event.id[2:]
233 dom_name = _on_attribute_to_event_name_mapping.get(dom_name, dom_name) 227 dom_name = _on_attribute_to_event_name_mapping.get(dom_name, dom_name)
234 dom_event_names.add(dom_name) 228 dom_event_names.add(dom_name)
235 if html_interface_name in _html_manual_events: 229 if html_interface_name in _html_manual_events:
236 dom_event_names.update(_html_manual_events[html_interface_name]) 230 dom_event_names.update(_html_manual_events[html_interface_name])
237 for dom_name in sorted(dom_event_names): 231 for dom_name in sorted(dom_event_names):
238 if dom_name not in _html_event_names: 232 if dom_name not in _html_event_names:
239 _logger.warn('omitting %s event as there is no HTML name for it' % dom_n ame) 233 _logger.warn('omitting %s event as there is no HTML name for it' % dom_n ame)
240 continue 234 continue
241 235
242 html_name = _html_event_names[dom_name] 236 html_name = _html_event_names[dom_name]
243 interface_events_members.Emit('\n EventListenerList get $NAME;\n',
244 NAME=html_name)
245 full_event_name = '%sEvents.%s' % (html_interface_name, html_name) 237 full_event_name = '%sEvents.%s' % (html_interface_name, html_name)
246 if not full_event_name in custom_events: 238 if not full_event_name in custom_events:
247 implementation_events_members.Emit( 239 implementation_events_members.Emit(
248 "\n" 240 "\n"
249 " EventListenerList get $NAME => this['$DOM_NAME'];\n", 241 " EventListenerList get $NAME => this['$DOM_NAME'];\n",
250 NAME=html_name, 242 NAME=html_name,
251 DOM_NAME=dom_name) 243 DOM_NAME=dom_name)
252 244
253 return events_interface 245 return events_class_name
254 246
255 # TODO(jacobr): this isn't quite right.... 247 # TODO(jacobr): this isn't quite right....
256 def _GetParentEventsInterface(self, interface): 248 def _GetParentEventsInterface(self, interface):
257 # Ugly hack as we don't specify that Document and DocumentFragment inherit 249 # Ugly hack as we don't specify that Document and DocumentFragment inherit
258 # from Element in our IDL. 250 # from Element in our IDL.
259 if interface.id == 'Document' or interface.id == 'DocumentFragment': 251 if interface.id == 'Document' or interface.id == 'DocumentFragment':
260 return 'ElementEvents' 252 return 'ElementEvents'
261 253
262 parent_events_interface = 'Events' 254 parent_events_interface = 'Events'
263 interfaces_with_events = set() 255 interfaces_with_events = set()
264 for parent in self._database.Hierarchy(interface): 256 for parent in self._database.Hierarchy(interface):
265 if parent != interface and parent.id in self._event_classes: 257 if parent != interface and parent.id in self._event_classes:
266 parent_events_interface = parent.id + 'Events' 258 parent_events_interface = parent.id + 'Events'
267 interfaces_with_events.add(parent) 259 interfaces_with_events.add(parent)
268 if len(interfaces_with_events) > 1: 260 if len(interfaces_with_events) > 1:
269 raise Exception('Only one parent event class allowed ' + interface.id) 261 raise Exception('Only one parent event class allowed ' + interface.id)
270 return parent_events_interface 262 return parent_events_interface
OLDNEW
« no previous file with comments | « sdk/lib/html/scripts/htmldartgenerator.py ('k') | sdk/lib/html/scripts/systemhtml.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698