{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE ViewPatterns #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE TypeFamilies #-}

{-# OPTIONS_GHC -fno-warn-orphans #-} -- instance Diagnostic TcRnMessage
{-# LANGUAGE InstanceSigs #-}

module GHC.Iface.Errors.Ppr
  ( IfaceMessageOpts(..)
  , interfaceErrorHints
  , interfaceErrorReason
  , interfaceErrorDiagnostic
  , missingInterfaceErrorHints
  , missingInterfaceErrorReason
  , missingInterfaceErrorDiagnostic
  , readInterfaceErrorDiagnostic

  , lookingForHerald
  , cantFindErrorX
  , mayShowLocations
  , pkgHiddenHint
  )
  where

import GHC.Prelude

import GHC.Types.Error
import GHC.Types.Hint.Ppr () -- Outputable GhcHint
import GHC.Types.Error.Codes ( constructorCode )
import GHC.Types.Name
import GHC.Types.TyThing

import GHC.Unit.State
import GHC.Unit.Module

import GHC.Utils.Outputable
import GHC.Utils.Panic

import GHC.Iface.Errors.Types

defaultIfaceMessageOpts :: IfaceMessageOpts
defaultIfaceMessageOpts :: IfaceMessageOpts
defaultIfaceMessageOpts = IfaceMessageOpts { ifaceShowTriedFiles :: Bool
ifaceShowTriedFiles = Bool
False
                                           , ifaceBuildingCabalPackage :: BuildingCabalPackage
ifaceBuildingCabalPackage = BuildingCabalPackage
NoBuildingCabalPackage }

instance HasDefaultDiagnosticOpts IfaceMessageOpts where
  defaultOpts :: IfaceMessageOpts
defaultOpts = IfaceMessageOpts
defaultIfaceMessageOpts

instance Diagnostic IfaceMessage where
  type DiagnosticOpts IfaceMessage = IfaceMessageOpts
  diagnosticMessage :: DiagnosticOpts IfaceMessage -> IfaceMessage -> DecoratedSDoc
diagnosticMessage DiagnosticOpts IfaceMessage
opts IfaceMessage
reason = SDoc -> DecoratedSDoc
mkSimpleDecorated (SDoc -> DecoratedSDoc) -> SDoc -> DecoratedSDoc
forall a b. (a -> b) -> a -> b
$
         IfaceMessageOpts -> IfaceMessage -> SDoc
interfaceErrorDiagnostic DiagnosticOpts IfaceMessage
IfaceMessageOpts
opts IfaceMessage
reason

  diagnosticReason :: IfaceMessage -> DiagnosticReason
diagnosticReason = IfaceMessage -> DiagnosticReason
interfaceErrorReason

  diagnosticHints :: IfaceMessage -> [GhcHint]
diagnosticHints = IfaceMessage -> [GhcHint]
interfaceErrorHints

  diagnosticCode :: IfaceMessage -> Maybe DiagnosticCode
diagnosticCode = IfaceMessage -> Maybe DiagnosticCode
forall diag.
(Generic diag, GDiagnosticCode (Rep diag)) =>
diag -> Maybe DiagnosticCode
constructorCode

interfaceErrorHints :: IfaceMessage -> [GhcHint]
interfaceErrorHints :: IfaceMessage -> [GhcHint]
interfaceErrorHints = \ case
  Can'tFindInterface MissingInterfaceError
err InterfaceLookingFor
_looking_for ->
    MissingInterfaceError -> [GhcHint]
missingInterfaceErrorHints MissingInterfaceError
err
  Can'tFindNameInInterface {} ->
    [GhcHint]
noHints
  CircularImport {} ->
    [GhcHint]
noHints

missingInterfaceErrorHints :: MissingInterfaceError -> [GhcHint]
missingInterfaceErrorHints :: MissingInterfaceError -> [GhcHint]
missingInterfaceErrorHints = \case
  BadSourceImport {} ->
    [GhcHint]
noHints
  HomeModError {} ->
    [GhcHint]
noHints
  DynamicHashMismatchError {} ->
    [GhcHint]
noHints
  CantFindErr {} ->
    [GhcHint]
noHints
  BadIfaceFile {} ->
    [GhcHint]
noHints
  FailedToLoadDynamicInterface {} ->
    [GhcHint]
noHints

interfaceErrorReason :: IfaceMessage -> DiagnosticReason
interfaceErrorReason :: IfaceMessage -> DiagnosticReason
interfaceErrorReason (Can'tFindInterface MissingInterfaceError
err InterfaceLookingFor
_)
  = MissingInterfaceError -> DiagnosticReason
missingInterfaceErrorReason MissingInterfaceError
err
interfaceErrorReason (Can'tFindNameInInterface {})
  = DiagnosticReason
ErrorWithoutFlag
interfaceErrorReason (CircularImport {})
  = DiagnosticReason
ErrorWithoutFlag

missingInterfaceErrorReason :: MissingInterfaceError -> DiagnosticReason
missingInterfaceErrorReason :: MissingInterfaceError -> DiagnosticReason
missingInterfaceErrorReason = \ case
  BadSourceImport {} ->
    DiagnosticReason
ErrorWithoutFlag
  HomeModError {} ->
    DiagnosticReason
ErrorWithoutFlag
  DynamicHashMismatchError {} ->
    DiagnosticReason
ErrorWithoutFlag
  CantFindErr {} ->
    DiagnosticReason
ErrorWithoutFlag
  BadIfaceFile {} ->
    DiagnosticReason
ErrorWithoutFlag
  FailedToLoadDynamicInterface {} ->
    DiagnosticReason
ErrorWithoutFlag


prettyCantFindWhat :: FindOrLoad -> FindingModuleOrInterface -> AmbiguousOrMissing -> SDoc
prettyCantFindWhat :: FindOrLoad
-> FindingModuleOrInterface -> AmbiguousOrMissing -> SDoc
prettyCantFindWhat FindOrLoad
Find FindingModuleOrInterface
FindingModule AmbiguousOrMissing
AoM_Missing = FilePath -> SDoc
forall doc. IsLine doc => FilePath -> doc
text FilePath
"Could not find module"
prettyCantFindWhat FindOrLoad
Load FindingModuleOrInterface
FindingModule AmbiguousOrMissing
AoM_Missing = FilePath -> SDoc
forall doc. IsLine doc => FilePath -> doc
text FilePath
"Could not load module"
prettyCantFindWhat FindOrLoad
_ FindingModuleOrInterface
FindingInterface AmbiguousOrMissing
AoM_Missing = FilePath -> SDoc
forall doc. IsLine doc => FilePath -> doc
text FilePath
"Failed to load interface for"
prettyCantFindWhat FindOrLoad
_ FindingModuleOrInterface
FindingModule AmbiguousOrMissing
AoM_Ambiguous = FilePath -> SDoc
forall doc. IsLine doc => FilePath -> doc
text FilePath
"Ambiguous module name"
prettyCantFindWhat FindOrLoad
_ FindingModuleOrInterface
FindingInterface AmbiguousOrMissing
AoM_Ambiguous = FilePath -> SDoc
forall doc. IsLine doc => FilePath -> doc
text FilePath
"Ambiguous interface for"

isAmbiguousInstalledReason :: CantFindInstalledReason -> AmbiguousOrMissing
isAmbiguousInstalledReason :: CantFindInstalledReason -> AmbiguousOrMissing
isAmbiguousInstalledReason (MultiplePackages {}) = AmbiguousOrMissing
AoM_Ambiguous
isAmbiguousInstalledReason CantFindInstalledReason
_ = AmbiguousOrMissing
AoM_Missing

isLoadOrFindReason :: CantFindInstalledReason -> FindOrLoad
isLoadOrFindReason :: CantFindInstalledReason -> FindOrLoad
isLoadOrFindReason NotAModule {} = FindOrLoad
Find
isLoadOrFindReason (GenericMissing [(Unit, Maybe UnitInfo)]
a [Unit]
b [(Unit, UnusableUnitReason)]
c [FilePath]
_) | [(Unit, Maybe UnitInfo)] -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [(Unit, Maybe UnitInfo)]
a Bool -> Bool -> Bool
&& [Unit] -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [Unit]
b Bool -> Bool -> Bool
&& [(Unit, UnusableUnitReason)] -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [(Unit, UnusableUnitReason)]
c = FindOrLoad
Find
isLoadOrFindReason (ModuleSuggestion {}) = FindOrLoad
Find
isLoadOrFindReason CantFindInstalledReason
_ = FindOrLoad
Load

data FindOrLoad  = Find | Load

data AmbiguousOrMissing = AoM_Ambiguous | AoM_Missing

cantFindError :: IfaceMessageOpts
  -> FindingModuleOrInterface
  -> CantFindInstalled
  -> SDoc
cantFindError :: IfaceMessageOpts
-> FindingModuleOrInterface -> CantFindInstalled -> SDoc
cantFindError IfaceMessageOpts
opts =
  (UnitInfo -> SDoc)
-> ([FilePath] -> SDoc)
-> FindingModuleOrInterface
-> CantFindInstalled
-> SDoc
cantFindErrorX
    ((UnitInfo -> SDoc) -> BuildingCabalPackage -> UnitInfo -> SDoc
pkgHiddenHint (SDoc -> UnitInfo -> SDoc
forall a b. a -> b -> a
const SDoc
forall doc. IsOutput doc => doc
empty) (IfaceMessageOpts -> BuildingCabalPackage
ifaceBuildingCabalPackage IfaceMessageOpts
opts))
    (FilePath -> Bool -> [FilePath] -> SDoc
mayShowLocations FilePath
"-v" (IfaceMessageOpts -> Bool
ifaceShowTriedFiles IfaceMessageOpts
opts))


pkgHiddenHint :: (UnitInfo -> SDoc) -> BuildingCabalPackage
              -> UnitInfo -> SDoc
pkgHiddenHint :: (UnitInfo -> SDoc) -> BuildingCabalPackage -> UnitInfo -> SDoc
pkgHiddenHint UnitInfo -> SDoc
_hint BuildingCabalPackage
YesBuildingCabalPackage UnitInfo
pkg
 = FilePath -> SDoc
forall doc. IsLine doc => FilePath -> doc
text FilePath
"Perhaps you need to add" SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+>
   SDoc -> SDoc
quotes (PackageName -> SDoc
forall a. Outputable a => a -> SDoc
ppr (UnitInfo -> PackageName
forall srcpkgid srcpkgname uid modulename mod.
GenericUnitInfo srcpkgid srcpkgname uid modulename mod
-> srcpkgname
unitPackageName UnitInfo
pkg)) SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+>
   FilePath -> SDoc
forall doc. IsLine doc => FilePath -> doc
text FilePath
"to the build-depends in your .cabal file."
pkgHiddenHint UnitInfo -> SDoc
hint BuildingCabalPackage
_not_cabal UnitInfo
pkg
 = UnitInfo -> SDoc
hint UnitInfo
pkg

mayShowLocations :: String -> Bool -> [FilePath] -> SDoc
mayShowLocations :: FilePath -> Bool -> [FilePath] -> SDoc
mayShowLocations FilePath
option Bool
verbose [FilePath]
files
    | [FilePath] -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [FilePath]
files = SDoc
forall doc. IsOutput doc => doc
empty
    | Bool -> Bool
not Bool
verbose =
          FilePath -> SDoc
forall doc. IsLine doc => FilePath -> doc
text FilePath
"Use" SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> FilePath -> SDoc
forall doc. IsLine doc => FilePath -> doc
text FilePath
option SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+>
              FilePath -> SDoc
forall doc. IsLine doc => FilePath -> doc
text FilePath
"to see a list of the files searched for."
    | Bool
otherwise =
          SDoc -> Int -> SDoc -> SDoc
hang (FilePath -> SDoc
forall doc. IsLine doc => FilePath -> doc
text FilePath
"Locations searched:") Int
2 (SDoc -> SDoc) -> SDoc -> SDoc
forall a b. (a -> b) -> a -> b
$ [SDoc] -> SDoc
forall doc. IsDoc doc => [doc] -> doc
vcat ((FilePath -> SDoc) -> [FilePath] -> [SDoc]
forall a b. (a -> b) -> [a] -> [b]
map FilePath -> SDoc
forall doc. IsLine doc => FilePath -> doc
text [FilePath]
files)

-- | General version of cantFindError which has some holes which allow GHC/GHCi to display slightly different
-- error messages.
cantFindErrorX :: (UnitInfo -> SDoc) -> ([FilePath] -> SDoc) -> FindingModuleOrInterface -> CantFindInstalled -> SDoc
cantFindErrorX :: (UnitInfo -> SDoc)
-> ([FilePath] -> SDoc)
-> FindingModuleOrInterface
-> CantFindInstalled
-> SDoc
cantFindErrorX UnitInfo -> SDoc
pkg_hidden_hint [FilePath] -> SDoc
may_show_locations FindingModuleOrInterface
mod_or_interface (CantFindInstalled ModuleName
mod_name CantFindInstalledReason
cfir) =
  let ambig :: AmbiguousOrMissing
ambig = CantFindInstalledReason -> AmbiguousOrMissing
isAmbiguousInstalledReason CantFindInstalledReason
cfir
      find_or_load :: FindOrLoad
find_or_load = CantFindInstalledReason -> FindOrLoad
isLoadOrFindReason CantFindInstalledReason
cfir
      ppr_what :: SDoc
ppr_what = FindOrLoad
-> FindingModuleOrInterface -> AmbiguousOrMissing -> SDoc
prettyCantFindWhat FindOrLoad
find_or_load FindingModuleOrInterface
mod_or_interface AmbiguousOrMissing
ambig
  in
  (SDoc
ppr_what SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> SDoc -> SDoc
quotes (ModuleName -> SDoc
forall a. Outputable a => a -> SDoc
ppr ModuleName
mod_name) SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<> SDoc
forall doc. IsLine doc => doc
dot) SDoc -> SDoc -> SDoc
forall doc. IsDoc doc => doc -> doc -> doc
$$
  case CantFindInstalledReason
cfir of
    NoUnitIdMatching UnitId
pkg [UnitInfo]
cands ->

      let looks_like_srcpkgid :: SDoc
          looks_like_srcpkgid :: SDoc
looks_like_srcpkgid =
     -- Unsafely coerce a unit id (i.e. an installed package component
     -- identifier) into a PackageId and see if it means anything.
           case [UnitInfo]
cands of
             (UnitInfo
pkg:[UnitInfo]
pkgs) ->
              SDoc -> SDoc
forall doc. IsLine doc => doc -> doc
parens (FilePath -> SDoc
forall doc. IsLine doc => FilePath -> doc
text FilePath
"This unit ID looks like the source package ID;" SDoc -> SDoc -> SDoc
forall doc. IsDoc doc => doc -> doc -> doc
$$
                      FilePath -> SDoc
forall doc. IsLine doc => FilePath -> doc
text FilePath
"the real unit ID is" SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> SDoc -> SDoc
quotes (FastString -> SDoc
forall doc. IsLine doc => FastString -> doc
ftext (UnitId -> FastString
unitIdFS (UnitInfo -> UnitId
forall srcpkgid srcpkgname uid modulename mod.
GenericUnitInfo srcpkgid srcpkgname uid modulename mod -> uid
unitId UnitInfo
pkg))) SDoc -> SDoc -> SDoc
forall doc. IsDoc doc => doc -> doc -> doc
$$
                     (if [UnitInfo] -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [UnitInfo]
pkgs then SDoc
forall doc. IsOutput doc => doc
empty
                                  else FilePath -> SDoc
forall doc. IsLine doc => FilePath -> doc
text FilePath
"and" SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> Int -> SDoc
forall doc. IsLine doc => Int -> doc
int ([UnitInfo] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [UnitInfo]
pkgs) SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> FilePath -> SDoc
forall doc. IsLine doc => FilePath -> doc
text FilePath
"other candidate" SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<> [UnitInfo] -> SDoc
forall a. [a] -> SDoc
plural [UnitInfo]
pkgs))
             -- Todo: also check if it looks like a package name!
             [] -> SDoc
forall doc. IsOutput doc => doc
empty

      in [SDoc] -> SDoc
forall doc. IsLine doc => [doc] -> doc
hsep [ FilePath -> SDoc
forall doc. IsLine doc => FilePath -> doc
text FilePath
"no unit id matching" SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> SDoc -> SDoc
quotes (UnitId -> SDoc
forall a. Outputable a => a -> SDoc
ppr UnitId
pkg)
              , FilePath -> SDoc
forall doc. IsLine doc => FilePath -> doc
text FilePath
"was found"] SDoc -> SDoc -> SDoc
forall doc. IsDoc doc => doc -> doc -> doc
$$ SDoc
looks_like_srcpkgid
    MissingPackageFiles UnitId
pkg [FilePath]
files ->
      FilePath -> SDoc
forall doc. IsLine doc => FilePath -> doc
text FilePath
"There are files missing in the " SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<> SDoc -> SDoc
quotes (UnitId -> SDoc
forall a. Outputable a => a -> SDoc
ppr UnitId
pkg) SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+>
      FilePath -> SDoc
forall doc. IsLine doc => FilePath -> doc
text FilePath
"package," SDoc -> SDoc -> SDoc
forall doc. IsDoc doc => doc -> doc -> doc
$$
      FilePath -> SDoc
forall doc. IsLine doc => FilePath -> doc
text FilePath
"try running 'ghc-pkg check'." SDoc -> SDoc -> SDoc
forall doc. IsDoc doc => doc -> doc -> doc
$$
      [FilePath] -> SDoc
may_show_locations [FilePath]
files
    MissingPackageWayFiles FilePath
build UnitId
pkg [FilePath]
files ->
      FilePath -> SDoc
forall doc. IsLine doc => FilePath -> doc
text FilePath
"Perhaps you haven't installed the " SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<> FilePath -> SDoc
forall doc. IsLine doc => FilePath -> doc
text FilePath
build SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+>
      FilePath -> SDoc
forall doc. IsLine doc => FilePath -> doc
text FilePath
"libraries for package " SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<> SDoc -> SDoc
quotes (UnitId -> SDoc
forall a. Outputable a => a -> SDoc
ppr UnitId
pkg) SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<> Char -> SDoc
forall doc. IsLine doc => Char -> doc
char Char
'?' SDoc -> SDoc -> SDoc
forall doc. IsDoc doc => doc -> doc -> doc
$$
      [FilePath] -> SDoc
may_show_locations [FilePath]
files
    ModuleSuggestion [ModuleSuggestion]
ms [FilePath]
fps ->

      let pp_suggestions :: [ModuleSuggestion] -> SDoc
          pp_suggestions :: [ModuleSuggestion] -> SDoc
pp_suggestions [ModuleSuggestion]
sugs
            | [ModuleSuggestion] -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [ModuleSuggestion]
sugs = SDoc
forall doc. IsOutput doc => doc
empty
            | Bool
otherwise = SDoc -> Int -> SDoc -> SDoc
hang (FilePath -> SDoc
forall doc. IsLine doc => FilePath -> doc
text FilePath
"Perhaps you meant")
                             Int
2 ([SDoc] -> SDoc
forall doc. IsDoc doc => [doc] -> doc
vcat ((ModuleSuggestion -> SDoc) -> [ModuleSuggestion] -> [SDoc]
forall a b. (a -> b) -> [a] -> [b]
map ModuleSuggestion -> SDoc
pp_sugg [ModuleSuggestion]
sugs))

          -- NB: Prefer the *original* location, and then reexports, and then
          -- package flags when making suggestions.  ToDo: if the original package
          -- also has a reexport, prefer that one
          pp_sugg :: ModuleSuggestion -> SDoc
pp_sugg (SuggestVisible ModuleName
m Module
mod ModuleOrigin
o) = ModuleName -> SDoc
forall a. Outputable a => a -> SDoc
ppr ModuleName
m SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> ModuleOrigin -> SDoc
provenance ModuleOrigin
o
            where provenance :: ModuleOrigin -> SDoc
provenance ModuleOrigin
ModHidden = SDoc
forall doc. IsOutput doc => doc
empty
                  provenance (ModUnusable UnusableUnitReason
_) = SDoc
forall doc. IsOutput doc => doc
empty
                  provenance (ModOrigin{ fromOrigUnit :: ModuleOrigin -> Maybe Bool
fromOrigUnit = Maybe Bool
e,
                                         fromExposedReexport :: ModuleOrigin -> [UnitInfo]
fromExposedReexport = [UnitInfo]
res,
                                         fromPackageFlag :: ModuleOrigin -> Bool
fromPackageFlag = Bool
f })
                    | Just Bool
True <- Maybe Bool
e
                       = SDoc -> SDoc
forall doc. IsLine doc => doc -> doc
parens (FilePath -> SDoc
forall doc. IsLine doc => FilePath -> doc
text FilePath
"from" SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> Unit -> SDoc
forall a. Outputable a => a -> SDoc
ppr (Module -> Unit
forall unit. GenModule unit -> unit
moduleUnit Module
mod))
                    | Bool
f Bool -> Bool -> Bool
&& Module -> ModuleName
forall unit. GenModule unit -> ModuleName
moduleName Module
mod ModuleName -> ModuleName -> Bool
forall a. Eq a => a -> a -> Bool
== ModuleName
m
                       = SDoc -> SDoc
forall doc. IsLine doc => doc -> doc
parens (FilePath -> SDoc
forall doc. IsLine doc => FilePath -> doc
text FilePath
"from" SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> Unit -> SDoc
forall a. Outputable a => a -> SDoc
ppr (Module -> Unit
forall unit. GenModule unit -> unit
moduleUnit Module
mod))
                    | (UnitInfo
pkg:[UnitInfo]
_) <- [UnitInfo]
res
                       = SDoc -> SDoc
forall doc. IsLine doc => doc -> doc
parens (FilePath -> SDoc
forall doc. IsLine doc => FilePath -> doc
text FilePath
"from" SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> Unit -> SDoc
forall a. Outputable a => a -> SDoc
ppr (UnitInfo -> Unit
mkUnit UnitInfo
pkg)
                          SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<> SDoc
forall doc. IsLine doc => doc
comma SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> FilePath -> SDoc
forall doc. IsLine doc => FilePath -> doc
text FilePath
"reexporting" SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> Module -> SDoc
forall a. Outputable a => a -> SDoc
ppr Module
mod)
                    | Bool
f
                       = SDoc -> SDoc
forall doc. IsLine doc => doc -> doc
parens (FilePath -> SDoc
forall doc. IsLine doc => FilePath -> doc
text FilePath
"defined via package flags to be"
                          SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> Module -> SDoc
forall a. Outputable a => a -> SDoc
ppr Module
mod)
                    | Bool
otherwise = SDoc
forall doc. IsOutput doc => doc
empty
          pp_sugg (SuggestHidden ModuleName
m Module
mod ModuleOrigin
o) = ModuleName -> SDoc
forall a. Outputable a => a -> SDoc
ppr ModuleName
m SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> ModuleOrigin -> SDoc
provenance ModuleOrigin
o
            where provenance :: ModuleOrigin -> SDoc
provenance ModuleOrigin
ModHidden =  SDoc
forall doc. IsOutput doc => doc
empty
                  provenance (ModUnusable UnusableUnitReason
_) = SDoc
forall doc. IsOutput doc => doc
empty
                  provenance (ModOrigin{ fromOrigUnit :: ModuleOrigin -> Maybe Bool
fromOrigUnit = Maybe Bool
e,
                                         fromHiddenReexport :: ModuleOrigin -> [UnitInfo]
fromHiddenReexport = [UnitInfo]
rhs })
                    | Just Bool
False <- Maybe Bool
e
                       = SDoc -> SDoc
forall doc. IsLine doc => doc -> doc
parens (FilePath -> SDoc
forall doc. IsLine doc => FilePath -> doc
text FilePath
"needs flag -package-id"
                          SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> Unit -> SDoc
forall a. Outputable a => a -> SDoc
ppr (Module -> Unit
forall unit. GenModule unit -> unit
moduleUnit Module
mod))
                    | (UnitInfo
pkg:[UnitInfo]
_) <- [UnitInfo]
rhs
                       = SDoc -> SDoc
forall doc. IsLine doc => doc -> doc
parens (FilePath -> SDoc
forall doc. IsLine doc => FilePath -> doc
text FilePath
"needs flag -package-id"
                          SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> Unit -> SDoc
forall a. Outputable a => a -> SDoc
ppr (UnitInfo -> Unit
mkUnit UnitInfo
pkg))
                    | Bool
otherwise = SDoc
forall doc. IsOutput doc => doc
empty

        in [ModuleSuggestion] -> SDoc
pp_suggestions [ModuleSuggestion]
ms SDoc -> SDoc -> SDoc
forall doc. IsDoc doc => doc -> doc -> doc
$$ [FilePath] -> SDoc
may_show_locations [FilePath]
fps
    CantFindInstalledReason
NotAModule -> FilePath -> SDoc
forall doc. IsLine doc => FilePath -> doc
text FilePath
"It is not a module in the current program, or in any known package."
    CouldntFindInFiles [FilePath]
fps -> [SDoc] -> SDoc
forall doc. IsDoc doc => [doc] -> doc
vcat ((FilePath -> SDoc) -> [FilePath] -> [SDoc]
forall a b. (a -> b) -> [a] -> [b]
map FilePath -> SDoc
forall doc. IsLine doc => FilePath -> doc
text [FilePath]
fps)
    MultiplePackages [(Module, ModuleOrigin)]
mods
      | Just [Unit]
pkgs <- Maybe [Unit]
unambiguousPackages
      -> [SDoc] -> SDoc
forall doc. IsLine doc => [doc] -> doc
sep [FilePath -> SDoc
forall doc. IsLine doc => FilePath -> doc
text FilePath
"it was found in multiple packages:",
            [SDoc] -> SDoc
forall doc. IsLine doc => [doc] -> doc
hsep ((Unit -> SDoc) -> [Unit] -> [SDoc]
forall a b. (a -> b) -> [a] -> [b]
map Unit -> SDoc
forall a. Outputable a => a -> SDoc
ppr [Unit]
pkgs)]
      | Bool
otherwise
      -> [SDoc] -> SDoc
forall doc. IsDoc doc => [doc] -> doc
vcat (((Module, ModuleOrigin) -> SDoc)
-> [(Module, ModuleOrigin)] -> [SDoc]
forall a b. (a -> b) -> [a] -> [b]
map (Module, ModuleOrigin) -> SDoc
forall {a}.
(Outputable a, Outputable (GenModule a)) =>
(GenModule a, ModuleOrigin) -> SDoc
pprMod [(Module, ModuleOrigin)]
mods)
      where
        unambiguousPackages :: Maybe [Unit]
unambiguousPackages = (Maybe [Unit] -> (Module, ModuleOrigin) -> Maybe [Unit])
-> Maybe [Unit] -> [(Module, ModuleOrigin)] -> Maybe [Unit]
forall b a. (b -> a -> b) -> b -> [a] -> b
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl' Maybe [Unit] -> (Module, ModuleOrigin) -> Maybe [Unit]
forall {a}. Maybe [a] -> (GenModule a, ModuleOrigin) -> Maybe [a]
unambiguousPackage ([Unit] -> Maybe [Unit]
forall a. a -> Maybe a
Just []) [(Module, ModuleOrigin)]
mods
        unambiguousPackage :: Maybe [a] -> (GenModule a, ModuleOrigin) -> Maybe [a]
unambiguousPackage (Just [a]
xs) (GenModule a
m, ModOrigin (Just Bool
_) [UnitInfo]
_ [UnitInfo]
_ Bool
_)
            = [a] -> Maybe [a]
forall a. a -> Maybe a
Just (GenModule a -> a
forall unit. GenModule unit -> unit
moduleUnit GenModule a
m a -> [a] -> [a]
forall a. a -> [a] -> [a]
: [a]
xs)
        unambiguousPackage Maybe [a]
_ (GenModule a, ModuleOrigin)
_ = Maybe [a]
forall a. Maybe a
Nothing
    GenericMissing [(Unit, Maybe UnitInfo)]
pkg_hiddens [Unit]
mod_hiddens [(Unit, UnusableUnitReason)]
unusables [FilePath]
files ->
      [SDoc] -> SDoc
forall doc. IsDoc doc => [doc] -> doc
vcat (((Unit, Maybe UnitInfo) -> SDoc)
-> [(Unit, Maybe UnitInfo)] -> [SDoc]
forall a b. (a -> b) -> [a] -> [b]
map (Unit, Maybe UnitInfo) -> SDoc
pkg_hidden [(Unit, Maybe UnitInfo)]
pkg_hiddens) SDoc -> SDoc -> SDoc
forall doc. IsDoc doc => doc -> doc -> doc
$$
      [SDoc] -> SDoc
forall doc. IsDoc doc => [doc] -> doc
vcat ((Unit -> SDoc) -> [Unit] -> [SDoc]
forall a b. (a -> b) -> [a] -> [b]
map Unit -> SDoc
forall a. Outputable a => a -> SDoc
mod_hidden [Unit]
mod_hiddens) SDoc -> SDoc -> SDoc
forall doc. IsDoc doc => doc -> doc -> doc
$$
      [SDoc] -> SDoc
forall doc. IsDoc doc => [doc] -> doc
vcat (((Unit, UnusableUnitReason) -> SDoc)
-> [(Unit, UnusableUnitReason)] -> [SDoc]
forall a b. (a -> b) -> [a] -> [b]
map (Unit, UnusableUnitReason) -> SDoc
forall {a}. Outputable a => (a, UnusableUnitReason) -> SDoc
unusable [(Unit, UnusableUnitReason)]
unusables) SDoc -> SDoc -> SDoc
forall doc. IsDoc doc => doc -> doc -> doc
$$
      [FilePath] -> SDoc
may_show_locations [FilePath]
files
  where
    pprMod :: (GenModule a, ModuleOrigin) -> SDoc
pprMod (GenModule a
m, ModuleOrigin
o) = FilePath -> SDoc
forall doc. IsLine doc => FilePath -> doc
text FilePath
"it is bound as" SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> GenModule a -> SDoc
forall a. Outputable a => a -> SDoc
ppr GenModule a
m SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+>
                                FilePath -> SDoc
forall doc. IsLine doc => FilePath -> doc
text FilePath
"by" SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> GenModule a -> ModuleOrigin -> SDoc
forall {a}. Outputable a => GenModule a -> ModuleOrigin -> SDoc
pprOrigin GenModule a
m ModuleOrigin
o
    pprOrigin :: GenModule a -> ModuleOrigin -> SDoc
pprOrigin GenModule a
_ ModuleOrigin
ModHidden = FilePath -> SDoc
forall a. HasCallStack => FilePath -> a
panic FilePath
"cantFindErr: bound by mod hidden"
    pprOrigin GenModule a
_ (ModUnusable UnusableUnitReason
_) = FilePath -> SDoc
forall a. HasCallStack => FilePath -> a
panic FilePath
"cantFindErr: bound by mod unusable"
    pprOrigin GenModule a
m (ModOrigin Maybe Bool
e [UnitInfo]
res [UnitInfo]
_ Bool
f) = [SDoc] -> SDoc
forall doc. IsLine doc => [doc] -> doc
sep ([SDoc] -> SDoc) -> [SDoc] -> SDoc
forall a b. (a -> b) -> a -> b
$ SDoc -> [SDoc] -> [SDoc]
forall doc. IsLine doc => doc -> [doc] -> [doc]
punctuate SDoc
forall doc. IsLine doc => doc
comma (
      if Maybe Bool
e Maybe Bool -> Maybe Bool -> Bool
forall a. Eq a => a -> a -> Bool
== Bool -> Maybe Bool
forall a. a -> Maybe a
Just Bool
True
          then [FilePath -> SDoc
forall doc. IsLine doc => FilePath -> doc
text FilePath
"package" SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> a -> SDoc
forall a. Outputable a => a -> SDoc
ppr (GenModule a -> a
forall unit. GenModule unit -> unit
moduleUnit GenModule a
m)]
          else [] [SDoc] -> [SDoc] -> [SDoc]
forall a. [a] -> [a] -> [a]
++
      (UnitInfo -> SDoc) -> [UnitInfo] -> [SDoc]
forall a b. (a -> b) -> [a] -> [b]
map ((FilePath -> SDoc
forall doc. IsLine doc => FilePath -> doc
text FilePath
"a reexport in package" SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+>)
                (SDoc -> SDoc) -> (UnitInfo -> SDoc) -> UnitInfo -> SDoc
forall b c a. (b -> c) -> (a -> b) -> a -> c
.Unit -> SDoc
forall a. Outputable a => a -> SDoc
ppr(Unit -> SDoc) -> (UnitInfo -> Unit) -> UnitInfo -> SDoc
forall b c a. (b -> c) -> (a -> b) -> a -> c
.UnitInfo -> Unit
mkUnit) [UnitInfo]
res [SDoc] -> [SDoc] -> [SDoc]
forall a. [a] -> [a] -> [a]
++
      if Bool
f then [FilePath -> SDoc
forall doc. IsLine doc => FilePath -> doc
text FilePath
"a package flag"] else []
      )
    pkg_hidden :: (Unit, Maybe UnitInfo) -> SDoc
    pkg_hidden :: (Unit, Maybe UnitInfo) -> SDoc
pkg_hidden (Unit
uid, Maybe UnitInfo
uif) =
        FilePath -> SDoc
forall doc. IsLine doc => FilePath -> doc
text FilePath
"It is a member of the hidden package"
        SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> SDoc -> SDoc
quotes (Unit -> SDoc
forall a. Outputable a => a -> SDoc
ppr Unit
uid)
        --FIXME: we don't really want to show the unit id here we should
        -- show the source package id or installed package id if it's ambiguous
        SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<> SDoc
forall doc. IsLine doc => doc
dot SDoc -> SDoc -> SDoc
forall doc. IsDoc doc => doc -> doc -> doc
$$ SDoc -> (UnitInfo -> SDoc) -> Maybe UnitInfo -> SDoc
forall b a. b -> (a -> b) -> Maybe a -> b
maybe SDoc
forall doc. IsOutput doc => doc
empty UnitInfo -> SDoc
pkg_hidden_hint Maybe UnitInfo
uif


    mod_hidden :: a -> SDoc
mod_hidden a
pkg =
        FilePath -> SDoc
forall doc. IsLine doc => FilePath -> doc
text FilePath
"it is a hidden module in the package" SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> SDoc -> SDoc
quotes (a -> SDoc
forall a. Outputable a => a -> SDoc
ppr a
pkg)

    unusable :: (a, UnusableUnitReason) -> SDoc
unusable (a
pkg, UnusableUnitReason
reason)
      = FilePath -> SDoc
forall doc. IsLine doc => FilePath -> doc
text FilePath
"It is a member of the package"
      SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> SDoc -> SDoc
quotes (a -> SDoc
forall a. Outputable a => a -> SDoc
ppr a
pkg)
      SDoc -> SDoc -> SDoc
forall doc. IsDoc doc => doc -> doc -> doc
$$ SDoc -> UnusableUnitReason -> SDoc
pprReason (FilePath -> SDoc
forall doc. IsLine doc => FilePath -> doc
text FilePath
"which is") UnusableUnitReason
reason


interfaceErrorDiagnostic :: IfaceMessageOpts -> IfaceMessage -> SDoc
interfaceErrorDiagnostic :: IfaceMessageOpts -> IfaceMessage -> SDoc
interfaceErrorDiagnostic IfaceMessageOpts
opts = \ case
  Can'tFindNameInInterface Name
name [TyThing]
relevant_tyThings ->
    Name -> [TyThing] -> SDoc
missingDeclInInterface Name
name [TyThing]
relevant_tyThings
  Can'tFindInterface MissingInterfaceError
err InterfaceLookingFor
looking_for ->
    SDoc -> Int -> SDoc -> SDoc
hangNotEmpty (InterfaceLookingFor -> SDoc
lookingForHerald InterfaceLookingFor
looking_for) Int
2 (IfaceMessageOpts -> MissingInterfaceError -> SDoc
missingInterfaceErrorDiagnostic IfaceMessageOpts
opts MissingInterfaceError
err)
  CircularImport Module
mod ->
    FilePath -> SDoc
forall doc. IsLine doc => FilePath -> doc
text FilePath
"Circular imports: module" SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> SDoc -> SDoc
quotes (Module -> SDoc
forall a. Outputable a => a -> SDoc
ppr Module
mod)
    SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> FilePath -> SDoc
forall doc. IsLine doc => FilePath -> doc
text FilePath
"depends on itself"

lookingForHerald :: InterfaceLookingFor -> SDoc
lookingForHerald :: InterfaceLookingFor -> SDoc
lookingForHerald InterfaceLookingFor
looking_for =
    case InterfaceLookingFor
looking_for of
      LookingForName {} -> SDoc
forall doc. IsOutput doc => doc
empty
      LookingForModule {} -> SDoc
forall doc. IsOutput doc => doc
empty
      LookingForHiBoot Module
mod ->
        FilePath -> SDoc
forall doc. IsLine doc => FilePath -> doc
text FilePath
"Could not find hi-boot interface for" SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> SDoc -> SDoc
quotes (Module -> SDoc
forall a. Outputable a => a -> SDoc
ppr Module
mod) SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<> SDoc
forall doc. IsLine doc => doc
colon
      LookingForSig InstalledModule
sig ->
        FilePath -> SDoc
forall doc. IsLine doc => FilePath -> doc
text FilePath
"Could not find interface file for signature" SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> SDoc -> SDoc
quotes (InstalledModule -> SDoc
forall a. Outputable a => a -> SDoc
ppr InstalledModule
sig) SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<> SDoc
forall doc. IsLine doc => doc
colon

readInterfaceErrorDiagnostic :: ReadInterfaceError -> SDoc
readInterfaceErrorDiagnostic :: ReadInterfaceError -> SDoc
readInterfaceErrorDiagnostic = \ case
  ExceptionOccurred FilePath
fp SomeException
ex ->
    SDoc -> Int -> SDoc -> SDoc
hang (FilePath -> SDoc
forall doc. IsLine doc => FilePath -> doc
text FilePath
"Exception when reading interface file " SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> FilePath -> SDoc
forall doc. IsLine doc => FilePath -> doc
text FilePath
fp)
      Int
2 (FilePath -> SDoc
forall doc. IsLine doc => FilePath -> doc
text (SomeException -> FilePath
forall e. Exception e => e -> FilePath
showException SomeException
ex))
  HiModuleNameMismatchWarn FilePath
_ Module
m1 Module
m2 ->
    Module -> Module -> SDoc
hiModuleNameMismatchWarn Module
m1 Module
m2

missingInterfaceErrorDiagnostic :: IfaceMessageOpts -> MissingInterfaceError -> SDoc
missingInterfaceErrorDiagnostic :: IfaceMessageOpts -> MissingInterfaceError -> SDoc
missingInterfaceErrorDiagnostic IfaceMessageOpts
opts MissingInterfaceError
reason =
  case MissingInterfaceError
reason of
    BadSourceImport Module
m -> Module -> SDoc
badSourceImport Module
m
    HomeModError InstalledModule
im ModLocation
ml -> InstalledModule -> ModLocation -> SDoc
homeModError InstalledModule
im ModLocation
ml
    DynamicHashMismatchError Module
m ModLocation
ml -> Module -> ModLocation -> SDoc
dynamicHashMismatchError Module
m ModLocation
ml
    CantFindErr UnitState
us FindingModuleOrInterface
module_or_interface CantFindInstalled
cfi -> UnitState -> SDoc -> SDoc
pprWithUnitState UnitState
us (SDoc -> SDoc) -> SDoc -> SDoc
forall a b. (a -> b) -> a -> b
$ IfaceMessageOpts
-> FindingModuleOrInterface -> CantFindInstalled -> SDoc
cantFindError IfaceMessageOpts
opts FindingModuleOrInterface
module_or_interface CantFindInstalled
cfi
    BadIfaceFile ReadInterfaceError
rie -> ReadInterfaceError -> SDoc
readInterfaceErrorDiagnostic ReadInterfaceError
rie
    FailedToLoadDynamicInterface Module
wanted_mod ReadInterfaceError
err ->
      SDoc -> Int -> SDoc -> SDoc
hang (FilePath -> SDoc
forall doc. IsLine doc => FilePath -> doc
text FilePath
"Failed to load dynamic interface file for" SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> Module -> SDoc
forall a. Outputable a => a -> SDoc
ppr Module
wanted_mod SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<> SDoc
forall doc. IsLine doc => doc
colon)
        Int
2 (ReadInterfaceError -> SDoc
readInterfaceErrorDiagnostic ReadInterfaceError
err)

hiModuleNameMismatchWarn :: Module -> Module -> SDoc
hiModuleNameMismatchWarn :: Module -> Module -> SDoc
hiModuleNameMismatchWarn Module
requested_mod Module
read_mod
 | Module -> Unit
forall unit. GenModule unit -> unit
moduleUnit Module
requested_mod Unit -> Unit -> Bool
forall a. Eq a => a -> a -> Bool
== Module -> Unit
forall unit. GenModule unit -> unit
moduleUnit Module
read_mod =
    [SDoc] -> SDoc
forall doc. IsLine doc => [doc] -> doc
sep [FilePath -> SDoc
forall doc. IsLine doc => FilePath -> doc
text FilePath
"Interface file contains module" SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> SDoc -> SDoc
quotes (Module -> SDoc
forall a. Outputable a => a -> SDoc
ppr Module
read_mod) SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<> SDoc
forall doc. IsLine doc => doc
comma,
         FilePath -> SDoc
forall doc. IsLine doc => FilePath -> doc
text FilePath
"but we were expecting module" SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> SDoc -> SDoc
quotes (Module -> SDoc
forall a. Outputable a => a -> SDoc
ppr Module
requested_mod),
         [SDoc] -> SDoc
forall doc. IsLine doc => [doc] -> doc
sep [FilePath -> SDoc
forall doc. IsLine doc => FilePath -> doc
text FilePath
"Probable cause: the source code which generated interface file",
             FilePath -> SDoc
forall doc. IsLine doc => FilePath -> doc
text FilePath
"has an incompatible module name"
            ]
        ]
 | Bool
otherwise =
  -- ToDo: This will fail to have enough qualification when the package IDs
  -- are the same
  PprStyle -> SDoc -> SDoc
withPprStyle (NamePprCtx -> Depth -> PprStyle
mkUserStyle NamePprCtx
alwaysQualify Depth
AllTheWay) (SDoc -> SDoc) -> SDoc -> SDoc
forall a b. (a -> b) -> a -> b
$
    -- we want the Modules below to be qualified with package names,
    -- so reset the NamePprCtx setting.
    [SDoc] -> SDoc
forall doc. IsLine doc => [doc] -> doc
hsep [ FilePath -> SDoc
forall doc. IsLine doc => FilePath -> doc
text FilePath
"Something is amiss; requested module "
         , Module -> SDoc
forall a. Outputable a => a -> SDoc
ppr Module
requested_mod
         , FilePath -> SDoc
forall doc. IsLine doc => FilePath -> doc
text FilePath
"differs from name found in the interface file"
         , Module -> SDoc
forall a. Outputable a => a -> SDoc
ppr Module
read_mod
         , SDoc -> SDoc
forall doc. IsLine doc => doc -> doc
parens (FilePath -> SDoc
forall doc. IsLine doc => FilePath -> doc
text FilePath
"if these names look the same, try again with -dppr-debug")
         ]

dynamicHashMismatchError :: Module -> ModLocation -> SDoc
dynamicHashMismatchError :: Module -> ModLocation -> SDoc
dynamicHashMismatchError Module
wanted_mod ModLocation
loc  =
  [SDoc] -> SDoc
forall doc. IsDoc doc => [doc] -> doc
vcat [ FilePath -> SDoc
forall doc. IsLine doc => FilePath -> doc
text FilePath
"Dynamic hash doesn't match for" SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> SDoc -> SDoc
quotes (Module -> SDoc
forall a. Outputable a => a -> SDoc
ppr Module
wanted_mod)
       , FilePath -> SDoc
forall doc. IsLine doc => FilePath -> doc
text FilePath
"Normal interface file from"  SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> FilePath -> SDoc
forall doc. IsLine doc => FilePath -> doc
text (ModLocation -> FilePath
ml_hi_file ModLocation
loc)
       , FilePath -> SDoc
forall doc. IsLine doc => FilePath -> doc
text FilePath
"Dynamic interface file from" SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> FilePath -> SDoc
forall doc. IsLine doc => FilePath -> doc
text (ModLocation -> FilePath
ml_dyn_hi_file ModLocation
loc)
       , FilePath -> SDoc
forall doc. IsLine doc => FilePath -> doc
text FilePath
"You probably need to recompile" SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> SDoc -> SDoc
quotes (Module -> SDoc
forall a. Outputable a => a -> SDoc
ppr Module
wanted_mod) ]

homeModError :: InstalledModule -> ModLocation -> SDoc
-- See Note [Home module load error]
homeModError :: InstalledModule -> ModLocation -> SDoc
homeModError InstalledModule
mod ModLocation
location
  = FilePath -> SDoc
forall doc. IsLine doc => FilePath -> doc
text FilePath
"attempting to use module " SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<> SDoc -> SDoc
quotes (InstalledModule -> SDoc
forall a. Outputable a => a -> SDoc
ppr InstalledModule
mod)
    SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<> (case ModLocation -> Maybe FilePath
ml_hs_file ModLocation
location of
           Just FilePath
file -> SDoc
forall doc. IsLine doc => doc
space SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc
parens (FilePath -> SDoc
forall doc. IsLine doc => FilePath -> doc
text FilePath
file)
           Maybe FilePath
Nothing   -> SDoc
forall doc. IsOutput doc => doc
empty)
    SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> FilePath -> SDoc
forall doc. IsLine doc => FilePath -> doc
text FilePath
"which is not loaded"


missingDeclInInterface :: Name -> [TyThing] -> SDoc
missingDeclInInterface :: Name -> [TyThing] -> SDoc
missingDeclInInterface Name
name [TyThing]
things =
  SDoc -> SDoc
forall doc. IsOutput doc => doc -> doc
whenPprDebug (SDoc
found_things SDoc -> SDoc -> SDoc
forall doc. IsDoc doc => doc -> doc -> doc
$$ SDoc
forall doc. IsOutput doc => doc
empty) SDoc -> SDoc -> SDoc
forall doc. IsDoc doc => doc -> doc -> doc
$$
  SDoc -> Int -> SDoc -> SDoc
hang (FilePath -> SDoc
forall doc. IsLine doc => FilePath -> doc
text FilePath
"Can't find interface-file declaration for" SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+>
         NameSpace -> SDoc
pprNameSpace (Name -> NameSpace
nameNameSpace Name
name) SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> Name -> SDoc
forall a. Outputable a => a -> SDoc
ppr Name
name)
    Int
2 ([SDoc] -> SDoc
forall doc. IsDoc doc => [doc] -> doc
vcat [FilePath -> SDoc
forall doc. IsLine doc => FilePath -> doc
text FilePath
"Probable cause: bug in .hi-boot file, or inconsistent .hi file",
             FilePath -> SDoc
forall doc. IsLine doc => FilePath -> doc
text FilePath
"Use -ddump-if-trace to get an idea of which file caused the error"])
  where
    found_things :: SDoc
found_things =
      SDoc -> Int -> SDoc -> SDoc
hang (FilePath -> SDoc
forall doc. IsLine doc => FilePath -> doc
text FilePath
"Found the following declarations in" SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> Module -> SDoc
forall a. Outputable a => a -> SDoc
ppr (HasDebugCallStack => Name -> Module
Name -> Module
nameModule Name
name) SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<> SDoc
forall doc. IsLine doc => doc
colon)
           Int
2 ([SDoc] -> SDoc
forall doc. IsDoc doc => [doc] -> doc
vcat ((TyThing -> SDoc) -> [TyThing] -> [SDoc]
forall a b. (a -> b) -> [a] -> [b]
map TyThing -> SDoc
forall a. Outputable a => a -> SDoc
ppr [TyThing]
things))

badSourceImport :: Module -> SDoc
badSourceImport :: Module -> SDoc
badSourceImport Module
mod
  = SDoc -> Int -> SDoc -> SDoc
hang (FilePath -> SDoc
forall doc. IsLine doc => FilePath -> doc
text FilePath
"You cannot {-# SOURCE #-} import a module from another package")
       Int
2 (FilePath -> SDoc
forall doc. IsLine doc => FilePath -> doc
text FilePath
"but" SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> SDoc -> SDoc
quotes (Module -> SDoc
forall a. Outputable a => a -> SDoc
ppr Module
mod) SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> FilePath -> SDoc
forall doc. IsLine doc => FilePath -> doc
text FilePath
"is from package"
          SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> SDoc -> SDoc
quotes (Unit -> SDoc
forall a. Outputable a => a -> SDoc
ppr (Module -> Unit
forall unit. GenModule unit -> unit
moduleUnit Module
mod)))