| #!/usr/bin/python | 
 | # Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file | 
 | # for details. All rights reserved. Use of this source code is governed by a | 
 | # BSD-style license that can be found in the LICENSE file. | 
 |  | 
 | """This module provides base functionality for systems to generate | 
 | Dart APIs from the IDL database.""" | 
 |  | 
 | import os | 
 | #import re | 
 | import generator | 
 |  | 
 | def MassagePath(path): | 
 |   # The most robust way to emit path separators is to use / always. | 
 |   return path.replace('\\', '/') | 
 |  | 
 | class System(object): | 
 |   """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 | 
 |     self._database = database | 
 |     self._emitters = emitters | 
 |     self._output_dir = output_dir | 
 |     self._dart_callback_file_paths = [] | 
 |  | 
 |   def InterfaceGenerator(self, | 
 |                          interface, | 
 |                          common_prefix, | 
 |                          super_interface_name, | 
 |                          source_filter): | 
 |     """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): | 
 |     pass | 
 |  | 
 |   def Finish(self): | 
 |     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) | 
 |     code = self._emitters.FileEmitter(file_path) | 
 |  | 
 |     code.Emit(self._templates.Load('callback.darttemplate')) | 
 |     code.Emit('typedef $TYPE $NAME($PARAMS);\n', | 
 |               NAME=interface.id, | 
 |               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) | 
 |     # Generate the .lib file. | 
 |     lib_file_contents = self._emitters.FileEmitter(lib_file_path) | 
 |  | 
 |     # Emit the list of #source directives. | 
 |     list_emitter = lib_file_contents.Emit(template, **template_args) | 
 |     lib_file_dir = os.path.dirname(lib_file_path) | 
 |     for path in sorted(file_paths): | 
 |       relpath = os.path.relpath(path, lib_file_dir) | 
 |       list_emitter.Emit("#source('$PATH');\n", PATH=MassagePath(relpath)) | 
 |  | 
 |  | 
 |   def _BaseDefines(self, interface): | 
 |     """Returns a set of names (strings) for members defined in a base class. | 
 |     """ | 
 |     def WalkParentChain(interface): | 
 |       if interface.parents: | 
 |         # Only consider primary parent, secondary parents are not on the | 
 |         # implementation class inheritance chain. | 
 |         parent = interface.parents[0] | 
 |         if generator.IsDartCollectionType(parent.type.id): | 
 |           return | 
 |         if self._database.HasInterface(parent.type.id): | 
 |           parent_interface = self._database.GetInterface(parent.type.id) | 
 |           for attr in parent_interface.attributes: | 
 |             result.add(attr.id) | 
 |           for op in parent_interface.operations: | 
 |             result.add(op.id) | 
 |           WalkParentChain(parent_interface) | 
 |  | 
 |     result = set() | 
 |     WalkParentChain(interface) | 
 |     return result; |