From dd53948a23a2809630a754bf09c91de2ad051669 Mon Sep 17 00:00:00 2001 From: Lennart Spitzner Date: Tue, 1 May 2018 23:20:11 +0200 Subject: [PATCH] Fix IndentPolicyMultiple for indentAmount>4 --- .../40-indent-policy-multiple.blt | 18 ++++++-- .../Brittany/Internal/Transformations/Alt.hs | 44 +++++++++++-------- 2 files changed, 41 insertions(+), 21 deletions(-) diff --git a/src-literatetests/40-indent-policy-multiple.blt b/src-literatetests/40-indent-policy-multiple.blt index 80288bd..b75c726 100644 --- a/src-literatetests/40-indent-policy-multiple.blt +++ b/src-literatetests/40-indent-policy-multiple.blt @@ -12,14 +12,26 @@ func = mweroiuxlskdfjlksjdflkjsdfljksldkjflkjsdflkj + mweroiuxlskdfjlksjdflkjsdfljksldkjflkjsdflkj -#test let +#test let indAmount=4 -- brittany { lconfig_indentAmount: 4, lconfig_indentPolicy: IndentPolicyMultiple } foo = do - let - aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa = + let aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa foo +#test let indAmount=8 +-- brittany { lconfig_indentAmount: 8, lconfig_indentPolicy: IndentPolicyMultiple } +foo = do + let aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa = + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + foo +foo = do + let aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa = + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + foo + #test nested do-block -- brittany { lconfig_indentAmount: 4, lconfig_indentPolicy: IndentPolicyMultiple } foo = asdyf8asdf diff --git a/src/Language/Haskell/Brittany/Internal/Transformations/Alt.hs b/src/Language/Haskell/Brittany/Internal/Transformations/Alt.hs index 5b833fd..7361ce6 100644 --- a/src/Language/Haskell/Brittany/Internal/Transformations/Alt.hs +++ b/src/Language/Haskell/Brittany/Internal/Transformations/Alt.hs @@ -141,24 +141,14 @@ transformAlts = BDFSeparator -> processSpacingSimple bdX $> bdX BDFAddBaseY indent bd -> do acp <- mGet - indAmount <- mAsk <&> _conf_layout .> _lconfig_indentAmount .> confUnpack - indPolicy <- mAsk <&> _conf_layout .> _lconfig_indentPolicy .> confUnpack - let indAdd = case indent of - BrIndentNone -> 0 - BrIndentRegular -> indAmount - BrIndentSpecial i -> i - let indAdd' = - if indPolicy == IndentPolicyMultiple - then - max 0 (indAdd - ((_acp_indent acp + indAdd) `mod` indAmount)) - else indAdd - mSet $ acp { _acp_indentPrep = max (_acp_indentPrep acp) indAdd' } + indAdd <- fixIndentationForMultiple acp indent + mSet $ acp { _acp_indentPrep = max (_acp_indentPrep acp) indAdd } r <- rec bd acp' <- mGet mSet $ acp' { _acp_indent = _acp_indent acp } return $ case indent of BrIndentNone -> r - BrIndentRegular -> reWrap $ BDFAddBaseY (BrIndentSpecial indAdd') r + BrIndentRegular -> reWrap $ BDFAddBaseY (BrIndentSpecial indAdd) r BrIndentSpecial i -> reWrap $ BDFAddBaseY (BrIndentSpecial i) r BDFBaseYPushCur bd -> do acp <- mGet @@ -321,11 +311,7 @@ transformAlts = return $ reWrap $ BDFLines (l':lr') BDFEnsureIndent indent bd -> do acp <- mGet - indAmount <- mAsk <&> _conf_layout .> _lconfig_indentAmount .> confUnpack - let indAdd = case indent of - BrIndentNone -> 0 - BrIndentRegular -> indAmount - BrIndentSpecial i -> i + indAdd <- fixIndentationForMultiple acp indent mSet $ acp { _acp_indentPrep = 0 -- TODO: i am not sure this is valid, in general. @@ -863,3 +849,25 @@ getSpacings limit bridoc = preFilterLimit <$> rec bridoc VerticalSpacingParSome i -> VerticalSpacingParSome $ x1 `max` i VerticalSpacingParNone -> VerticalSpacingParSome $ x1 VerticalSpacingParAlways i -> VerticalSpacingParAlways $ x1 `max` i + +fixIndentationForMultiple + :: (MonadMultiReader (CConfig Identity) m) => AltCurPos -> BrIndent -> m Int +fixIndentationForMultiple acp indent = do + indAmount <- mAsk <&> _conf_layout .> _lconfig_indentAmount .> confUnpack + let indAddRaw = case indent of + BrIndentNone -> 0 + BrIndentRegular -> indAmount + BrIndentSpecial i -> i + -- for IndentPolicyMultiple, we restrict the amount of added + -- indentation in such a manner that we end up on a multiple of the + -- base indentation. + indPolicy <- mAsk <&> _conf_layout .> _lconfig_indentPolicy .> confUnpack + pure $ if indPolicy == IndentPolicyMultiple + then + let indAddMultiple1 = + indAddRaw - ((_acp_indent acp + indAddRaw) `mod` indAmount) + indAddMultiple2 = if indAddMultiple1 <= 0 + then indAddMultiple1 + indAmount + else indAddMultiple1 + in indAddMultiple2 + else indAddRaw