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

Side by Side Diff: lib/dom/scripts/systemnative.py

Issue 10696033: Create implementation file emitter in HtmlDartInterfaceGenerator. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: . Created 8 years, 5 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 | « lib/dom/scripts/systemhtml.py ('k') | no next file » | 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 native binding from the IDL database.""" 7 native binding from the IDL database."""
8 8
9 import emitter 9 import emitter
10 import os 10 import os
11 import systembase 11 import systembase
12 from generator import * 12 from generator import *
13 from systemhtml import DomToHtmlEvent, DomToHtmlEvents, HtmlSystemShared 13 from systemhtml import DomToHtmlEvent, DomToHtmlEvents, HtmlSystemShared
14 from systemhtml import HtmlElementConstructorInfos 14 from systemhtml import HtmlElementConstructorInfos
15 from systemhtml import EmitHtmlElementFactoryConstructors 15 from systemhtml import EmitHtmlElementFactoryConstructors
16 16
17 class NativeImplementationSystem(systembase.System): 17 class NativeImplementationSystem(systembase.System):
18 18
19 def __init__(self, templates, database, emitters, output_dir, auxiliary_dir): 19 def __init__(self, templates, database, emitters, output_dir, auxiliary_dir):
20 super(NativeImplementationSystem, self).__init__( 20 super(NativeImplementationSystem, self).__init__(
21 templates, database, emitters, output_dir) 21 templates, database, emitters, output_dir)
22 self._auxiliary_dir = auxiliary_dir 22 self._auxiliary_dir = auxiliary_dir
23 self._dom_impl_files = [] 23 self._dom_impl_files = []
24 self._cpp_header_files = [] 24 self._cpp_header_files = []
25 self._cpp_impl_files = [] 25 self._cpp_impl_files = []
26 self._html_system = HtmlSystemShared(database) 26 self._html_system = HtmlSystemShared(database)
27 self._factory_provider_emitters = {} 27 self._factory_provider_emitters = {}
28 28
29 def ProcessInterface(self, interface): 29 def ImplementationGenerator(self, interface):
30 interface_name = interface.id 30 return NativeImplementationGenerator(self, interface)
31
32 if IsPureInterface(interface_name):
33 return None
34
35 dart_impl_path = self._FilePathForDartImplementation(interface_name)
36 self._dom_impl_files.append(dart_impl_path)
37
38 cpp_header_path = self._FilePathForCppHeader(interface_name)
39 self._cpp_header_files.append(cpp_header_path)
40
41 cpp_impl_path = self._FilePathForCppImplementation(interface_name)
42 self._cpp_impl_files.append(cpp_impl_path)
43
44 NativeImplementationGenerator(self, interface,
45 self._emitters.FileEmitter(dart_impl_path),
46 self._emitters.FileEmitter(cpp_header_path),
47 self._emitters.FileEmitter(cpp_impl_path),
48 self._BaseDefines(interface),
49 self._templates).Generate()
50 31
51 def ProcessCallback(self, interface, info): 32 def ProcessCallback(self, interface, info):
52 self._interface = interface 33 self._interface = interface
53 34
54 if IsPureInterface(self._interface.id): 35 if IsPureInterface(self._interface.id):
55 return None 36 return None
56 37
57 cpp_impl_includes = set() 38 cpp_impl_includes = set()
58 cpp_header_handlers_emitter = emitter.Emitter() 39 cpp_header_handlers_emitter = emitter.Emitter()
59 cpp_impl_handlers_emitter = emitter.Emitter() 40 cpp_impl_handlers_emitter = emitter.Emitter()
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after
160 141
161 cpp_resolver_emitter = self._emitters.FileEmitter(cpp_resolver_path) 142 cpp_resolver_emitter = self._emitters.FileEmitter(cpp_resolver_path)
162 cpp_resolver_emitter.Emit( 143 cpp_resolver_emitter.Emit(
163 self._templates.Load('cpp_resolver.template'), 144 self._templates.Load('cpp_resolver.template'),
164 INCLUDES=includes_emitter.Fragments(), 145 INCLUDES=includes_emitter.Fragments(),
165 RESOLVER_BODY=resolver_body_emitter.Fragments()) 146 RESOLVER_BODY=resolver_body_emitter.Fragments())
166 147
167 def Finish(self): 148 def Finish(self):
168 pass 149 pass
169 150
170 def _FilePathForDartImplementation(self, interface_name):
171 return os.path.join(self._output_dir, 'dart',
172 '%sImplementation.dart' % interface_name)
173
174 def _FilePathForDartFactoryProviderImplementation(self, interface_name): 151 def _FilePathForDartFactoryProviderImplementation(self, interface_name):
175 return os.path.join(self._output_dir, 'dart', 152 return os.path.join(self._output_dir, 'dart',
176 '%sFactoryProviderImplementation.dart' % interface_name) 153 '%sFactoryProviderImplementation.dart' % interface_name)
177 154
178 def _FilePathForCppHeader(self, interface_name): 155 def _FilePathForCppHeader(self, interface_name):
179 return os.path.join(self._output_dir, 'cpp', 'Dart%s.h' % interface_name) 156 return os.path.join(self._output_dir, 'cpp', 'Dart%s.h' % interface_name)
180 157
181 def _FilePathForCppImplementation(self, interface_name): 158 def _FilePathForCppImplementation(self, interface_name):
182 return os.path.join(self._output_dir, 'cpp', 'Dart%s.cpp' % interface_name) 159 return os.path.join(self._output_dir, 'cpp', 'Dart%s.cpp' % interface_name)
183 160
184 def _EmitterForFactoryProviderBody(self, name): 161 def _EmitterForFactoryProviderBody(self, name):
185 if name not in self._factory_provider_emitters: 162 if name not in self._factory_provider_emitters:
186 file_name = self._FilePathForDartFactoryProviderImplementation(name) 163 file_name = self._FilePathForDartFactoryProviderImplementation(name)
187 self._dom_impl_files.append(file_name) 164 self._dom_impl_files.append(file_name)
188 template = self._templates.Load('factoryprovider_%s.darttemplate' % name) 165 template = self._templates.Load('factoryprovider_%s.darttemplate' % name)
189 file_emitter = self._emitters.FileEmitter(file_name) 166 file_emitter = self._emitters.FileEmitter(file_name)
190 self._factory_provider_emitters[name] = file_emitter.Emit(template) 167 self._factory_provider_emitters[name] = file_emitter.Emit(template)
191 return self._factory_provider_emitters[name] 168 return self._factory_provider_emitters[name]
192 169
193 170
194 class NativeImplementationGenerator(systembase.BaseGenerator): 171 class NativeImplementationGenerator(systembase.BaseGenerator):
195 """Generates Dart implementation for one DOM IDL interface.""" 172 """Generates Dart implementation for one DOM IDL interface."""
196 173
197 def __init__(self, system, interface, 174 def __init__(self, system, interface):
198 dart_impl_emitter, cpp_header_emitter, cpp_impl_emitter,
199 base_members, templates):
200 """Generates Dart and C++ code for the given interface. 175 """Generates Dart and C++ code for the given interface.
201 176
202 Args: 177 Args:
203 system: The NativeImplementationSystem. 178 system: The NativeImplementationSystem.
204 interface: an IDLInterface instance. It is assumed that all types have 179 interface: an IDLInterface instance. It is assumed that all types have
205 been converted to Dart types (e.g. int, String), unless they are in 180 been converted to Dart types (e.g. int, String), unless they are in
206 the same package as the interface. 181 the same package as the interface.
207 dart_impl_emitter: an Emitter for the file containing the Dart
208 implementation class.
209 cpp_header_emitter: an Emitter for the file containing the C++ header.
210 cpp_impl_emitter: an Emitter for the file containing the C++
211 implementation.
212 base_members: a set of names of members defined in a base class. This is
213 used to avoid static member 'overriding' in the generated Dart code.
214 """ 182 """
215 super(NativeImplementationGenerator, self).__init__( 183 super(NativeImplementationGenerator, self).__init__(
216 system._database, interface) 184 system._database, interface)
217 self._system = system 185 self._system = system
218 self._dart_impl_emitter = dart_impl_emitter
219 self._cpp_header_emitter = cpp_header_emitter
220 self._cpp_impl_emitter = cpp_impl_emitter
221 self._base_members = base_members
222 self._templates = templates
223 self._current_secondary_parent = None 186 self._current_secondary_parent = None
224 self._html_system = self._system._html_system 187 self._html_system = self._system._html_system
225 self._html_renames = self._html_system._html_renames 188 self._html_renames = self._html_system._html_renames
226 189
190 def HasImplementation(self):
191 return not IsPureInterface(self._interface.id)
192
193 def FilePathForDartImplementation(self):
194 return os.path.join(self._system._output_dir, 'dart',
195 '%sImplementation.dart' % self._interface.id)
196
197 def SetImplementationEmitter(self, implementation_emitter):
198 self._dart_impl_emitter = implementation_emitter
199
227 def StartInterface(self): 200 def StartInterface(self):
201 # Create emitters for c++ implementation.
202 if self.HasImplementation():
203 cpp_header_path = self._system._FilePathForCppHeader(self._interface.id)
204 self._system._cpp_header_files.append(cpp_header_path)
205 self._cpp_header_emitter = self._system._emitters.FileEmitter(cpp_header_p ath)
206 cpp_impl_path = self._system._FilePathForCppImplementation(self._interface .id)
207 self._system._cpp_impl_files.append(cpp_impl_path)
208 self._cpp_impl_emitter = self._system._emitters.FileEmitter(cpp_impl_path)
209 else:
210 self._cpp_header_emitter = emitter.Emitter()
211 self._cpp_impl_emitter = emitter.Emitter()
212
228 self._interface_type_info = GetIDLTypeInfo(self._interface.id) 213 self._interface_type_info = GetIDLTypeInfo(self._interface.id)
229 self._members_emitter = emitter.Emitter() 214 self._members_emitter = emitter.Emitter()
230 self._cpp_declarations_emitter = emitter.Emitter() 215 self._cpp_declarations_emitter = emitter.Emitter()
231 self._cpp_impl_includes = set() 216 self._cpp_impl_includes = set()
232 self._cpp_definitions_emitter = emitter.Emitter() 217 self._cpp_definitions_emitter = emitter.Emitter()
233 self._cpp_resolver_emitter = emitter.Emitter() 218 self._cpp_resolver_emitter = emitter.Emitter()
234 219
235 self._GenerateConstructors() 220 self._GenerateConstructors()
236 self._GenerateEvents() 221 self._GenerateEvents()
237 222
(...skipping 232 matching lines...) Expand 10 before | Expand all | Expand 10 after
470 INTERFACE=html_interface_name, 455 INTERFACE=html_interface_name,
471 PARAMETERS=constructor_info.ParametersImplementationDeclaration(self._Da rtType), 456 PARAMETERS=constructor_info.ParametersImplementationDeclaration(self._Da rtType),
472 ARGUMENTS=constructor_info.ParametersAsArgumentList(), 457 ARGUMENTS=constructor_info.ParametersAsArgumentList(),
473 NATIVE_NAME=native_implementation_function) 458 NATIVE_NAME=native_implementation_function)
474 459
475 def FinishInterface(self): 460 def FinishInterface(self):
476 html_interface_name = self._HTMLInterfaceName(self._interface.id) 461 html_interface_name = self._HTMLInterfaceName(self._interface.id)
477 template = None 462 template = None
478 if html_interface_name == self._interface.id or not self._database.HasInterf ace(html_interface_name): 463 if html_interface_name == self._interface.id or not self._database.HasInterf ace(html_interface_name):
479 template_file = 'impl_%s.darttemplate' % html_interface_name 464 template_file = 'impl_%s.darttemplate' % html_interface_name
480 template = self._templates.TryLoad(template_file) 465 template = self._system._templates.TryLoad(template_file)
481 if not template: 466 if not template:
482 template = self._templates.Load('dart_implementation.darttemplate') 467 template = self._system._templates.Load('dart_implementation.darttemplate' )
483 468
484 class_name = self._ImplClassName(self._interface.id) 469 class_name = self._ImplClassName(self._interface.id)
485 members_emitter = self._dart_impl_emitter.Emit( 470 members_emitter = self._dart_impl_emitter.Emit(
486 template, 471 template,
487 CLASSNAME=class_name, 472 CLASSNAME=class_name,
488 EXTENDS=' extends ' + self._BaseClassName(), 473 EXTENDS=' extends ' + self._BaseClassName(),
489 IMPLEMENTS=' implements ' + html_interface_name, 474 IMPLEMENTS=' implements ' + html_interface_name,
490 NATIVESPEC='') 475 NATIVESPEC='')
491 members_emitter.Emit(''.join(self._members_emitter.Fragments())) 476 members_emitter.Emit(''.join(self._members_emitter.Fragments()))
492 477
493 self._GenerateCppHeader() 478 self._GenerateCppHeader()
494 479
495 self._cpp_impl_emitter.Emit( 480 self._cpp_impl_emitter.Emit(
496 self._templates.Load('cpp_implementation.template'), 481 self._system._templates.Load('cpp_implementation.template'),
497 INTERFACE=self._interface.id, 482 INTERFACE=self._interface.id,
498 INCLUDES=_GenerateCPPIncludes(self._cpp_impl_includes), 483 INCLUDES=_GenerateCPPIncludes(self._cpp_impl_includes),
499 CALLBACKS=self._cpp_definitions_emitter.Fragments(), 484 CALLBACKS=self._cpp_definitions_emitter.Fragments(),
500 RESOLVER=self._cpp_resolver_emitter.Fragments(), 485 RESOLVER=self._cpp_resolver_emitter.Fragments(),
501 DART_IMPLEMENTATION_CLASS=class_name) 486 DART_IMPLEMENTATION_CLASS=class_name)
502 487
503 def _GenerateCppHeader(self): 488 def _GenerateCppHeader(self):
504 to_native_emitter = emitter.Emitter() 489 to_native_emitter = emitter.Emitter()
505 if self._interface_type_info.custom_to_native(): 490 if self._interface_type_info.custom_to_native():
506 to_native_emitter.Emit( 491 to_native_emitter.Emit(
(...skipping 18 matching lines...) Expand all
525 to_dart_emitter.Emit( 510 to_dart_emitter.Emit(
526 ' static Dart_Handle toDart(NativeType* value)\n' 511 ' static Dart_Handle toDart(NativeType* value)\n'
527 ' {\n' 512 ' {\n'
528 ' return DartDOMWrapper::toDart<Dart$(INTERFACE)>(value);\n' 513 ' return DartDOMWrapper::toDart<Dart$(INTERFACE)>(value);\n'
529 ' }\n', 514 ' }\n',
530 INTERFACE=self._interface.id) 515 INTERFACE=self._interface.id)
531 516
532 webcore_includes = _GenerateCPPIncludes(self._interface_type_info.webcore_in cludes()) 517 webcore_includes = _GenerateCPPIncludes(self._interface_type_info.webcore_in cludes())
533 wrapper_type = _DOMWrapperType(self._database, self._interface) 518 wrapper_type = _DOMWrapperType(self._database, self._interface)
534 self._cpp_header_emitter.Emit( 519 self._cpp_header_emitter.Emit(
535 self._templates.Load('cpp_header.template'), 520 self._system._templates.Load('cpp_header.template'),
536 INTERFACE=self._interface.id, 521 INTERFACE=self._interface.id,
537 WEBCORE_INCLUDES=webcore_includes, 522 WEBCORE_INCLUDES=webcore_includes,
538 WEBCORE_CLASS_NAME=self._interface_type_info.native_type(), 523 WEBCORE_CLASS_NAME=self._interface_type_info.native_type(),
539 DECLARATIONS=self._cpp_declarations_emitter.Fragments(), 524 DECLARATIONS=self._cpp_declarations_emitter.Fragments(),
540 NATIVE_TRAITS_TYPE='DartDOMWrapper::%sTraits' % wrapper_type, 525 NATIVE_TRAITS_TYPE='DartDOMWrapper::%sTraits' % wrapper_type,
541 TO_NATIVE=to_native_emitter.Fragments(), 526 TO_NATIVE=to_native_emitter.Fragments(),
542 TO_DART=to_dart_emitter.Fragments()) 527 TO_DART=to_dart_emitter.Fragments())
543 528
544 def _GenerateCallWithHandling(self, node, parameter_definitions_emitter, argum ents): 529 def _GenerateCallWithHandling(self, node, parameter_definitions_emitter, argum ents):
545 if 'CallWith' not in node.ext_attrs: 530 if 'CallWith' not in node.ext_attrs:
(...skipping 546 matching lines...) Expand 10 before | Expand all | Expand 10 after
1092 1077
1093 def _IsArgumentOptionalInWebCore(argument): 1078 def _IsArgumentOptionalInWebCore(argument):
1094 return IsOptional(argument) and not 'Callback' in argument.ext_attrs 1079 return IsOptional(argument) and not 'Callback' in argument.ext_attrs
1095 1080
1096 def _ToWebKitName(name): 1081 def _ToWebKitName(name):
1097 name = name[0].lower() + name[1:] 1082 name = name[0].lower() + name[1:]
1098 name = re.sub(r'^(hTML|uRL|jS|xML|xSLT)', lambda s: s.group(1).lower(), 1083 name = re.sub(r'^(hTML|uRL|jS|xML|xSLT)', lambda s: s.group(1).lower(),
1099 name) 1084 name)
1100 return re.sub(r'^(create|exclusive)', lambda s: 'is' + s.group(1).capitalize() , 1085 return re.sub(r'^(create|exclusive)', lambda s: 'is' + s.group(1).capitalize() ,
1101 name) 1086 name)
OLDNEW
« no previous file with comments | « lib/dom/scripts/systemhtml.py ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698