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

Side by Side Diff: client/dom/scripts/systemhtml.py

Issue 9464002: Implement automatically generated constructors for frog and dartium dart:html (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: rerun script Created 8 years, 10 months 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 | « no previous file | client/dom/templates/html/frog/factoryprovider.darttemplate » ('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 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 os 9 import os
10 from generator import * 10 from generator import *
(...skipping 424 matching lines...) Expand 10 before | Expand all | Expand 10 after
435 435
436 self._TraverseParents(interface, visit) 436 self._TraverseParents(interface, visit)
437 if len(interfaces_with_events) == 0: 437 if len(interfaces_with_events) == 0:
438 return ['Events'] 438 return ['Events']
439 else: 439 else:
440 names = [] 440 names = []
441 for interface in interfaces_with_events: 441 for interface in interfaces_with_events:
442 names.append(interface.id + 'Events') 442 names.append(interface.id + 'Events')
443 return names 443 return names
444 444
445
445 class HtmlInterfacesSystem(HtmlSystem): 446 class HtmlInterfacesSystem(HtmlSystem):
446 447
447 def __init__(self, templates, database, emitters, output_dir, generator): 448 def __init__(self, templates, database, emitters, output_dir, generator):
448 super(HtmlInterfacesSystem, self).__init__( 449 super(HtmlInterfacesSystem, self).__init__(
449 templates, database, emitters, output_dir, generator) 450 templates, database, emitters, output_dir, generator)
450 self._dart_interface_file_paths = [] 451 self._dart_interface_file_paths = []
451 452
452 def InterfaceGenerator(self, 453 def InterfaceGenerator(self,
453 interface, 454 interface,
454 common_prefix, 455 common_prefix,
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
522 (self._common_prefix, parent.type.id)) 523 (self._common_prefix, parent.type.id))
523 524
524 comment = ' extends' 525 comment = ' extends'
525 extends_str = '' 526 extends_str = ''
526 if extends: 527 if extends:
527 extends_str += ' extends ' + ', '.join(extends) 528 extends_str += ' extends ' + ', '.join(extends)
528 comment = ',' 529 comment = ','
529 if suppressed_extends: 530 if suppressed_extends:
530 extends_str += ' /*%s %s */' % (comment, ', '.join(suppressed_extends)) 531 extends_str += ' /*%s %s */' % (comment, ', '.join(suppressed_extends))
531 532
533 factory_provider = None
534 constructor_info = AnalyzeConstructor(self._interface)
535 if constructor_info:
536 factory_provider = '_' + typename + 'FactoryProvider';
537
532 if typename in interface_factories: 538 if typename in interface_factories:
533 extends_str += ' default ' + interface_factories[typename] 539 factory_provider = interface_factories[typename]
540
541 if factory_provider:
542 extends_str += ' default ' + factory_provider
534 543
535 # TODO(vsm): Add appropriate package / namespace syntax. 544 # TODO(vsm): Add appropriate package / namespace syntax.
536 (self._members_emitter, 545 (self._members_emitter,
537 self._top_level_emitter) = self._emitter.Emit( 546 self._top_level_emitter) = self._emitter.Emit(
538 self._template + '$!TOP_LEVEL', 547 self._template + '$!TOP_LEVEL',
539 ID=typename, 548 ID=typename,
540 EXTENDS=extends_str) 549 EXTENDS=extends_str)
541 550
551 if constructor_info:
552 self._members_emitter.Emit(
553 '\n'
554 ' $CTOR($PARAMS);\n',
555 CTOR=typename,
556 PARAMS=constructor_info.ParametersInterfaceDeclaration());
557
542 element_type = MaybeTypedArrayElementType(self._interface) 558 element_type = MaybeTypedArrayElementType(self._interface)
543 if element_type: 559 if element_type:
544 self._members_emitter.Emit( 560 self._members_emitter.Emit(
545 '\n' 561 '\n'
546 ' $CTOR(int length);\n' 562 ' $CTOR(int length);\n'
547 '\n' 563 '\n'
548 ' $CTOR.fromList(List<$TYPE> list);\n' 564 ' $CTOR.fromList(List<$TYPE> list);\n'
549 '\n' 565 '\n'
550 ' $CTOR.fromBuffer(ArrayBuffer buffer);\n', 566 ' $CTOR.fromBuffer(ArrayBuffer buffer);\n',
551 CTOR=self._interface.id, 567 CTOR=self._interface.id,
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after
670 #} 686 #}
671 CLASSNAME=self._class_name, 687 CLASSNAME=self._class_name,
672 EXTENDS=extends, 688 EXTENDS=extends,
673 IMPLEMENTS=' implements ' + ', '.join(implements), 689 IMPLEMENTS=' implements ' + ', '.join(implements),
674 NATIVESPEC=' native "' + native_spec + '"') 690 NATIVESPEC=' native "' + native_spec + '"')
675 691
676 element_type = MaybeTypedArrayElementType(interface) 692 element_type = MaybeTypedArrayElementType(interface)
677 if element_type: 693 if element_type:
678 self.AddTypedArrayConstructors(element_type) 694 self.AddTypedArrayConstructors(element_type)
679 695
696 # Emit a factory provider class for the constructor.
697 constructor_info = AnalyzeConstructor(interface)
698 if constructor_info:
699 self._EmitFactoryProvider(interface_name, constructor_info)
700
701
702 def _EmitFactoryProvider(self, interface_name, constructor_info):
703 template_file = 'factoryprovider_%s.darttemplate' % interface_name
704 template = self._system._templates.TryLoad(template_file)
705 if not template:
706 template = self._system._templates.Load('factoryprovider.darttemplate')
707
708 factory_provider = '_' + interface_name + 'FactoryProvider'
709 emitter = self._system._ImplFileEmitter(factory_provider)
710 emitter.Emit(
711 template,
712 FACTORYPROVIDER=factory_provider,
713 CONSTRUCTOR=interface_name,
714 PARAMETERS=constructor_info.ParametersImplementationDeclaration(),
715 NAMEDCONSTRUCTOR=constructor_info.name or interface_name,
716 ARGUMENTS=constructor_info.ParametersAsArgumentList())
717
718
680 def AddAttribute(self, getter, setter): 719 def AddAttribute(self, getter, setter):
681 720
682 if self._system._PrivateInHtmlLibrary(self._interface, getter.id): 721 if self._system._PrivateInHtmlLibrary(self._interface, getter.id):
683 if getter: 722 self._AddAttributeUsingProperties(getter, setter, True)
684 self._AddGetter(getter, True)
685 if setter:
Jacob 2012/02/25 03:50:03 can you revert this part?
686 self._AddSetter(setter, True)
687 return 723 return
688 if getter and not self._system._AllowInHtmlLibrary(self._interface, 724 if getter and not self._system._AllowInHtmlLibrary(self._interface,
689 'get:' + getter.id): 725 'get:' + getter.id):
690 getter = None 726 getter = None
691 if setter and not self._system._AllowInHtmlLibrary(self._interface, 727 if setter and not self._system._AllowInHtmlLibrary(self._interface,
692 'set:' + setter.id): 728 'set:' + setter.id):
693 setter = None 729 setter = None
694 if not getter and not setter: 730 if not getter and not setter:
695 return 731 return
696 # If the (getter, setter) pair is shadowing, we can't generate a shadowing 732 # If the (getter, setter) pair is shadowing, we can't generate a shadowing
697 # field (Issue 1633). 733 # field (Issue 1633).
698 (super_getter, super_getter_interface) = self._FindShadowedAttribute(getter) 734 (super_getter, super_getter_interface) = self._FindShadowedAttribute(getter)
699 (super_setter, super_setter_interface) = self._FindShadowedAttribute(setter) 735 (super_setter, super_setter_interface) = self._FindShadowedAttribute(setter)
700 if super_getter or super_setter: 736 if super_getter or super_setter:
701 if getter and not setter and super_getter and not super_setter: 737 if getter and not setter and super_getter and not super_setter:
702 if getter.type.id == super_getter.type.id: 738 if getter.type.id == super_getter.type.id:
703 # Compatible getter, use the superclass property. This works because 739 # Compatible getter, use the superclass property. This works because
704 # JavaScript will do its own dynamic dispatch. 740 # JavaScript will do its own dynamic dispatch.
705 output_type = getter and self._NarrowOutputType(getter.type.id) 741 output_type = getter and self._NarrowOutputType(getter.type.id)
706 self._members_emitter.Emit( 742 self._members_emitter.Emit(
707 '\n' 743 '\n'
708 ' // Use implementation from $SUPER.\n' 744 ' // Use implementation from $SUPER.\n'
709 ' // final $TYPE $NAME;\n', 745 ' // final $TYPE $NAME;\n',
710 SUPER=super_getter_interface.id, 746 SUPER=super_getter_interface.id,
711 NAME=getter.id, TYPE=output_type) 747 NAME=getter.id, TYPE=output_type)
712 return 748 return
713 749
714 self._members_emitter.Emit('\n // Shadowing definition.') 750 self._members_emitter.Emit('\n // Shadowing definition.')
715 if getter: 751 self._AddAttributeUsingProperties(getter, setter, False)
716 self._AddGetter(getter, False)
717 if setter:
718 self._AddSetter(setter, False)
719 return 752 return
720 753
721 if self._interface.id != 'Document': 754 if self._interface.id != 'Document':
722 output_type = getter and self._NarrowOutputType(getter.type.id) 755 output_type = getter and self._NarrowOutputType(getter.type.id)
723 input_type = setter and self._NarrowInputType(setter.type.id) 756 input_type = setter and self._NarrowInputType(setter.type.id)
724 if getter and setter and input_type == output_type: 757 if getter and setter and input_type == output_type:
725 self._members_emitter.Emit( 758 self._members_emitter.Emit(
726 '\n $TYPE $NAME;\n', 759 '\n $TYPE $NAME;\n',
727 NAME=getter.id, TYPE=output_type) 760 NAME=getter.id, TYPE=output_type)
728 return 761 return
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after
841 templates, database, emitters, output_dir, generator) 874 templates, database, emitters, output_dir, generator)
842 self._dart_frog_file_paths = [] 875 self._dart_frog_file_paths = []
843 876
844 877
845 def InterfaceGenerator(self, 878 def InterfaceGenerator(self,
846 interface, 879 interface,
847 common_prefix, 880 common_prefix,
848 super_interface_name, 881 super_interface_name,
849 source_filter): 882 source_filter):
850 """.""" 883 """."""
851 dart_frog_file_path = self._FilePathForFrogImpl(interface.id)
852 self._dart_frog_file_paths.append(dart_frog_file_path)
853
854 template_file = 'impl_%s.darttemplate' % interface.id 884 template_file = 'impl_%s.darttemplate' % interface.id
855 template = self._templates.TryLoad(template_file) 885 template = self._templates.TryLoad(template_file)
856 if not template: 886 if not template:
857 template = self._templates.Load('frog_impl.darttemplate') 887 template = self._templates.Load('frog_impl.darttemplate')
858 888
859 dart_code = self._emitters.FileEmitter(dart_frog_file_path) 889 dart_code = self._ImplFileEmitter(interface.id)
860 return HtmlFrogClassGenerator(self, interface, template, 890 return HtmlFrogClassGenerator(self, interface, template,
861 super_interface_name, dart_code) 891 super_interface_name, dart_code)
862 892
863 def GenerateLibraries(self, lib_dir): 893 def GenerateLibraries(self, lib_dir):
864 self._GenerateLibFile( 894 self._GenerateLibFile(
865 'html_frog.darttemplate', 895 'html_frog.darttemplate',
866 os.path.join(lib_dir, 'html_frog.dart'), 896 os.path.join(lib_dir, 'html_frog.dart'),
867 (self._interface_system._dart_interface_file_paths + 897 (self._interface_system._dart_interface_file_paths +
868 self._interface_system._dart_callback_file_paths + 898 self._interface_system._dart_callback_file_paths +
869 self._dart_frog_file_paths)) 899 self._dart_frog_file_paths))
870 900
871 def Finish(self): 901 def Finish(self):
872 pass 902 pass
873 903
874 def _FilePathForFrogImpl(self, interface_name): 904 def _ImplFileEmitter(self, name):
875 """Returns the file path of the Frog implementation.""" 905 """Returns the file emitter of the Frog implementation file."""
876 # TODO(jmesserly): is this the right path 906 # TODO(jmesserly): is this the right path
877 return os.path.join(self._output_dir, 'html', 'frog', 907 path = os.path.join(self._output_dir, 'html', 'frog', '%s.dart' % name)
878 '%s.dart' % interface_name) 908 self._dart_frog_file_paths.append(path)
909 return self._emitters.FileEmitter(path)
879 910
880 # ------------------------------------------------------------------------------ 911 # ------------------------------------------------------------------------------
881 912
882 class WrappingInterfaceGenerator(object): 913 class WrappingInterfaceGenerator(object):
883 """Generates Dart and JS implementation for one DOM IDL interface.""" 914 """Generates Dart and JS implementation for one DOM IDL interface."""
884 915
885 def __init__(self, interface, super_interface, dart_code, base_members): 916 def __init__(self, interface, super_interface, dart_code, base_members):
886 """Generates Dart and JS code for the given interface. 917 """Generates Dart and JS code for the given interface.
887 918
888 Args: 919 Args:
(...skipping 437 matching lines...) Expand 10 before | Expand all | Expand 10 after
1326 # dispatch has removed f(X), leaving only f(Y), but there is no guarantee 1357 # dispatch has removed f(X), leaving only f(Y), but there is no guarantee
1327 # that Y = Z-X, so we need to check for Y. 1358 # that Y = Z-X, so we need to check for Y.
1328 true_code = emitter.Emit( 1359 true_code = emitter.Emit(
1329 '$(INDENT)if ($COND) {\n' 1360 '$(INDENT)if ($COND) {\n'
1330 '$!TRUE' 1361 '$!TRUE'
1331 '$(INDENT)}\n', 1362 '$(INDENT)}\n',
1332 COND=test, INDENT=indent) 1363 COND=test, INDENT=indent)
1333 self.GenerateDispatch( 1364 self.GenerateDispatch(
1334 true_code, info, indent + ' ', position + 1, positive) 1365 true_code, info, indent + ' ', position + 1, positive)
1335 return True 1366 return True
OLDNEW
« no previous file with comments | « no previous file | client/dom/templates/html/frog/factoryprovider.darttemplate » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698