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

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

Issue 9428050: Automatically generate most constructors (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: add test 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 | « client/dom/scripts/generator.py ('k') | client/dom/scripts/systeminterface.py » ('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 systems to generate 6 """This module provides shared functionality for the systems to generate
7 frog binding from the IDL database.""" 7 frog binding from the IDL database."""
8 8
9 import os 9 import os
10 from generator import * 10 from generator import *
11 from systembase import * 11 from systembase import *
12 12
13 class FrogSystem(System): 13 class FrogSystem(System):
14 14
15 def __init__(self, templates, database, emitters, output_dir): 15 def __init__(self, templates, database, emitters, output_dir):
16 super(FrogSystem, self).__init__( 16 super(FrogSystem, self).__init__(
17 templates, database, emitters, output_dir) 17 templates, database, emitters, output_dir)
18 self._dart_frog_file_paths = [] 18 self._impl_file_paths = []
19 19
20 def InterfaceGenerator(self, 20 def InterfaceGenerator(self,
21 interface, 21 interface,
22 common_prefix, 22 common_prefix,
23 super_interface_name, 23 super_interface_name,
24 source_filter): 24 source_filter):
25 """.""" 25 """."""
26 dart_frog_file_path = self._FilePathForFrogImpl(interface.id)
27 self._dart_frog_file_paths.append(dart_frog_file_path)
28
29 template_file = 'impl_%s.darttemplate' % interface.id 26 template_file = 'impl_%s.darttemplate' % interface.id
30 template = self._templates.TryLoad(template_file) 27 template = self._templates.TryLoad(template_file)
31 if not template: 28 if not template:
32 template = self._templates.Load('frog_impl.darttemplate') 29 template = self._templates.Load('frog_impl.darttemplate')
33 30
34 dart_code = self._emitters.FileEmitter(dart_frog_file_path) 31 dart_code = self._ImplFileEmitter(interface.id)
35 return FrogInterfaceGenerator(self, interface, template, 32 return FrogInterfaceGenerator(self, interface, template,
36 super_interface_name, dart_code) 33 super_interface_name, dart_code)
37 34
38 def GenerateLibraries(self, lib_dir): 35 def GenerateLibraries(self, lib_dir):
39 self._GenerateLibFile( 36 self._GenerateLibFile(
40 'frog_dom.darttemplate', 37 'frog_dom.darttemplate',
41 os.path.join(lib_dir, 'dom_frog.dart'), 38 os.path.join(lib_dir, 'dom_frog.dart'),
42 (self._interface_system._dart_interface_file_paths + 39 (self._interface_system._dart_interface_file_paths +
43 self._interface_system._dart_callback_file_paths + 40 self._interface_system._dart_callback_file_paths +
44 self._dart_frog_file_paths)) 41 self._impl_file_paths))
45 42
46 def Finish(self): 43 def Finish(self):
47 pass 44 pass
48 45
49 def _FilePathForFrogImpl(self, interface_name): 46 def _ImplFileEmitter(self, name):
50 """Returns the file path of the Frog implementation.""" 47 """Returns the file emitter of the Frog implementation file."""
51 return os.path.join(self._output_dir, 'src', 'frog', 48 path = os.path.join(self._output_dir, 'src', 'frog', '%s.dart' % name)
52 '%s.dart' % interface_name) 49 self._impl_file_paths.append(path)
50 return self._emitters.FileEmitter(path)
53 51
54 # ------------------------------------------------------------------------------ 52 # ------------------------------------------------------------------------------
55 53
56 class FrogInterfaceGenerator(object): 54 class FrogInterfaceGenerator(object):
57 """Generates a Frog class for a DOM IDL interface.""" 55 """Generates a Frog class for a DOM IDL interface."""
58 56
59 def __init__(self, system, interface, template, super_interface, dart_code): 57 def __init__(self, system, interface, template, super_interface, dart_code):
60 """Generates Dart code for the given interface. 58 """Generates Dart code for the given interface.
61 59
62 Args: 60 Args:
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
115 #} 113 #}
116 CLASSNAME=self._class_name, 114 CLASSNAME=self._class_name,
117 EXTENDS=extends, 115 EXTENDS=extends,
118 IMPLEMENTS=' implements ' + ', '.join(implements), 116 IMPLEMENTS=' implements ' + ', '.join(implements),
119 NATIVESPEC=' native "' + native_spec + '"') 117 NATIVESPEC=' native "' + native_spec + '"')
120 118
121 element_type = MaybeTypedArrayElementType(interface) 119 element_type = MaybeTypedArrayElementType(interface)
122 if element_type: 120 if element_type:
123 self.AddTypedArrayConstructors(element_type) 121 self.AddTypedArrayConstructors(element_type)
124 122
123 # Emit a factory provider class for the constructor.
124 constructor_info = AnalyzeConstructor(interface)
125 if constructor_info:
126 self._EmitFactoryProvider(interface_name, constructor_info)
127
125 128
126 def FinishInterface(self): 129 def FinishInterface(self):
127 """.""" 130 """."""
128 pass 131 pass
129 132
130 def _ImplClassName(self, type_name): 133 def _ImplClassName(self, type_name):
131 return '_' + type_name + 'Js' 134 return '_' + type_name + 'Js'
132 135
136 def _EmitFactoryProvider(self, interface_name, constructor_info):
137 template_file = 'factoryprovider_%s.darttemplate' % interface_name
138 template = self._system._templates.TryLoad(template_file)
139 if not template:
140 template = self._system._templates.Load('factoryprovider.darttemplate')
141
142 factory_provider = '_' + interface_name + 'FactoryProvider'
143 emitter = self._system._ImplFileEmitter(factory_provider)
144 emitter.Emit(
145 template,
146 FACTORYPROVIDER=factory_provider,
147 CONSTRUCTOR=interface_name,
148 PARAMETERS=constructor_info.ParametersImplementationDeclaration(),
149 NAMEDCONSTRUCTOR=constructor_info.name or interface_name,
150 ARGUMENTS=constructor_info.ParametersAsArgumentList())
151
133 def _NarrowToImplementationType(self, type_name): 152 def _NarrowToImplementationType(self, type_name):
134 # TODO(sra): Move into the 'system' and cache the result. 153 # TODO(sra): Move into the 'system' and cache the result.
135 if type_name == 'EventListener': 154 if type_name == 'EventListener':
136 # Callbacks are typedef functions so don't have a class. 155 # Callbacks are typedef functions so don't have a class.
137 return type_name 156 return type_name
138 if self._system._database.HasInterface(type_name): 157 if self._system._database.HasInterface(type_name):
139 interface = self._system._database.GetInterface(type_name) 158 interface = self._system._database.GetInterface(type_name)
140 if RecognizeCallback(interface): 159 if RecognizeCallback(interface):
141 # Callbacks are typedef functions so don't have a class. 160 # Callbacks are typedef functions so don't have a class.
142 return type_name 161 return type_name
(...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after
323 if native_body: 342 if native_body:
324 native_body = " '''" + native_body + "'''" 343 native_body = " '''" + native_body + "'''"
325 344
326 self._members_emitter.Emit( 345 self._members_emitter.Emit(
327 '\n' 346 '\n'
328 ' $TYPE $NAME($PARAMS) native$NATIVESTRING;\n', 347 ' $TYPE $NAME($PARAMS) native$NATIVESTRING;\n',
329 TYPE=self._NarrowOutputType(info.type_name), 348 TYPE=self._NarrowOutputType(info.type_name),
330 NAME=info.name, 349 NAME=info.name,
331 PARAMS=params, 350 PARAMS=params,
332 NATIVESTRING=native_body) 351 NATIVESTRING=native_body)
OLDNEW
« no previous file with comments | « client/dom/scripts/generator.py ('k') | client/dom/scripts/systeminterface.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698