Chromium Code Reviews| 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 from systemfrog import * | 9 from systemfrog import * |
| 10 from systeminterface import * | 10 from systeminterface import * |
| (...skipping 430 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 441 # doesn't match the interface hierarchy. | 441 # doesn't match the interface hierarchy. |
| 442 _html_explicit_event_classes = set(['DocumentFragment']) | 442 _html_explicit_event_classes = set(['DocumentFragment']) |
| 443 | 443 |
| 444 def _OnAttributeToEventName(on_method): | 444 def _OnAttributeToEventName(on_method): |
| 445 event_name = on_method.id[2:] | 445 event_name = on_method.id[2:] |
| 446 if event_name in _on_attribute_to_event_name_mapping: | 446 if event_name in _on_attribute_to_event_name_mapping: |
| 447 return _on_attribute_to_event_name_mapping[event_name] | 447 return _on_attribute_to_event_name_mapping[event_name] |
| 448 else: | 448 else: |
| 449 return event_name | 449 return event_name |
| 450 | 450 |
| 451 def _DomToHtmlEvents(interface_id, events): | 451 def DomToHtmlEvents(interface_id, events): |
| 452 event_names = set(map(_OnAttributeToEventName, events)) | 452 event_names = set(map(_OnAttributeToEventName, events)) |
| 453 if interface_id in _html_manual_events: | 453 if interface_id in _html_manual_events: |
| 454 for manual_event_name in _html_manual_events[interface_id]: | 454 for manual_event_name in _html_manual_events[interface_id]: |
| 455 event_names.add(manual_event_name) | 455 event_names.add(manual_event_name) |
| 456 | 456 |
| 457 return sorted(event_names, key=lambda name: _html_event_names[name]) | 457 return sorted(event_names, key=lambda name: _html_event_names[name]) |
| 458 | 458 |
| 459 def DomToHtmlEvent(event_name): | |
| 460 assert event_name in _html_event_names, \ | |
| 461 'No known html event name for event: ' + event_name | |
|
Anton Muhin
2012/05/16 13:17:57
nit: something like 'No html event with name %s' %
| |
| 462 return _html_event_names[event_name] | |
| 463 | |
| 459 # ------------------------------------------------------------------------------ | 464 # ------------------------------------------------------------------------------ |
| 460 class HtmlSystemShared(object): | 465 class HtmlSystemShared(object): |
| 461 | 466 |
| 462 def __init__(self, database, generator): | 467 def __init__(self, database, generator): |
| 463 self._event_classes = set() | 468 self._event_classes = set() |
| 464 self._seen_event_names = {} | 469 self._seen_event_names = {} |
| 465 self._database = database | 470 self._database = database |
| 466 self._generator = generator | 471 self._generator = generator |
| 467 | 472 |
| 468 def _AllowInHtmlLibrary(self, interface, member, member_prefix): | 473 def _AllowInHtmlLibrary(self, interface, member, member_prefix): |
| (...skipping 302 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 771 NAME=html_name, | 776 NAME=html_name, |
| 772 PARAMS=info.ParametersInterfaceDeclaration()) | 777 PARAMS=info.ParametersInterfaceDeclaration()) |
| 773 | 778 |
| 774 def FinishInterface(self): | 779 def FinishInterface(self): |
| 775 pass | 780 pass |
| 776 | 781 |
| 777 def AddConstant(self, constant): | 782 def AddConstant(self, constant): |
| 778 self._EmitConstant(self._members_emitter, constant) | 783 self._EmitConstant(self._members_emitter, constant) |
| 779 | 784 |
| 780 def AddEventAttributes(self, event_attrs): | 785 def AddEventAttributes(self, event_attrs): |
| 781 event_attrs = _DomToHtmlEvents(self._interface.id, event_attrs) | 786 event_attrs = DomToHtmlEvents(self._interface.id, event_attrs) |
| 782 self._shared._event_classes.add(self._interface.id) | 787 self._shared._event_classes.add(self._interface.id) |
| 783 events_interface = self._interface.id + 'Events' | 788 events_interface = self._interface.id + 'Events' |
| 784 self._EmitEventGetter(events_interface) | 789 self._EmitEventGetter(events_interface) |
| 785 | 790 |
| 786 events_members = self._emitter.Emit( | 791 events_members = self._emitter.Emit( |
| 787 '\ninterface $INTERFACE extends $PARENTS {\n$!MEMBERS}\n', | 792 '\ninterface $INTERFACE extends $PARENTS {\n$!MEMBERS}\n', |
| 788 INTERFACE=events_interface, | 793 INTERFACE=events_interface, |
| 789 PARENTS=', '.join( | 794 PARENTS=', '.join( |
| 790 self._shared.GetParentsEventsClasses(self._interface))) | 795 self._shared.GetParentsEventsClasses(self._interface))) |
| 791 | 796 |
| (...skipping 266 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1058 else: | 1063 else: |
| 1059 self._members_emitter.Emit( | 1064 self._members_emitter.Emit( |
| 1060 '\n' | 1065 '\n' |
| 1061 ' $TYPE $NAME($PARAMS) native;\n', | 1066 ' $TYPE $NAME($PARAMS) native;\n', |
| 1062 TYPE=self._NarrowOutputType(info.type_name), | 1067 TYPE=self._NarrowOutputType(info.type_name), |
| 1063 NAME=info.name, | 1068 NAME=info.name, |
| 1064 PARAMS=info.ParametersImplementationDeclaration( | 1069 PARAMS=info.ParametersImplementationDeclaration( |
| 1065 lambda type_name: self._NarrowInputType(type_name))) | 1070 lambda type_name: self._NarrowInputType(type_name))) |
| 1066 | 1071 |
| 1067 def AddEventAttributes(self, event_attrs): | 1072 def AddEventAttributes(self, event_attrs): |
| 1068 event_attrs = _DomToHtmlEvents(self._interface.id, event_attrs) | 1073 event_attrs = DomToHtmlEvents(self._interface.id, event_attrs) |
| 1069 events_class = '_' + self._interface.id + 'EventsImpl' | 1074 events_class = '_' + self._interface.id + 'EventsImpl' |
| 1070 events_interface = self._interface.id + 'Events' | 1075 events_interface = self._interface.id + 'Events' |
| 1071 self._EmitEventGetter(events_class) | 1076 self._EmitEventGetter(events_class) |
| 1072 | 1077 |
| 1073 self._shared._event_classes.add(self._interface.id) | 1078 self._shared._event_classes.add(self._interface.id) |
| 1074 | 1079 |
| 1075 parent_event_class = self._shared.GetParentEventsClass(self._interface) | 1080 parent_event_class = self._shared.GetParentEventsClass(self._interface) |
| 1076 | 1081 |
| 1077 # TODO(jacobr): specify the type of _ptr as EventTarget | 1082 # TODO(jacobr): specify the type of _ptr as EventTarget |
| 1078 events_members = self._dart_code.Emit( | 1083 events_members = self._dart_code.Emit( |
| (...skipping 233 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1312 self._members_emitter.Emit( | 1317 self._members_emitter.Emit( |
| 1313 ' $(CLASSNAME)._wrap(ptr) : super._wrap(ptr);\n', | 1318 ' $(CLASSNAME)._wrap(ptr) : super._wrap(ptr);\n', |
| 1314 CLASSNAME=self._class_name) | 1319 CLASSNAME=self._class_name) |
| 1315 | 1320 |
| 1316 # Emit a factory provider class for the constructor. | 1321 # Emit a factory provider class for the constructor. |
| 1317 constructor_info = AnalyzeConstructor(interface) | 1322 constructor_info = AnalyzeConstructor(interface) |
| 1318 if constructor_info: | 1323 if constructor_info: |
| 1319 self._EmitFactoryProvider(interface_name, constructor_info) | 1324 self._EmitFactoryProvider(interface_name, constructor_info) |
| 1320 | 1325 |
| 1321 emit_events, events = self._shared.GetEventAttributes(self._interface) | 1326 emit_events, events = self._shared.GetEventAttributes(self._interface) |
| 1322 if not emit_events: | 1327 if emit_events: |
| 1323 return | 1328 self._members_emitter.Emit( |
| 1324 elif events: | 1329 '\n' |
| 1325 self.AddEventAttributes(events) | 1330 ' Events get on() => $THIS.on;\n', |
| 1326 else: | 1331 THIS=self.DomObjectName()) |
| 1327 parent_events_class = self._shared.GetParentEventsClass(self._interface) | |
| 1328 self._EmitEventGetter('_' + parent_events_class + 'Impl') | |
| 1329 | 1332 |
| 1330 def _EmitFactoryProvider(self, interface_name, constructor_info): | 1333 def _EmitFactoryProvider(self, interface_name, constructor_info): |
| 1331 template_file = 'factoryprovider_%s.darttemplate' % interface_name | 1334 template_file = 'factoryprovider_%s.darttemplate' % interface_name |
| 1332 template = self._system._templates.TryLoad(template_file) | 1335 template = self._system._templates.TryLoad(template_file) |
| 1333 if not template: | 1336 if not template: |
| 1334 template = self._system._templates.Load('factoryprovider.darttemplate') | 1337 template = self._system._templates.Load('factoryprovider.darttemplate') |
| 1335 | 1338 |
| 1336 factory_provider = '_' + interface_name + 'FactoryProvider' | 1339 factory_provider = '_' + interface_name + 'FactoryProvider' |
| 1337 emitter = self._system._ImplFileEmitter(factory_provider) | 1340 emitter = self._system._ImplFileEmitter(factory_provider) |
| 1338 emitter.Emit( | 1341 emitter.Emit( |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1423 THIS=self.DomObjectName()) | 1426 THIS=self.DomObjectName()) |
| 1424 | 1427 |
| 1425 def AddSecondaryAttribute(self, interface, getter, setter): | 1428 def AddSecondaryAttribute(self, interface, getter, setter): |
| 1426 self._SecondaryContext(interface) | 1429 self._SecondaryContext(interface) |
| 1427 self.AddAttribute(getter, setter) | 1430 self.AddAttribute(getter, setter) |
| 1428 | 1431 |
| 1429 def AddSecondaryOperation(self, interface, info): | 1432 def AddSecondaryOperation(self, interface, info): |
| 1430 self._SecondaryContext(interface) | 1433 self._SecondaryContext(interface) |
| 1431 self.AddOperation(info) | 1434 self.AddOperation(info) |
| 1432 | 1435 |
| 1433 def AddEventAttributes(self, event_attrs): | |
| 1434 event_attrs = _DomToHtmlEvents(self._interface.id, event_attrs) | |
| 1435 events_class = '_' + self._interface.id + 'EventsImpl' | |
| 1436 events_interface = self._interface.id + 'Events' | |
| 1437 self._EmitEventGetter(events_class) | |
| 1438 | |
| 1439 self._shared._event_classes.add(self._interface.id) | |
| 1440 | |
| 1441 parent_event_class = self._shared.GetParentEventsClass(self._interface) | |
| 1442 | |
| 1443 # TODO(jacobr): specify the type of _ptr as EventTarget | |
| 1444 events_members = self._dart_code.Emit( | |
| 1445 '\n' | |
| 1446 'class $CLASSNAME extends $SUPER implements $INTERFACE {\n' | |
| 1447 ' $CLASSNAME(_ptr) : super(_ptr);\n' | |
| 1448 '$!MEMBERS}\n', | |
| 1449 CLASSNAME=events_class, | |
| 1450 INTERFACE=events_interface, | |
| 1451 SUPER='_' + parent_event_class + 'Impl') | |
| 1452 | |
| 1453 for event_name in event_attrs: | |
| 1454 if event_name in _html_event_names: | |
| 1455 events_members.Emit( | |
| 1456 "\n" | |
| 1457 " EventListenerList get $NAME() => _get('$RAWNAME');\n", | |
| 1458 RAWNAME=event_name, | |
| 1459 NAME=_html_event_names[event_name]) | |
| 1460 else: | |
| 1461 raise Exception('No known html even name for event: ' + event_name) | |
| 1462 | |
| 1463 def _EmitEventGetter(self, events_class): | |
| 1464 self._members_emitter.Emit( | |
| 1465 '\n' | |
| 1466 ' $TYPE get on() {\n' | |
| 1467 ' if (_on == null) _on = new $TYPE(this);\n' | |
| 1468 ' return _on;\n' | |
| 1469 ' }\n', | |
| 1470 TYPE=events_class) | |
| 1471 | |
| 1472 def _SecondaryContext(self, interface): | 1436 def _SecondaryContext(self, interface): |
| 1473 if interface is not self._current_secondary_parent: | 1437 if interface is not self._current_secondary_parent: |
| 1474 self._current_secondary_parent = interface | 1438 self._current_secondary_parent = interface |
| 1475 self._members_emitter.Emit('\n // From $WHERE\n', WHERE=interface.id) | 1439 self._members_emitter.Emit('\n // From $WHERE\n', WHERE=interface.id) |
| 1476 | 1440 |
| 1477 # TODO(jacobr): change this to more directly match the frog version. | 1441 # TODO(jacobr): change this to more directly match the frog version. |
| 1478 def AddIndexer(self, element_type): | 1442 def AddIndexer(self, element_type): |
| 1479 """Adds all the methods required to complete implementation of List.""" | 1443 """Adds all the methods required to complete implementation of List.""" |
| 1480 # We would like to simply inherit the implementation of everything except | 1444 # We would like to simply inherit the implementation of everything except |
| 1481 # get length(), [], and maybe []=. It is possible to extend from a base | 1445 # get length(), [], and maybe []=. It is possible to extend from a base |
| (...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1579 self._members_emitter.Emit( | 1543 self._members_emitter.Emit( |
| 1580 '\n' | 1544 '\n' |
| 1581 ' $TYPE $HTML_NAME($PARAMS) => $FUNCTION_CALL;\n', | 1545 ' $TYPE $HTML_NAME($PARAMS) => $FUNCTION_CALL;\n', |
| 1582 TYPE=info.type_name, | 1546 TYPE=info.type_name, |
| 1583 HTML_NAME=html_name, | 1547 HTML_NAME=html_name, |
| 1584 PARAMS=info.ParametersImplementationDeclaration(), | 1548 PARAMS=info.ParametersImplementationDeclaration(), |
| 1585 FUNCTION_CALL=function_call) | 1549 FUNCTION_CALL=function_call) |
| 1586 | 1550 |
| 1587 def AddStaticOperation(self, info): | 1551 def AddStaticOperation(self, info): |
| 1588 pass | 1552 pass |
| OLD | NEW |