Skip to content
Snippets Groups Projects

Improved Source File and Code Structure Modelling

Merged Frederik Hennig requested to merge fhennig/source-files into master
Viewing commit 87d35024
Show latest version
2 files
+ 59
0
Preferences
Compare changes
Files
2
+ 57
0
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)