-- | Functions for initialising error message printing configuration from the
-- GHC session flags.
module GHC.Driver.Config.Diagnostic
  ( initDiagOpts
  , initPrintConfig
  , initPsMessageOpts
  , initDsMessageOpts
  , initTcMessageOpts
  , initDriverMessageOpts
  , initIfaceMessageOpts
  )
where

import GHC.Driver.Flags
import GHC.Driver.DynFlags
import GHC.Prelude

import GHC.Utils.Outputable
import GHC.Utils.Error (DiagOpts (..))
import GHC.Driver.Errors.Types (GhcMessage, GhcMessageOpts (..), PsMessage, DriverMessage, DriverMessageOpts (..), checkBuildingCabalPackage)
import GHC.Driver.Errors.Ppr ()
import GHC.Tc.Errors.Types
import GHC.HsToCore.Errors.Types
import GHC.Types.Error
import GHC.Iface.Errors.Types

-- | Initialise the general configuration for printing diagnostic messages
-- For example, this configuration controls things like whether warnings are
-- treated like errors.
initDiagOpts :: DynFlags -> DiagOpts
initDiagOpts :: DynFlags -> DiagOpts
initDiagOpts DynFlags
dflags = DiagOpts
  { diag_warning_flags :: EnumSet WarningFlag
diag_warning_flags       = DynFlags -> EnumSet WarningFlag
warningFlags DynFlags
dflags
  , diag_fatal_warning_flags :: EnumSet WarningFlag
diag_fatal_warning_flags = DynFlags -> EnumSet WarningFlag
fatalWarningFlags DynFlags
dflags
  , diag_custom_warning_categories :: WarningCategorySet
diag_custom_warning_categories = DynFlags -> WarningCategorySet
customWarningCategories DynFlags
dflags
  , diag_fatal_custom_warning_categories :: WarningCategorySet
diag_fatal_custom_warning_categories = DynFlags -> WarningCategorySet
fatalCustomWarningCategories DynFlags
dflags
  , diag_warn_is_error :: Bool
diag_warn_is_error       = GeneralFlag -> DynFlags -> Bool
gopt GeneralFlag
Opt_WarnIsError DynFlags
dflags
  , diag_reverse_errors :: Bool
diag_reverse_errors      = DynFlags -> Bool
reverseErrors DynFlags
dflags
  , diag_max_errors :: Maybe Int
diag_max_errors          = DynFlags -> Maybe Int
maxErrors DynFlags
dflags
  , diag_ppr_ctx :: SDocContext
diag_ppr_ctx             = DynFlags -> PprStyle -> SDocContext
initSDocContext DynFlags
dflags PprStyle
defaultErrStyle
  }

-- | Initialise the configuration for printing specific diagnostic messages
initPrintConfig :: DynFlags -> DiagnosticOpts GhcMessage
initPrintConfig :: DynFlags -> DiagnosticOpts GhcMessage
initPrintConfig DynFlags
dflags =
  GhcMessageOpts { psMessageOpts :: DiagnosticOpts PsMessage
psMessageOpts = DynFlags -> DiagnosticOpts PsMessage
initPsMessageOpts DynFlags
dflags
                 , tcMessageOpts :: DiagnosticOpts TcRnMessage
tcMessageOpts = DynFlags -> DiagnosticOpts TcRnMessage
initTcMessageOpts DynFlags
dflags
                 , dsMessageOpts :: DiagnosticOpts DsMessage
dsMessageOpts = DynFlags -> DiagnosticOpts DsMessage
initDsMessageOpts DynFlags
dflags
                 , driverMessageOpts :: DiagnosticOpts DriverMessage
driverMessageOpts= DynFlags -> DiagnosticOpts DriverMessage
initDriverMessageOpts DynFlags
dflags }

initPsMessageOpts :: DynFlags -> DiagnosticOpts PsMessage
initPsMessageOpts :: DynFlags -> DiagnosticOpts PsMessage
initPsMessageOpts DynFlags
_ = NoDiagnosticOpts
DiagnosticOpts PsMessage
NoDiagnosticOpts

initTcMessageOpts :: DynFlags -> DiagnosticOpts TcRnMessage
initTcMessageOpts :: DynFlags -> DiagnosticOpts TcRnMessage
initTcMessageOpts DynFlags
dflags =
  TcRnMessageOpts { tcOptsShowContext :: Bool
tcOptsShowContext    = GeneralFlag -> DynFlags -> Bool
gopt GeneralFlag
Opt_ShowErrorContext DynFlags
dflags
                  , tcOptsIfaceOpts :: IfaceMessageOpts
tcOptsIfaceOpts      = DynFlags -> DiagnosticOpts IfaceMessage
initIfaceMessageOpts DynFlags
dflags }

initDsMessageOpts :: DynFlags -> DiagnosticOpts DsMessage
initDsMessageOpts :: DynFlags -> DiagnosticOpts DsMessage
initDsMessageOpts DynFlags
_ = NoDiagnosticOpts
DiagnosticOpts DsMessage
NoDiagnosticOpts

initIfaceMessageOpts :: DynFlags -> DiagnosticOpts IfaceMessage
initIfaceMessageOpts :: DynFlags -> DiagnosticOpts IfaceMessage
initIfaceMessageOpts DynFlags
dflags =
                  IfaceMessageOpts { ifaceShowTriedFiles :: Bool
ifaceShowTriedFiles = DynFlags -> Int
verbosity DynFlags
dflags Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>= Int
3
                                   , ifaceBuildingCabalPackage :: BuildingCabalPackage
ifaceBuildingCabalPackage = DynFlags -> BuildingCabalPackage
checkBuildingCabalPackage DynFlags
dflags }

initDriverMessageOpts :: DynFlags -> DiagnosticOpts DriverMessage
initDriverMessageOpts :: DynFlags -> DiagnosticOpts DriverMessage
initDriverMessageOpts DynFlags
dflags = DiagnosticOpts PsMessage
-> DiagnosticOpts IfaceMessage -> DriverMessageOpts
DriverMessageOpts (DynFlags -> DiagnosticOpts PsMessage
initPsMessageOpts DynFlags
dflags) (DynFlags -> DiagnosticOpts IfaceMessage
initIfaceMessageOpts DynFlags
dflags)