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

Unified Diff: lib/dom/scripts/dartgenerator.py

Issue 10392147: Move systems creation to dartdomgenerator.py. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Fix output_dir Created 8 years, 7 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 | « lib/dom/scripts/dartdomgenerator.py ('k') | lib/dom/scripts/systemfrog.py » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: lib/dom/scripts/dartgenerator.py
diff --git a/lib/dom/scripts/dartgenerator.py b/lib/dom/scripts/dartgenerator.py
index 6d8762527431002ac02b158d0beaa82310aa2062..087060515005614a3f3537955c0461425d1e74e0 100755
--- a/lib/dom/scripts/dartgenerator.py
+++ b/lib/dom/scripts/dartgenerator.py
@@ -8,17 +8,11 @@
import emitter
import idlnode
import logging
-import multiemitter
import os
import re
import shutil
from generator import *
from systembase import *
-from systemfrog import *
-from systemhtml import *
-from systeminterface import *
-from systemnative import *
-from templateloader import TemplateLoader
_logger = logging.getLogger('dartgenerator')
@@ -33,23 +27,10 @@ def MergeNodes(node, other):
class DartGenerator(object):
"""Utilities to generate Dart APIs and corresponding JavaScript."""
- def __init__(self, auxiliary_dir, template_dir, base_package):
- """Constructor for the DartGenerator.
-
- Args:
- auxiliary_dir -- location of auxiliary handwritten classes
- template_dir -- location of template files
- base_package -- the base package name for the generated code.
- """
- self._auxiliary_dir = auxiliary_dir
- self._template_dir = template_dir
- self._base_package = base_package
+ def __init__(self):
self._auxiliary_files = {}
self._dart_templates_re = re.compile(r'[\w.:]+<([\w\.<>:]+)>')
- self._emitters = None # set later
-
-
def _StripModules(self, type_name):
return type_name.split('::')[-1]
@@ -73,13 +54,13 @@ class DartGenerator(object):
def _IsDartType(self, type_name):
return '.' in type_name
- def LoadAuxiliary(self):
+ def LoadAuxiliary(self, auxiliary_dir):
def Visitor(_, dirname, names):
for name in names:
if name.endswith('.dart'):
name = name[0:-5] # strip off ".dart"
self._auxiliary_files[name] = os.path.join(dirname, name)
- os.path.walk(self._auxiliary_dir, Visitor, None)
+ os.path.walk(auxiliary_dir, Visitor, None)
def RenameTypes(self, database, conversion_table, rename_javascript_binding_names):
"""Renames interfaces using the given conversion table.
@@ -205,99 +186,9 @@ class DartGenerator(object):
self.FilterMembersWithUnidentifiedTypes(database)
-
- def Generate(self, database, output_dir,
- module_source_preference=[], source_filter=None,
- super_database=None, common_prefix=None,
- webkit_renames={},
- html_renames={},
- lib_dir=None,
- systems=[]):
- """Generates Dart and JS files for the loaded interfaces.
-
- Args:
- database -- database containing interfaces to generate code for.
- output_dir -- directory to write generated files to.
- module_source_preference -- priority order list of source annotations to
- use when choosing a module name, if none specified uses the module name
- from the database.
- source_filter -- if specified, only outputs interfaces that have one of
- these source annotation and rewrites the names of superclasses not
- marked with this source to use the common prefix.
- super_database -- database containing super interfaces that the generated
- interfaces should extend.
- common_prefix -- prefix for the common library, if any.
- lib_file_path -- filename for generated .lib file, None if not required.
- lib_template -- template file in this directory for generated lib file.
- """
-
- self._emitters = multiemitter.MultiEmitter()
+ def Generate(self, database, system, source_filter=None, super_database=None,
+ common_prefix=None, webkit_renames={}, html_renames={}):
self._database = database
- self._output_dir = output_dir
-
- self._FixEventTargets()
- self._ComputeInheritanceClosure()
-
- self._systems = []
-
- # TODO(jmesserly): only create these if needed
- if ('htmlfrog' in systems) or ('htmldartium' in systems):
- html_interface_system = HtmlInterfacesSystem(
- TemplateLoader(self._template_dir, ['html/interface', 'html', '']),
- self._database, self._emitters, self._output_dir, self)
- self._systems.append(html_interface_system)
- else:
- interface_system = InterfacesSystem(
- TemplateLoader(self._template_dir, ['dom/interface', 'dom', '']),
- self._database, self._emitters, self._output_dir)
- self._systems.append(interface_system)
-
- if 'native' in systems:
- native_system = NativeImplementationSystem(
- TemplateLoader(self._template_dir, ['dom/native', 'dom', '']),
- self._database, html_renames, self._emitters, self._auxiliary_dir,
- self._output_dir)
-
- self._systems.append(native_system)
-
- if 'dummy' in systems:
- dummy_system = DummyImplementationSystem(
- TemplateLoader(self._template_dir, ['dom/dummy', 'dom', '']),
- self._database, self._emitters, self._output_dir)
-
- # Makes interface files available for listing in the library for the
- # dummy implementation.
- dummy_system._interface_system = interface_system
- self._systems.append(dummy_system)
-
- if 'frog' in systems:
- frog_system = FrogSystem(
- TemplateLoader(self._template_dir, ['dom/frog', 'dom', '']),
- self._database, self._emitters, self._output_dir)
-
- 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/impl', 'html', ''],
- {'DARTIUM': False, 'FROG': True}),
- self._database, self._emitters, self._output_dir, self)
-
- 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/impl', 'html', ''],
- {'DARTIUM': True, 'FROG': False}),
- self._database, self._emitters, self._auxiliary_dir,
- self._output_dir, self)
-
- html_system._interface_system = html_interface_system
- self._systems.append(html_system)
# Collect interfaces
interfaces = []
@@ -336,21 +227,15 @@ class DartGenerator(object):
info = RecognizeCallback(interface)
if info:
- for system in self._systems:
- system.ProcessCallback(interface, info)
+ system.ProcessCallback(interface, info)
else:
if 'Callback' in interface.ext_attrs:
_logger.info('Malformed callback: %s' % interface.id)
- self._ProcessInterface(interface, super_interface,
+ self._ProcessInterface(system, interface, super_interface,
source_filter, common_prefix)
- # Libraries
- if lib_dir:
- for system in self._systems:
- system.GenerateLibraries(lib_dir)
-
- for system in self._systems:
- system.Finish()
+ system.GenerateLibraries()
+ system.Finish()
def _PreOrderInterfaces(self, interfaces):
"""Returns the interfaces in pre-order, i.e. parents first."""
@@ -373,42 +258,38 @@ class DartGenerator(object):
return ordered
- def _ProcessInterface(self, interface, super_interface_name,
+ def _ProcessInterface(self, system, interface, super_interface_name,
source_filter,
common_prefix):
"""."""
_logger.info('Generating %s' % interface.id)
- generators = [system.InterfaceGenerator(interface,
- common_prefix,
- super_interface_name,
- source_filter)
- for system in self._systems]
- generators = filter(None, generators)
+ generator = system.InterfaceGenerator(interface,
+ common_prefix,
+ super_interface_name,
+ source_filter)
+ if not generator:
+ return
- for generator in generators:
- generator.StartInterface()
+ generator.StartInterface()
for const in sorted(interface.constants, ConstantOutputOrder):
- for generator in generators:
- generator.AddConstant(const)
+ generator.AddConstant(const)
attributes = [attr for attr in interface.attributes
if attr.type.id != 'EventListener']
for (getter, setter) in _PairUpAttributes(attributes):
- for generator in generators:
- generator.AddAttribute(getter, setter)
+ generator.AddAttribute(getter, setter)
# The implementation should define an indexer if the interface directly
# extends List.
(element_type, requires_indexer) = ListImplementationInfo(
interface, self._database)
if element_type:
- for generator in generators:
- if requires_indexer:
- generator.AddIndexer(element_type)
- else:
- generator.AmendIndexer(element_type)
+ if requires_indexer:
+ generator.AddIndexer(element_type)
+ else:
+ generator.AmendIndexer(element_type)
# Group overloaded operations by id
operationsById = {}
for operation in interface.operations:
@@ -420,11 +301,10 @@ class DartGenerator(object):
for id in sorted(operationsById.keys()):
operations = operationsById[id]
info = AnalyzeOperation(interface, operations)
- for generator in generators:
- if info.IsStatic():
- generator.AddStaticOperation(info)
- else:
- generator.AddOperation(info)
+ if info.IsStatic():
+ generator.AddStaticOperation(info)
+ else:
+ generator.AddOperation(info)
# With multiple inheritance, attributes and operations of non-first
# interfaces need to be added. Sometimes the attribute or operation is
@@ -437,8 +317,7 @@ class DartGenerator(object):
attributes = [attr for attr in parent_interface.attributes
if not FindMatchingAttribute(interface, attr)]
for (getter, setter) in _PairUpAttributes(attributes):
- for generator in generators:
- generator.AddSecondaryAttribute(parent_interface, getter, setter)
+ generator.AddSecondaryAttribute(parent_interface, getter, setter)
# Group overloaded operations by id
operationsById = {}
@@ -452,12 +331,9 @@ class DartGenerator(object):
if not any(op.id == id for op in interface.operations):
operations = operationsById[id]
info = AnalyzeOperation(interface, operations)
- for generator in generators:
- generator.AddSecondaryOperation(parent_interface, info)
+ generator.AddSecondaryOperation(parent_interface, info)
- for generator in generators:
- generator.FinishInterface()
- return
+ generator.FinishInterface()
def _TransitiveSecondaryParents(self, interface):
"""Returns a list of all non-primary parents.
@@ -495,13 +371,8 @@ class DartGenerator(object):
return exceptions
- def Flush(self):
- """Write out all pending files."""
- _logger.info('Flush...')
- self._emitters.Flush()
-
- def _FixEventTargets(self):
- for interface in self._database.GetInterfaces():
+ def FixEventTargets(self, database):
+ for interface in database.GetInterfaces():
# Create fake EventTarget parent interface for interfaces that have
# 'EventTarget' extended attribute.
if 'EventTarget' in interface.ext_attrs:
@@ -509,35 +380,6 @@ class DartGenerator(object):
('InterfaceType', ('ScopedName', 'EventTarget'))]
interface.parents.append(idlnode.IDLParentInterface(ast))
- def _ComputeInheritanceClosure(self):
- def Collect(interface, seen, collected):
- name = interface.id
- if '<' in name:
- # TODO(sra): Handle parameterized types.
- return
- if not name in seen:
- seen.add(name)
- collected.append(name)
- for parent in interface.parents:
- # TODO(sra): Handle parameterized types.
- if not '<' in parent.type.id:
- if self._database.HasInterface(parent.type.id):
- Collect(self._database.GetInterface(parent.type.id),
- seen, collected)
-
- self._inheritance_closure = {}
- for interface in self._database.GetInterfaces():
- seen = set()
- collected = []
- Collect(interface, seen, collected)
- self._inheritance_closure[interface.id] = collected
-
- def _AllImplementedInterfaces(self, interface):
- """Returns a list of the names of all interfaces implemented by 'interface'.
- List includes the name of 'interface'.
- """
- return self._inheritance_closure[interface.id]
-
def _PairUpAttributes(attributes):
"""Returns a list of (getter, setter) pairs sorted by name.
@@ -580,11 +422,11 @@ class DummyImplementationSystem(System):
def ProcessCallback(self, interface, info):
pass
- def GenerateLibraries(self, lib_dir):
+ def GenerateLibraries(self):
# Library generated for implementation.
self._GenerateLibFile(
'dom_dummy.darttemplate',
- os.path.join(lib_dir, 'dom_dummy.dart'),
+ os.path.join(self._output_dir, 'dom_dummy.dart'),
(self._interface_system._dart_interface_file_paths +
self._interface_system._dart_callback_file_paths +
self._impl_file_paths))
« no previous file with comments | « lib/dom/scripts/dartdomgenerator.py ('k') | lib/dom/scripts/systemfrog.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698