diff --git a/data/15-regressions.blt b/data/15-regressions.blt index ceb536e..6bc82cd 100644 --- a/data/15-regressions.blt +++ b/data/15-regressions.blt @@ -329,11 +329,13 @@ func = foooooooooooooooooooooooooooooooo #test opapp-specialcasing-3 -func = fooooooooooooooooooooooooooooooooo + foooooooooooooooooooooooooooooooo - [ foooooooooooooooooooooooooooooooo - , foooooooooooooooooooooooooooooooo - , foooooooooooooooooooooooooooooooo - ] +func = + fooooooooooooooooooooooooooooooooo + + foooooooooooooooooooooooooooooooo + [ foooooooooooooooooooooooooooooooo + , foooooooooooooooooooooooooooooooo + , foooooooooooooooooooooooooooooooo + ] #test opapp-indenting parserPrim = @@ -966,3 +968,8 @@ func = ) <$> mylist ) + +#test operator newline behaviour +func = + fromIntegral aaaaaaaaaaaaaaaaaaa + / fromIntegral (aaaaaaaaaaaaaaaaaaa + bbbbbbbbbbbbbbbbbb) diff --git a/data/30-tests-context-free.blt b/data/30-tests-context-free.blt index 36aaf62..dbe1273 100644 --- a/data/30-tests-context-free.blt +++ b/data/30-tests-context-free.blt @@ -1278,11 +1278,13 @@ func = foooooooooooooooooooooooooooooooo #test opapp-specialcasing-3 -func = fooooooooooooooooooooooooooooooooo + foooooooooooooooooooooooooooooooo - [ foooooooooooooooooooooooooooooooo - , foooooooooooooooooooooooooooooooo - , foooooooooooooooooooooooooooooooo - ] +func = + fooooooooooooooooooooooooooooooooo + + foooooooooooooooooooooooooooooooo + [ foooooooooooooooooooooooooooooooo + , foooooooooooooooooooooooooooooooo + , foooooooooooooooooooooooooooooooo + ] #test opapp-indenting parserPrim = diff --git a/source/library/Language/Haskell/Brittany/Internal/ToBriDoc/OpTree.hs b/source/library/Language/Haskell/Brittany/Internal/ToBriDoc/OpTree.hs index 0710caf..cb0421a 100644 --- a/source/library/Language/Haskell/Brittany/Internal/ToBriDoc/OpTree.hs +++ b/source/library/Language/Haskell/Brittany/Internal/ToBriDoc/OpTree.hs @@ -198,6 +198,9 @@ layoutOpTree allowSinglelinePar = \case pure (pure op, subDoc) sharedOpsFlat <- flattenList docOps sharedOps <- simpleTransform docOps + let lastWrap = if getPrec fixity <= 1 + then docForceParSpacing + else docForceSingleline coreAlternative hasParen locO locC @@ -205,11 +208,12 @@ layoutOpTree allowSinglelinePar = \case docL sharedOps sharedOpsFlat - docForceParSpacing + lastWrap OpLeaf l -> pure l where - isPrec0 = \case - Fixity _ prec _ -> prec == 0 + isPrec0 x = getPrec x == 0 + getPrec = \case + Fixity _ prec _ -> prec coreAlternative :: Bool -> Maybe GHC.RealSrcLoc @@ -268,33 +272,35 @@ layoutOpTree allowSinglelinePar = \case $ wrapParenIfSl hasParen $ docSetParSpacing $ docSeq - ([docForceSingleline docL] ++ case splitFirstLast sharedOpsFlat of - FirstLastEmpty -> [] - FirstLastSingleton (od, ed) -> - [docSeparator, docForceSingleline od, docSeparator, lastWrap ed] - FirstLast (od1, ed1) ems (odN, edN) -> - ( [ docSeparator - , docForceSingleline od1 - , docSeparator - , docForceSingleline ed1 - ] - ++ join - [ [ docSeparator - , docForceSingleline od + ([docForceSingleline docL] ++ case splitFirstLast sharedOpsFlat of + FirstLastEmpty -> [] + FirstLastSingleton (od, ed) -> + [ docSeparator + , docForceSingleline od + , docSeparator + , lastWrap ed + ] + FirstLast (od1, ed1) ems (odN, edN) -> + ( [ docSeparator + , docForceSingleline od1 , docSeparator - , docForceSingleline ed + , docForceSingleline ed1 ] - | (od, ed) <- ems - ] - ++ [ docSeparator - , docForceSingleline odN - , docSeparator - , lastWrap edN - ] + ++ join + [ [ docSeparator + , docForceSingleline od + , docSeparator + , docForceSingleline ed + ] + | (od, ed) <- ems + ] + ++ [ docSeparator + , docForceSingleline odN + , docSeparator + , lastWrap edN + ] + ) ) - ) - -- this case rather leads to some unfortunate layouting than to anything - -- useful; disabling for now. (it interfers with cols stuff.) -- one -- + two -- + three @@ -308,15 +314,14 @@ layoutOpTree allowSinglelinePar = \case IndentPolicyMultiple -> docForceSingleline IndentPolicyFree -> id let curIsPrec0 = case fixity of - Nothing -> False + Nothing -> False Just (Fixity _ prec _) -> prec == 0 case sharedOps of [(od, ed)] | curIsPrec0 -> addAlternativeCond (not hasParen && isSingleOp) $ docSetParSpacing - $ docPar - (docHandleComms locO $ docForceSingleline $ docL) - (docSeq [od, docSeparator, singlelineUnlessFree ed]) + $ docPar (docHandleComms locO $ docForceSingleline $ docL) + (docSeq [od, docSeparator, singlelineUnlessFree ed]) _ -> pure () -- > ( one -- > + two @@ -334,9 +339,9 @@ layoutOpTree allowSinglelinePar = \case -- > + three addAlternative $ wrapParenMlIf - hasParen + hasParen -- ((if not hasParen then docAddBaseY BrIndentRegular else id) docL) - (if hasParen then docSetBaseY docL else docL) - ((if hasParen then sharedOps else sharedOpsFlat) <&> \(od, ed) -> - docCols ColOpPrefix [appSep od, docSetBaseY ed] - ) + (if hasParen then docSetBaseY docL else docL) + ((if hasParen then sharedOps else sharedOpsFlat) <&> \(od, ed) -> + docCols ColOpPrefix [appSep od, docSetBaseY ed] + )