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 -> a -> Maybe (GHC.HsBind GHC.RdrName)
getHsBind pos 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