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

Unified Diff: client/dom/scripts/systemnative.py

Issue 9705040: Generate factory providers for systemnative (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: merge Created 8 years, 9 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | client/dom/src/native_FactoryProviders.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: client/dom/scripts/systemnative.py
diff --git a/client/dom/scripts/systemnative.py b/client/dom/scripts/systemnative.py
index f787a7baccc163e45271cfdc3050552b33f8a51a..504cbf8feeef94a70eecc79db9e120a95558e9e0 100644
--- a/client/dom/scripts/systemnative.py
+++ b/client/dom/scripts/systemnative.py
@@ -46,7 +46,7 @@ class NativeImplementationSystem(System):
cpp_impl_path = self._FilePathForCppImplementation(interface_name)
self._cpp_impl_files.append(cpp_impl_path)
- return NativeImplementationGenerator(interface, super_interface_name,
+ return NativeImplementationGenerator(self, interface, super_interface_name,
self._emitters.FileEmitter(dart_impl_path),
self._emitters.FileEmitter(cpp_header_path),
self._emitters.FileEmitter(cpp_impl_path),
@@ -177,6 +177,14 @@ class NativeImplementationSystem(System):
return os.path.join(self._output_dir, 'dart',
'%sImplementation.dart' % interface_name)
+ def _FilePathForDartFactoryProvider(self, interface_name):
+ return os.path.join(self._output_dir, 'dart',
+ '_%sFactoryProvider.dart' % interface_name)
+
+ def _FilePathForDartFactoryProviderImplementation(self, interface_name):
+ return os.path.join(self._output_dir, 'dart',
+ '%sFactoryProviderImplementation.dart' % interface_name)
+
def _FilePathForCppHeader(self, interface_name):
return os.path.join(self._output_dir, 'cpp', 'Dart%s.h' % interface_name)
@@ -187,13 +195,13 @@ class NativeImplementationSystem(System):
class NativeImplementationGenerator(systemwrapping.WrappingInterfaceGenerator):
"""Generates Dart implementation for one DOM IDL interface."""
- def __init__(self, interface, super_interface,
+ def __init__(self, system, interface, super_interface,
dart_impl_emitter, cpp_header_emitter, cpp_impl_emitter,
base_members, templates):
"""Generates Dart and C++ code for the given interface.
Args:
-
+ system: The NativeImplementationSystem.
interface: an IDLInterface instance. It is assumed that all types have
been converted to Dart types (e.g. int, String), unless they are in
the same package as the interface.
@@ -207,6 +215,7 @@ class NativeImplementationGenerator(systemwrapping.WrappingInterfaceGenerator):
base_members: a set of names of members defined in a base class. This is
used to avoid static member 'overriding' in the generated Dart code.
"""
+ self._system = system
self._interface = interface
self._super_interface = super_interface
self._dart_impl_emitter = dart_impl_emitter
@@ -240,6 +249,9 @@ class NativeImplementationGenerator(systemwrapping.WrappingInterfaceGenerator):
constructor_info = AnalyzeConstructor(self._interface)
+ if constructor_info:
+ self._EmitFactoryProvider(self._interface.id, constructor_info)
+
if constructor_info is None:
# We have a custom implementation for it.
self._cpp_declarations_emitter.Emit(
@@ -298,6 +310,48 @@ class NativeImplementationGenerator(systemwrapping.WrappingInterfaceGenerator):
# FIXME: support ConstructorTemplate.
return set(['CustomConstructor', 'V8CustomConstructor', 'Constructor', 'NamedConstructor']) & set(self._interface.ext_attrs)
+ def _EmitFactoryProvider(self, interface_name, constructor_info):
+ factory_provider = '_' + interface_name + 'FactoryProvider'
+ implementation_class = interface_name + 'FactoryProviderImplementation'
+ implementation_function = 'create' + interface_name
+ native_implementation_function = '%s_constructor_Callback' % interface_name
+
+ # Emit private factory provider in public library.
+ template_file = 'factoryprovider_%s.darttemplate' % interface_name
+ template = self._system._templates.TryLoad(template_file)
+ if not template:
+ template = self._system._templates.Load('factoryprovider.darttemplate')
+
+ dart_impl_path = self._system._FilePathForDartFactoryProvider(
+ interface_name)
+ self._system._dom_public_files.append(dart_impl_path)
+
+ emitter = self._system._emitters.FileEmitter(dart_impl_path)
+ emitter.Emit(
+ template,
+ FACTORY_PROVIDER=factory_provider,
+ CONSTRUCTOR=interface_name,
+ PARAMETERS=constructor_info.ParametersImplementationDeclaration(),
+ IMPL_CLASS=implementation_class,
+ IMPL_FUNCTION=implementation_function,
+ ARGUMENTS=constructor_info.ParametersAsArgumentList())
+
+ # Emit public implementation in implementation libary.
+ dart_impl_path = self._system._FilePathForDartFactoryProviderImplementation(
+ interface_name)
+ self._system._dom_impl_files.append(dart_impl_path)
+ emitter = self._system._emitters.FileEmitter(dart_impl_path)
+ emitter.Emit(
+ 'class $IMPL_CLASS {\n'
+ ' static $INTERFACE_NAME $IMPL_FUNCTION($PARAMETERS)\n'
+ ' native "$NATIVE_NAME";\n'
+ '}',
+ INTERFACE_NAME=interface_name,
+ PARAMETERS=constructor_info.ParametersImplementationDeclaration(),
+ IMPL_CLASS=implementation_class,
+ IMPL_FUNCTION=implementation_function,
+ NATIVE_NAME=native_implementation_function)
+
def FinishInterface(self):
base = self._BaseClassName(self._interface)
self._dart_impl_emitter.Emit(
« no previous file with comments | « no previous file | client/dom/src/native_FactoryProviders.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698