|
| 1 | +-------------------------------------------------------------------------------- |
| 2 | +module Language.Haskell.Stylish.Step.Squash |
| 3 | + ( step |
| 4 | + ) where |
| 5 | + |
| 6 | + |
| 7 | +-------------------------------------------------------------------------------- |
| 8 | +import Data.Maybe (mapMaybe) |
| 9 | +import qualified Language.Haskell.Exts as H |
| 10 | + |
| 11 | + |
| 12 | +-------------------------------------------------------------------------------- |
| 13 | +import Language.Haskell.Stylish.Editor |
| 14 | +import Language.Haskell.Stylish.Step |
| 15 | +import Language.Haskell.Stylish.Util |
| 16 | + |
| 17 | + |
| 18 | +-------------------------------------------------------------------------------- |
| 19 | +squash |
| 20 | + :: (H.Annotated l, H.Annotated r) |
| 21 | + => l H.SrcSpan -> r H.SrcSpan -> Maybe (Change String) |
| 22 | +squash left right |
| 23 | + | H.srcSpanEndLine lAnn == H.srcSpanStartLine rAnn = Just $ |
| 24 | + changeLine (H.srcSpanEndLine lAnn) $ \str -> |
| 25 | + let (pre, post) = splitAt (H.srcSpanEndColumn lAnn) str |
| 26 | + in [trimRight pre ++ " " ++ trimLeft post] |
| 27 | + | otherwise = Nothing |
| 28 | + where |
| 29 | + lAnn = H.ann left |
| 30 | + rAnn = H.ann right |
| 31 | + |
| 32 | + |
| 33 | +-------------------------------------------------------------------------------- |
| 34 | +squashFieldDecl :: H.FieldDecl H.SrcSpan -> Maybe (Change String) |
| 35 | +squashFieldDecl (H.FieldDecl _ names type') |
| 36 | + | null names = Nothing |
| 37 | + | otherwise = squash (last names) type' |
| 38 | + |
| 39 | + |
| 40 | +-------------------------------------------------------------------------------- |
| 41 | +squashMatch :: H.Match H.SrcSpan -> Maybe (Change String) |
| 42 | +squashMatch (H.InfixMatch _ _ _ _ _ _) = Nothing |
| 43 | +squashMatch (H.Match _ name pats rhs _) |
| 44 | + | null pats = squash name rhs |
| 45 | + | otherwise = squash (last pats) rhs |
| 46 | + |
| 47 | + |
| 48 | +-------------------------------------------------------------------------------- |
| 49 | +squashAlt :: H.Alt H.SrcSpan -> Maybe (Change String) |
| 50 | +squashAlt (H.Alt _ pat rhs _) = squash pat rhs |
| 51 | + |
| 52 | + |
| 53 | +-------------------------------------------------------------------------------- |
| 54 | +step :: Step |
| 55 | +step = makeStep "Squash" $ \ls (module', _) -> |
| 56 | + let module'' = fmap H.srcInfoSpan module' |
| 57 | + changes = concat |
| 58 | + [ mapMaybe squashAlt (everything module'') |
| 59 | + , mapMaybe squashMatch (everything module'') |
| 60 | + , mapMaybe squashFieldDecl (everything module'') |
| 61 | + ] |
| 62 | + in applyChanges changes ls |
0 commit comments