stylish-haskell-0.14.0.0: lib/Language/Haskell/Stylish/Step/Squash.hs
--------------------------------------------------------------------------------
{-# LANGUAGE PartialTypeSignatures #-}
{-# LANGUAGE PatternGuards #-}
{-# LANGUAGE TypeFamilies #-}
module Language.Haskell.Stylish.Step.Squash
( step
) where
--------------------------------------------------------------------------------
import Control.Monad (guard)
import Data.Maybe (mapMaybe)
import qualified GHC.Types.SrcLoc as GHC
import qualified GHC.Hs as GHC
--------------------------------------------------------------------------------
import Language.Haskell.Stylish.Editor
import Language.Haskell.Stylish.Step
import Language.Haskell.Stylish.Util
--------------------------------------------------------------------------------
squash :: GHC.SrcSpan -> GHC.SrcSpan -> Maybe (Change String)
squash left right = do
l <- GHC.srcSpanToRealSrcSpan left
r <- GHC.srcSpanToRealSrcSpan right
guard $
GHC.srcSpanEndLine l == GHC.srcSpanStartLine r ||
GHC.srcSpanEndLine l + 1 == GHC.srcSpanStartLine r
pure $ changeLine (GHC.srcSpanEndLine l) $ \str ->
let (pre, post) = splitAt (GHC.srcSpanEndCol l) str
in [trimRight pre ++ " " ++ trimLeft post]
--------------------------------------------------------------------------------
squashFieldDecl :: GHC.ConDeclField GHC.GhcPs -> Maybe (Change String)
squashFieldDecl (GHC.ConDeclField _ names type' _)
| null names = Nothing
| otherwise = squash (GHC.getLoc $ last names) (GHC.getLocA type')
--------------------------------------------------------------------------------
squashMatch
:: GHC.Match GHC.GhcPs (GHC.LHsExpr GHC.GhcPs) -> Maybe (Change String)
squashMatch (GHC.Match _ (GHC.FunRhs name _ _) [] grhss) = do
body <- unguardedRhsBody grhss
squash (GHC.getLocA name) (GHC.getLocA body)
squashMatch (GHC.Match _ _ pats grhss) = do
body <- unguardedRhsBody grhss
squash (GHC.getLocA $ last pats) (GHC.getLocA body)
--------------------------------------------------------------------------------
step :: Step
step = makeStep "Squash" $ \ls (module') ->
let changes =
mapMaybe squashFieldDecl (everything module') ++
mapMaybe squashMatch (everything module') in
applyChanges changes ls