| 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 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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) |
| OLD | NEW |