 Chromium Code Reviews
 Chromium Code Reviews Issue 9464002:
  Implement automatically generated constructors for frog and dartium dart:html  (Closed) 
  Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
    
  
    Issue 9464002:
  Implement automatically generated constructors for frog and dartium dart:html  (Closed) 
  Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart| Index: client/dom/scripts/systemhtml.py | 
| diff --git a/client/dom/scripts/systemhtml.py b/client/dom/scripts/systemhtml.py | 
| index 64748f425d9e1ea2ddcfd0e1cda4b8009d174bc8..8853492f784bf2c84a60640bd597f78e2847e9fb 100644 | 
| --- a/client/dom/scripts/systemhtml.py | 
| +++ b/client/dom/scripts/systemhtml.py | 
| @@ -591,8 +591,16 @@ class HtmlDartInterfaceGenerator(DartInterfaceGenerator): | 
| if suppressed_extends: | 
| extends_str += ' /*%s %s */' % (comment, ', '.join(suppressed_extends)) | 
| + factory_provider = None | 
| + constructor_info = AnalyzeConstructor(self._interface) | 
| + if constructor_info: | 
| + factory_provider = '_' + typename + 'FactoryProvider'; | 
| + | 
| if typename in interface_factories: | 
| - extends_str += ' default ' + interface_factories[typename] | 
| + factory_provider = interface_factories[typename] | 
| + | 
| + if factory_provider: | 
| + extends_str += ' default ' + factory_provider | 
| # TODO(vsm): Add appropriate package / namespace syntax. | 
| (self._members_emitter, | 
| @@ -601,6 +609,13 @@ class HtmlDartInterfaceGenerator(DartInterfaceGenerator): | 
| ID=typename, | 
| EXTENDS=extends_str) | 
| + if constructor_info: | 
| + self._members_emitter.Emit( | 
| + '\n' | 
| + ' $CTOR($PARAMS);\n', | 
| + CTOR=typename, | 
| + PARAMS=constructor_info.ParametersInterfaceDeclaration()); | 
| + | 
| element_type = MaybeTypedArrayElementType(self._interface) | 
| if element_type: | 
| self._members_emitter.Emit( | 
| @@ -738,6 +753,27 @@ class HtmlFrogClassGenerator(FrogInterfaceGenerator): | 
| if element_type: | 
| self.AddTypedArrayConstructors(element_type) | 
| + # Emit a factory provider class for the constructor. | 
| + constructor_info = AnalyzeConstructor(interface) | 
| + if constructor_info: | 
| + self._EmitFactoryProvider(interface_name, constructor_info) | 
| + | 
| + def _EmitFactoryProvider(self, interface_name, constructor_info): | 
| + template_file = 'factoryprovider_%s.darttemplate' % interface_name | 
| + template = self._system._templates.TryLoad(template_file) | 
| + if not template: | 
| + template = self._system._templates.Load('factoryprovider.darttemplate') | 
| + | 
| + factory_provider = '_' + interface_name + 'FactoryProvider' | 
| + emitter = self._system._ImplFileEmitter(factory_provider) | 
| + emitter.Emit( | 
| + template, | 
| + FACTORYPROVIDER=factory_provider, | 
| + CONSTRUCTOR=interface_name, | 
| + PARAMETERS=constructor_info.ParametersImplementationDeclaration(), | 
| + NAMEDCONSTRUCTOR=constructor_info.name or interface_name, | 
| 
Jacob
2012/03/07 03:51:27
out of curiosity is there a reason you use NAMEDCO
 
sra1
2012/03/07 05:03:11
Done.
 | 
| + ARGUMENTS=constructor_info.ParametersAsArgumentList()) | 
| + | 
| def AddIndexer(self, element_type): | 
| """Adds all the methods required to complete implementation of List.""" | 
| # We would like to simply inherit the implementation of everything except | 
| @@ -1000,15 +1036,12 @@ class HtmlFrogSystem(HtmlSystem): | 
| super_interface_name, | 
| source_filter): | 
| """.""" | 
| - dart_frog_file_path = self._FilePathForFrogImpl(interface.id) | 
| - self._dart_frog_file_paths.append(dart_frog_file_path) | 
| - | 
| template_file = 'impl_%s.darttemplate' % interface.id | 
| template = self._templates.TryLoad(template_file) | 
| if not template: | 
| template = self._templates.Load('frog_impl.darttemplate') | 
| - dart_code = self._emitters.FileEmitter(dart_frog_file_path) | 
| + dart_code = self._ImplFileEmitter(interface.id) | 
| return HtmlFrogClassGenerator(self, interface, template, | 
| super_interface_name, dart_code, self._shared) | 
| @@ -1023,11 +1056,12 @@ class HtmlFrogSystem(HtmlSystem): | 
| def Finish(self): | 
| pass | 
| - def _FilePathForFrogImpl(self, interface_name): | 
| - """Returns the file path of the Frog implementation.""" | 
| + def _ImplFileEmitter(self, name): | 
| + """Returns the file emitter of the Frog implementation file.""" | 
| # TODO(jmesserly): is this the right path | 
| - return os.path.join(self._output_dir, 'html', 'frog', | 
| - '%s.dart' % interface_name) | 
| + path = os.path.join(self._output_dir, 'html', 'frog', '%s.dart' % name) | 
| + self._dart_frog_file_paths.append(path) | 
| + return self._emitters.FileEmitter(path) | 
| # ----------------------------------------------------------------------------- | 
| @@ -1050,25 +1084,22 @@ class HtmlDartiumSystem(HtmlSystem): | 
| super_interface_name, | 
| source_filter): | 
| """.""" | 
| - dart_dartium_file_path = self._FilePathForImpl(interface.id) | 
| - self._dart_dartium_file_paths.append(dart_dartium_file_path) | 
| - | 
| template_file = 'impl_%s.darttemplate' % interface.id | 
| template = self._templates.TryLoad(template_file) | 
| # TODO(jacobr): change this name as it is confusing. | 
| if not template: | 
| template = self._templates.Load('frog_impl.darttemplate') | 
| - dart_code = self._emitters.FileEmitter(dart_dartium_file_path) | 
| + dart_code = self._ImplFileEmitter(interface.id) | 
| return HtmlDartiumInterfaceGenerator(self, interface, template, | 
| super_interface_name, dart_code, self._BaseDefines(interface), | 
| self._shared) | 
| - def _FilePathForImpl(self, interface_name): | 
| - """Returns the file path of the Frog implementation.""" | 
| - # TODO(jmesserly): is this the right path | 
| - return os.path.join(self._output_dir, 'html', 'dartium', | 
| - '%s.dart' % interface_name) | 
| + def _ImplFileEmitter(self, name): | 
| + """Returns the file emitter of the Dartium implementation file.""" | 
| + path = os.path.join(self._output_dir, 'html', 'dartium', '%s.dart' % name) | 
| + self._dart_dartium_file_paths.append(path) | 
| + return self._emitters.FileEmitter(path); | 
| def ProcessCallback(self, interface, info): | 
| pass | 
| @@ -1080,7 +1111,6 @@ class HtmlDartiumSystem(HtmlSystem): | 
| os.path.join(lib_dir, 'html_dartium.dart'), | 
| (self._interface_system._dart_interface_file_paths + | 
| self._interface_system._dart_callback_file_paths + | 
| - # FIXME: Move the implementation to a separate library. | 
| self._dart_dartium_file_paths | 
| ), | 
| WRAPCASES='\n'.join(self._wrap_cases)) | 
| @@ -1202,6 +1232,27 @@ class HtmlDartiumInterfaceGenerator(object): | 
| ' $(CLASSNAME)._wrap(ptr) : super._wrap(ptr);\n', | 
| CLASSNAME=self._class_name) | 
| + # Emit a factory provider class for the constructor. | 
| + constructor_info = AnalyzeConstructor(interface) | 
| + if constructor_info: | 
| + self._EmitFactoryProvider(interface_name, constructor_info) | 
| + | 
| + def _EmitFactoryProvider(self, interface_name, constructor_info): | 
| + template_file = 'factoryprovider_%s.darttemplate' % interface_name | 
| + template = self._system._templates.TryLoad(template_file) | 
| + if not template: | 
| + template = self._system._templates.Load('factoryprovider.darttemplate') | 
| + | 
| + factory_provider = '_' + interface_name + 'FactoryProvider' | 
| + emitter = self._system._ImplFileEmitter(factory_provider) | 
| + emitter.Emit( | 
| + template, | 
| + FACTORYPROVIDER=factory_provider, | 
| + CONSTRUCTOR=interface_name, | 
| + PARAMETERS=constructor_info.ParametersImplementationDeclaration(), | 
| + NAMEDCONSTRUCTOR=constructor_info.name or interface_name, | 
| + ARGUMENTS=constructor_info.ParametersAsArgumentList()) | 
| + | 
| def _BaseClassName(self, interface): | 
| if not interface.parents: | 
| return '_DOMTypeBase' |