| Index: client/dom/scripts/systembase.py
|
| diff --git a/client/dom/scripts/systembase.py b/client/dom/scripts/systembase.py
|
| index 5096ec94a560d440083a7a7e5956fa937c3dbd96..56d0db3b6c805b00333d8f9f30b770eeae61fc5e 100644
|
| --- a/client/dom/scripts/systembase.py
|
| +++ b/client/dom/scripts/systembase.py
|
| @@ -7,11 +7,19 @@
|
| Dart APIs from the IDL database."""
|
|
|
| import os
|
| -import re
|
| -from generator import *
|
| +#import re
|
| +import generator
|
|
|
| class System(object):
|
| - """Generates all the files for one implementation."""
|
| + """A System generates all the files for one implementation.
|
| +
|
| + This is a base class for all the specific systems.
|
| + The life-cycle of a System is:
|
| + - construction (__init__)
|
| + - (InterfaceGenerator | ProcessCallback)* # for each IDL interface
|
| + - GenerateLibraries
|
| + - Finish
|
| + """
|
|
|
| def __init__(self, templates, database, emitters, output_dir):
|
| self._templates = templates
|
| @@ -25,10 +33,14 @@ class System(object):
|
| common_prefix,
|
| super_interface_name,
|
| source_filter):
|
| - """Returns an interface generator for |interface|."""
|
| + """Returns an interface generator for |interface|.
|
| +
|
| + Called once for each interface that is not a callback function.
|
| + """
|
| return None
|
|
|
| def ProcessCallback(self, interface, info):
|
| + """Processes an interface that is a callback function."""
|
| pass
|
|
|
| def GenerateLibraries(self, lib_dir):
|
| @@ -38,6 +50,8 @@ class System(object):
|
| pass
|
|
|
|
|
| + # Helper methods used by several systems.
|
| +
|
| def _ProcessCallback(self, interface, info, file_path):
|
| """Generates a typedef for the callback interface."""
|
| self._dart_callback_file_paths.append(file_path)
|
| @@ -49,11 +63,13 @@ class System(object):
|
| TYPE=info.type_name,
|
| PARAMS=info.ParametersImplementationDeclaration())
|
|
|
| +
|
| def _GenerateLibFile(self, lib_template, lib_file_path, file_paths,
|
| **template_args):
|
| """Generates a lib file from a template and a list of files.
|
|
|
| Additional keyword arguments are passed to the template.
|
| + Typically called from self.GenerateLibraries.
|
| """
|
| # Load template.
|
| template = self._templates.Load(lib_template)
|
| @@ -76,7 +92,7 @@ class System(object):
|
| # Only consider primary parent, secondary parents are not on the
|
| # implementation class inheritance chain.
|
| parent = interface.parents[0]
|
| - if IsDartCollectionType(parent.type.id):
|
| + if generator.IsDartCollectionType(parent.type.id):
|
| return
|
| if self._database.HasInterface(parent.type.id):
|
| parent_interface = self._database.GetInterface(parent.type.id)
|
| @@ -89,243 +105,3 @@ class System(object):
|
| result = set()
|
| WalkParentChain(interface)
|
| return result;
|
| -
|
| -
|
| -# ------------------------------------------------------------------------------
|
| -
|
| -class InterfacesSystem(System):
|
| -
|
| - def __init__(self, templates, database, emitters, output_dir):
|
| - super(InterfacesSystem, 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 DartInterfaceGenerator(
|
| - 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."""
|
| - return os.path.join(self._output_dir, 'src', 'interface',
|
| - '%s.dart' % interface_name)
|
| -
|
| -# ------------------------------------------------------------------------------
|
| -
|
| -class DartInterfaceGenerator(object):
|
| - """Generates Dart Interface definition for one DOM IDL interface."""
|
| -
|
| - def __init__(self, interface, emitter, template,
|
| - common_prefix, super_interface, source_filter):
|
| - """Generates Dart code for the given interface.
|
| -
|
| - Args:
|
| - 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.
|
| - common_prefix -- the prefix for the common library, if any.
|
| - super_interface -- the name of the common interface that this interface
|
| - implements, if any.
|
| - source_filter -- if specified, rewrites the names of any superinterfaces
|
| - that are not from these sources to use the common prefix.
|
| - """
|
| - self._interface = interface
|
| - self._emitter = emitter
|
| - self._template = template
|
| - self._common_prefix = common_prefix
|
| - self._super_interface = super_interface
|
| - self._source_filter = source_filter
|
| -
|
| -
|
| - def StartInterface(self):
|
| - if self._super_interface:
|
| - typename = self._super_interface
|
| - else:
|
| - typename = self._interface.id
|
| -
|
| -
|
| - extends = []
|
| - suppressed_extends = []
|
| -
|
| - for parent in self._interface.parents:
|
| - # TODO(vsm): Remove source_filter.
|
| - if MatchSourceFilter(self._source_filter, parent):
|
| - # Parent is a DOM type.
|
| - extends.append(parent.type.id)
|
| - elif '<' in parent.type.id:
|
| - # Parent is a Dart collection type.
|
| - # TODO(vsm): Make this check more robust.
|
| - extends.append(parent.type.id)
|
| - else:
|
| - suppressed_extends.append('%s.%s' %
|
| - (self._common_prefix, parent.type.id))
|
| -
|
| - comment = ' extends'
|
| - extends_str = ''
|
| - if extends:
|
| - extends_str += ' extends ' + ', '.join(extends)
|
| - comment = ','
|
| - if suppressed_extends:
|
| - extends_str += ' /*%s %s */' % (comment, ', '.join(suppressed_extends))
|
| -
|
| - if typename in interface_factories:
|
| - extends_str += ' default ' + interface_factories[typename]
|
| -
|
| - # TODO(vsm): Add appropriate package / namespace syntax.
|
| - (self._members_emitter,
|
| - self._top_level_emitter) = self._emitter.Emit(
|
| - self._template + '$!TOP_LEVEL',
|
| - ID=typename,
|
| - EXTENDS=extends_str)
|
| -
|
| - element_type = MaybeTypedArrayElementType(self._interface)
|
| - if element_type:
|
| - self._members_emitter.Emit(
|
| - '\n'
|
| - ' $CTOR(int length);\n'
|
| - '\n'
|
| - ' $CTOR.fromList(List<$TYPE> list);\n'
|
| - '\n'
|
| - ' $CTOR.fromBuffer(ArrayBuffer buffer);\n',
|
| - CTOR=self._interface.id,
|
| - TYPE=element_type)
|
| -
|
| -
|
| - def FinishInterface(self):
|
| - # TODO(vsm): Use typedef if / when that is supported in Dart.
|
| - # Define variant as subtype.
|
| - if (self._super_interface and
|
| - self._interface.id is not self._super_interface):
|
| - consts_emitter = self._top_level_emitter.Emit(
|
| - '\n'
|
| - 'interface $NAME extends $BASE {\n'
|
| - '$!CONSTS'
|
| - '}\n',
|
| - NAME=self._interface.id,
|
| - BASE=self._super_interface)
|
| - for const in sorted(self._interface.constants, ConstantOutputOrder):
|
| - self._EmitConstant(consts_emitter, const)
|
| -
|
| - def AddConstant(self, constant):
|
| - if (not self._super_interface or
|
| - self._interface.id is self._super_interface):
|
| - self._EmitConstant(self._members_emitter, constant)
|
| -
|
| - def _EmitConstant(self, emitter, constant):
|
| - emitter.Emit('\n static final $TYPE $NAME = $VALUE;\n',
|
| - NAME=constant.id,
|
| - TYPE=constant.type.id,
|
| - VALUE=constant.value)
|
| -
|
| - def AddAttribute(self, getter, setter):
|
| - if getter and setter and getter.type.id == setter.type.id:
|
| - self._members_emitter.Emit('\n $TYPE $NAME;\n',
|
| - NAME=getter.id, TYPE=getter.type.id);
|
| - return
|
| - if getter and not setter:
|
| - self._members_emitter.Emit('\n final $TYPE $NAME;\n',
|
| - NAME=getter.id, TYPE=getter.type.id);
|
| - return
|
| - raise Exception('Unexpected getter/setter combination %s %s' %
|
| - (getter, setter))
|
| -
|
| - def AddIndexer(self, element_type):
|
| - # Interface inherits all operations from List<element_type>.
|
| - pass
|
| -
|
| - def AddOperation(self, info):
|
| - """
|
| - Arguments:
|
| - operations - contains the overloads, one or more operations with the same
|
| - name.
|
| - """
|
| - self._members_emitter.Emit('\n'
|
| - ' $TYPE $NAME($PARAMS);\n',
|
| - TYPE=info.type_name,
|
| - NAME=info.name,
|
| - PARAMS=info.ParametersInterfaceDeclaration())
|
| -
|
| - # Interfaces get secondary members directly via the superinterfaces.
|
| - def AddSecondaryAttribute(self, interface, getter, setter):
|
| - pass
|
| -
|
| - def AddSecondaryOperation(self, interface, attr):
|
| - pass
|
| -
|
| - def AddEventAttributes(self, event_attrs):
|
| - pass
|
| -
|
| -# Given a sorted sequence of type identifiers, return an appropriate type
|
| -# name
|
| -def TypeName(typeIds, interface):
|
| - # Dynamically type this field for now.
|
| - return 'var'
|
| -
|
| -# ------------------------------------------------------------------------------
|
| -
|
| -class DummyInterfaceGenerator(object):
|
| - """Generates nothing."""
|
| -
|
| - def __init__(self, system, interface):
|
| - pass
|
| -
|
| - def StartInterface(self):
|
| - pass
|
| -
|
| - def FinishInterface(self):
|
| - pass
|
| -
|
| - def AddConstant(self, constant):
|
| - pass
|
| -
|
| - def AddAttribute(self, getter, setter):
|
| - pass
|
| -
|
| - def AddSecondaryAttribute(self, interface, getter, setter):
|
| - pass
|
| -
|
| - def AddSecondaryOperation(self, interface, info):
|
| - pass
|
| -
|
| - def AddIndexer(self, element_type):
|
| - pass
|
| -
|
| - def AddTypedArrayConstructors(self, element_type):
|
| - pass
|
| -
|
| - def AddOperation(self, info):
|
| - pass
|
| -
|
| - def AddEventAttributes(self, event_attrs):
|
| - pass
|
| -
|
|
|