Fix ExplicitList comment insertion (fixes #18)

pull/35/head
Lennart Spitzner 2017-05-02 14:20:58 +02:00
parent 26ffb40fb4
commit f6324da600
3 changed files with 53 additions and 13 deletions

View File

@ -745,6 +745,12 @@ foo = Reflex.runSpiderHost $ ReflexHost.hostApp $ do
foldrDesc f z = unSwitchQueue $ \q ->
switch (Min.foldrDesc (f unTaggedF) z q) (Min.foldrAsc (f unTaggedF) z q)
#test issue 18
autocheckCases =
[ ("Never Deadlocks", representative deadlocksNever)
, ("No Exceptions", representative exceptionsNever)
, ("Consistent Result", alwaysSame) -- already representative
]
###############################################################################
###############################################################################

View File

@ -21,6 +21,7 @@ import Name
import qualified FastString
import BasicTypes
import Language.Haskell.Brittany.Utils
import Language.Haskell.Brittany.Layouters.Pattern
import Language.Haskell.Brittany.Layouters.Decl
import Language.Haskell.Brittany.Layouters.Stmt
@ -547,18 +548,39 @@ layoutExpr lexpr@(L _ expr) = docWrapNode lexpr $ case expr of
unknownNodeError "HsDo{} no comp" lexpr
ExplicitList _ _ elems@(_:_) -> do
elemDocs <- elems `forM` docSharedWrapper layoutExpr
case splitFirstLast elemDocs of
FirstLastEmpty -> docSeq
[ docLit $ Text.pack "["
, docNodeAnnKW lexpr (Just AnnOpenS) $ docLit $ Text.pack "]"
]
FirstLastSingleton e -> docAlt
[ docSeq
[ docLit $ Text.pack "["
, docNodeAnnKW lexpr (Just AnnOpenS) $ docForceSingleline e
, docLit $ Text.pack "]"
]
, docSetBaseY $ docLines
[ docSeq
[ docLit $ Text.pack "["
, docNodeAnnKW lexpr (Just AnnOpenS) $ docForceSingleline e
]
, docLit $ Text.pack "]"
]
]
FirstLast e1 ems eN ->
docAlt
[ docSeq
$ [docLit $ Text.pack "["]
++ List.intersperse docCommaSep (docForceSingleline <$> elemDocs)
++ List.intersperse docCommaSep (docForceSingleline <$> (e1:ems ++ [docNodeAnnKW lexpr (Just AnnOpenS) eN]))
++ [docLit $ Text.pack "]"]
, let
start = docCols ColList
[appSep $ docLit $ Text.pack "[", List.head elemDocs]
lines = List.tail elemDocs <&> \d ->
[appSep $ docLit $ Text.pack "[", e1]
linesM = ems <&> \d ->
docCols ColList [docCommaSep, d]
lineN = docCols ColList [docCommaSep, docNodeAnnKW lexpr (Just AnnOpenS) eN]
end = docLit $ Text.pack "]"
in docSetBaseY $ docLines $ [start] ++ lines ++ [end]
in docSetBaseY $ docLines $ [start] ++ linesM ++ [lineN] ++ [end]
]
ExplicitList _ _ [] ->
docLit $ Text.pack "[]"

View File

@ -22,6 +22,8 @@ module Language.Haskell.Brittany.Utils
, spanMaybe
, transformUp
, transformDownMay
, FirstLastView(..)
, splitFirstLast
)
where
@ -266,6 +268,16 @@ spanMaybe f (x1:xR) | Just y <- f x1 = (y : ys, xs)
(ys, xs) = spanMaybe f xR
spanMaybe _ xs = ([], xs)
data FirstLastView a
= FirstLastEmpty
| FirstLastSingleton a
| FirstLast a [a] a
splitFirstLast :: [a] -> FirstLastView a
splitFirstLast [] = FirstLastEmpty
splitFirstLast [x] = FirstLastSingleton x
splitFirstLast (x1:xr) = FirstLast x1 (List.init xr) (List.last xr)
-- TODO: move to uniplate upstream?
-- aka `transform`
transformUp :: Uniplate.Uniplate on => (on -> on) -> (on -> on)