diff --git a/src/pystencilssfg/configuration.py b/src/pystencilssfg/configuration.py index 355be5e4c4d7bdd1a06724de253de9732971e30a..cee313f6626b6eb97c8294220663a92c640a9750 100644 --- a/src/pystencilssfg/configuration.py +++ b/src/pystencilssfg/configuration.py @@ -7,11 +7,10 @@ from os import path from enum import Enum, auto from dataclasses import dataclass, replace, asdict, InitVar from argparse import ArgumentParser +from textwrap import indent from importlib import util as iutil -from jinja2.filters import do_indent - from .exceptions import SfgException HEADER_FILE_EXTENSIONS = {'h', 'hpp'} @@ -39,7 +38,8 @@ class SfgCodeStyle: indent_width: int = 2 def indent(self, s: str): - return do_indent(s, self.indent_width, first=True) + prefix = " " * self.indent_width + return indent(s, prefix) @dataclass diff --git a/src/pystencilssfg/context.py b/src/pystencilssfg/context.py index 96649db9d7a3a9c7301df10dd6f8268d675b8505..e7c5ddfce9b1f8c9fc1f4888be0aa46a0be02822 100644 --- a/src/pystencilssfg/context.py +++ b/src/pystencilssfg/context.py @@ -15,7 +15,7 @@ class SfgContext: self._code_namespace: str | None = None # Source Components - self._prelude: list[str] = [] + self._prelude: str = "" self._includes: set[SfgHeaderInclude] = set() self._definitions: list[str] = [] self._kernel_namespaces = {self._default_kernel_namespace.name: self._default_kernel_namespace} @@ -58,12 +58,19 @@ class SfgContext: # Prelude, Includes, Definitions, Namespace # ---------------------------------------------------------------------------------------------- - def prelude(self) -> Generator[str, None, None]: + @property + def prelude_comment(self) -> str: """The prelude is a comment block printed at the top of both generated files.""" - yield from self._prelude + return self._prelude def append_to_prelude(self, code_str: str): - self._prelude.append(code_str) + if self._prelude: + self._prelude += "\n" + + self._prelude += code_str + + if not code_str.endswith("\n"): + self._prelude += "\n" def includes(self) -> Generator[SfgHeaderInclude, None, None]: """Includes of headers. Public includes are added to the header file, private includes diff --git a/src/pystencilssfg/emitters/cpu/basic_cpu.py b/src/pystencilssfg/emitters/cpu/basic_cpu.py index 25c952c8d6a39c55ea39bbf18f7c6f22600eb991..d49addd7e10856061369962ac23e58409d9e222e 100644 --- a/src/pystencilssfg/emitters/cpu/basic_cpu.py +++ b/src/pystencilssfg/emitters/cpu/basic_cpu.py @@ -1,5 +1,6 @@ from typing import cast from jinja2 import Environment, PackageLoader, StrictUndefined +from textwrap import indent from os import path @@ -59,13 +60,7 @@ class BasicCpuEmitter: def get_prelude_comment(ctx: SfgContext): - prelude_lines = [] - for p in ctx.prelude(): - prelude_lines += p.splitlines() - prelude_lines += [""] # empty line in-between - prelude_lines = prelude_lines[:-1] - - if not prelude_lines: + if not ctx.prelude_comment: return "" - return "\n".join(["/**"] + [f"* {line}" for line in prelude_lines] + ["*/"]) + return "/*\n" + indent(ctx.prelude_comment, "* ", predicate=lambda _: True) + "*/\n"