| # Copyright Bruno da Silva de Oliveira 2003. Use, modification and |
| # distribution is subject to the Boost Software License, Version 1.0. |
| # (See accompanying file LICENSE_1_0.txt or copy at |
| # http://www.boost.org/LICENSE_1_0.txt) |
| |
| from Exporter import Exporter |
| from ClassExporter import ClassExporter |
| from FunctionExporter import FunctionExporter |
| from EnumExporter import EnumExporter |
| from VarExporter import VarExporter |
| from infos import * |
| from declarations import * |
| import os.path |
| import exporters |
| import MultipleCodeUnit |
| |
| #============================================================================== |
| # HeaderExporter |
| #============================================================================== |
| class HeaderExporter(Exporter): |
| 'Exports all declarations found in the given header' |
| |
| def __init__(self, info, parser_tail=None): |
| Exporter.__init__(self, info, parser_tail) |
| |
| |
| def WriteInclude(self, codeunit): |
| pass |
| |
| |
| def IsInternalName(self, name): |
| '''Returns true if the given name looks like a internal compiler |
| structure''' |
| return name.startswith('_') |
| |
| |
| def Export(self, codeunit, exported_names): |
| header = os.path.normpath(self.parser_header) |
| for decl in self.declarations: |
| # check if this declaration is in the header |
| location = os.path.abspath(decl.location[0]) |
| if location == header and not self.IsInternalName(decl.name): |
| # ok, check the type of the declaration and export it accordingly |
| self.HandleDeclaration(decl, codeunit, exported_names) |
| |
| |
| def HandleDeclaration(self, decl, codeunit, exported_names): |
| '''Dispatch the declaration to the appropriate method, that must create |
| a suitable info object for a Exporter, create a Exporter, set its |
| declarations and append it to the list of exporters. |
| ''' |
| dispatch_table = { |
| Class : ClassExporter, |
| Enumeration : EnumExporter, |
| Function : FunctionExporter, |
| Variable : VarExporter, |
| } |
| |
| exporter_class = dispatch_table.get(type(decl)) |
| if exporter_class is not None: |
| self.HandleExporter(decl, exporter_class, codeunit, exported_names) |
| |
| |
| def HandleExporter(self, decl, exporter_type, codeunit, exported_names): |
| # only export complete declarations |
| if not decl.incomplete: |
| info = self.info[decl.name] |
| info.name = decl.FullName() |
| info.include = self.info.include |
| exporter = exporter_type(info) |
| exporter.SetDeclarations(self.declarations) |
| exporter.SetParsedHeader(self.parser_header) |
| if isinstance(codeunit, MultipleCodeUnit.MultipleCodeUnit): |
| codeunit.SetCurrent(self.interface_file, exporter.Name()) |
| else: |
| codeunit.SetCurrent(exporter.Name()) |
| exporter.GenerateCode(codeunit, exported_names) |
| |
| |
| def Name(self): |
| return self.info.include |