From 5c64928972c6bed09ae6d44be4070114b595335e Mon Sep 17 00:00:00 2001 From: Lennart Spitzner Date: Tue, 21 Apr 2020 01:34:31 +0200 Subject: [PATCH] Fix problem of do notation as left argument of an operator --- src-literatetests/15-regressions.blt | 7 ++++ .../Brittany/Internal/Layouters/Expr.hs | 34 +++++++++++-------- 2 files changed, 27 insertions(+), 14 deletions(-) diff --git a/src-literatetests/15-regressions.blt b/src-literatetests/15-regressions.blt index a6a0274..7fa47e0 100644 --- a/src-literatetests/15-regressions.blt +++ b/src-literatetests/15-regressions.blt @@ -877,3 +877,10 @@ instance HasDependencies SomeDataModel where -- between these data models or whatever. type Dependencies SomeDataModel = (SomeOtherDataModelId, SomeOtherOtherDataModelId) + +#test stupid-do-operator-combination + +func = + do + y + >>= x diff --git a/src/Language/Haskell/Brittany/Internal/Layouters/Expr.hs b/src/Language/Haskell/Brittany/Internal/Layouters/Expr.hs index bc43fe2..660355c 100644 --- a/src/Language/Haskell/Brittany/Internal/Layouters/Expr.hs +++ b/src/Language/Haskell/Brittany/Internal/Layouters/Expr.hs @@ -426,6 +426,9 @@ layoutExpr lexpr@(L _ expr) = do (_, L _ (HsApp _ (L _ HsVar{}))) -> False _ -> True #endif + let leftIsDoBlock = case expLeft of + L _ HsDo{} -> True + _ -> False runFilteredAlternative $ do -- one-line addAlternative @@ -442,16 +445,17 @@ layoutExpr lexpr@(L _ expr) = do -- , docSetBaseY $ docAddBaseY BrIndentRegular expDocRight -- ] -- two-line - addAlternative - $ docAddBaseY BrIndentRegular - $ docPar - expDocLeft -- TODO: this is not forced to single-line, which has - -- certain.. interesting consequences. - -- At least, the "two-line" label is not entirely - -- accurate. - ( docForceSingleline + addAlternative $ do + let + expDocOpAndRight = docForceSingleline $ docCols ColOpPrefix [appSep $ expDocOp, docSetBaseY expDocRight] - ) + if leftIsDoBlock + then docLines [expDocLeft, expDocOpAndRight] + else docAddBaseY BrIndentRegular $ docPar expDocLeft expDocOpAndRight + -- TODO: in both cases, we don't force expDocLeft to be + -- single-line, which has certain.. interesting consequences. + -- At least, the "two-line" label is not entirely + -- accurate. -- one-line + par addAlternativeCond allowPar $ docSeq @@ -460,11 +464,13 @@ layoutExpr lexpr@(L _ expr) = do , docForceParSpacing expDocRight ] -- more lines - addAlternative - $ docAddBaseY BrIndentRegular - $ docPar - expDocLeft - (docCols ColOpPrefix [appSep expDocOp, docSetBaseY expDocRight]) + addAlternative $ do + let expDocOpAndRight = + docCols ColOpPrefix [appSep expDocOp, docSetBaseY expDocRight] + if leftIsDoBlock + then docLines [expDocLeft, expDocOpAndRight] + else docAddBaseY BrIndentRegular + $ docPar expDocLeft expDocOpAndRight #if MIN_VERSION_ghc(8,6,0) /* ghc-8.6 */ NegApp _ op _ -> do #else