{-# LANGUAGE PatternSynonyms #-} {-# LANGUAGE ViewPatterns #-} module Language.Haskell.Refact.Refactoring.Simple(removeBracket) where import qualified Data.Generics as SYB import qualified GHC as GHC import qualified Language.Haskell.GhcMod as GM (Options(..)) import Language.Haskell.Refact.API -- To be moved into HaRe API import Language.Haskell.GHC.ExactPrint.Transform import Language.Haskell.GHC.ExactPrint.Types import Data.Maybe import System.Directory -- import Debug.Trace -- --------------------------------------------------------------------- -- | Convert an if expression to a case expression removeBracket :: RefactSettings -> GM.Options -> FilePath -> SimpPos -> SimpPos -> IO [FilePath] removeBracket settings opts fileName beginPos endPos = do absFileName <- canonicalizePath fileName let applied = (:[]) . fst <$> applyRefac (removeBracketTransform absFileName beginPos endPos) (RSFile absFileName) runRefacSession settings opts applied type HsExpr a = GHC.Located (GHC.HsExpr a) pattern HsPar l s = GHC.L l (GHC.HsPar s) removeBracketTransform :: FilePath -> SimpPos -> SimpPos -> RefactGhc () removeBracketTransform fileName beginPos endPos = do parseSourceFileGhc fileName parsed <- getRefactParsed let expr :: GHC.Located (GHC.HsExpr GHC.RdrName) expr = fromJust $ locToExp beginPos endPos parsed removePar :: HsExpr GHC.RdrName -> RefactGhc (HsExpr GHC.RdrName) removePar e@(HsPar _ s) | sameOccurrence e expr = do startAnns <- liftT $ getAnnsT let oldkey = mkAnnKey e newkey = mkAnnKey s newanns = fromMaybe startAnns $ replace oldkey newkey startAnns setRefactAnns newanns return s removePar e = return e p2 <- SYB.everywhereM (SYB.mkM removePar) parsed (liftT getAnnsT) >>= putRefactParsed p2 logm $ "logm: after refactor\n" ++ showGhc p2 -- EOF