Index: client/dom/scripts/dartgenerator.py |
diff --git a/client/dom/scripts/dartgenerator.py b/client/dom/scripts/dartgenerator.py |
index c2408f40caa405a1afe7ef7b197dd21ddc004349..fd1bc936bfbd731909f9b9a3d4b57a6f3a9fe796 100755 |
--- a/client/dom/scripts/dartgenerator.py |
+++ b/client/dom/scripts/dartgenerator.py |
@@ -376,11 +376,17 @@ class DartGenerator(object): |
self._systems = [] |
+ # TODO(jmesserly): only create these if needed |
interface_system = InterfacesSystem( |
TemplateLoader(self._template_dir, ['dom/interface', 'dom', '']), |
self._database, self._emitters, self._output_dir) |
self._systems.append(interface_system) |
+ html_interface_system = HtmlInterfacesSystem( |
+ TemplateLoader(self._template_dir, ['html/interface', 'html', '']), |
+ self._database, self._emitters, self._output_dir) |
+ self._systems.append(html_interface_system) |
+ |
if 'native' in systems: |
native_system = NativeImplementationSystem( |
TemplateLoader(self._template_dir, ['dom/native', 'dom', '']), |
@@ -407,6 +413,21 @@ class DartGenerator(object): |
frog_system._interface_system = interface_system |
self._systems.append(frog_system) |
+ if 'htmlfrog' in systems: |
+ html_system = HtmlFrogSystem( |
+ TemplateLoader(self._template_dir, ['html/frog', 'html', '']), |
+ self._database, self._emitters, self._output_dir) |
+ |
+ html_system._interface_system = html_interface_system |
+ self._systems.append(html_system) |
+ |
+ if 'htmldartium' in systems: |
+ html_system = HtmlDartiumSystem( |
+ TemplateLoader(self._template_dir, ['html/dartium', 'html', '']), |
+ self._database, self._emitters, self._output_dir) |
+ |
+ html_system._interface_system = html_interface_system |
+ self._systems.append(html_system) |
# Render all interfaces into Dart and save them in files. |
for interface in database.GetInterfaces(): |
@@ -473,11 +494,17 @@ class DartGenerator(object): |
generator.AddConstant(const) |
attributes = [attr for attr in interface.attributes |
- if not self._OmitAttribute(interface, attr)] |
+ if not self._IsEventAttribute(interface, attr)] |
for (getter, setter) in _PairUpAttributes(attributes): |
for generator in generators: |
generator.AddAttribute(getter, setter) |
+ events = _PairUpAttributes([attr for attr in interface.attributes |
+ if self._IsEventAttribute(interface, attr)]) |
+ if events: |
+ for generator in generators: |
+ generator.AddEvents(events) |
sra1
2012/02/07 05:06:16
AddEventAttributes would be a better name.
Jennifer Messerly
2012/02/07 21:05:14
Done.
|
+ |
# The implementation should define an indexer if the interface directly |
# extends List. |
element_type = MaybeListElementType(interface) |
@@ -532,7 +559,7 @@ class DartGenerator(object): |
generator.FinishInterface() |
return |
- def _OmitAttribute(self, interface, attr): |
+ def _IsEventAttribute(self, interface, attr): |
# Remove EventListener attributes like 'onclick' when addEventListener |
# is available. |
if attr.type.id == 'EventListener': |
@@ -968,6 +995,57 @@ class InterfacesSystem(System): |
# ------------------------------------------------------------------------------ |
+class HtmlInterfacesSystem(System): |
+ |
+ def __init__(self, templates, database, emitters, output_dir): |
+ super(HtmlInterfacesSystem, self).__init__( |
+ templates, database, emitters, output_dir) |
+ self._dart_interface_file_paths = [] |
+ |
+ |
+ def InterfaceGenerator(self, |
+ interface, |
+ common_prefix, |
+ super_interface_name, |
+ source_filter): |
+ """.""" |
+ interface_name = interface.id |
+ dart_interface_file_path = self._FilePathForDartInterface(interface_name) |
+ |
+ self._dart_interface_file_paths.append(dart_interface_file_path) |
+ |
+ dart_interface_code = self._emitters.FileEmitter(dart_interface_file_path) |
+ |
+ template_file = 'interface_%s.darttemplate' % interface_name |
+ template = self._templates.TryLoad(template_file) |
+ if not template: |
+ template = self._templates.Load('interface.darttemplate') |
+ |
+ return HtmlDartInterfaceGenerator( |
+ interface, dart_interface_code, |
+ template, |
+ common_prefix, super_interface_name, |
+ source_filter) |
+ |
+ def ProcessCallback(self, interface, info): |
+ """Generates a typedef for the callback interface.""" |
+ interface_name = interface.id |
+ file_path = self._FilePathForDartInterface(interface_name) |
+ self._ProcessCallback(interface, info, file_path) |
+ |
+ def GenerateLibraries(self, lib_dir): |
+ pass |
+ |
+ |
+ def _FilePathForDartInterface(self, interface_name): |
+ """Returns the file path of the Dart interface definition.""" |
+ # TODO(jmesserly): is this the right path |
+ return os.path.join(self._output_dir, 'html', 'interface', |
+ '%s.dart' % interface_name) |
+ |
+ |
+# ------------------------------------------------------------------------------ |
+ |
class WrappingImplementationSystem(System): |
def __init__(self, templates, database, emitters, output_dir): |
@@ -1124,6 +1202,57 @@ class FrogSystem(System): |
return os.path.join(self._output_dir, 'src', 'frog', |
'%s.dart' % interface_name) |
+ |
+# ------------------------------------------------------------------------------ |
+ |
+class HtmlFrogSystem(System): |
+ |
+ def __init__(self, templates, database, emitters, output_dir): |
+ super(HtmlFrogSystem, self).__init__( |
+ templates, database, emitters, output_dir) |
+ self._dart_frog_file_paths = [] |
+ |
+ def InterfaceGenerator(self, |
+ interface, |
+ common_prefix, |
+ 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.Emit(self._templates.Load('frog_impl.darttemplate')) |
+ return HtmlFrogInterfaceGenerator(self, interface, template, |
+ super_interface_name, dart_code) |
+ |
+ #def ProcessCallback(self, interface, info): |
+ # """Generates a typedef for the callback interface.""" |
+ # file_path = self._FilePathForFrogImpl(interface.id) |
+ # self._ProcessCallback(interface, info, file_path) |
sra1
2012/02/07 05:06:16
remove commented out code
Jennifer Messerly
2012/02/07 21:05:14
This was also commented out in FrogSystem, so I pr
|
+ |
+ def GenerateLibraries(self, lib_dir): |
+ self._GenerateLibFile( |
+ 'html_frog.darttemplate', |
+ os.path.join(lib_dir, 'html_frog.dart'), |
+ (self._interface_system._dart_interface_file_paths + |
+ self._interface_system._dart_callback_file_paths + |
+ self._dart_frog_file_paths)) |
+ |
+ def Finish(self): |
+ pass |
+ |
+ def _FilePathForFrogImpl(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', 'frog', |
+ '%s.dart' % interface_name) |
+ |
# ------------------------------------------------------------------------------ |
class DartInterfaceGenerator(object): |
@@ -1265,7 +1394,8 @@ class DartInterfaceGenerator(object): |
def AddSecondaryOperation(self, interface, attr): |
pass |
- |
+ def AddEvents(self, event_attrs): |
+ pass |
# Given a sorted sequence of type identifiers, return an appropriate type |
# name |
@@ -1273,6 +1403,30 @@ def TypeName(typeIds, interface): |
# Dynamically type this field for now. |
return 'var' |
+# ------------------------------------------------------------------------------ |
+ |
+# TODO(jmesserly): inheritance is probably not the right way to factor this long |
+# term, but it makes merging better for now. |
+class HtmlDartInterfaceGenerator(DartInterfaceGenerator): |
+ """Generates Dart Interface definition for one DOM IDL interface.""" |
+ |
+ def __init__(self, interface, emitter, template, |
+ common_prefix, super_interface, source_filter): |
+ super(HtmlDartInterfaceGenerator, self).__init__(interface, |
+ emitter, template, common_prefix, super_interface, source_filter) |
+ |
+ def AddEvents(self, event_attrs): |
+ events_interface = self._interface.id + 'Events' |
+ self._members_emitter.Emit('\n $TYPE get on();\n', |
+ TYPE=events_interface) |
+ events_members = self._emitter.Emit( |
+ '\ninterface $INTERFACE {\n$!MEMBERS}\n', |
+ INTERFACE=events_interface) |
+ |
+ for getter, setter in event_attrs: |
+ event = getter or setter |
+ events_members.Emit('\n EventListenerList get $NAME();\n', NAME=event.id) |
+ |
# ------------------------------------------------------------------------------ |
@@ -1435,6 +1589,9 @@ class WrappingInterfaceGenerator(object): |
self._SecondaryContext(interface) |
self.AddOperation(info) |
+ def AddEvents(self, event_attrs): |
+ pass |
+ |
def _SecondaryContext(self, interface): |
if interface is not self._current_secondary_parent: |
self._current_secondary_parent = interface |
@@ -1995,6 +2152,9 @@ class FrogInterfaceGenerator(object): |
self._SecondaryContext(interface) |
self.AddOperation(info) |
+ def AddEvents(self, event_attrs): |
+ pass |
+ |
def _SecondaryContext(self, interface): |
if interface is not self._current_secondary_parent: |
self._current_secondary_parent = interface |
@@ -2075,6 +2235,39 @@ class FrogInterfaceGenerator(object): |
# ------------------------------------------------------------------------------ |
+# TODO(jmesserly): inheritance is probably not the right way to factor this long |
+# term, but it makes merging better for now. |
+class HtmlFrogInterfaceGenerator(FrogInterfaceGenerator): |
+ """Generates a Frog class for the dart:html library from a DOM IDL |
+ interface. |
+ """ |
+ |
+ def __init__(self, system, interface, template, super_interface, dart_code): |
+ super(HtmlFrogInterfaceGenerator, self).__init__( |
+ system, interface, template, super_interface, dart_code) |
+ |
+ def AddEvents(self, event_attrs): |
+ events_class = self._interface.id + 'EventsImpl' |
+ events_interface = self._interface.id + 'Events' |
+ self._members_emitter.Emit('\n $TYPE get on() =>\n new $TYPE(this);\n', |
sra1
2012/02/07 05:06:16
I find this kind of string easier to read if you a
Jennifer Messerly
2012/02/07 21:05:14
Done.
|
+ TYPE=events_class) |
+ |
+ events_members = self._dart_code.Emit( |
+ '\nclass $CLASSNAME extends EventsImplementation ' |
+ 'implements $INTERFACE {\n' |
+ ' $CLASSNAME(_ptr) : super._wrap(_ptr);\n$!MEMBERS}\n', |
+ CLASSNAME=events_class, |
+ INTERFACE=events_interface) |
+ |
+ for getter, setter in event_attrs: |
+ event = getter or setter |
+ events_members.Emit( |
+ "\n EventListenerList get $NAME() => _get('$NAME');\n", |
+ NAME=event.id) |
+ |
+ |
+# ------------------------------------------------------------------------------ |
+ |
class NativeImplementationSystem(System): |
def __init__(self, templates, database, emitters, auxiliary_dir, output_dir): |