{-# LANGUAGE CPP #-}

-- | Plugin Compat utils.
module Development.IDE.GHC.Compat.Plugins (
    -- * Plugin Compat Types, and initialisation
    Plugin(..),
    defaultPlugin,
    PluginWithArgs(..),
    applyPluginsParsedResultAction,

    -- * Static plugins
    StaticPlugin(..),
    hsc_static_plugins,

    -- * Plugin messages
    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
  -- Apply parsedResultAction of plugins
  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