ghc-9.14.1: GHC/Tc/Types/ErrCtxt.hs
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE UndecidableInstances #-}
module GHC.Tc.Types.ErrCtxt
( ErrCtxt, ErrCtxtMsg(..)
, UserSigType(..), FunAppCtxtFunArg(..)
, TyConInstFlavour(..)
)
where
import GHC.Prelude
import GHC.Hs.Expr
import GHC.Hs.Extension
import GHC.Parser.Annotation ( LocatedN, SrcSpanAnnA )
import GHC.Tc.Errors.Types.PromotionErr ( TermLevelUseCtxt )
import GHC.Tc.Types.Origin ( CtOrigin, UserTypeCtxt, ExpectedFunTyOrigin )
import GHC.Tc.Utils.TcType ( TcType, TcTyCon )
import GHC.Tc.Zonk.Monad ( ZonkM )
import GHC.Types.Basic ( TyConFlavour )
import GHC.Types.Name ( Name )
import GHC.Types.SrcLoc ( SrcSpan )
import GHC.Types.Var ( Id, TyCoVar )
import GHC.Types.Var.Env ( TidyEnv )
import GHC.Unit.Types ( Module, InstantiatedModule )
import GHC.Core.Class ( Class )
import GHC.Core.ConLike ( ConLike )
import GHC.Core.PatSyn ( PatSyn )
import GHC.Core.TyCon ( TyCon )
import GHC.Core.TyCo.Rep ( Type, ThetaType, PredType )
import GHC.Unit.State ( UnitState )
import GHC.Data.FastString ( FastString )
import GHC.Utils.Outputable ( Outputable(..) )
import Language.Haskell.Syntax.Basic ( FieldLabelString(..) )
import Language.Haskell.Syntax
import GHC.Boot.TH.Syntax qualified as TH
import qualified Data.List.NonEmpty as NE
--------------------------------------------------------------------------------
-- | Additional context to include in an error message, e.g.
-- "In the type signature ...", "In the ambiguity check for ...", etc.
type ErrCtxt = (Bool, TidyEnv -> ZonkM (TidyEnv, ErrCtxtMsg))
-- Monadic so that we have a chance
-- to deal with bound type variables just before error
-- message construction
-- Bool: True <=> this is a landmark context; do not
-- discard it when trimming for display
--------------------------------------------------------------------------------
-- Error message contexts
data UserSigType p
= UserLHsSigType !(LHsSigType p)
| UserLHsType !(LHsType p)
instance OutputableBndrId p => Outputable (UserSigType (GhcPass p)) where
ppr (UserLHsSigType ty) = ppr ty
ppr (UserLHsType ty) = ppr ty
data FunAppCtxtFunArg
= FunAppCtxtExpr !(HsExpr GhcRn) !(HsExpr GhcRn)
| FunAppCtxtTy !(LHsType GhcRn) !(LHsType GhcRn)
-- | Like 'TyConFlavour' but for instance declarations, with
-- the additional information of whether this we are dealing with
-- a default declaration.
data TyConInstFlavour
= TyConInstFlavour
{ tyConInstFlavour :: !(TyConFlavour TyCon)
, tyConInstIsDefault :: !Bool
}
-- | The "context" of an error message, e.g. "In the expression <...>",
-- "In the pattern <...>", or "In the equations for closed type family <...>".
data ErrCtxtMsg
-- | In an expression.
= ExprCtxt !(HsExpr GhcRn)
-- | In a user-written context.
| ThetaCtxt !UserTypeCtxt !ThetaType
-- | In a quantified constraint.
| QuantifiedCtCtxt !PredType
-- | When checking an inferred type.
| InferredTypeCtxt !Name !TcType
-- | In an inline pragma, or a fixity signature,
-- or a type signature, or... (see 'Sig').
| SigCtxt !(Sig GhcRn)
-- | In a user-written type signature.
| UserSigCtxt !UserTypeCtxt !(UserSigType GhcRn)
-- | In a record update.
| RecordUpdCtxt !(NE.NonEmpty ConLike) ![Name] ![TyCoVar]
-- | In a class method.
| ClassOpCtxt !Id !Type
-- | In the instance type signature of a class method.
| MethSigCtxt !Name !TcType !TcType
-- | In a pattern type signature.
| PatSigErrCtxt !TcType !TcType
-- | In a pattern.
| PatCtxt !(Pat GhcRn)
-- | In a pattern synonym declaration.
| PatSynDeclCtxt !Name
-- | In a pattern matching context, e.g. a equation for a function binding,
-- or a case alternative, ...
| MatchCtxt !HsMatchContextRn
-- | In a match in a pattern matching context,
-- either for an expression or for an arrow command.
| forall body. (Outputable body)
=> MatchInCtxt !(Match GhcRn body)
-- | In a function application.
| FunAppCtxt !FunAppCtxtFunArg !Int
-- | In a function call.
| FunTysCtxt !ExpectedFunTyOrigin !Type !Int !Int
-- | In the result of a function call.
| FunResCtxt !(HsExpr GhcTc) !Int !Type !Type !Int !Int
-- | In the declaration of a type constructor.
| TyConDeclCtxt !Name !(TyConFlavour TyCon)
-- | In a type or data family instance (or default instance).
| TyConInstCtxt !Name !TyConInstFlavour
-- | In the declaration of a data constructor.
| DataConDefCtxt !(NE.NonEmpty (LocatedN Name))
-- | In the result type of a data constructor.
| DataConResTyCtxt !(NE.NonEmpty (LocatedN Name))
-- | In the equations for a closed type family.
| ClosedFamEqnCtxt !TyCon
-- | In the expansion of a type synonym.
| TySynErrCtxt !TyCon
-- | In a role annotation.
| RoleAnnotErrCtxt !Name
-- | In an arrow command.
| CmdCtxt !(HsCmd GhcRn)
-- | In an instance declaration.
| InstDeclErrCtxt !(Either (LHsType GhcRn) PredType)
-- | In a default declaration.
| DefaultDeclErrCtxt { ddec_in_type_list :: !Bool }
-- | In the body of a static form.
| StaticFormCtxt !(LHsExpr GhcRn)
-- | In a pattern binding.
| forall p. OutputableBndrId p
=> PatMonoBindsCtxt !(LPat (GhcPass p)) !(GRHSs GhcRn (LHsExpr GhcRn))
-- | In a foreign import/export declaration.
| ForeignDeclCtxt !(ForeignDecl GhcRn)
-- | In a record field.
| FieldCtxt !FieldLabelString
-- | In a type.
| TypeCtxt !(LHsType GhcRn)
-- | In a kind.
| KindCtxt !(LHsKind GhcRn)
-- | In an ambiguity check.
| AmbiguityCheckCtxt !UserTypeCtxt !Bool
-- | In a term-level use of a 'Name'.
| TermLevelUseCtxt !Name !TermLevelUseCtxt
-- | When checking the type of the @main@ function.
| MainCtxt !Name
-- | Warning emitted when inferring use of visible dependent quantification.
| VDQWarningCtxt !TcTyCon
-- | In a statement.
| forall body.
( Anno (StmtLR GhcRn GhcRn body) ~ SrcSpanAnnA
, Outputable body
) => StmtErrCtxt !HsStmtContextRn !(StmtLR GhcRn GhcRn body)
-- | In an rebindable syntax expression.
| SyntaxNameCtxt !(HsExpr GhcRn) !CtOrigin !TcType !SrcSpan
-- | In a RULE.
| RuleCtxt !FastString
-- | In a subtype check.
| SubTypeCtxt !TcType !TcType
-- | In an export.
| forall p. OutputableBndrId p
=> ExportCtxt (IE (GhcPass p))
-- | In an export of a pattern synonym.
| PatSynExportCtxt !PatSyn
-- | In an export of a pattern synonym record field.
| PatSynRecSelExportCtxt !PatSyn !Name
-- | In an annotation.
| forall p. OutputableBndrId p
=> AnnCtxt (AnnDecl (GhcPass p))
-- | In a specialise pragma.
| SpecPragmaCtxt !(Sig GhcRn)
-- | In a deriving clause.
| DerivInstCtxt !PredType
-- | In a standalone deriving clause.
| StandaloneDerivCtxt !(LHsSigWcType GhcRn)
-- | When typechecking the body of a derived instance.
| DerivBindCtxt !Id !Class ![Type]
-- | In an untyped Template Haskell quote.
| UntypedTHBracketCtxt !(HsQuote GhcPs)
-- | In a typed Template Haskell quote.
| forall p. OutputableBndrId p
=> TypedTHBracketCtxt !(LHsExpr (GhcPass p))
-- | In an untyped Template Haskell splice or quasi-quote.
| UntypedSpliceCtxt !(HsUntypedSplice GhcPs)
-- | In a typed Template Haskell splice.
| forall p. OutputableBndrId p
=> TypedSpliceCtxt !(Maybe SplicePointName) !(HsTypedSplice (GhcPass p))
-- | In the result of a typed Template Haskell splice.
| TypedSpliceResultCtxt !(LHsExpr GhcTc)
-- | In an argument to the Template Haskell @reifyInstances@ function.
| ReifyInstancesCtxt !TH.Name ![TH.Type]
-- | While merging Backpack signatures.
| MergeSignaturesCtxt !UnitState !ModuleName ![InstantiatedModule]
-- | While checking that a module implements a Backpack signature.
| CheckImplementsCtxt !UnitState !Module !InstantiatedModule