ghcide-1.9.0.0: src/Development/IDE/GHC/Compat/Plugins.hs
{-# LANGUAGE CPP #-}
-- | Plugin Compat utils.
module Development.IDE.GHC.Compat.Plugins (
-- * Plugin Compat Types, and initialisation
Plugin(..),
defaultPlugin,
PluginWithArgs(..),
applyPluginsParsedResultAction,
initializePlugins,
initPlugins,
-- * Static plugins
StaticPlugin(..),
hsc_static_plugins,
-- * Plugin messages
PsMessages(..),
getPsMessages
) where
#if MIN_VERSION_ghc(9,0,0)
#if MIN_VERSION_ghc(9,2,0)
import qualified GHC.Driver.Env as Env
#endif
import GHC.Driver.Plugins (Plugin (..),
PluginWithArgs (..),
StaticPlugin (..),
defaultPlugin,
withPlugins)
#if MIN_VERSION_ghc(9,3,0)
import GHC.Driver.Plugins (ParsedResult (..),
PsMessages (..),
staticPlugins)
import qualified GHC.Parser.Lexer as Lexer
#else
import Data.Bifunctor (bimap)
#endif
import qualified GHC.Runtime.Loader as Loader
#else
import qualified DynamicLoading as Loader
import Plugins
#endif
import Development.IDE.GHC.Compat.Core
import Development.IDE.GHC.Compat.Env (hscSetFlags, hsc_dflags)
import Development.IDE.GHC.Compat.Outputable as Out
import Development.IDE.GHC.Compat.Parser as Parser
import Development.IDE.GHC.Compat.Util (Bag)
#if !MIN_VERSION_ghc(9,3,0)
type PsMessages = (Bag WarnMsg, Bag ErrMsg)
#endif
getPsMessages :: PState -> DynFlags -> PsMessages
getPsMessages pst dflags =
#if MIN_VERSION_ghc(9,3,0)
uncurry PsMessages $ Lexer.getPsMessages pst
#else
#if MIN_VERSION_ghc(9,2,0)
bimap (fmap pprWarning) (fmap pprError) $
#endif
getMessages pst
#if !MIN_VERSION_ghc(9,2,0)
dflags
#endif
#endif
applyPluginsParsedResultAction :: HscEnv -> DynFlags -> ModSummary -> Parser.ApiAnns -> ParsedSource -> PsMessages -> IO (ParsedSource, PsMessages)
applyPluginsParsedResultAction env dflags ms hpm_annotations parsed msgs = do
-- Apply parsedResultAction of plugins
let applyPluginAction p opts = parsedResultAction p opts ms
#if MIN_VERSION_ghc(9,3,0)
fmap (\result -> (hpm_module (parsedResultModule result), (parsedResultMessages result))) $ runHsc env $ withPlugins
#else
fmap (\parsed_module -> (hpm_module parsed_module, msgs)) $ runHsc env $ withPlugins
#endif
#if MIN_VERSION_ghc(9,3,0)
(Env.hsc_plugins env)
#elif MIN_VERSION_ghc(9,2,0)
env
#else
dflags
#endif
applyPluginAction
#if MIN_VERSION_ghc(9,3,0)
(ParsedResult (HsParsedModule parsed [] hpm_annotations) msgs)
#else
(HsParsedModule parsed [] hpm_annotations)
#endif
initializePlugins :: HscEnv -> IO HscEnv
initializePlugins env = do
#if MIN_VERSION_ghc(9,2,0)
Loader.initializePlugins env
#else
newDf <- Loader.initializePlugins env (hsc_dflags env)
pure $ hscSetFlags newDf env
#endif
-- | Plugins aren't stored in ModSummary anymore since GHC 9.2, but this
-- function still returns it for compatibility with 8.10
initPlugins :: HscEnv -> ModSummary -> IO (ModSummary, HscEnv)
initPlugins session modSummary = do
session1 <- initializePlugins (hscSetFlags (ms_hspp_opts modSummary) session)
return (modSummary{ms_hspp_opts = hsc_dflags session1}, session1)
hsc_static_plugins :: HscEnv -> [StaticPlugin]
#if MIN_VERSION_ghc(9,3,0)
hsc_static_plugins = staticPlugins . Env.hsc_plugins
#elif MIN_VERSION_ghc(9,2,0)
hsc_static_plugins = Env.hsc_static_plugins
#else
hsc_static_plugins = staticPlugins . hsc_dflags
#endif