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 import emitter | 9 import emitter |
| 10 | 10 |
| (...skipping 314 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 325 infos = _html_element_constructors[typename] | 325 infos = _html_element_constructors[typename] |
| 326 if isinstance(infos, str): | 326 if isinstance(infos, str): |
| 327 infos = ElementConstructorInfo(tag=infos) | 327 infos = ElementConstructorInfo(tag=infos) |
| 328 if not isinstance(infos, list): | 328 if not isinstance(infos, list): |
| 329 infos = [infos] | 329 infos = [infos] |
| 330 return infos | 330 return infos |
| 331 | 331 |
| 332 def EmitHtmlElementFactoryConstructors(emitter, infos, typename, class_name): | 332 def EmitHtmlElementFactoryConstructors(emitter, infos, typename, class_name): |
| 333 for info in infos: | 333 for info in infos: |
| 334 constructor_info = info.ConstructorInfo(typename) | 334 constructor_info = info.ConstructorInfo(typename) |
| 335 | |
| 335 inits = emitter.Emit( | 336 inits = emitter.Emit( |
| 336 '\n' | 337 '\n' |
| 337 ' factory $CONSTRUCTOR($PARAMS) {\n' | 338 ' static $RETURN_TYPE $CONSTRUCTOR($PARAMS) {\n' |
| 338 ' $CLASS _e = _document.$dom_createElement("$TAG");\n' | 339 ' $CLASS _e = _document.$dom_createElement("$TAG");\n' |
| 339 '$!INITS' | 340 '$!INITS' |
| 340 ' return _e;\n' | 341 ' return _e;\n' |
| 341 ' }\n', | 342 ' }\n', |
| 342 CONSTRUCTOR=constructor_info.ConstructorFullName(), | 343 RETURN_TYPE=constructor_info.type_name, |
| 344 CONSTRUCTOR=constructor_info.ConstructorFactoryName(DartType), | |
| 343 CLASS=class_name, | 345 CLASS=class_name, |
| 344 TAG=info.tag, | 346 TAG=info.tag, |
| 345 PARAMS=constructor_info.ParametersInterfaceDeclaration(DartType)) | 347 PARAMS=constructor_info.ParametersInterfaceDeclaration(DartType)) |
| 346 for param in constructor_info.param_infos: | 348 for param in constructor_info.param_infos: |
| 347 inits.Emit(' if ($E != null) _e.$E = $E;\n', E=param.name) | 349 inits.Emit(' if ($E != null) _e.$E = $E;\n', E=param.name) |
| 348 | 350 |
| 349 | 351 |
| 350 # These classes require an explicit declaration for the "on" method even though | 352 # These classes require an explicit declaration for the "on" method even though |
| 351 # they don't declare any unique events, because the concrete class hierarchy | 353 # they don't declare any unique events, because the concrete class hierarchy |
| 352 # doesn't match the interface hierarchy. | 354 # doesn't match the interface hierarchy. |
| (...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 479 self._interface_emitter = self._system._emitters.FileEmitter(path) | 481 self._interface_emitter = self._system._emitters.FileEmitter(path) |
| 480 else: | 482 else: |
| 481 self._interface_emitter = emitter.Emitter() | 483 self._interface_emitter = emitter.Emitter() |
| 482 | 484 |
| 483 template_file = 'interface_%s.darttemplate' % self._html_interface_name | 485 template_file = 'interface_%s.darttemplate' % self._html_interface_name |
| 484 interface_template = (self._system._templates.TryLoad(template_file) or | 486 interface_template = (self._system._templates.TryLoad(template_file) or |
| 485 self._system._templates.Load('interface.darttemplate') ) | 487 self._system._templates.Load('interface.darttemplate') ) |
| 486 | 488 |
| 487 typename = self._html_interface_name | 489 typename = self._html_interface_name |
| 488 | 490 |
| 489 extends = [] | 491 extends = [] |
|
Anton Muhin
2012/09/17 10:11:29
extends -> implements?
blois
2012/09/17 19:48:22
Done.
| |
| 490 suppressed_extends = [] | 492 suppressed_extends = [] |
| 491 | 493 |
| 492 for parent in self._interface.parents: | 494 for parent in self._interface.parents: |
| 493 # TODO(vsm): Remove source_filter. | 495 # TODO(vsm): Remove source_filter. |
| 494 if MatchSourceFilter(parent): | 496 if MatchSourceFilter(parent): |
| 495 # Parent is a DOM type. | 497 # Parent is a DOM type. |
| 496 extends.append(self._DartType(parent.type.id)) | 498 extends.append(self._DartType(parent.type.id)) |
| 497 elif '<' in parent.type.id: | 499 elif '<' in parent.type.id: |
| 498 # Parent is a Dart collection type. | 500 # Parent is a Dart collection type. |
| 499 # TODO(vsm): Make this check more robust. | 501 # TODO(vsm): Make this check more robust. |
| 500 extends.append(self._DartType(parent.type.id)) | 502 extends.append(self._DartType(parent.type.id)) |
| 501 else: | 503 else: |
| 502 suppressed_extends.append('%s.%s' % | 504 suppressed_extends.append('%s.%s' % |
| 503 (self._common_prefix, self._DartType(parent.type.id))) | 505 (self._common_prefix, self._DartType(parent.type.id))) |
| 504 | 506 |
| 505 comment = ' extends' | 507 comment = ' extends' |
| 506 extends_str = '' | 508 extends_str = '' |
| 507 if extends: | 509 if extends: |
| 508 extends_str += ' extends ' + ', '.join(extends) | 510 extends_str += ' implements ' + ', '.join(extends) |
| 509 comment = ',' | 511 comment = ',' |
| 510 if suppressed_extends: | 512 if suppressed_extends: |
| 511 extends_str += ' /*%s %s */' % (comment, ', '.join(suppressed_extends)) | 513 extends_str += ' /*%s %s */' % (comment, ', '.join(suppressed_extends)) |
| 512 | 514 |
| 513 factory_provider = None | 515 factory_provider = None |
| 514 if typename in interface_factories: | 516 if typename in interface_factories: |
| 515 factory_provider = interface_factories[typename] | 517 factory_provider = interface_factories[typename] |
| 516 | 518 |
| 517 constructors = [] | 519 constructors = [] |
| 518 constructor_info = AnalyzeConstructor(self._interface) | 520 constructor_info = AnalyzeConstructor(self._interface) |
| (...skipping 21 matching lines...) Expand all Loading... | |
| 540 self._html_interface_name, | 542 self._html_interface_name, |
| 541 self._backend.ImplementationClassName()) | 543 self._backend.ImplementationClassName()) |
| 542 | 544 |
| 543 for info in infos: | 545 for info in infos: |
| 544 constructors.append(info.ConstructorInfo(typename)) | 546 constructors.append(info.ConstructorInfo(typename)) |
| 545 if factory_provider: | 547 if factory_provider: |
| 546 assert factory_provider == info.factory_provider_name | 548 assert factory_provider == info.factory_provider_name |
| 547 else: | 549 else: |
| 548 factory_provider = info.factory_provider_name | 550 factory_provider = info.factory_provider_name |
| 549 | 551 |
| 550 if factory_provider: | |
| 551 extends_str += ' default ' + factory_provider | |
| 552 | |
| 553 # TODO(vsm): Add appropriate package / namespace syntax. | 552 # TODO(vsm): Add appropriate package / namespace syntax. |
| 554 (self._type_comment_emitter, | 553 (self._type_comment_emitter, |
| 555 self._members_emitter, | 554 self._members_emitter, |
| 556 self._top_level_emitter) = self._interface_emitter.Emit( | 555 self._top_level_emitter) = self._interface_emitter.Emit( |
| 557 interface_template + '$!TOP_LEVEL', | 556 interface_template + '$!TOP_LEVEL', |
| 558 ID=typename, | 557 ID=typename, |
| 559 EXTENDS=extends_str) | 558 EXTENDS=extends_str) |
| 560 | 559 |
| 561 self._type_comment_emitter.Emit("/// @domName $DOMNAME", | 560 self._type_comment_emitter.Emit("/// @domName $DOMNAME", |
| 562 DOMNAME=self._interface.doc_js_name) | 561 DOMNAME=self._interface.doc_js_name) |
| 563 | 562 |
| 564 if self._backend.HasImplementation(): | 563 if self._backend.HasImplementation(): |
| 565 path = self._backend.FilePathForDartImplementation() | 564 path = self._backend.FilePathForDartImplementation() |
| 566 self._system._dart_interface_file_paths.append(path) | 565 self._system._dart_interface_file_paths.append(path) |
| 567 self._implementation_emitter = self._system._emitters.FileEmitter(path) | 566 self._implementation_emitter = self._system._emitters.FileEmitter(path) |
| 568 else: | 567 else: |
| 569 self._implementation_emitter = emitter.Emitter() | 568 self._implementation_emitter = emitter.Emitter() |
| 570 self._backend.SetImplementationEmitter(self._implementation_emitter) | 569 self._backend.SetImplementationEmitter(self._implementation_emitter) |
| 571 self._implementation_members_emitter = self._backend.StartInterface() | 570 self._implementation_members_emitter = self._backend.StartInterface() |
| 572 | 571 |
| 573 for constructor_info in constructors: | 572 for constructor_info in constructors: |
| 574 self._members_emitter.Emit( | 573 constructor_info.GenerateFactoryInvocation( |
| 575 '\n' | 574 self._DartType, self._members_emitter, factory_provider) |
| 576 ' $CTOR($PARAMS);\n', | |
| 577 CTOR=self._DartType(constructor_info.ConstructorFullName()), | |
| 578 PARAMS=constructor_info.ParametersInterfaceDeclaration(self._DartType) ) | |
| 579 | 575 |
| 580 element_type = MaybeTypedArrayElementTypeInHierarchy( | 576 element_type = MaybeTypedArrayElementTypeInHierarchy( |
| 581 self._interface, self._system._database) | 577 self._interface, self._system._database) |
| 582 if element_type: | 578 if element_type: |
| 583 self._members_emitter.Emit( | 579 self._members_emitter.Emit( |
| 584 '\n' | 580 '\n' |
| 585 ' $CTOR(int length);\n' | 581 ' factory $CTOR(int length) =>\n' |
| 582 ' $FACTORY.create$(CTOR)(length);\n' | |
| 586 '\n' | 583 '\n' |
| 587 ' $CTOR.fromList(List<$TYPE> list);\n' | 584 ' factory $CTOR.fromList(List<$TYPE> list) =>\n' |
| 585 ' $FACTORY.create$(CTOR)_fromList(list);\n' | |
| 588 '\n' | 586 '\n' |
| 589 ' $CTOR.fromBuffer(ArrayBuffer buffer,' | 587 ' factory $CTOR.fromBuffer(ArrayBuffer buffer, [int byteOffset, int l ength]) => \n' |
| 590 ' [int byteOffset, int length]);\n', | 588 ' $FACTORY.create$(CTOR)_fromBuffer(buffer, byteOffset, length);\n' , |
| 591 CTOR=self._interface.id, | 589 CTOR=self._interface.id, |
| 592 TYPE=self._DartType(element_type)) | 590 TYPE=self._DartType(element_type), |
| 591 FACTORY=factory_provider) | |
| 593 | 592 |
| 594 self._GenerateEvents() | 593 self._GenerateEvents() |
| 595 | 594 |
| 596 old_backend = self._backend | 595 old_backend = self._backend |
| 597 if not self._backend.ImplementsMergedMembers(): | 596 if not self._backend.ImplementsMergedMembers(): |
| 598 self._backend = HtmlGeneratorDummyBackend() | 597 self._backend = HtmlGeneratorDummyBackend() |
| 599 for merged_interface in _merged_html_interfaces: | 598 for merged_interface in _merged_html_interfaces: |
| 600 if _merged_html_interfaces[merged_interface] == self._interface.id: | 599 if _merged_html_interfaces[merged_interface] == self._interface.id: |
| 601 merged_interface = self._database.GetInterface(merged_interface) | 600 merged_interface = self._database.GetInterface(merged_interface) |
| 602 self.AddMembers(merged_interface) | 601 self.AddMembers(merged_interface) |
| (...skipping 17 matching lines...) Expand all Loading... | |
| 620 self._interface.id, dom_name, 'set:') | 619 self._interface.id, dom_name, 'set:') |
| 621 read_only = IsReadOnly(attribute) or not html_setter_name | 620 read_only = IsReadOnly(attribute) or not html_setter_name |
| 622 | 621 |
| 623 # We don't yet handle inconsistent renames of the getter and setter yet. | 622 # We don't yet handle inconsistent renames of the getter and setter yet. |
| 624 assert(not html_setter_name or html_name == html_setter_name) | 623 assert(not html_setter_name or html_name == html_setter_name) |
| 625 | 624 |
| 626 if not is_secondary: | 625 if not is_secondary: |
| 627 self._members_emitter.Emit('\n /** @domName $DOMINTERFACE.$DOMNAME */', | 626 self._members_emitter.Emit('\n /** @domName $DOMINTERFACE.$DOMNAME */', |
| 628 DOMINTERFACE=attribute.doc_js_interface_name, | 627 DOMINTERFACE=attribute.doc_js_interface_name, |
| 629 DOMNAME=dom_name) | 628 DOMNAME=dom_name) |
| 630 modifier = 'final ' if read_only else '' | 629 if read_only: |
|
Anton Muhin
2012/09/17 10:11:29
nit: I'd prefer not to duplicate the logic here to
blois
2012/09/17 19:48:22
Done.
| |
| 631 self._members_emitter.Emit('\n $MODIFIER$TYPE $NAME;\n', | 630 self._members_emitter.Emit('\n abstract $TYPE get $NAME;\n', |
| 632 MODIFIER=modifier, | 631 NAME=html_name, |
| 633 NAME=html_name, | 632 TYPE=self._DartType(attribute.type.id)) |
| 634 TYPE=self._DartType(attribute.type.id)) | 633 else: |
| 634 self._members_emitter.Emit('\n $TYPE $NAME;\n', | |
| 635 NAME=html_name, | |
| 636 TYPE=self._DartType(attribute.type.id)) | |
| 635 self._backend.AddAttribute(attribute, html_name, read_only) | 637 self._backend.AddAttribute(attribute, html_name, read_only) |
| 636 | 638 |
| 637 def AddSecondaryAttribute(self, interface, attribute): | 639 def AddSecondaryAttribute(self, interface, attribute): |
| 638 self._backend.SecondaryContext(interface) | 640 self._backend.SecondaryContext(interface) |
| 639 self.AddAttribute(attribute, True) | 641 self.AddAttribute(attribute, True) |
| 640 | 642 |
| 641 def AddOperation(self, info, skip_declaration=False): | 643 def AddOperation(self, info, skip_declaration=False): |
| 642 """ | 644 """ |
| 643 Arguments: | 645 Arguments: |
| 644 operations - contains the overloads, one or more operations with the same | 646 operations - contains the overloads, one or more operations with the same |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 692 parent_events_interface = self._shared.GetParentEventsClass(self._interface) | 694 parent_events_interface = self._shared.GetParentEventsClass(self._interface) |
| 693 parent_events_class = '_%sImpl' % parent_events_interface | 695 parent_events_class = '_%sImpl' % parent_events_interface |
| 694 | 696 |
| 695 if not event_attrs: | 697 if not event_attrs: |
| 696 self._EmitEventGetter(parent_events_interface, parent_events_class) | 698 self._EmitEventGetter(parent_events_interface, parent_events_class) |
| 697 return | 699 return |
| 698 | 700 |
| 699 self._EmitEventGetter(events_interface, events_class) | 701 self._EmitEventGetter(events_interface, events_class) |
| 700 | 702 |
| 701 events_members = self._interface_emitter.Emit( | 703 events_members = self._interface_emitter.Emit( |
| 702 '\ninterface $INTERFACE extends $PARENTS {\n$!MEMBERS}\n', | 704 '\nabstract class $INTERFACE implements $PARENTS {\n$!MEMBERS}\n', |
| 703 INTERFACE=events_interface, | 705 INTERFACE=events_interface, |
| 704 PARENTS=', '.join( | 706 PARENTS=', '.join( |
| 705 self._shared.GetParentsEventsClasses(self._interface))) | 707 self._shared.GetParentsEventsClasses(self._interface))) |
| 706 | 708 |
| 707 # TODO(jacobr): specify the type of _ptr as EventTarget | 709 # TODO(jacobr): specify the type of _ptr as EventTarget |
| 708 implementation_events_members = self._implementation_emitter.Emit( | 710 implementation_events_members = self._implementation_emitter.Emit( |
| 709 '\n' | 711 '\n' |
| 710 'class $CLASSNAME extends $SUPER implements $INTERFACE {\n' | 712 'class $CLASSNAME extends $SUPER implements $INTERFACE {\n' |
| 711 ' $CLASSNAME(_ptr) : super(_ptr);\n' | 713 ' $CLASSNAME(_ptr) : super(_ptr);\n' |
| 712 '$!MEMBERS}\n', | 714 '$!MEMBERS}\n', |
| (...skipping 521 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1234 return HtmlDart2JSClassGenerator(self, interface) | 1236 return HtmlDart2JSClassGenerator(self, interface) |
| 1235 | 1237 |
| 1236 def GenerateLibraries(self, dart_files): | 1238 def GenerateLibraries(self, dart_files): |
| 1237 self._GenerateLibFile( | 1239 self._GenerateLibFile( |
| 1238 'html_dart2js.darttemplate', | 1240 'html_dart2js.darttemplate', |
| 1239 os.path.join(self._output_dir, 'html_dart2js.dart'), | 1241 os.path.join(self._output_dir, 'html_dart2js.dart'), |
| 1240 dart_files) | 1242 dart_files) |
| 1241 | 1243 |
| 1242 def Finish(self): | 1244 def Finish(self): |
| 1243 pass | 1245 pass |
| OLD | NEW |