From 043b554a89ee1ddccfea20c36e7f14c0bb5e28fd Mon Sep 17 00:00:00 2001
From: Lennart Spitzner <hexagoxel@hexagoxel.de>
Date: Sun, 28 May 2023 16:32:49 +0200
Subject: [PATCH] Do not retain newlines when refactoring list into single line

---
 data/10-structured/expression-list.blt        | 23 +++++++++++++++++++
 .../Brittany/Internal/S3_ToBriDocTools.hs     |  9 +++++---
 .../Brittany/Internal/ToBriDoc/Expr.hs        | 22 +++++++++++++-----
 3 files changed, 45 insertions(+), 9 deletions(-)
 create mode 100644 data/10-structured/expression-list.blt

diff --git a/data/10-structured/expression-list.blt b/data/10-structured/expression-list.blt
new file mode 100644
index 0000000..ad8c8f2
--- /dev/null
+++ b/data/10-structured/expression-list.blt
@@ -0,0 +1,23 @@
+#group expression/list
+
+#golden list format into singleline should not keep spacing
+foo =
+  [ 1
+  , 2
+  , 3
+  , 4
+  , 5
+  ]
+#expected
+foo = [1, 2, 3, 4, 5]
+
+#golden singleline list with comment
+foo = [1 {- a -}, {- b -} 2, {- c -} 3, 4, 5]
+#expected
+foo =
+  [ 1 {- a -}
+  , {- b -} 2
+  , {- c -} 3
+  , 4
+  , 5
+  ]
diff --git a/source/library/Language/Haskell/Brittany/Internal/S3_ToBriDocTools.hs b/source/library/Language/Haskell/Brittany/Internal/S3_ToBriDocTools.hs
index fc43352..ba57df0 100644
--- a/source/library/Language/Haskell/Brittany/Internal/S3_ToBriDocTools.hs
+++ b/source/library/Language/Haskell/Brittany/Internal/S3_ToBriDocTools.hs
@@ -795,7 +795,8 @@ docHandleListElemComms layouter e = case obtainListElemStartCommaLocs e of
 docHandleListElemCommsProperPost
   :: (LocatedA ast -> ToBriDocM BriDocNumbered)
   -> [LocatedA ast]
-  -> ToBriDocM [(Maybe GHC.RealSrcLoc, ToBriDocM BriDocNumbered)]
+  -> ToBriDocM
+       [(Maybe GHC.RealSrcLoc, LocatedA ast, ToBriDocM BriDocNumbered)]
 docHandleListElemCommsProperPost layouter es = case es of
   []          -> pure []
   (e1 : rest) -> case obtainListElemStartCommaLocs e1 of
@@ -803,7 +804,8 @@ docHandleListElemCommsProperPost layouter es = case es of
       res <- go posComma rest
       pure
         $ ( Nothing
-          , docFlushCommsPost True e1 $ docHandleComms posStart $ layouter e1
+          , e1
+          , docHandleComms posStart $ layouter e1
           )
         : res
  where
@@ -813,7 +815,8 @@ docHandleListElemCommsProperPost layouter es = case es of
       res <- go posComma rest
       pure
         $ ( intoComma
-          , docFlushCommsPost True e1 $ docHandleComms posStart $ layouter e1
+          , e1
+          , docHandleComms posStart $ layouter e1
           )
         : res
 
diff --git a/source/library/Language/Haskell/Brittany/Internal/ToBriDoc/Expr.hs b/source/library/Language/Haskell/Brittany/Internal/ToBriDoc/Expr.hs
index 8d94308..278e93b 100644
--- a/source/library/Language/Haskell/Brittany/Internal/ToBriDoc/Expr.hs
+++ b/source/library/Language/Haskell/Brittany/Internal/ToBriDoc/Expr.hs
@@ -699,17 +699,23 @@ layoutExpr lexpr@(L _ expr) = do
       let hasComments = hasAnyCommentsBelow lexpr
       case splitFirstLast elemDocs of
         FirstLastEmpty       -> docSeq [docLit $ Text.pack "[", closeDoc]
-        FirstLastSingleton (_, e) -> docAlt
+        FirstLastSingleton (_, ast, e) -> docAlt
           [ docSeq [openDoc, docForceSingleline e, closeDoc]
           , docSetBaseY $ docLines
-            [docSeq [openDoc, docSeparator, docSetBaseY $ e], closeDoc]
+            [ docSeq
+              [ openDoc
+              , docSeparator
+              , docSetBaseY $ docFlushCommsPost True ast e
+              ]
+            , closeDoc
+            ]
           ]
-        FirstLast (_, e1) ems (finalCommaPos, eN) -> runFilteredAlternative $ do
+        FirstLast (_, _, e1) ems (finalCommaPos, _, eN) -> runFilteredAlternative $ do
           addAlternativeCond (not hasComments)
             $  docSeq
             $  [openDoc, docForceSingleline e1]
             ++ [ x
-               | (commaPos, e) <- ems
+               | (commaPos, _, e) <- ems
                , x <- [docHandleComms commaPos docCommaSep, docForceSingleline e]
                ]
             ++ [ docHandleComms finalCommaPos docCommaSep
@@ -717,8 +723,12 @@ layoutExpr lexpr@(L _ expr) = do
                , closeDoc]
           addAlternative
             $ let start  = docCols ColList [appSep $ openDoc, e1]
-                  linesM = ems <&> \(p, d) ->
-                    docCols ColList [docHandleComms p docCommaSep, d]
+                  linesM = ems <&> \(p, ast, d) ->
+                    docCols
+                      ColList
+                      [ docHandleComms p docCommaSep
+                      , docFlushCommsPost True ast $ d
+                      ]
                   lineN  = docCols ColList
                     [docHandleComms finalCommaPos $ docCommaSep, eN]
               in  docSetBaseY