parsley-garnish-0.1.0.1: src/Parsley/PluginUtils.hs
{-# LANGUAGE TypeSynonymInstances, FlexibleInstances, CPP #-}
module Parsley.PluginUtils where
import qualified GHC.TcPluginM.Extra as TCPluginExtra (lookupName)
-- ghc
#if __GLASGOW_HASKELL__ >= 900
import GHC.Tc.Types (TcM, TcPluginM)
import GHC.Utils.Outputable
import qualified GHC.Plugins as GHC
import qualified GHC.Iface.Env as GHC (lookupOrig)
import GHC.Driver.Finder (findImportedModule, FindResult(Found))
import GHC.Data.FastString (mkFastString)
import GHC.Unit.Module (Module)
import GHC.Unit.Module.Name (mkModuleName)
import GHC (Name)
#else
import TcRnTypes (TcM, TcPluginM)
import Outputable
import qualified GhcPlugins as GHC
import qualified IfaceEnv as GHC (lookupOrig)
import Finder (findImportedModule, FindResult(Found))
import FastString (mkFastString)
import Module (Module, mkModuleName)
import Name (Name)
#endif
import Control.Monad.IO.Class ( liftIO )
class Monad m => Lookup m where
lookupOrig :: Module -> GHC.OccName -> m Name
instance Lookup TcM where
lookupOrig = GHC.lookupOrig
instance Lookup TcPluginM where
lookupOrig = TCPluginExtra.lookupName
pprTouch :: Outputable a => String -> a -> a
pprTouch name x = pprTrace name (ppr x) x
lookupNames :: (Lookup m, Traversable t) => Module -> t String -> m (t Name)
lookupNames = traverse . lookupName
lookupName :: Lookup m => Module -> String -> m Name
lookupName pm = lookupOrig pm . GHC.mkVarOcc
lookupClass :: Lookup m => Module -> String -> m Name
lookupClass pm = lookupOrig pm . GHC.mkTcOcc
lookupIds :: Traversable t => Module -> t String -> TcM (t GHC.Id)
lookupIds = traverse . lookupId
lookupId :: Module -> String -> TcM GHC.Id
lookupId pm name = lookupName pm name >>= GHC.lookupId
lookupModule :: GHC.HscEnv -> String -> TcM Module
lookupModule hscEnv modName = do
Found _ md <- liftIO (findImportedModule hscEnv (mkModuleName modName) Nothing)
return md
lookupModuleInPackage :: GHC.HscEnv -> String -> String -> TcM Module
lookupModuleInPackage hscEnv package modName = do
Found _ md <- liftIO (findImportedModule hscEnv (mkModuleName modName) (Just (mkFastString package)))
return md