packages feed

parsley-garnish-0.1.0.0: src/Parsley/PluginUtils.hs

{-# LANGUAGE TypeSynonymInstances, FlexibleInstances #-}
module Parsley.PluginUtils where

import qualified GHC.TcPluginM.Extra as TCPluginExtra (lookupName)

-- GHC API
import TcRnTypes (TcM, TcPluginM)
import Outputable

-- ghc
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)
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