diff options
Diffstat (limited to 'libs/python/pyste/src/Pyste/HeaderExporter.py')
-rw-r--r-- | libs/python/pyste/src/Pyste/HeaderExporter.py | 81 |
1 files changed, 81 insertions, 0 deletions
diff --git a/libs/python/pyste/src/Pyste/HeaderExporter.py b/libs/python/pyste/src/Pyste/HeaderExporter.py new file mode 100644 index 000000000..47651ba70 --- /dev/null +++ b/libs/python/pyste/src/Pyste/HeaderExporter.py @@ -0,0 +1,81 @@ +# 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 |