module Language.Haskell.Refact.Utils.Query where
import qualified GHC as GHC
import Language.Haskell.Refact.Utils.Monad
import Language.Haskell.Refact.Utils.Synonyms
import Language.Haskell.Refact.Utils.Types
import Language.Haskell.Refact.Utils.TypeUtils
import Data.Generics as SYB
import GHC.SYB.Utils as SYB
import Control.Applicative
import FastString
import RdrName
--Assumptions:
getVarAndRHS :: GHC.Match GHC.RdrName (GHC.LHsExpr GHC.RdrName) -> RefactGhc (GHC.LPat GHC.RdrName, ParsedGRHSs)
getVarAndRHS match = do
let (Just pat) = SYB.something (Nothing `SYB.mkQ` varPat) (GHC.m_pats match)
return (pat , GHC.m_grhss match)
where varPat lPat@(GHC.L _ (GHC.VarPat _ )) = Just lPat
varPat _ = Nothing
getHsBind :: (Data a) => SimpPos -> String -> a -> Maybe (GHC.HsBind GHC.RdrName)
getHsBind pos funNm a =
let rdrNm = locToRdrName pos a in
case rdrNm of
Nothing -> Nothing
(Just (GHC.L _ rNm)) -> SYB.everythingStaged SYB.Parser (<|>) Nothing (Nothing `SYB.mkQ` isBind) a
where
#if __GLASGOW_HASKELL__ <= 710
isBind (bnd@(GHC.FunBind (GHC.L _ name) _ _ _ _ _) :: GHC.HsBind GHC.RdrName)
#else
isBind (bnd@(GHC.FunBind (GHC.L _ name) _ _ _ _) :: GHC.HsBind GHC.RdrName)
#endif
| name == rNm = (Just bnd)
isBind _ = Nothing
isHsVar :: String -> ParsedExpr -> Bool
#if __GLASGOW_HASKELL__ <= 710
isHsVar str (GHC.HsVar rNm) =
#else
isHsVar str (GHC.HsVar (GHC.L _ rNm)) =
#endif
let nm = mkVarUnqual (fsLit str) in
rNm == nm
isHsVar _ _ = False