diff --git a/src/pystencilssfg/emission/file_printer.py b/src/pystencilssfg/emission/file_printer.py new file mode 100644 index 0000000000000000000000000000000000000000..2dc1e7b4891c9dcfefff8dcfc7e6f68966d379bc --- /dev/null +++ b/src/pystencilssfg/emission/file_printer.py @@ -0,0 +1,57 @@ +from __future__ import annotations +from textwrap import indent + +from ..ir import ( + SfgSourceFile, + SfgSourceFileType, + SfgNamespaceBlock, + SfgEntityDecl, + SfgEntityDef, +) +from ..ir.syntax import SfgNamespaceElement +from ..config import CodeStyle + + +class SfgFilePrinter: + def __init__(self, code_style: CodeStyle) -> None: + self._code_style = code_style + + def __call__(self, file: SfgSourceFile) -> str: + code = "" + + if file.file_type == SfgSourceFileType.HEADER: + code += "#pragma once\n" + + if file.prelude: + comment = "/**\n" + comment += indent(file.prelude, " * ") + comment += "\n */\n\n" + + code += comment + + for header in file.includes: + incl = str(header) if header.system_header else f'"{str(header)}"' + code += f"#include {incl}\n" + + if file.includes: + code += "\n" + + # Here begins the actual code + code += "\n\n".join(self.visit(elem) for elem in file.elements) + code += "\n" + return code + + def visit(self, elem: SfgNamespaceElement) -> str: + match elem: + case str(): + return elem + case SfgNamespaceBlock(name, elements): + code = f"namespace {name} {{\n" + code += self._code_style.indent( + "\n\n".join(self.visit(e) for e in elements) + ) + code += f"\n}} // namespace {name}" + case SfgEntityDecl(entity): + code += self.visit_decl(entity) + case SfgEntityDef(entity): + code += self.visit_defin(entity) diff --git a/src/pystencilssfg/ir/syntax.py b/src/pystencilssfg/ir/syntax.py index 2e924a032fe8c33d756a59fc62f9b5e6a2fdc732..42b705b46686a24dca8c181db6e54e8ee69fda8c 100644 --- a/src/pystencilssfg/ir/syntax.py +++ b/src/pystencilssfg/ir/syntax.py @@ -122,6 +122,8 @@ class SfgNamespaceBlock: parent: Parent namespace enclosing this namespace """ + __match_args__ = ("name", "elements",) + def __init__(self, namespace: SfgNamespace) -> None: self._namespace = namespace self._elements: list[SfgNamespaceElement] = []