From a5342e4d319c80cafbdae975af57cbba53cbd7b3 Mon Sep 17 00:00:00 2001 From: Simon Jakobi Date: Fri, 5 Dec 2025 11:18:17 +0100 Subject: [PATCH 1/2] Add performance test for #205 When the timeout limit is raised, the test finishes after ~8s on my laptop. --- prettyprinter/test/Testsuite/Main.hs | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/prettyprinter/test/Testsuite/Main.hs b/prettyprinter/test/Testsuite/Main.hs index 956dc829..6b18f400 100644 --- a/prettyprinter/test/Testsuite/Main.hs +++ b/prettyprinter/test/Testsuite/Main.hs @@ -53,6 +53,8 @@ tests = testGroup "Tests" groupingPerformance , testCase "fillSep performance" fillSepPerformance + , testCase "Issue 205" + issue205 ] , testGroup "Regression tests" [ testCase "layoutSmart: softline behaves like a newline (#49)" @@ -285,6 +287,14 @@ fillSepPerformance = docPerformanceTest (pathological 1000) pathological :: Int -> Doc ann pathological n = iterate (\x -> fillSep ["a", x <+> "b"] ) "foobar" !! n +issue205 :: Assertion +issue205 = do + let doc = fillSep (replicate 30 (sep ["abc", "xyz" :: Doc ()])) + t = renderStrict (layoutSmart defaultLayoutOptions doc) + timeout 1000000 (evaluate t) >>= \t' -> case t' of + Nothing -> assertFailure "Timeout!" + Just _success -> pure () + regressionLayoutSmartSoftline :: Assertion regressionLayoutSmartSoftline = let doc = "a" <> softline <> "b" From 8cb05e34c4139c7d2ad47cc54fd4bc5bfcb8c19a Mon Sep 17 00:00:00 2001 From: Simon Jakobi Date: Fri, 5 Dec 2025 11:34:15 +0100 Subject: [PATCH 2/2] Revert "layoutWL: Don't let indentation result in trailing whitespace (#139)" This reverts commit 9635a5d694b934e8cac6abe158614ac17a8a89b8. Fixes #205. --- prettyprinter/src/Prettyprinter/Internal.hs | 10 +--------- prettyprinter/test/Testsuite/Main.hs | 10 ---------- 2 files changed, 1 insertion(+), 19 deletions(-) diff --git a/prettyprinter/src/Prettyprinter/Internal.hs b/prettyprinter/src/Prettyprinter/Internal.hs index 25cd6afe..596742cf 100755 --- a/prettyprinter/src/Prettyprinter/Internal.hs +++ b/prettyprinter/src/Prettyprinter/Internal.hs @@ -2073,15 +2073,7 @@ layoutWadlerLeijen Empty -> best nl cc ds Char c -> let !cc' = cc+1 in SChar c (best nl cc' ds) Text l t -> let !cc' = cc+l in SText l t (best nl cc' ds) - Line -> let x = best i i ds - -- Don't produce indentation if there's no - -- following text on the same line. - -- This prevents trailing whitespace. - i' = case x of - SEmpty -> 0 - SLine{} -> 0 - _ -> i - in SLine i' x + Line -> SLine i (best i i ds) FlatAlt x _ -> best nl cc (Cons i x ds) Cat x y -> best nl cc (Cons i x (Cons i y ds)) Nest j x -> let !ij = i+j in best nl cc (Cons ij x ds) diff --git a/prettyprinter/test/Testsuite/Main.hs b/prettyprinter/test/Testsuite/Main.hs index 6b18f400..7af3f815 100644 --- a/prettyprinter/test/Testsuite/Main.hs +++ b/prettyprinter/test/Testsuite/Main.hs @@ -90,8 +90,6 @@ tests = testGroup "Tests" [ testCase "Line" regressionUnboundedGroupedLine , testCase "Line within align" regressionUnboundedGroupedLineWithinAlign ] - , testCase "Indentation on otherwise empty lines results in trailing whitespace (#139)" - indentationShouldntCauseTrailingWhitespaceOnOtherwiseEmptyLines , testCase "Ribbon width should be computed with `floor` instead of `round` (#157)" computeRibbonWidthWithFloor ] @@ -395,14 +393,6 @@ regressionUnboundedGroupedLineWithinAlign expected = SChar 'x' (SLine 0 (SChar 'y' SEmpty)) in assertEqual "" expected sdoc -indentationShouldntCauseTrailingWhitespaceOnOtherwiseEmptyLines :: Assertion -indentationShouldntCauseTrailingWhitespaceOnOtherwiseEmptyLines - = let doc :: Doc () - doc = indent 1 ("x" <> hardline <> hardline <> "y" <> hardline) - sdoc = layoutPretty (LayoutOptions Unbounded) doc - expected = SChar ' ' (SChar 'x' (SLine 0 (SLine 1 (SChar 'y' (SLine 0 SEmpty))))) - in assertEqual "" expected sdoc - computeRibbonWidthWithFloor :: Assertion computeRibbonWidthWithFloor = let doc :: Doc ()