{-# LANGUAGE CPP #-}
-- | Compat module for GHC 9.2 Logger infrastructure.
module Development.IDE.GHC.Compat.Logger (
    putLogHook,
    Development.IDE.GHC.Compat.Logger.pushLogHook,
    -- * Logging stuff
    LogActionCompat,
    logActionCompat,
    defaultLogActionHPutStrDoc,
    ) where

import           Development.IDE.GHC.Compat.Core
import           Development.IDE.GHC.Compat.Env        as Env
import           Development.IDE.GHC.Compat.Outputable

#if MIN_VERSION_ghc(9,0,0)
import           GHC.Driver.Session                    as DynFlags
import           GHC.Utils.Outputable
#if MIN_VERSION_ghc(9,2,0)
import           GHC.Driver.Env                        (hsc_logger)
import           GHC.Utils.Logger                      as Logger
#endif
#else
import           DynFlags
import           Outputable                            (queryQual)
#endif
#if MIN_VERSION_ghc(9,3,0)
import           GHC.Types.Error
#endif

putLogHook :: Logger -> HscEnv -> HscEnv
putLogHook :: Logger -> HscEnv -> HscEnv
putLogHook Logger
logger HscEnv
env =
#if MIN_VERSION_ghc(9,2,0)
  HscEnv
env { hsc_logger :: Logger
hsc_logger = Logger
logger }
#else
  hscSetFlags ((hsc_dflags env) { DynFlags.log_action = Env.log_action logger }) env
#endif

pushLogHook :: (LogAction -> LogAction) -> Logger -> Logger
pushLogHook :: (LogAction -> LogAction) -> Logger -> Logger
pushLogHook LogAction -> LogAction
f Logger
logger =
#if MIN_VERSION_ghc(9,2,0)
  (LogAction -> LogAction) -> Logger -> Logger
Logger.pushLogHook LogAction -> LogAction
f Logger
logger
#else
  logger { Env.log_action = f (Env.log_action logger) }
#endif

#if MIN_VERSION_ghc(9,3,0)
type LogActionCompat = LogFlags -> Maybe DiagnosticReason -> Maybe Severity -> SrcSpan -> PrintUnqualified -> SDoc -> IO ()

-- alwaysQualify seems to still do the right thing here, according to the "unqualified warnings" test.
logActionCompat :: LogActionCompat -> LogAction
logActionCompat logAction logFlags (MCDiagnostic severity wr) loc = logAction logFlags (Just wr) (Just severity) loc alwaysQualify
logActionCompat logAction logFlags _cls loc = logAction logFlags Nothing Nothing loc alwaysQualify

#else
#if MIN_VERSION_ghc(9,0,0)
type LogActionCompat = DynFlags -> WarnReason -> Severity -> SrcSpan -> PrintUnqualified -> SDoc -> IO ()

-- alwaysQualify seems to still do the right thing here, according to the "unqualified warnings" test.
logActionCompat :: LogActionCompat -> LogAction
logActionCompat :: LogActionCompat -> LogAction
logActionCompat LogActionCompat
logAction DynFlags
dynFlags WarnReason
wr Severity
severity SrcSpan
loc = LogActionCompat
logAction DynFlags
dynFlags WarnReason
wr Severity
severity SrcSpan
loc PrintUnqualified
alwaysQualify

#else
type LogActionCompat = DynFlags -> WarnReason -> Severity -> SrcSpan -> PrintUnqualified -> SDoc -> IO ()

logActionCompat :: LogActionCompat -> LogAction
logActionCompat logAction dynFlags wr severity loc style = logAction dynFlags wr severity loc (queryQual style)
#endif
#endif