ghc-9.0.2: GHC/Plugins.hs
{-# OPTIONS_GHC -fno-warn-duplicate-exports -fno-warn-orphans #-}
-- | This module is not used by GHC itself. Rather, it exports all of
-- the functions and types you are likely to need when writing a
-- plugin for GHC. So authors of plugins can probably get away simply
-- with saying "import GHC.Plugins".
--
-- Particularly interesting modules for plugin writers include
-- "GHC.Core" and "GHC.Core.Opt.Monad".
module GHC.Plugins
( module GHC.Driver.Plugins
, module GHC.Types.Name.Reader
, module GHC.Types.Name.Occurrence
, module GHC.Types.Name
, module GHC.Types.Var
, module GHC.Types.Id
, module GHC.Types.Id.Info
, module GHC.Core.Opt.Monad
, module GHC.Core
, module GHC.Types.Literal
, module GHC.Core.DataCon
, module GHC.Core.Utils
, module GHC.Core.Make
, module GHC.Core.FVs
, module GHC.Core.Subst
, module GHC.Core.Rules
, module GHC.Types.Annotations
, module GHC.Driver.Session
, module GHC.Unit.State
, module GHC.Unit.Module
, module GHC.Core.Type
, module GHC.Core.TyCon
, module GHC.Core.Coercion
, module GHC.Builtin.Types
, module GHC.Driver.Types
, module GHC.Types.Basic
, module GHC.Types.Var.Set
, module GHC.Types.Var.Env
, module GHC.Types.Name.Set
, module GHC.Types.Name.Env
, module GHC.Types.Unique
, module GHC.Types.Unique.Set
, module GHC.Types.Unique.FM
, module GHC.Data.FiniteMap
, module GHC.Utils.Misc
, module GHC.Serialized
, module GHC.Types.SrcLoc
, module GHC.Utils.Outputable
, module GHC.Types.Unique.Supply
, module GHC.Data.FastString
, module GHC.Tc.Errors.Hole.FitTypes -- for hole-fit plugins
, -- * Getting 'Name's
thNameToGhcName
)
where
-- Plugin stuff itself
import GHC.Driver.Plugins
-- Variable naming
import GHC.Types.Name.Reader
import GHC.Types.Name.Occurrence hiding ( varName {- conflicts with Var.varName -} )
import GHC.Types.Name hiding ( varName {- reexport from OccName, conflicts with Var.varName -} )
import GHC.Types.Var
import GHC.Types.Id hiding ( lazySetIdInfo, setIdExported, setIdNotExported {- all three conflict with Var -} )
import GHC.Types.Id.Info
-- Core
import GHC.Core.Opt.Monad
import GHC.Core
import GHC.Types.Literal
import GHC.Core.DataCon
import GHC.Core.Utils
import GHC.Core.Make
import GHC.Core.FVs
import GHC.Core.Subst hiding( substTyVarBndr, substCoVarBndr, extendCvSubst )
-- These names are also exported by Type
-- Core "extras"
import GHC.Core.Rules
import GHC.Types.Annotations
-- Pipeline-related stuff
import GHC.Driver.Session
import GHC.Unit.State
-- Important GHC types
import GHC.Unit.Module
import GHC.Core.Type hiding {- conflict with GHC.Core.Subst -}
( substTy, extendTvSubst, extendTvSubstList, isInScope )
import GHC.Core.Coercion hiding {- conflict with GHC.Core.Subst -}
( substCo )
import GHC.Core.TyCon
import GHC.Builtin.Types
import GHC.Driver.Types
import GHC.Types.Basic
-- Collections and maps
import GHC.Types.Var.Set
import GHC.Types.Var.Env
import GHC.Types.Name.Set
import GHC.Types.Name.Env
import GHC.Types.Unique.Set
import GHC.Types.Unique.FM
-- Conflicts with UniqFM:
--import LazyUniqFM
import GHC.Data.FiniteMap
-- Common utilities
import GHC.Utils.Misc
import GHC.Serialized
import GHC.Types.SrcLoc
import GHC.Utils.Outputable
import GHC.Types.Unique.Supply
import GHC.Types.Unique ( Unique, Uniquable(..) )
import GHC.Data.FastString
import Data.Maybe
import GHC.Iface.Env ( lookupOrigIO )
import GHC.Prelude
import GHC.Utils.Monad ( mapMaybeM )
import GHC.ThToHs ( thRdrNameGuesses )
import GHC.Tc.Utils.Env ( lookupGlobal )
import GHC.Tc.Errors.Hole.FitTypes
import qualified Language.Haskell.TH as TH
{- This instance is defined outside GHC.Core.Opt.Monad so that
GHC.Core.Opt.Monad does not depend on GHC.Tc.Utils.Env -}
instance MonadThings CoreM where
lookupThing name = do { hsc_env <- getHscEnv
; liftIO $ lookupGlobal hsc_env name }
{-
************************************************************************
* *
Template Haskell interoperability
* *
************************************************************************
-}
-- | Attempt to convert a Template Haskell name to one that GHC can
-- understand. Original TH names such as those you get when you use
-- the @'foo@ syntax will be translated to their equivalent GHC name
-- exactly. Qualified or unqualified TH names will be dynamically bound
-- to names in the module being compiled, if possible. Exact TH names
-- will be bound to the name they represent, exactly.
thNameToGhcName :: TH.Name -> CoreM (Maybe Name)
thNameToGhcName th_name
= do { names <- mapMaybeM lookup (thRdrNameGuesses th_name)
-- Pick the first that works
-- E.g. reify (mkName "A") will pick the class A in preference
-- to the data constructor A
; return (listToMaybe names) }
where
lookup rdr_name
| Just n <- isExact_maybe rdr_name -- This happens in derived code
= return $ if isExternalName n then Just n else Nothing
| Just (rdr_mod, rdr_occ) <- isOrig_maybe rdr_name
= do { hsc_env <- getHscEnv
; Just <$> liftIO (lookupOrigIO hsc_env rdr_mod rdr_occ) }
| otherwise = return Nothing