{-# LANGUAGE CPP #-}
module Development.IDE.GHC.Compat.Plugins (
Plugin(..),
defaultPlugin,
PluginWithArgs(..),
applyPluginsParsedResultAction,
StaticPlugin(..),
hsc_static_plugins,
PsMessages(..),
getPsMessages
) where
import Development.IDE.GHC.Compat.Core
import Development.IDE.GHC.Compat.Parser as Parser
import qualified GHC.Driver.Env as Env
import GHC.Driver.Plugins (ParsedResult (..),
Plugin (..),
PluginWithArgs (..),
PsMessages (..),
StaticPlugin (..),
defaultPlugin,
staticPlugins, withPlugins)
import qualified GHC.Parser.Lexer as Lexer
getPsMessages :: PState -> PsMessages
getPsMessages :: PState -> PsMessages
getPsMessages PState
pst =
(Messages PsMessage -> Messages PsMessage -> PsMessages)
-> (Messages PsMessage, Messages PsMessage) -> PsMessages
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry Messages PsMessage -> Messages PsMessage -> PsMessages
PsMessages ((Messages PsMessage, Messages PsMessage) -> PsMessages)
-> (Messages PsMessage, Messages PsMessage) -> PsMessages
forall a b. (a -> b) -> a -> b
$ PState -> (Messages PsMessage, Messages PsMessage)
Lexer.getPsMessages PState
pst
applyPluginsParsedResultAction :: HscEnv -> ModSummary -> ParsedSource -> PsMessages -> IO (ParsedSource, PsMessages)
applyPluginsParsedResultAction :: HscEnv
-> ModSummary
-> ParsedSource
-> PsMessages
-> IO (ParsedSource, PsMessages)
applyPluginsParsedResultAction HscEnv
env ModSummary
ms ParsedSource
parsed PsMessages
msgs = do
let applyPluginAction :: Plugin -> [CommandLineOption] -> ParsedResult -> Hsc ParsedResult
applyPluginAction Plugin
p [CommandLineOption]
opts = Plugin
-> [CommandLineOption]
-> ModSummary
-> ParsedResult
-> Hsc ParsedResult
parsedResultAction Plugin
p [CommandLineOption]
opts ModSummary
ms
(ParsedResult -> (ParsedSource, PsMessages))
-> IO ParsedResult -> IO (ParsedSource, PsMessages)
forall a b. (a -> b) -> IO a -> IO b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (\ParsedResult
result -> (HsParsedModule -> ParsedSource
hpm_module (ParsedResult -> HsParsedModule
parsedResultModule ParsedResult
result), ParsedResult -> PsMessages
parsedResultMessages ParsedResult
result)) (IO ParsedResult -> IO (ParsedSource, PsMessages))
-> IO ParsedResult -> IO (ParsedSource, PsMessages)
forall a b. (a -> b) -> a -> b
$ HscEnv -> Hsc ParsedResult -> IO ParsedResult
forall a. HscEnv -> Hsc a -> IO a
runHsc HscEnv
env (Hsc ParsedResult -> IO ParsedResult)
-> Hsc ParsedResult -> IO ParsedResult
forall a b. (a -> b) -> a -> b
$ Plugins
-> (Plugin
-> [CommandLineOption] -> ParsedResult -> Hsc ParsedResult)
-> ParsedResult
-> Hsc ParsedResult
forall (m :: * -> *) a.
Monad m =>
Plugins -> PluginOperation m a -> a -> m a
withPlugins
(HscEnv -> Plugins
Env.hsc_plugins HscEnv
env)
Plugin -> [CommandLineOption] -> ParsedResult -> Hsc ParsedResult
applyPluginAction
(HsParsedModule -> PsMessages -> ParsedResult
ParsedResult (ParsedSource -> [CommandLineOption] -> HsParsedModule
HsParsedModule ParsedSource
parsed []) PsMessages
msgs)
hsc_static_plugins :: HscEnv -> [StaticPlugin]
hsc_static_plugins :: HscEnv -> [StaticPlugin]
hsc_static_plugins = Plugins -> [StaticPlugin]
staticPlugins (Plugins -> [StaticPlugin])
-> (HscEnv -> Plugins) -> HscEnv -> [StaticPlugin]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. HscEnv -> Plugins
Env.hsc_plugins