From ca42178eff87d2a0f115d0d8a3b74787f3386757 Mon Sep 17 00:00:00 2001 From: Lennart Spitzner Date: Tue, 2 May 2017 16:20:35 +0200 Subject: [PATCH] Improve tuple layouting (also fixes #18 for tuples) --- src-literatetests/tests.blt | 14 ++++- .../Haskell/Brittany/Layouters/Expr.hs | 52 ++++++++++++++----- src/Language/Haskell/Brittany/Types.hs | 2 + 3 files changed, 53 insertions(+), 15 deletions(-) diff --git a/src-literatetests/tests.blt b/src-literatetests/tests.blt index fef40d9..d3e3ad5 100644 --- a/src-literatetests/tests.blt +++ b/src-literatetests/tests.blt @@ -747,11 +747,21 @@ foldrDesc f z = unSwitchQueue $ \q -> #test issue 18 autocheckCases = - [ ("Never Deadlocks", representative deadlocksNever) - , ("No Exceptions", representative exceptionsNever) + [ ("Never Deadlocks" , representative deadlocksNever) + , ("No Exceptions" , representative exceptionsNever) , ("Consistent Result", alwaysSame) -- already representative ] +#test issue 18b +autocheckCases = + [ ("Never Deadlocks", representative deadlocksNever) + , ("No Exceptions" , representative exceptionsNever) + , ( "Consistent Result" + , alwaysSame -- already representative + ) + ] + + ############################################################################### ############################################################################### ############################################################################### diff --git a/src/Language/Haskell/Brittany/Layouters/Expr.hs b/src/Language/Haskell/Brittany/Layouters/Expr.hs index 4b1f3f7..009001f 100644 --- a/src/Language/Haskell/Brittany/Layouters/Expr.hs +++ b/src/Language/Haskell/Brittany/Layouters/Expr.hs @@ -283,21 +283,47 @@ layoutExpr lexpr@(L _ expr) = docWrapNode lexpr $ case expr of ExplicitTuple args boxity | Just argExprs <- args `forM` (\case (L _ (Present e)) -> Just e; _ -> Nothing) -> do argDocs <- docSharedWrapper layoutExpr `mapM` argExprs - case boxity of - Boxed -> docAlt - [ docSeq - $ [ docLit $ Text.pack "(" ] - ++ List.intersperse (appSep $ docLit $ Text.pack ",") argDocs - ++ [ docLit $ Text.pack ")"] - -- TODO + hasComments <- hasAnyCommentsBelow lexpr + let (openLit, closeLit) = case boxity of + Boxed -> (docLit $ Text.pack "(", docLit $ Text.pack ")") + Unboxed -> (docLit $ Text.pack "(#", docLit $ Text.pack "#)") + case splitFirstLast argDocs of + FirstLastEmpty -> docSeq + [ openLit + , docNodeAnnKW lexpr (Just AnnOpenP) $ closeLit ] - Unboxed -> docAlt - [ docSeq - $ [ docLit $ Text.pack "(#" ] - ++ List.intersperse (appSep $ docLit $ Text.pack ",") argDocs - ++ [ docLit $ Text.pack "#)"] - -- TODO + FirstLastSingleton e -> docAlt + [ docCols ColTuple + [ openLit + , docNodeAnnKW lexpr (Just AnnOpenP) $ docForceSingleline e + , closeLit + ] + , docSetBaseY $ docLines + [ docSeq + [ openLit + , docNodeAnnKW lexpr (Just AnnOpenP) $ docForceSingleline e + ] + , closeLit + ] ] + FirstLast e1 ems eN -> + docAltFilter + [ (,) (not hasComments) + $ docCols ColTuple + ( [docSeq [openLit, docForceSingleline e1]] + ++ (ems <&> \e -> docSeq [docCommaSep, docForceSingleline e]) + ++ [docSeq [docCommaSep, docNodeAnnKW lexpr (Just AnnOpenP) (docForceSingleline eN), closeLit]] + ) + , (,) True + $ let + start = docCols ColTuples + [appSep $ openLit, e1] + linesM = ems <&> \d -> + docCols ColTuples [docCommaSep, d] + lineN = docCols ColTuples [docCommaSep, docNodeAnnKW lexpr (Just AnnOpenP) eN] + end = closeLit + in docSetBaseY $ docLines $ [start] ++ linesM ++ [lineN] ++ [end] + ] ExplicitTuple{} -> unknownNodeError "ExplicitTuple|.." lexpr HsCase cExp (MG lmatches@(L _ matches) _ _ _) -> do diff --git a/src/Language/Haskell/Brittany/Types.hs b/src/Language/Haskell/Brittany/Types.hs index 265551c..941a922 100644 --- a/src/Language/Haskell/Brittany/Types.hs +++ b/src/Language/Haskell/Brittany/Types.hs @@ -168,6 +168,8 @@ data ColSig | ColListComp | ColList | ColApp + | ColTuple + | ColTuples | ColOpPrefix -- merge with ColList ? other stuff? -- TODO