#!/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;