| 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 import os | 10 import os |
| (...skipping 272 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 283 constructor_info, factory_provider, factory_provider_emitter) | 283 constructor_info, factory_provider, factory_provider_emitter) |
| 284 | 284 |
| 285 infos = HtmlElementConstructorInfos(interface_name) | 285 infos = HtmlElementConstructorInfos(interface_name) |
| 286 if infos: | 286 if infos: |
| 287 template = self._template_loader.Load( | 287 template = self._template_loader.Load( |
| 288 'factoryprovider_Elements.darttemplate') | 288 'factoryprovider_Elements.darttemplate') |
| 289 EmitHtmlElementFactoryConstructors( | 289 EmitHtmlElementFactoryConstructors( |
| 290 self._library_emitter.FileEmitter('_Elements', template), | 290 self._library_emitter.FileEmitter('_Elements', template), |
| 291 infos, | 291 infos, |
| 292 self._interface.id, | 292 self._interface.id, |
| 293 self._backend.ImplementationClassName(), | 293 self._interface_type_info.implementation_name(), |
| 294 self._DartType) | 294 self._DartType) |
| 295 | 295 |
| 296 for info in infos: | 296 for info in infos: |
| 297 constructors.append(info.ConstructorInfo(self._interface.id)) | 297 constructors.append(info.ConstructorInfo(self._interface.id)) |
| 298 if factory_provider: | 298 if factory_provider: |
| 299 assert factory_provider == info.factory_provider_name | 299 assert factory_provider == info.factory_provider_name |
| 300 else: | 300 else: |
| 301 factory_provider = info.factory_provider_name | 301 factory_provider = info.factory_provider_name |
| 302 | 302 |
| 303 # TODO(vsm): Add appropriate package / namespace syntax. | 303 # TODO(vsm): Add appropriate package / namespace syntax. |
| 304 (self._type_comment_emitter, | 304 (self._type_comment_emitter, |
| 305 self._members_emitter, | 305 self._members_emitter, |
| 306 self._top_level_emitter) = interface_emitter.Emit( | 306 self._top_level_emitter) = interface_emitter.Emit( |
| 307 interface_template + '$!TOP_LEVEL', | 307 interface_template + '$!TOP_LEVEL', |
| 308 ID=interface_name, | 308 ID=interface_name, |
| 309 EXTENDS=implements_str) | 309 EXTENDS=implements_str) |
| 310 | 310 |
| 311 self._type_comment_emitter.Emit("/// @domName $DOMNAME", | 311 self._type_comment_emitter.Emit("/// @domName $DOMNAME", |
| 312 DOMNAME=self._interface.doc_js_name) | 312 DOMNAME=self._interface.doc_js_name) |
| 313 | 313 |
| 314 implementation_emitter = self._ImplementationEmitter() | 314 implementation_emitter = self._ImplementationEmitter() |
| 315 base_class = self._backend.BaseClassName() | 315 base_class = self._backend.BaseClassName() |
| 316 interface_type_info = self._type_registry.TypeInfo(self._interface.id) | 316 interface_type_info = self._type_registry.TypeInfo(self._interface.id) |
| 317 implemented_interfaces = [interface_type_info.interface_name()] +\ | 317 implemented_interfaces = [interface_type_info.interface_name()] +\ |
| 318 self._backend.AdditionalImplementedInterfaces() | 318 self._backend.AdditionalImplementedInterfaces() |
| 319 self._implementation_members_emitter = implementation_emitter.Emit( | 319 self._implementation_members_emitter = implementation_emitter.Emit( |
| 320 self._backend.ImplementationTemplate(), | 320 self._backend.ImplementationTemplate(), |
| 321 CLASSNAME=self._backend.ImplementationClassName(), | 321 CLASSNAME=self._interface_type_info.implementation_name(), |
| 322 EXTENDS=' extends %s' % base_class if base_class else '', | 322 EXTENDS=' extends %s' % base_class if base_class else '', |
| 323 IMPLEMENTS=' implements ' + ', '.join(implemented_interfaces), | 323 IMPLEMENTS=' implements ' + ', '.join(implemented_interfaces), |
| 324 NATIVESPEC=self._backend.NativeSpec()) | 324 NATIVESPEC=self._backend.NativeSpec()) |
| 325 self._backend.StartInterface(self._implementation_members_emitter) | 325 self._backend.StartInterface(self._implementation_members_emitter) |
| 326 | 326 |
| 327 for constructor_info in constructors: | 327 for constructor_info in constructors: |
| 328 constructor_info.GenerateFactoryInvocation( | 328 constructor_info.GenerateFactoryInvocation( |
| 329 self._DartType, self._members_emitter, factory_provider) | 329 self._DartType, self._members_emitter, factory_provider) |
| 330 | 330 |
| 331 element_type = MaybeTypedArrayElementTypeInHierarchy( | 331 element_type = MaybeTypedArrayElementTypeInHierarchy( |
| (...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 475 self._backend.AddOperation(info, '_item') | 475 self._backend.AddOperation(info, '_item') |
| 476 return | 476 return |
| 477 | 477 |
| 478 if not self._IsPrivate(html_name) and not skip_declaration: | 478 if not self._IsPrivate(html_name) and not skip_declaration: |
| 479 self._members_emitter.Emit('\n /** @domName $DOMINTERFACE.$DOMNAME */', | 479 self._members_emitter.Emit('\n /** @domName $DOMINTERFACE.$DOMNAME */', |
| 480 DOMINTERFACE=info.overloads[0].doc_js_interface_name, | 480 DOMINTERFACE=info.overloads[0].doc_js_interface_name, |
| 481 DOMNAME=info.name) | 481 DOMNAME=info.name) |
| 482 | 482 |
| 483 if info.IsStatic(): | 483 if info.IsStatic(): |
| 484 # FIXME: provide a type. | 484 # FIXME: provide a type. |
| 485 self._members_emitter.Emit('\n' | 485 self._members_emitter.Emit( |
| 486 ' static final $NAME = $IMPL_CLASS_NAME.$NAME
;\n', | 486 '\n' |
| 487 IMPL_CLASS_NAME=self._backend.ImplementationCl
assName(), | 487 ' static final $NAME = $IMPL_CLASS_NAME.$NAME;\n', |
| 488 NAME=html_name) | 488 IMPL_CLASS_NAME=self._interface_type_info.implementation_name(), |
| 489 NAME=html_name) |
| 489 else: | 490 else: |
| 490 self._members_emitter.Emit('\n' | 491 self._members_emitter.Emit( |
| 491 ' $TYPE $NAME($PARAMS);\n', | 492 '\n' |
| 492 TYPE=SecureOutputType(self, info.type_name), | 493 ' $TYPE $NAME($PARAMS);\n', |
| 493 NAME=html_name, | 494 TYPE=SecureOutputType(self, info.type_name), |
| 494 PARAMS=info.ParametersInterfaceDeclaration(sel
f._DartType)) | 495 NAME=html_name, |
| 496 PARAMS=info.ParametersInterfaceDeclaration(self._DartType)) |
| 495 self._backend.AddOperation(info, html_name) | 497 self._backend.AddOperation(info, html_name) |
| 496 | 498 |
| 497 def AddSecondaryOperation(self, interface, info): | 499 def AddSecondaryOperation(self, interface, info): |
| 498 self._backend.SecondaryContext(interface) | 500 self._backend.SecondaryContext(interface) |
| 499 self.AddOperation(info, True) | 501 self.AddOperation(info, True) |
| 500 | 502 |
| 501 def AddConstant(self, constant): | 503 def AddConstant(self, constant): |
| 502 type = TypeOrNothing(self._DartType(constant.type.id), constant.type.id) | 504 type = TypeOrNothing(self._DartType(constant.type.id), constant.type.id) |
| 503 self._members_emitter.Emit('\n static const $TYPE$NAME = $VALUE;\n', | 505 self._members_emitter.Emit('\n static const $TYPE$NAME = $VALUE;\n', |
| 504 NAME=constant.id, | 506 NAME=constant.id, |
| 505 TYPE=type, | 507 TYPE=type, |
| 506 VALUE=constant.value) | 508 VALUE=constant.value) |
| 507 | 509 |
| 508 def _ImplementationEmitter(self): | 510 def _ImplementationEmitter(self): |
| 509 if IsPureInterface(self._interface.id): | 511 if IsPureInterface(self._interface.id): |
| 510 return emitter.Emitter() | 512 return emitter.Emitter() |
| 511 | |
| 512 basename = self._interface_type_info.implementation_name() | 513 basename = self._interface_type_info.implementation_name() |
| 513 if self._interface_type_info.merged_into(): | 514 if (self._interface_type_info.merged_into() and |
| 514 if self._backend.ImplementsMergedMembers(): | 515 self._backend.ImplementsMergedMembers()): |
| 515 # Merged members are implemented in target interface implementation. | 516 # Merged members are implemented in target interface implementation. |
| 516 return emitter.Emitter() | 517 return emitter.Emitter() |
| 517 basename = '%s_Merged' % basename | |
| 518 return self._library_emitter.FileEmitter(basename.lstrip('_')) | 518 return self._library_emitter.FileEmitter(basename.lstrip('_')) |
| 519 | 519 |
| 520 def _EmitEventGetter(self, events_interface, events_class): | 520 def _EmitEventGetter(self, events_interface, events_class): |
| 521 self._members_emitter.Emit( | 521 self._members_emitter.Emit( |
| 522 '\n /**' | 522 '\n /**' |
| 523 '\n * @domName EventTarget.addEventListener, ' | 523 '\n * @domName EventTarget.addEventListener, ' |
| 524 'EventTarget.removeEventListener, EventTarget.dispatchEvent' | 524 'EventTarget.removeEventListener, EventTarget.dispatchEvent' |
| 525 '\n */' | 525 '\n */' |
| 526 '\n $TYPE get on;\n', | 526 '\n $TYPE get on;\n', |
| 527 TYPE=events_interface) | 527 TYPE=events_interface) |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 578 """ | 578 """ |
| 579 | 579 |
| 580 def __init__(self, interface, options): | 580 def __init__(self, interface, options): |
| 581 self._interface = interface | 581 self._interface = interface |
| 582 self._database = options.database | 582 self._database = options.database |
| 583 self._template_loader = options.templates | 583 self._template_loader = options.templates |
| 584 self._type_registry = options.type_registry | 584 self._type_registry = options.type_registry |
| 585 self._interface_type_info = self._type_registry.TypeInfo(self._interface.id) | 585 self._interface_type_info = self._type_registry.TypeInfo(self._interface.id) |
| 586 self._current_secondary_parent = None | 586 self._current_secondary_parent = None |
| 587 | 587 |
| 588 def ImplementationClassName(self): | |
| 589 return self._interface_type_info.implementation_name() | |
| 590 | |
| 591 def ImplementsMergedMembers(self): | 588 def ImplementsMergedMembers(self): |
| 592 return True | 589 return True |
| 593 | 590 |
| 594 def GenerateCallback(self, info): | 591 def GenerateCallback(self, info): |
| 595 pass | 592 pass |
| 596 | 593 |
| 597 def BaseClassName(self): | 594 def BaseClassName(self): |
| 598 if not self._interface.parents: | 595 if not self._interface.parents: |
| 599 return None | 596 return None |
| 600 supertype = self._interface.parents[0].type.id | 597 supertype = self._interface.parents[0].type.id |
| 601 if IsDartCollectionType(supertype): | 598 if IsDartCollectionType(supertype): |
| 602 # List methods are injected in AddIndexer. | 599 # List methods are injected in AddIndexer. |
| 603 return None | 600 return None |
| 604 if IsPureInterface(supertype): | 601 if IsPureInterface(supertype): |
| 605 return None | 602 return None |
| 606 return self._type_registry.TypeInfo(supertype).implementation_name() | 603 type_info = self._type_registry.TypeInfo(supertype) |
| 604 if type_info.merged_into(): |
| 605 type_info = self._type_registry.TypeInfo(type_info.merged_into()) |
| 606 return type_info.implementation_name() |
| 607 | 607 |
| 608 def AdditionalImplementedInterfaces(self): | 608 def AdditionalImplementedInterfaces(self): |
| 609 # TODO: Include all implemented interfaces, including other Lists. | 609 # TODO: Include all implemented interfaces, including other Lists. |
| 610 implements = [] | 610 implements = [] |
| 611 element_type = MaybeTypedArrayElementType(self._interface) | 611 element_type = MaybeTypedArrayElementType(self._interface) |
| 612 if element_type: | 612 if element_type: |
| 613 implements.append('List<%s>' % self._DartType(element_type)) | 613 implements.append('List<%s>' % self._DartType(element_type)) |
| 614 if self._HasJavaScriptIndexingBehaviour(): | 614 if self._HasJavaScriptIndexingBehaviour(): |
| 615 implements.append('JavaScriptIndexingBehavior') | 615 implements.append('JavaScriptIndexingBehavior') |
| 616 return implements | 616 return implements |
| (...skipping 500 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1117 | 1117 |
| 1118 library_emitter = self._multiemitter.FileEmitter(library_file_path) | 1118 library_emitter = self._multiemitter.FileEmitter(library_file_path) |
| 1119 library_file_dir = os.path.dirname(library_file_path) | 1119 library_file_dir = os.path.dirname(library_file_path) |
| 1120 auxiliary_dir = os.path.relpath(auxiliary_dir, library_file_dir) | 1120 auxiliary_dir = os.path.relpath(auxiliary_dir, library_file_dir) |
| 1121 imports_emitter = library_emitter.Emit( | 1121 imports_emitter = library_emitter.Emit( |
| 1122 self._template, AUXILIARY_DIR=massage_path(auxiliary_dir)) | 1122 self._template, AUXILIARY_DIR=massage_path(auxiliary_dir)) |
| 1123 for path in sorted(self._path_to_emitter.keys()): | 1123 for path in sorted(self._path_to_emitter.keys()): |
| 1124 relpath = os.path.relpath(path, library_file_dir) | 1124 relpath = os.path.relpath(path, library_file_dir) |
| 1125 imports_emitter.Emit( | 1125 imports_emitter.Emit( |
| 1126 "#source('$PATH');\n", PATH=massage_path(relpath)) | 1126 "#source('$PATH');\n", PATH=massage_path(relpath)) |
| OLD | NEW |