From cd9474a9695787666c6aadc333bc272c1e507397 Mon Sep 17 00:00:00 2001 From: Lennart Spitzner Date: Sat, 6 Aug 2016 19:36:47 +0200 Subject: [PATCH] Change layouting for lambda, app; Fix exponential behaviour --- src/Language/Haskell/Brittany/BriLayouter.hs | 13 +++++++++++-- src/Language/Haskell/Brittany/Layouters/Expr.hs | 14 +++++++++++--- 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/src/Language/Haskell/Brittany/BriLayouter.hs b/src/Language/Haskell/Brittany/BriLayouter.hs index 976a6ce..88013c4 100644 --- a/src/Language/Haskell/Brittany/BriLayouter.hs +++ b/src/Language/Haskell/Brittany/BriLayouter.hs @@ -631,7 +631,15 @@ getSpacings limit bridoc = rec bridoc VerticalSpacingParSome i -> i <= colMax VerticalSpacingParNonBottom -> True let filterAndLimit :: [VerticalSpacing] -> [VerticalSpacing] - filterAndLimit = forceList . take limit . filter hasOkColCount + filterAndLimit = forceList + . take limit + . filter hasOkColCount + . take (100*limit) -- we need to limit here in case + -- that the input list is + -- _large_ with a similarly _large_ + -- prefix not passing hasOkColCount + -- predicate. + -- TODO: 100 is arbitrary. forceList l = foldl (flip seq) l l result <- case brdc of -- BDWrapAnnKey _annKey bd -> rec bd @@ -730,7 +738,8 @@ getSpacings limit bridoc = rec bridoc lSpss <- rec `mapM` ls let worbled = fmap reverse $ sequence - $ reverse lSpss + $ reverse + $ lSpss summed = worbled <&> \lSps@(lSp1:_) -> VerticalSpacing (_vs_sameLine lSp1) (spMakePar $ maxVs lSps) diff --git a/src/Language/Haskell/Brittany/Layouters/Expr.hs b/src/Language/Haskell/Brittany/Layouters/Expr.hs index 6566756..8873e64 100644 --- a/src/Language/Haskell/Brittany/Layouters/Expr.hs +++ b/src/Language/Haskell/Brittany/Layouters/Expr.hs @@ -56,13 +56,15 @@ layoutExpr lexpr@(L _ expr) = docWrapNode lexpr $ case expr of docCols ColCasePattern $ (patDocs <&> (\p -> docSeq [docForceSingleline p, docSeparator])) docAlt - [ docSeq + [ docSetParSpacing + $ docSeq [ docLit $ Text.pack "\\" , docWrapNode lmatch $ docForceSingleline funcPatternPartLine , appSep $ docLit $ Text.pack "->" , docWrapNode lgrhs $ docForceParSpacing bodyDoc ] - , docAddBaseY BrIndentRegular + , docSetParSpacing + $ docAddBaseY BrIndentRegular $ docPar (docSeq [ docLit $ Text.pack "\\" @@ -120,6 +122,12 @@ layoutExpr lexpr@(L _ expr) = docWrapNode lexpr $ case expr of [ docSeq [appSep $ docForceSingleline expDoc1, docForceSingleline expDoc2] , docSetParSpacing $ docAddBaseY BrIndentRegular + $ docSeq + [ appSep $ docForceSingleline expDoc1 + , docForceParSpacing expDoc2 + ] + , docSetParSpacing + $ docAddBaseY BrIndentRegular $ docPar (docForceSingleline expDoc1) expDoc2 @@ -472,7 +480,7 @@ layoutExpr lexpr@(L _ expr) = docWrapNode lexpr $ case expr of $ docAddBaseY BrIndentRegular $ docPar (docLit t) - (docLines $ let + (docNonBottomSpacing $ docLines $ let line1 = docCols ColRecUpdate [ appSep $ docLit $ Text.pack "{" , appSep $ docLit $ fd1n