From 3be468c23c822fccb6d58a7f29af55cd25408bba Mon Sep 17 00:00:00 2001 From: Frederik Hennig <frederik.hennig@fau.de> Date: Wed, 12 Feb 2025 13:15:27 +0100 Subject: [PATCH] use set().union instead of reduce. remove non-required imports in test_sycl. Add test for include sorting. --- src/pystencilssfg/ir/analysis.py | 22 +++++------------- tests/extensions/test_sycl.py | 2 -- tests/generator_scripts/index.yaml | 11 +++++++++ .../source/TestIncludeSorting.py | 23 +++++++++++++++++++ 4 files changed, 40 insertions(+), 18 deletions(-) create mode 100644 tests/generator_scripts/source/TestIncludeSorting.py diff --git a/src/pystencilssfg/ir/analysis.py b/src/pystencilssfg/ir/analysis.py index 5b6d2d6..4e43eb9 100644 --- a/src/pystencilssfg/ir/analysis.py +++ b/src/pystencilssfg/ir/analysis.py @@ -1,7 +1,5 @@ from __future__ import annotations -from functools import reduce - from ..lang import HeaderFile, includes from .syntax import ( SfgSourceFile, @@ -35,9 +33,7 @@ def collect_includes(file: SfgSourceFile) -> set[HeaderFile]: | SfgMethod(_, _, parameters) | SfgConstructor(_, parameters, _, _) ): - incls: set[HeaderFile] = reduce( - lambda accu, p: accu | includes(p), parameters, set() - ) + incls: set[HeaderFile] = set().union(*(includes(p) for p in parameters)) if isinstance(entity, (SfgFunction, SfgMethod)): incls |= includes(entity.return_type) return incls @@ -61,10 +57,8 @@ def collect_includes(file: SfgSourceFile) -> set[HeaderFile]: return set() case SfgCallTreeNode(): - return reduce( - lambda accu, child: accu | walk_syntax(child), - obj.children, - obj.required_includes, + return obj.required_includes.union( + *(walk_syntax(child) for child in obj.children), ) case SfgEntityDecl(entity): @@ -92,16 +86,12 @@ def collect_includes(file: SfgSourceFile) -> set[HeaderFile]: assert False, "unexpected entity" case SfgNamespaceBlock(_, elements) | SfgVisibilityBlock(_, elements): - return reduce( - lambda accu, elem: accu | walk_syntax(elem), elements, set() - ) # type: ignore + return set().union(*(walk_syntax(elem) for elem in elements)) # type: ignore case SfgClassBody(_, vblocks): - return reduce( - lambda accu, vblock: accu | walk_syntax(vblock), vblocks, set() - ) + return set().union(*(walk_syntax(vb) for vb in vblocks)) case _: assert False, "unexpected syntax element" - return reduce(lambda accu, elem: accu | walk_syntax(elem), file.elements, set()) + return set().union(*(walk_syntax(elem) for elem in file.elements)) diff --git a/tests/extensions/test_sycl.py b/tests/extensions/test_sycl.py index 0e067c8..71effb6 100644 --- a/tests/extensions/test_sycl.py +++ b/tests/extensions/test_sycl.py @@ -1,8 +1,6 @@ import pytest -from pystencilssfg import SourceFileGenerator import pystencilssfg.extensions.sycl as sycl import pystencils as ps -from pystencilssfg import SfgContext def test_parallel_for_1_kernels(sfg): diff --git a/tests/generator_scripts/index.yaml b/tests/generator_scripts/index.yaml index b723799..0e08e22 100644 --- a/tests/generator_scripts/index.yaml +++ b/tests/generator_scripts/index.yaml @@ -17,6 +17,17 @@ TestIllegalArgs: extra-args: [--sfg-file-extensionss, ".c++,.h++"] expect-failure: true +TestIncludeSorting: + sfg-args: + output-mode: header-only + expect-code: + hpp: + - regex: >- + #include\s\<memory>\s* + #include\s<vector>\s* + #include\s<array> + strip-whitespace: true + # Basic Composer Functionality BasicDefinitions: diff --git a/tests/generator_scripts/source/TestIncludeSorting.py b/tests/generator_scripts/source/TestIncludeSorting.py new file mode 100644 index 0000000..8a584f6 --- /dev/null +++ b/tests/generator_scripts/source/TestIncludeSorting.py @@ -0,0 +1,23 @@ +from pystencilssfg import SourceFileGenerator, SfgConfig +from pystencilssfg.lang import HeaderFile + + +def sortkey(h: HeaderFile): + try: + return [ + "memory", + "vector", + "array" + ].index(h.filepath) + except ValueError: + return 100 + + +cfg = SfgConfig() +cfg.codestyle.includes_sorting_key = sortkey + + +with SourceFileGenerator(cfg) as sfg: + sfg.include("<array>") + sfg.include("<memory>") + sfg.include("<vector>") -- GitLab