Skip to content
Snippets Groups Projects
Commit 87d35024 authored by Frederik Hennig's avatar Frederik Hennig
Browse files

start writing printer

parent a87856af
Branches
Tags
1 merge request!17Improved Source File and Code Structure Modelling
Pipeline #73650 failed with stages
in 1 minute and 9 seconds
This commit is part of merge request !17. Comments created here will be created in the context of that merge request.
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)
......@@ -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] = []
......
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment