{-# LANGUAGE CPP #-}
{-# LANGUAGE MultiWayIf #-}
{-# LANGUAGE TypeFamilies #-}
{-# OPTIONS_GHC -Wno-incomplete-uni-patterns #-}
module GHC.Tc.Deriv ( tcDeriving, DerivInfo(..) ) where
#include "HsVersions.h"
import GHC.Prelude
import GHC.Hs
import GHC.Driver.Session
import GHC.Tc.Utils.Monad
import GHC.Tc.Instance.Family
import GHC.Tc.Types.Origin
import GHC.Core.Predicate
import GHC.Tc.Deriv.Infer
import GHC.Tc.Deriv.Utils
import GHC.Tc.Validity( allDistinctTyVars )
import GHC.Tc.TyCl.Class( instDeclCtxt3, tcATDefault )
import GHC.Tc.Utils.Env
import GHC.Tc.Deriv.Generate
import GHC.Tc.Validity( checkValidInstHead )
import GHC.Core.InstEnv
import GHC.Tc.Utils.Instantiate
import GHC.Core.FamInstEnv
import GHC.Tc.Gen.HsType
import GHC.Core.TyCo.Rep
import GHC.Core.TyCo.Ppr ( pprTyVars )
import GHC.Rename.Names ( extendGlobalRdrEnvRn )
import GHC.Rename.Bind
import GHC.Rename.Env
import GHC.Rename.Module ( addTcgDUs )
import GHC.Types.Avail
import GHC.Core.Unify( tcUnifyTy )
import GHC.Core.Class
import GHC.Core.Type
import GHC.Utils.Error
import GHC.Core.DataCon
import GHC.Data.Maybe
import GHC.Types.Name.Reader
import GHC.Types.Name
import GHC.Types.Name.Set as NameSet
import GHC.Core.TyCon
import GHC.Tc.Utils.TcType
import GHC.Types.Var as Var
import GHC.Types.Var.Env
import GHC.Types.Var.Set
import GHC.Builtin.Names
import GHC.Types.SrcLoc
import GHC.Utils.Misc
import GHC.Utils.Outputable as Outputable
import GHC.Data.FastString
import GHC.Data.Bag
import GHC.Utils.FV as FV (fvVarList, unionFV, mkFVs)
import qualified GHC.LanguageExtensions as LangExt
import Control.Monad
import Control.Monad.Trans.Class
import Control.Monad.Trans.Reader
import Data.List (partition, find)
data EarlyDerivSpec = InferTheta (DerivSpec [ThetaOrigin])
| GivenTheta (DerivSpec ThetaType)
splitEarlyDerivSpec :: [EarlyDerivSpec]
-> ([DerivSpec [ThetaOrigin]], [DerivSpec ThetaType])
splitEarlyDerivSpec :: [EarlyDerivSpec]
-> ([DerivSpec [ThetaOrigin]], [DerivSpec [PredType]])
splitEarlyDerivSpec [] = ([],[])
splitEarlyDerivSpec (InferTheta DerivSpec [ThetaOrigin]
spec : [EarlyDerivSpec]
specs) =
case [EarlyDerivSpec]
-> ([DerivSpec [ThetaOrigin]], [DerivSpec [PredType]])
splitEarlyDerivSpec [EarlyDerivSpec]
specs of ([DerivSpec [ThetaOrigin]]
is, [DerivSpec [PredType]]
gs) -> (DerivSpec [ThetaOrigin]
spec DerivSpec [ThetaOrigin]
-> [DerivSpec [ThetaOrigin]] -> [DerivSpec [ThetaOrigin]]
forall a. a -> [a] -> [a]
: [DerivSpec [ThetaOrigin]]
is, [DerivSpec [PredType]]
gs)
splitEarlyDerivSpec (GivenTheta DerivSpec [PredType]
spec : [EarlyDerivSpec]
specs) =
case [EarlyDerivSpec]
-> ([DerivSpec [ThetaOrigin]], [DerivSpec [PredType]])
splitEarlyDerivSpec [EarlyDerivSpec]
specs of ([DerivSpec [ThetaOrigin]]
is, [DerivSpec [PredType]]
gs) -> ([DerivSpec [ThetaOrigin]]
is, DerivSpec [PredType]
spec DerivSpec [PredType]
-> [DerivSpec [PredType]] -> [DerivSpec [PredType]]
forall a. a -> [a] -> [a]
: [DerivSpec [PredType]]
gs)
instance Outputable EarlyDerivSpec where
ppr :: EarlyDerivSpec -> SDoc
ppr (InferTheta DerivSpec [ThetaOrigin]
spec) = DerivSpec [ThetaOrigin] -> SDoc
forall a. Outputable a => a -> SDoc
External instance of the constraint type forall theta. Outputable theta => Outputable (DerivSpec theta)
External instance of the constraint type forall a. Outputable a => Outputable [a]
External instance of the constraint type Outputable ThetaOrigin
ppr DerivSpec [ThetaOrigin]
spec SDoc -> SDoc -> SDoc
<+> [Char] -> SDoc
text [Char]
"(Infer)"
ppr (GivenTheta DerivSpec [PredType]
spec) = DerivSpec [PredType] -> SDoc
forall a. Outputable a => a -> SDoc
External instance of the constraint type forall theta. Outputable theta => Outputable (DerivSpec theta)
External instance of the constraint type forall a. Outputable a => Outputable [a]
External instance of the constraint type Outputable PredType
ppr DerivSpec [PredType]
spec SDoc -> SDoc -> SDoc
<+> [Char] -> SDoc
text [Char]
"(Given)"
data DerivInfo = DerivInfo { DerivInfo -> TyCon
di_rep_tc :: TyCon
, DerivInfo -> [(Name, TyVar)]
di_scoped_tvs :: ![(Name,TyVar)]
, DerivInfo -> [LHsDerivingClause GhcRn]
di_clauses :: [LHsDerivingClause GhcRn]
, DerivInfo -> SDoc
di_ctxt :: SDoc
}
tcDeriving :: [DerivInfo]
-> [LDerivDecl GhcRn]
-> TcM (TcGblEnv, Bag (InstInfo GhcRn), HsValBinds GhcRn)
tcDeriving :: [DerivInfo]
-> [LDerivDecl GhcRn]
-> TcM (TcGblEnv, Bag (InstInfo GhcRn), HsValBinds GhcRn)
tcDeriving [DerivInfo]
deriv_infos [LDerivDecl GhcRn]
deriv_decls
= TcM (TcGblEnv, Bag (InstInfo GhcRn), HsValBinds GhcRn)
-> TcM (TcGblEnv, Bag (InstInfo GhcRn), HsValBinds GhcRn)
-> TcM (TcGblEnv, Bag (InstInfo GhcRn), HsValBinds GhcRn)
forall r. TcRn r -> TcRn r -> TcRn r
recoverM (do { TcGblEnv
g <- TcRnIf TcGblEnv TcLclEnv TcGblEnv
forall gbl lcl. TcRnIf gbl lcl gbl
getGblEnv
; (TcGblEnv, Bag (InstInfo GhcRn), HsValBinds GhcRn)
-> TcM (TcGblEnv, Bag (InstInfo GhcRn), HsValBinds GhcRn)
forall (m :: * -> *) a. Monad m => a -> m a
External instance of the constraint type forall m. Monad (IOEnv m)
return (TcGblEnv
g, Bag (InstInfo GhcRn)
forall a. Bag a
emptyBag, HsValBinds GhcRn
forall (a :: Pass) (b :: Pass).
HsValBindsLR (GhcPass a) (GhcPass b)
emptyValBindsOut)}) (TcM (TcGblEnv, Bag (InstInfo GhcRn), HsValBinds GhcRn)
-> TcM (TcGblEnv, Bag (InstInfo GhcRn), HsValBinds GhcRn))
-> TcM (TcGblEnv, Bag (InstInfo GhcRn), HsValBinds GhcRn)
-> TcM (TcGblEnv, Bag (InstInfo GhcRn), HsValBinds GhcRn)
forall a b. (a -> b) -> a -> b
$
do {
[EarlyDerivSpec]
early_specs <- [DerivInfo] -> [LDerivDecl GhcRn] -> TcM [EarlyDerivSpec]
makeDerivSpecs [DerivInfo]
deriv_infos [LDerivDecl GhcRn]
deriv_decls
; [Char] -> SDoc -> TcRn ()
traceTc [Char]
"tcDeriving" ([EarlyDerivSpec] -> SDoc
forall a. Outputable a => a -> SDoc
External instance of the constraint type forall a. Outputable a => Outputable [a]
Instance of class: Outputable of the constraint type Outputable EarlyDerivSpec
ppr [EarlyDerivSpec]
early_specs)
; let ([DerivSpec [ThetaOrigin]]
infer_specs, [DerivSpec [PredType]]
given_specs) = [EarlyDerivSpec]
-> ([DerivSpec [ThetaOrigin]], [DerivSpec [PredType]])
splitEarlyDerivSpec [EarlyDerivSpec]
early_specs
; [([PredType] -> TcM (InstInfo GhcPs), BagDerivStuff, [Name])]
insts1 <- (DerivSpec [PredType]
-> IOEnv
(Env TcGblEnv TcLclEnv)
([PredType] -> TcM (InstInfo GhcPs), BagDerivStuff, [Name]))
-> [DerivSpec [PredType]]
-> IOEnv
(Env TcGblEnv TcLclEnv)
[([PredType] -> TcM (InstInfo GhcPs), BagDerivStuff, [Name])]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
External instance of the constraint type forall m. Monad (IOEnv m)
External instance of the constraint type Traversable []
mapM DerivSpec [PredType]
-> IOEnv
(Env TcGblEnv TcLclEnv)
([PredType] -> TcM (InstInfo GhcPs), BagDerivStuff, [Name])
forall theta.
DerivSpec theta
-> IOEnv
(Env TcGblEnv TcLclEnv)
([PredType] -> TcM (InstInfo GhcPs), BagDerivStuff, [Name])
genInst [DerivSpec [PredType]]
given_specs
; [([PredType] -> TcM (InstInfo GhcPs), BagDerivStuff, [Name])]
insts2 <- (DerivSpec [ThetaOrigin]
-> IOEnv
(Env TcGblEnv TcLclEnv)
([PredType] -> TcM (InstInfo GhcPs), BagDerivStuff, [Name]))
-> [DerivSpec [ThetaOrigin]]
-> IOEnv
(Env TcGblEnv TcLclEnv)
[([PredType] -> TcM (InstInfo GhcPs), BagDerivStuff, [Name])]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
External instance of the constraint type forall m. Monad (IOEnv m)
External instance of the constraint type Traversable []
mapM DerivSpec [ThetaOrigin]
-> IOEnv
(Env TcGblEnv TcLclEnv)
([PredType] -> TcM (InstInfo GhcPs), BagDerivStuff, [Name])
forall theta.
DerivSpec theta
-> IOEnv
(Env TcGblEnv TcLclEnv)
([PredType] -> TcM (InstInfo GhcPs), BagDerivStuff, [Name])
genInst [DerivSpec [ThetaOrigin]]
infer_specs
; DynFlags
dflags <- IOEnv (Env TcGblEnv TcLclEnv) DynFlags
forall (m :: * -> *). HasDynFlags m => m DynFlags
External instance of the constraint type forall env. ContainsDynFlags env => HasDynFlags (IOEnv env)
External instance of the constraint type forall gbl lcl. ContainsDynFlags (Env gbl lcl)
getDynFlags
; let ([[PredType] -> TcM (InstInfo GhcPs)]
_, [BagDerivStuff]
deriv_stuff, [[Name]]
fvs) = [([PredType] -> TcM (InstInfo GhcPs), BagDerivStuff, [Name])]
-> ([[PredType] -> TcM (InstInfo GhcPs)], [BagDerivStuff],
[[Name]])
forall a b c. [(a, b, c)] -> ([a], [b], [c])
unzip3 ([([PredType] -> TcM (InstInfo GhcPs), BagDerivStuff, [Name])]
insts1 [([PredType] -> TcM (InstInfo GhcPs), BagDerivStuff, [Name])]
-> [([PredType] -> TcM (InstInfo GhcPs), BagDerivStuff, [Name])]
-> [([PredType] -> TcM (InstInfo GhcPs), BagDerivStuff, [Name])]
forall a. [a] -> [a] -> [a]
++ [([PredType] -> TcM (InstInfo GhcPs), BagDerivStuff, [Name])]
insts2)
; SrcSpan
loc <- TcRn SrcSpan
getSrcSpanM
; let (Bag (LHsBind GhcPs, LSig GhcPs)
binds, Bag FamInst
famInsts) = DynFlags
-> SrcSpan
-> BagDerivStuff
-> (Bag (LHsBind GhcPs, LSig GhcPs), Bag FamInst)
genAuxBinds DynFlags
dflags SrcSpan
loc
([BagDerivStuff] -> BagDerivStuff
forall a. [Bag a] -> Bag a
unionManyBags [BagDerivStuff]
deriv_stuff)
; let mk_inst_infos1 :: [[PredType] -> TcM (InstInfo GhcPs)]
mk_inst_infos1 = (([PredType] -> TcM (InstInfo GhcPs), BagDerivStuff, [Name])
-> [PredType] -> TcM (InstInfo GhcPs))
-> [([PredType] -> TcM (InstInfo GhcPs), BagDerivStuff, [Name])]
-> [[PredType] -> TcM (InstInfo GhcPs)]
forall a b. (a -> b) -> [a] -> [b]
map ([PredType] -> TcM (InstInfo GhcPs), BagDerivStuff, [Name])
-> [PredType] -> TcM (InstInfo GhcPs)
forall a b c. (a, b, c) -> a
fstOf3 [([PredType] -> TcM (InstInfo GhcPs), BagDerivStuff, [Name])]
insts1
; [InstInfo GhcPs]
inst_infos1 <- [[PredType] -> TcM (InstInfo GhcPs)]
-> [DerivSpec [PredType]] -> TcM [InstInfo GhcPs]
apply_inst_infos [[PredType] -> TcM (InstInfo GhcPs)]
mk_inst_infos1 [DerivSpec [PredType]]
given_specs
; [FamInst]
-> TcM (TcGblEnv, Bag (InstInfo GhcRn), HsValBinds GhcRn)
-> TcM (TcGblEnv, Bag (InstInfo GhcRn), HsValBinds GhcRn)
forall a. [FamInst] -> TcM a -> TcM a
tcExtendLocalFamInstEnv (Bag FamInst -> [FamInst]
forall a. Bag a -> [a]
bagToList Bag FamInst
famInsts) (TcM (TcGblEnv, Bag (InstInfo GhcRn), HsValBinds GhcRn)
-> TcM (TcGblEnv, Bag (InstInfo GhcRn), HsValBinds GhcRn))
-> TcM (TcGblEnv, Bag (InstInfo GhcRn), HsValBinds GhcRn)
-> TcM (TcGblEnv, Bag (InstInfo GhcRn), HsValBinds GhcRn)
forall a b. (a -> b) -> a -> b
$
do {
; [DerivSpec [PredType]]
final_specs <- [ClsInst]
-> TcM [DerivSpec [PredType]] -> TcM [DerivSpec [PredType]]
forall a. [ClsInst] -> TcM a -> TcM a
extendLocalInstEnv ((InstInfo GhcPs -> ClsInst) -> [InstInfo GhcPs] -> [ClsInst]
forall a b. (a -> b) -> [a] -> [b]
map InstInfo GhcPs -> ClsInst
forall a. InstInfo a -> ClsInst
iSpec [InstInfo GhcPs]
inst_infos1) (TcM [DerivSpec [PredType]] -> TcM [DerivSpec [PredType]])
-> TcM [DerivSpec [PredType]] -> TcM [DerivSpec [PredType]]
forall a b. (a -> b) -> a -> b
$
[DerivSpec [ThetaOrigin]] -> TcM [DerivSpec [PredType]]
simplifyInstanceContexts [DerivSpec [ThetaOrigin]]
infer_specs
; let mk_inst_infos2 :: [[PredType] -> TcM (InstInfo GhcPs)]
mk_inst_infos2 = (([PredType] -> TcM (InstInfo GhcPs), BagDerivStuff, [Name])
-> [PredType] -> TcM (InstInfo GhcPs))
-> [([PredType] -> TcM (InstInfo GhcPs), BagDerivStuff, [Name])]
-> [[PredType] -> TcM (InstInfo GhcPs)]
forall a b. (a -> b) -> [a] -> [b]
map ([PredType] -> TcM (InstInfo GhcPs), BagDerivStuff, [Name])
-> [PredType] -> TcM (InstInfo GhcPs)
forall a b c. (a, b, c) -> a
fstOf3 [([PredType] -> TcM (InstInfo GhcPs), BagDerivStuff, [Name])]
insts2
; [InstInfo GhcPs]
inst_infos2 <- [[PredType] -> TcM (InstInfo GhcPs)]
-> [DerivSpec [PredType]] -> TcM [InstInfo GhcPs]
apply_inst_infos [[PredType] -> TcM (InstInfo GhcPs)]
mk_inst_infos2 [DerivSpec [PredType]]
final_specs
; let inst_infos :: [InstInfo GhcPs]
inst_infos = [InstInfo GhcPs]
inst_infos1 [InstInfo GhcPs] -> [InstInfo GhcPs] -> [InstInfo GhcPs]
forall a. [a] -> [a] -> [a]
++ [InstInfo GhcPs]
inst_infos2
; (Bag (InstInfo GhcRn)
inst_info, HsValBinds GhcRn
rn_binds, DefUses
rn_dus) <- [InstInfo GhcPs]
-> Bag (LHsBind GhcPs, LSig GhcPs)
-> TcM (Bag (InstInfo GhcRn), HsValBinds GhcRn, DefUses)
renameDeriv [InstInfo GhcPs]
inst_infos Bag (LHsBind GhcPs, LSig GhcPs)
binds
; Bool -> TcRn () -> TcRn ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
External instance of the constraint type forall m. Applicative (IOEnv m)
unless (Bag (InstInfo GhcRn) -> Bool
forall a. Bag a -> Bool
isEmptyBag Bag (InstInfo GhcRn)
inst_info) (TcRn () -> TcRn ()) -> TcRn () -> TcRn ()
forall a b. (a -> b) -> a -> b
$
IO () -> TcRn ()
forall (m :: * -> *) a. MonadIO m => IO a -> m a
External instance of the constraint type forall env. MonadIO (IOEnv env)
liftIO (DynFlags -> DumpFlag -> [Char] -> DumpFormat -> SDoc -> IO ()
dumpIfSet_dyn DynFlags
dflags DumpFlag
Opt_D_dump_deriv [Char]
"Derived instances"
DumpFormat
FormatHaskell
(Bag (InstInfo GhcRn) -> HsValBinds GhcRn -> Bag FamInst -> SDoc
ddump_deriving Bag (InstInfo GhcRn)
inst_info HsValBinds GhcRn
rn_binds Bag FamInst
famInsts))
; TcGblEnv
gbl_env <- [ClsInst]
-> TcRnIf TcGblEnv TcLclEnv TcGblEnv
-> TcRnIf TcGblEnv TcLclEnv TcGblEnv
forall a. [ClsInst] -> TcM a -> TcM a
tcExtendLocalInstEnv ((InstInfo GhcRn -> ClsInst) -> [InstInfo GhcRn] -> [ClsInst]
forall a b. (a -> b) -> [a] -> [b]
map InstInfo GhcRn -> ClsInst
forall a. InstInfo a -> ClsInst
iSpec (Bag (InstInfo GhcRn) -> [InstInfo GhcRn]
forall a. Bag a -> [a]
bagToList Bag (InstInfo GhcRn)
inst_info))
TcRnIf TcGblEnv TcLclEnv TcGblEnv
forall gbl lcl. TcRnIf gbl lcl gbl
getGblEnv
; let all_dus :: DefUses
all_dus = DefUses
rn_dus DefUses -> DefUses -> DefUses
`plusDU` Uses -> DefUses
usesOnly ([Name] -> Uses
NameSet.mkFVs ([Name] -> Uses) -> [Name] -> Uses
forall a b. (a -> b) -> a -> b
$ [[Name]] -> [Name]
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
External instance of the constraint type Foldable []
concat [[Name]]
fvs)
; (TcGblEnv, Bag (InstInfo GhcRn), HsValBinds GhcRn)
-> TcM (TcGblEnv, Bag (InstInfo GhcRn), HsValBinds GhcRn)
forall (m :: * -> *) a. Monad m => a -> m a
External instance of the constraint type forall m. Monad (IOEnv m)
return (TcGblEnv -> DefUses -> TcGblEnv
addTcgDUs TcGblEnv
gbl_env DefUses
all_dus, Bag (InstInfo GhcRn)
inst_info, HsValBinds GhcRn
rn_binds) } }
where
ddump_deriving :: Bag (InstInfo GhcRn) -> HsValBinds GhcRn
-> Bag FamInst
-> SDoc
ddump_deriving :: Bag (InstInfo GhcRn) -> HsValBinds GhcRn -> Bag FamInst -> SDoc
ddump_deriving Bag (InstInfo GhcRn)
inst_infos HsValBinds GhcRn
extra_binds Bag FamInst
repFamInsts
= SDoc -> Arity -> SDoc -> SDoc
hang ([Char] -> SDoc
text [Char]
"Derived class instances:")
Arity
2 ([SDoc] -> SDoc
vcat ((InstInfo GhcRn -> SDoc) -> [InstInfo GhcRn] -> [SDoc]
forall a b. (a -> b) -> [a] -> [b]
map (\InstInfo GhcRn
i -> InstInfo GhcRn -> SDoc
forall (a :: Pass).
OutputableBndrId a =>
InstInfo (GhcPass a) -> SDoc
External instance of the constraint type OutputableBndr Name
External instance of the constraint type OutputableBndr Name
External instance of the constraint type IsPass 'Renamed
pprInstInfoDetails InstInfo GhcRn
i SDoc -> SDoc -> SDoc
$$ [Char] -> SDoc
text [Char]
"") (Bag (InstInfo GhcRn) -> [InstInfo GhcRn]
forall a. Bag a -> [a]
bagToList Bag (InstInfo GhcRn)
inst_infos))
SDoc -> SDoc -> SDoc
$$ HsValBinds GhcRn -> SDoc
forall a. Outputable a => a -> SDoc
External instance of the constraint type forall (pl :: Pass) (pr :: Pass).
(OutputableBndrId pl, OutputableBndrId pr) =>
Outputable (HsValBindsLR (GhcPass pl) (GhcPass pr))
External instance of the constraint type OutputableBndr Name
External instance of the constraint type OutputableBndr Name
External instance of the constraint type IsPass 'Renamed
External instance of the constraint type OutputableBndr Name
External instance of the constraint type OutputableBndr Name
External instance of the constraint type IsPass 'Renamed
ppr HsValBinds GhcRn
extra_binds)
SDoc -> SDoc -> SDoc
$$ [Char] -> SDoc -> SDoc
hangP [Char]
"Derived type family instances:"
([SDoc] -> SDoc
vcat ((FamInst -> SDoc) -> [FamInst] -> [SDoc]
forall a b. (a -> b) -> [a] -> [b]
map FamInst -> SDoc
pprRepTy (Bag FamInst -> [FamInst]
forall a. Bag a -> [a]
bagToList Bag FamInst
repFamInsts)))
hangP :: [Char] -> SDoc -> SDoc
hangP [Char]
s SDoc
x = [Char] -> SDoc
text [Char]
"" SDoc -> SDoc -> SDoc
$$ SDoc -> Arity -> SDoc -> SDoc
hang (PtrString -> SDoc
ptext ([Char] -> PtrString
sLit [Char]
s)) Arity
2 SDoc
x
apply_inst_infos :: [ThetaType -> TcM (InstInfo GhcPs)]
-> [DerivSpec ThetaType] -> TcM [InstInfo GhcPs]
apply_inst_infos :: [[PredType] -> TcM (InstInfo GhcPs)]
-> [DerivSpec [PredType]] -> TcM [InstInfo GhcPs]
apply_inst_infos = (([PredType] -> TcM (InstInfo GhcPs))
-> DerivSpec [PredType] -> TcM (InstInfo GhcPs))
-> [[PredType] -> TcM (InstInfo GhcPs)]
-> [DerivSpec [PredType]]
-> TcM [InstInfo GhcPs]
forall (m :: * -> *) a b c.
Applicative m =>
(a -> b -> m c) -> [a] -> [b] -> m [c]
External instance of the constraint type forall m. Applicative (IOEnv m)
zipWithM (\[PredType] -> TcM (InstInfo GhcPs)
f DerivSpec [PredType]
ds -> [PredType] -> TcM (InstInfo GhcPs)
f (DerivSpec [PredType] -> [PredType]
forall theta. DerivSpec theta -> theta
ds_theta DerivSpec [PredType]
ds))
pprRepTy :: FamInst -> SDoc
pprRepTy :: FamInst -> SDoc
pprRepTy fi :: FamInst
fi@(FamInst { fi_tys :: FamInst -> [PredType]
fi_tys = [PredType]
lhs })
= [Char] -> SDoc
text [Char]
"type" SDoc -> SDoc -> SDoc
<+> PredType -> SDoc
forall a. Outputable a => a -> SDoc
External instance of the constraint type Outputable PredType
ppr (TyCon -> [PredType] -> PredType
mkTyConApp (FamInst -> TyCon
famInstTyCon FamInst
fi) [PredType]
lhs) SDoc -> SDoc -> SDoc
<+>
SDoc
equals SDoc -> SDoc -> SDoc
<+> PredType -> SDoc
forall a. Outputable a => a -> SDoc
External instance of the constraint type Outputable PredType
ppr PredType
rhs
where rhs :: PredType
rhs = FamInst -> PredType
famInstRHS FamInst
fi
renameDeriv :: [InstInfo GhcPs]
-> Bag (LHsBind GhcPs, LSig GhcPs)
-> TcM (Bag (InstInfo GhcRn), HsValBinds GhcRn, DefUses)
renameDeriv :: [InstInfo GhcPs]
-> Bag (LHsBind GhcPs, LSig GhcPs)
-> TcM (Bag (InstInfo GhcRn), HsValBinds GhcRn, DefUses)
renameDeriv [InstInfo GhcPs]
inst_infos Bag (LHsBind GhcPs, LSig GhcPs)
bagBinds
= TcM (Bag (InstInfo GhcRn), HsValBinds GhcRn, DefUses)
-> TcM (Bag (InstInfo GhcRn), HsValBinds GhcRn, DefUses)
forall a. TcRn a -> TcRn a
discardWarnings (TcM (Bag (InstInfo GhcRn), HsValBinds GhcRn, DefUses)
-> TcM (Bag (InstInfo GhcRn), HsValBinds GhcRn, DefUses))
-> TcM (Bag (InstInfo GhcRn), HsValBinds GhcRn, DefUses)
-> TcM (Bag (InstInfo GhcRn), HsValBinds GhcRn, DefUses)
forall a b. (a -> b) -> a -> b
$
Extension
-> TcM (Bag (InstInfo GhcRn), HsValBinds GhcRn, DefUses)
-> TcM (Bag (InstInfo GhcRn), HsValBinds GhcRn, DefUses)
forall gbl lcl a. Extension -> TcRnIf gbl lcl a -> TcRnIf gbl lcl a
setXOptM Extension
LangExt.EmptyCase (TcM (Bag (InstInfo GhcRn), HsValBinds GhcRn, DefUses)
-> TcM (Bag (InstInfo GhcRn), HsValBinds GhcRn, DefUses))
-> TcM (Bag (InstInfo GhcRn), HsValBinds GhcRn, DefUses)
-> TcM (Bag (InstInfo GhcRn), HsValBinds GhcRn, DefUses)
forall a b. (a -> b) -> a -> b
$
Extension
-> TcM (Bag (InstInfo GhcRn), HsValBinds GhcRn, DefUses)
-> TcM (Bag (InstInfo GhcRn), HsValBinds GhcRn, DefUses)
forall gbl lcl a. Extension -> TcRnIf gbl lcl a -> TcRnIf gbl lcl a
setXOptM Extension
LangExt.ScopedTypeVariables (TcM (Bag (InstInfo GhcRn), HsValBinds GhcRn, DefUses)
-> TcM (Bag (InstInfo GhcRn), HsValBinds GhcRn, DefUses))
-> TcM (Bag (InstInfo GhcRn), HsValBinds GhcRn, DefUses)
-> TcM (Bag (InstInfo GhcRn), HsValBinds GhcRn, DefUses)
forall a b. (a -> b) -> a -> b
$
Extension
-> TcM (Bag (InstInfo GhcRn), HsValBinds GhcRn, DefUses)
-> TcM (Bag (InstInfo GhcRn), HsValBinds GhcRn, DefUses)
forall gbl lcl a. Extension -> TcRnIf gbl lcl a -> TcRnIf gbl lcl a
setXOptM Extension
LangExt.KindSignatures (TcM (Bag (InstInfo GhcRn), HsValBinds GhcRn, DefUses)
-> TcM (Bag (InstInfo GhcRn), HsValBinds GhcRn, DefUses))
-> TcM (Bag (InstInfo GhcRn), HsValBinds GhcRn, DefUses)
-> TcM (Bag (InstInfo GhcRn), HsValBinds GhcRn, DefUses)
forall a b. (a -> b) -> a -> b
$
Extension
-> TcM (Bag (InstInfo GhcRn), HsValBinds GhcRn, DefUses)
-> TcM (Bag (InstInfo GhcRn), HsValBinds GhcRn, DefUses)
forall gbl lcl a. Extension -> TcRnIf gbl lcl a -> TcRnIf gbl lcl a
setXOptM Extension
LangExt.TypeApplications (TcM (Bag (InstInfo GhcRn), HsValBinds GhcRn, DefUses)
-> TcM (Bag (InstInfo GhcRn), HsValBinds GhcRn, DefUses))
-> TcM (Bag (InstInfo GhcRn), HsValBinds GhcRn, DefUses)
-> TcM (Bag (InstInfo GhcRn), HsValBinds GhcRn, DefUses)
forall a b. (a -> b) -> a -> b
$
Extension
-> TcM (Bag (InstInfo GhcRn), HsValBinds GhcRn, DefUses)
-> TcM (Bag (InstInfo GhcRn), HsValBinds GhcRn, DefUses)
forall gbl lcl a. Extension -> TcRnIf gbl lcl a -> TcRnIf gbl lcl a
unsetXOptM Extension
LangExt.RebindableSyntax (TcM (Bag (InstInfo GhcRn), HsValBinds GhcRn, DefUses)
-> TcM (Bag (InstInfo GhcRn), HsValBinds GhcRn, DefUses))
-> TcM (Bag (InstInfo GhcRn), HsValBinds GhcRn, DefUses)
-> TcM (Bag (InstInfo GhcRn), HsValBinds GhcRn, DefUses)
forall a b. (a -> b) -> a -> b
$
Extension
-> TcM (Bag (InstInfo GhcRn), HsValBinds GhcRn, DefUses)
-> TcM (Bag (InstInfo GhcRn), HsValBinds GhcRn, DefUses)
forall gbl lcl a. Extension -> TcRnIf gbl lcl a -> TcRnIf gbl lcl a
setXOptM Extension
LangExt.TemplateHaskellQuotes (TcM (Bag (InstInfo GhcRn), HsValBinds GhcRn, DefUses)
-> TcM (Bag (InstInfo GhcRn), HsValBinds GhcRn, DefUses))
-> TcM (Bag (InstInfo GhcRn), HsValBinds GhcRn, DefUses)
-> TcM (Bag (InstInfo GhcRn), HsValBinds GhcRn, DefUses)
forall a b. (a -> b) -> a -> b
$
do {
; [Char] -> SDoc -> TcRn ()
traceTc [Char]
"rnd" ([SDoc] -> SDoc
vcat ((InstInfo GhcPs -> SDoc) -> [InstInfo GhcPs] -> [SDoc]
forall a b. (a -> b) -> [a] -> [b]
map (\InstInfo GhcPs
i -> InstInfo GhcPs -> SDoc
forall (a :: Pass).
OutputableBndrId a =>
InstInfo (GhcPass a) -> SDoc
External instance of the constraint type OutputableBndr RdrName
External instance of the constraint type OutputableBndr RdrName
External instance of the constraint type IsPass 'Parsed
pprInstInfoDetails InstInfo GhcPs
i SDoc -> SDoc -> SDoc
$$ [Char] -> SDoc
text [Char]
"") [InstInfo GhcPs]
inst_infos))
; (Bag (LHsBind GhcPs)
aux_binds, Bag (LSig GhcPs)
aux_sigs) <- ((LHsBind GhcPs, LSig GhcPs)
-> IOEnv (Env TcGblEnv TcLclEnv) (LHsBind GhcPs, LSig GhcPs))
-> Bag (LHsBind GhcPs, LSig GhcPs)
-> IOEnv
(Env TcGblEnv TcLclEnv) (Bag (LHsBind GhcPs), Bag (LSig GhcPs))
forall (m :: * -> *) a b c.
Monad m =>
(a -> m (b, c)) -> Bag a -> m (Bag b, Bag c)
External instance of the constraint type forall m. Monad (IOEnv m)
mapAndUnzipBagM (LHsBind GhcPs, LSig GhcPs)
-> IOEnv (Env TcGblEnv TcLclEnv) (LHsBind GhcPs, LSig GhcPs)
forall (m :: * -> *) a. Monad m => a -> m a
External instance of the constraint type forall m. Monad (IOEnv m)
return Bag (LHsBind GhcPs, LSig GhcPs)
bagBinds
; let aux_val_binds :: HsValBindsLR GhcPs GhcPs
aux_val_binds = XValBinds GhcPs GhcPs
-> Bag (LHsBind GhcPs) -> [LSig GhcPs] -> HsValBindsLR GhcPs GhcPs
forall idL idR.
XValBinds idL idR
-> LHsBindsLR idL idR -> [LSig idR] -> HsValBindsLR idL idR
ValBinds XValBinds GhcPs GhcPs
NoExtField
noExtField Bag (LHsBind GhcPs)
aux_binds (Bag (LSig GhcPs) -> [LSig GhcPs]
forall a. Bag a -> [a]
bagToList Bag (LSig GhcPs)
aux_sigs)
; HsValBindsLR GhcRn GhcPs
rn_aux_lhs <- MiniFixityEnv
-> HsValBindsLR GhcPs GhcPs -> RnM (HsValBindsLR GhcRn GhcPs)
rnTopBindsLHS MiniFixityEnv
forall a. FastStringEnv a
emptyFsEnv HsValBindsLR GhcPs GhcPs
aux_val_binds
; let bndrs :: [IdP GhcRn]
bndrs = HsValBindsLR GhcRn GhcPs -> [IdP GhcRn]
forall (idL :: Pass) (idR :: Pass).
CollectPass (GhcPass idL) =>
HsValBindsLR (GhcPass idL) (GhcPass idR) -> [IdP (GhcPass idL)]
External instance of the constraint type CollectPass GhcRn
collectHsValBinders HsValBindsLR GhcRn GhcPs
rn_aux_lhs
; (TcGblEnv, TcLclEnv)
envs <- [AvailInfo] -> MiniFixityEnv -> RnM (TcGblEnv, TcLclEnv)
extendGlobalRdrEnvRn ((Name -> AvailInfo) -> [Name] -> [AvailInfo]
forall a b. (a -> b) -> [a] -> [b]
map Name -> AvailInfo
avail [Name]
[IdP GhcRn]
bndrs) MiniFixityEnv
forall a. FastStringEnv a
emptyFsEnv ;
; (TcGblEnv, TcLclEnv)
-> TcM (Bag (InstInfo GhcRn), HsValBinds GhcRn, DefUses)
-> TcM (Bag (InstInfo GhcRn), HsValBinds GhcRn, DefUses)
forall gbl' lcl' a gbl lcl.
(gbl', lcl') -> TcRnIf gbl' lcl' a -> TcRnIf gbl lcl a
setEnvs (TcGblEnv, TcLclEnv)
envs (TcM (Bag (InstInfo GhcRn), HsValBinds GhcRn, DefUses)
-> TcM (Bag (InstInfo GhcRn), HsValBinds GhcRn, DefUses))
-> TcM (Bag (InstInfo GhcRn), HsValBinds GhcRn, DefUses)
-> TcM (Bag (InstInfo GhcRn), HsValBinds GhcRn, DefUses)
forall a b. (a -> b) -> a -> b
$
do { (HsValBinds GhcRn
rn_aux, DefUses
dus_aux) <- HsSigCtxt
-> HsValBindsLR GhcRn GhcPs -> RnM (HsValBinds GhcRn, DefUses)
rnValBindsRHS (Uses -> HsSigCtxt
TopSigCtxt ([Name] -> Uses
mkNameSet [Name]
[IdP GhcRn]
bndrs)) HsValBindsLR GhcRn GhcPs
rn_aux_lhs
; ([InstInfo GhcRn]
rn_inst_infos, [Uses]
fvs_insts) <- (InstInfo GhcPs
-> IOEnv (Env TcGblEnv TcLclEnv) (InstInfo GhcRn, Uses))
-> [InstInfo GhcPs]
-> IOEnv (Env TcGblEnv TcLclEnv) ([InstInfo GhcRn], [Uses])
forall (m :: * -> *) a b c.
Applicative m =>
(a -> m (b, c)) -> [a] -> m ([b], [c])
External instance of the constraint type forall m. Applicative (IOEnv m)
mapAndUnzipM InstInfo GhcPs
-> IOEnv (Env TcGblEnv TcLclEnv) (InstInfo GhcRn, Uses)
rn_inst_info [InstInfo GhcPs]
inst_infos
; (Bag (InstInfo GhcRn), HsValBinds GhcRn, DefUses)
-> TcM (Bag (InstInfo GhcRn), HsValBinds GhcRn, DefUses)
forall (m :: * -> *) a. Monad m => a -> m a
External instance of the constraint type forall m. Monad (IOEnv m)
return ([InstInfo GhcRn] -> Bag (InstInfo GhcRn)
forall a. [a] -> Bag a
listToBag [InstInfo GhcRn]
rn_inst_infos, HsValBinds GhcRn
rn_aux,
DefUses
dus_aux DefUses -> DefUses -> DefUses
`plusDU` Uses -> DefUses
usesOnly ([Uses] -> Uses
plusFVs [Uses]
fvs_insts)) } }
where
rn_inst_info :: InstInfo GhcPs -> TcM (InstInfo GhcRn, FreeVars)
rn_inst_info :: InstInfo GhcPs
-> IOEnv (Env TcGblEnv TcLclEnv) (InstInfo GhcRn, Uses)
rn_inst_info
inst_info :: InstInfo GhcPs
inst_info@(InstInfo { iSpec :: forall a. InstInfo a -> ClsInst
iSpec = ClsInst
inst
, iBinds :: forall a. InstInfo a -> InstBindings a
iBinds = InstBindings
{ ib_binds :: forall a. InstBindings a -> LHsBinds a
ib_binds = Bag (LHsBind GhcPs)
binds
, ib_tyvars :: forall a. InstBindings a -> [Name]
ib_tyvars = [Name]
tyvars
, ib_pragmas :: forall a. InstBindings a -> [LSig a]
ib_pragmas = [LSig GhcPs]
sigs
, ib_extensions :: forall a. InstBindings a -> [Extension]
ib_extensions = [Extension]
exts
, ib_derived :: forall a. InstBindings a -> Bool
ib_derived = Bool
sa } })
= do { (LHsBinds GhcRn
rn_binds, [LSig GhcRn]
rn_sigs, Uses
fvs) <- Bool
-> Name
-> [Name]
-> Bag (LHsBind GhcPs)
-> [LSig GhcPs]
-> RnM (LHsBinds GhcRn, [LSig GhcRn], Uses)
rnMethodBinds Bool
False (ClsInst -> Name
is_cls_nm ClsInst
inst)
[Name]
tyvars Bag (LHsBind GhcPs)
binds [LSig GhcPs]
sigs
; let binds' :: InstBindings GhcRn
binds' = InstBindings :: forall a.
[Name]
-> LHsBinds a -> [LSig a] -> [Extension] -> Bool -> InstBindings a
InstBindings { ib_binds :: LHsBinds GhcRn
ib_binds = LHsBinds GhcRn
rn_binds
, ib_tyvars :: [Name]
ib_tyvars = [Name]
tyvars
, ib_pragmas :: [LSig GhcRn]
ib_pragmas = [LSig GhcRn]
rn_sigs
, ib_extensions :: [Extension]
ib_extensions = [Extension]
exts
, ib_derived :: Bool
ib_derived = Bool
sa }
; (InstInfo GhcRn, Uses)
-> IOEnv (Env TcGblEnv TcLclEnv) (InstInfo GhcRn, Uses)
forall (m :: * -> *) a. Monad m => a -> m a
External instance of the constraint type forall m. Monad (IOEnv m)
return (InstInfo GhcPs
inst_info { iBinds :: InstBindings GhcRn
iBinds = InstBindings GhcRn
binds' }, Uses
fvs) }
makeDerivSpecs :: [DerivInfo]
-> [LDerivDecl GhcRn]
-> TcM [EarlyDerivSpec]
makeDerivSpecs :: [DerivInfo] -> [LDerivDecl GhcRn] -> TcM [EarlyDerivSpec]
makeDerivSpecs [DerivInfo]
deriv_infos [LDerivDecl GhcRn]
deriv_decls
= do { [[EarlyDerivSpec]]
eqns1 <- [TcM [EarlyDerivSpec]]
-> IOEnv (Env TcGblEnv TcLclEnv) [[EarlyDerivSpec]]
forall (t :: * -> *) (f :: * -> *) a.
(Traversable t, Applicative f) =>
t (f a) -> f (t a)
External instance of the constraint type forall m. Applicative (IOEnv m)
External instance of the constraint type Traversable []
sequenceA
[ TyCon
-> [(Name, TyVar)]
-> Maybe (LDerivStrategy GhcRn)
-> [LHsSigType GhcRn]
-> SDoc
-> TcM [EarlyDerivSpec]
deriveClause TyCon
rep_tc [(Name, TyVar)]
scoped_tvs Maybe (LDerivStrategy GhcRn)
dcs [LHsSigType GhcRn]
preds SDoc
err_ctxt
| DerivInfo { di_rep_tc :: DerivInfo -> TyCon
di_rep_tc = TyCon
rep_tc
, di_scoped_tvs :: DerivInfo -> [(Name, TyVar)]
di_scoped_tvs = [(Name, TyVar)]
scoped_tvs
, di_clauses :: DerivInfo -> [LHsDerivingClause GhcRn]
di_clauses = [LHsDerivingClause GhcRn]
clauses
, di_ctxt :: DerivInfo -> SDoc
di_ctxt = SDoc
err_ctxt } <- [DerivInfo]
deriv_infos
, L SrcSpan
_ (HsDerivingClause { deriv_clause_strategy :: forall pass. HsDerivingClause pass -> Maybe (LDerivStrategy pass)
deriv_clause_strategy = Maybe (LDerivStrategy GhcRn)
dcs
, deriv_clause_tys :: forall pass. HsDerivingClause pass -> Located [LHsSigType pass]
deriv_clause_tys = L SrcSpan
_ [LHsSigType GhcRn]
preds })
<- [LHsDerivingClause GhcRn]
clauses
]
; [Maybe EarlyDerivSpec]
eqns2 <- (LDerivDecl GhcRn
-> IOEnv (Env TcGblEnv TcLclEnv) (Maybe EarlyDerivSpec))
-> [LDerivDecl GhcRn]
-> IOEnv (Env TcGblEnv TcLclEnv) [Maybe EarlyDerivSpec]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
External instance of the constraint type forall m. Monad (IOEnv m)
External instance of the constraint type Traversable []
mapM (IOEnv (Env TcGblEnv TcLclEnv) (Maybe EarlyDerivSpec)
-> IOEnv (Env TcGblEnv TcLclEnv) (Maybe EarlyDerivSpec)
-> IOEnv (Env TcGblEnv TcLclEnv) (Maybe EarlyDerivSpec)
forall r. TcRn r -> TcRn r -> TcRn r
recoverM (Maybe EarlyDerivSpec
-> IOEnv (Env TcGblEnv TcLclEnv) (Maybe EarlyDerivSpec)
forall (f :: * -> *) a. Applicative f => a -> f a
External instance of the constraint type forall m. Applicative (IOEnv m)
pure Maybe EarlyDerivSpec
forall a. Maybe a
Nothing) (IOEnv (Env TcGblEnv TcLclEnv) (Maybe EarlyDerivSpec)
-> IOEnv (Env TcGblEnv TcLclEnv) (Maybe EarlyDerivSpec))
-> (LDerivDecl GhcRn
-> IOEnv (Env TcGblEnv TcLclEnv) (Maybe EarlyDerivSpec))
-> LDerivDecl GhcRn
-> IOEnv (Env TcGblEnv TcLclEnv) (Maybe EarlyDerivSpec)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. LDerivDecl GhcRn
-> IOEnv (Env TcGblEnv TcLclEnv) (Maybe EarlyDerivSpec)
deriveStandalone) [LDerivDecl GhcRn]
deriv_decls
; [EarlyDerivSpec] -> TcM [EarlyDerivSpec]
forall (m :: * -> *) a. Monad m => a -> m a
External instance of the constraint type forall m. Monad (IOEnv m)
return ([EarlyDerivSpec] -> TcM [EarlyDerivSpec])
-> [EarlyDerivSpec] -> TcM [EarlyDerivSpec]
forall a b. (a -> b) -> a -> b
$ [[EarlyDerivSpec]] -> [EarlyDerivSpec]
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
External instance of the constraint type Foldable []
concat [[EarlyDerivSpec]]
eqns1 [EarlyDerivSpec] -> [EarlyDerivSpec] -> [EarlyDerivSpec]
forall a. [a] -> [a] -> [a]
++ [Maybe EarlyDerivSpec] -> [EarlyDerivSpec]
forall a. [Maybe a] -> [a]
catMaybes [Maybe EarlyDerivSpec]
eqns2 }
deriveClause :: TyCon
-> [(Name, TcTyVar)]
-> Maybe (LDerivStrategy GhcRn)
-> [LHsSigType GhcRn] -> SDoc
-> TcM [EarlyDerivSpec]
deriveClause :: TyCon
-> [(Name, TyVar)]
-> Maybe (LDerivStrategy GhcRn)
-> [LHsSigType GhcRn]
-> SDoc
-> TcM [EarlyDerivSpec]
deriveClause TyCon
rep_tc [(Name, TyVar)]
scoped_tvs Maybe (LDerivStrategy GhcRn)
mb_lderiv_strat [LHsSigType GhcRn]
deriv_preds SDoc
err_ctxt
= SDoc -> TcM [EarlyDerivSpec] -> TcM [EarlyDerivSpec]
forall a. SDoc -> TcM a -> TcM a
addErrCtxt SDoc
err_ctxt (TcM [EarlyDerivSpec] -> TcM [EarlyDerivSpec])
-> TcM [EarlyDerivSpec] -> TcM [EarlyDerivSpec]
forall a b. (a -> b) -> a -> b
$ do
[Char] -> SDoc -> TcRn ()
traceTc [Char]
"deriveClause" (SDoc -> TcRn ()) -> SDoc -> TcRn ()
forall a b. (a -> b) -> a -> b
$ [SDoc] -> SDoc
vcat
[ [Char] -> SDoc
text [Char]
"tvs" SDoc -> SDoc -> SDoc
<+> [TyVar] -> SDoc
forall a. Outputable a => a -> SDoc
External instance of the constraint type forall a. Outputable a => Outputable [a]
External instance of the constraint type Outputable TyVar
ppr [TyVar]
tvs
, [Char] -> SDoc
text [Char]
"scoped_tvs" SDoc -> SDoc -> SDoc
<+> [(Name, TyVar)] -> SDoc
forall a. Outputable a => a -> SDoc
External instance of the constraint type forall a. Outputable a => Outputable [a]
External instance of the constraint type forall a b. (Outputable a, Outputable b) => Outputable (a, b)
External instance of the constraint type Outputable Name
External instance of the constraint type Outputable TyVar
ppr [(Name, TyVar)]
scoped_tvs
, [Char] -> SDoc
text [Char]
"tc" SDoc -> SDoc -> SDoc
<+> TyCon -> SDoc
forall a. Outputable a => a -> SDoc
External instance of the constraint type Outputable TyCon
ppr TyCon
tc
, [Char] -> SDoc
text [Char]
"tys" SDoc -> SDoc -> SDoc
<+> [PredType] -> SDoc
forall a. Outputable a => a -> SDoc
External instance of the constraint type forall a. Outputable a => Outputable [a]
External instance of the constraint type Outputable PredType
ppr [PredType]
tys
, [Char] -> SDoc
text [Char]
"mb_lderiv_strat" SDoc -> SDoc -> SDoc
<+> Maybe (LDerivStrategy GhcRn) -> SDoc
forall a. Outputable a => a -> SDoc
External instance of the constraint type forall a. Outputable a => Outputable (Maybe a)
External instance of the constraint type forall l e.
(Outputable l, Outputable e) =>
Outputable (GenLocated l e)
External instance of the constraint type Outputable SrcSpan
External instance of the constraint type forall (p :: Pass).
OutputableBndrId p =>
Outputable (DerivStrategy (GhcPass p))
External instance of the constraint type OutputableBndr Name
External instance of the constraint type OutputableBndr Name
External instance of the constraint type IsPass 'Renamed
ppr Maybe (LDerivStrategy GhcRn)
mb_lderiv_strat ]
[(Name, TyVar)] -> TcM [EarlyDerivSpec] -> TcM [EarlyDerivSpec]
forall r. [(Name, TyVar)] -> TcM r -> TcM r
tcExtendNameTyVarEnv [(Name, TyVar)]
scoped_tvs (TcM [EarlyDerivSpec] -> TcM [EarlyDerivSpec])
-> TcM [EarlyDerivSpec] -> TcM [EarlyDerivSpec]
forall a b. (a -> b) -> a -> b
$ do
(Maybe (LDerivStrategy GhcTc)
mb_lderiv_strat', [TyVar]
via_tvs) <- Maybe (LDerivStrategy GhcRn)
-> TcM (Maybe (LDerivStrategy GhcTc), [TyVar])
tcDerivStrategy Maybe (LDerivStrategy GhcRn)
mb_lderiv_strat
[TyVar] -> TcM [EarlyDerivSpec] -> TcM [EarlyDerivSpec]
forall r. [TyVar] -> TcM r -> TcM r
tcExtendTyVarEnv [TyVar]
via_tvs (TcM [EarlyDerivSpec] -> TcM [EarlyDerivSpec])
-> TcM [EarlyDerivSpec] -> TcM [EarlyDerivSpec]
forall a b. (a -> b) -> a -> b
$
(LHsSigType GhcRn
-> IOEnv (Env TcGblEnv TcLclEnv) (Maybe EarlyDerivSpec))
-> [LHsSigType GhcRn] -> TcM [EarlyDerivSpec]
forall (m :: * -> *) a b.
Applicative m =>
(a -> m (Maybe b)) -> [a] -> m [b]
External instance of the constraint type forall m. Applicative (IOEnv m)
mapMaybeM (TyCon
-> [PredType]
-> Maybe (LDerivStrategy GhcTc)
-> [TyVar]
-> LHsSigType GhcRn
-> IOEnv (Env TcGblEnv TcLclEnv) (Maybe EarlyDerivSpec)
derivePred TyCon
tc [PredType]
tys Maybe (LDerivStrategy GhcTc)
mb_lderiv_strat' [TyVar]
via_tvs) [LHsSigType GhcRn]
deriv_preds
where
tvs :: [TyVar]
tvs = TyCon -> [TyVar]
tyConTyVars TyCon
rep_tc
(TyCon
tc, [PredType]
tys) = case TyCon -> Maybe (TyCon, [PredType], CoAxiom Unbranched)
tyConFamInstSig_maybe TyCon
rep_tc of
Just (TyCon
fam_tc, [PredType]
pats, CoAxiom Unbranched
_) -> (TyCon
fam_tc, [PredType]
pats)
Maybe (TyCon, [PredType], CoAxiom Unbranched)
_ -> (TyCon
rep_tc, [TyVar] -> [PredType]
mkTyVarTys [TyVar]
tvs)
derivePred :: TyCon -> [Type] -> Maybe (LDerivStrategy GhcTc) -> [TyVar]
-> LHsSigType GhcRn -> TcM (Maybe EarlyDerivSpec)
derivePred :: TyCon
-> [PredType]
-> Maybe (LDerivStrategy GhcTc)
-> [TyVar]
-> LHsSigType GhcRn
-> IOEnv (Env TcGblEnv TcLclEnv) (Maybe EarlyDerivSpec)
derivePred TyCon
tc [PredType]
tys Maybe (LDerivStrategy GhcTc)
mb_lderiv_strat [TyVar]
via_tvs LHsSigType GhcRn
deriv_pred =
IOEnv (Env TcGblEnv TcLclEnv) (Maybe EarlyDerivSpec)
-> IOEnv (Env TcGblEnv TcLclEnv) (Maybe EarlyDerivSpec)
-> IOEnv (Env TcGblEnv TcLclEnv) (Maybe EarlyDerivSpec)
forall r. TcRn r -> TcRn r -> TcRn r
recoverM (Maybe EarlyDerivSpec
-> IOEnv (Env TcGblEnv TcLclEnv) (Maybe EarlyDerivSpec)
forall (f :: * -> *) a. Applicative f => a -> f a
External instance of the constraint type forall m. Applicative (IOEnv m)
pure Maybe EarlyDerivSpec
forall a. Maybe a
Nothing) (IOEnv (Env TcGblEnv TcLclEnv) (Maybe EarlyDerivSpec)
-> IOEnv (Env TcGblEnv TcLclEnv) (Maybe EarlyDerivSpec))
-> IOEnv (Env TcGblEnv TcLclEnv) (Maybe EarlyDerivSpec)
-> IOEnv (Env TcGblEnv TcLclEnv) (Maybe EarlyDerivSpec)
forall a b. (a -> b) -> a -> b
$
SrcSpan
-> IOEnv (Env TcGblEnv TcLclEnv) (Maybe EarlyDerivSpec)
-> IOEnv (Env TcGblEnv TcLclEnv) (Maybe EarlyDerivSpec)
forall a. SrcSpan -> TcRn a -> TcRn a
setSrcSpan (GenLocated SrcSpan (HsType GhcRn) -> SrcSpan
forall l e. GenLocated l e -> l
getLoc (LHsSigType GhcRn -> GenLocated SrcSpan (HsType GhcRn)
forall (p :: Pass). LHsSigType (GhcPass p) -> LHsType (GhcPass p)
hsSigType LHsSigType GhcRn
deriv_pred)) (IOEnv (Env TcGblEnv TcLclEnv) (Maybe EarlyDerivSpec)
-> IOEnv (Env TcGblEnv TcLclEnv) (Maybe EarlyDerivSpec))
-> IOEnv (Env TcGblEnv TcLclEnv) (Maybe EarlyDerivSpec)
-> IOEnv (Env TcGblEnv TcLclEnv) (Maybe EarlyDerivSpec)
forall a b. (a -> b) -> a -> b
$ do
[Char] -> SDoc -> TcRn ()
traceTc [Char]
"derivePred" (SDoc -> TcRn ()) -> SDoc -> TcRn ()
forall a b. (a -> b) -> a -> b
$ [SDoc] -> SDoc
vcat
[ [Char] -> SDoc
text [Char]
"tc" SDoc -> SDoc -> SDoc
<+> TyCon -> SDoc
forall a. Outputable a => a -> SDoc
External instance of the constraint type Outputable TyCon
ppr TyCon
tc
, [Char] -> SDoc
text [Char]
"tys" SDoc -> SDoc -> SDoc
<+> [PredType] -> SDoc
forall a. Outputable a => a -> SDoc
External instance of the constraint type forall a. Outputable a => Outputable [a]
External instance of the constraint type Outputable PredType
ppr [PredType]
tys
, [Char] -> SDoc
text [Char]
"deriv_pred" SDoc -> SDoc -> SDoc
<+> LHsSigType GhcRn -> SDoc
forall a. Outputable a => a -> SDoc
External instance of the constraint type forall thing (p :: Pass).
Outputable thing =>
Outputable (HsImplicitBndrs (GhcPass p) thing)
External instance of the constraint type forall l e.
(Outputable l, Outputable e) =>
Outputable (GenLocated l e)
External instance of the constraint type Outputable SrcSpan
External instance of the constraint type forall (p :: Pass).
OutputableBndrId p =>
Outputable (HsType (GhcPass p))
External instance of the constraint type OutputableBndr Name
External instance of the constraint type OutputableBndr Name
External instance of the constraint type IsPass 'Renamed
ppr LHsSigType GhcRn
deriv_pred
, [Char] -> SDoc
text [Char]
"mb_lderiv_strat" SDoc -> SDoc -> SDoc
<+> Maybe (LDerivStrategy GhcTc) -> SDoc
forall a. Outputable a => a -> SDoc
External instance of the constraint type forall a. Outputable a => Outputable (Maybe a)
External instance of the constraint type forall l e.
(Outputable l, Outputable e) =>
Outputable (GenLocated l e)
External instance of the constraint type Outputable SrcSpan
External instance of the constraint type forall (p :: Pass).
OutputableBndrId p =>
Outputable (DerivStrategy (GhcPass p))
External instance of the constraint type OutputableBndr TyVar
External instance of the constraint type OutputableBndr Name
External instance of the constraint type IsPass 'Typechecked
ppr Maybe (LDerivStrategy GhcTc)
mb_lderiv_strat
, [Char] -> SDoc
text [Char]
"via_tvs" SDoc -> SDoc -> SDoc
<+> [TyVar] -> SDoc
forall a. Outputable a => a -> SDoc
External instance of the constraint type forall a. Outputable a => Outputable [a]
External instance of the constraint type Outputable TyVar
ppr [TyVar]
via_tvs ]
([TyVar]
cls_tvs, Class
cls, [PredType]
cls_tys, [PredType]
cls_arg_kinds) <- LHsSigType GhcRn -> TcM ([TyVar], Class, [PredType], [PredType])
tcHsDeriv LHsSigType GhcRn
deriv_pred
Bool -> TcRn () -> TcRn ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
External instance of the constraint type forall m. Applicative (IOEnv m)
when ([PredType]
cls_arg_kinds [PredType] -> Arity -> Bool
forall a. [a] -> Arity -> Bool
`lengthIsNot` Arity
1) (TcRn () -> TcRn ()) -> TcRn () -> TcRn ()
forall a b. (a -> b) -> a -> b
$
SDoc -> TcRn ()
forall a. SDoc -> TcM a
failWithTc (LHsSigType GhcRn -> SDoc
nonUnaryErr LHsSigType GhcRn
deriv_pred)
let [PredType
cls_arg_kind] = [PredType]
cls_arg_kinds
mb_deriv_strat :: Maybe (DerivStrategy GhcTc)
mb_deriv_strat = (LDerivStrategy GhcTc -> DerivStrategy GhcTc)
-> Maybe (LDerivStrategy GhcTc) -> Maybe (DerivStrategy GhcTc)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
External instance of the constraint type Functor Maybe
fmap LDerivStrategy GhcTc -> DerivStrategy GhcTc
forall l e. GenLocated l e -> e
unLoc Maybe (LDerivStrategy GhcTc)
mb_lderiv_strat
if (Class -> Name
className Class
cls Name -> Name -> Bool
forall a. Eq a => a -> a -> Bool
External instance of the constraint type Eq Name
== Name
typeableClassName)
then do TcRn ()
warnUselessTypeable
Maybe EarlyDerivSpec
-> IOEnv (Env TcGblEnv TcLclEnv) (Maybe EarlyDerivSpec)
forall (m :: * -> *) a. Monad m => a -> m a
External instance of the constraint type forall m. Monad (IOEnv m)
return Maybe EarlyDerivSpec
forall a. Maybe a
Nothing
else let deriv_tvs :: [TyVar]
deriv_tvs = [TyVar]
via_tvs [TyVar] -> [TyVar] -> [TyVar]
forall a. [a] -> [a] -> [a]
++ [TyVar]
cls_tvs in
EarlyDerivSpec -> Maybe EarlyDerivSpec
forall a. a -> Maybe a
Just (EarlyDerivSpec -> Maybe EarlyDerivSpec)
-> IOEnv (Env TcGblEnv TcLclEnv) EarlyDerivSpec
-> IOEnv (Env TcGblEnv TcLclEnv) (Maybe EarlyDerivSpec)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
External instance of the constraint type forall env. Functor (IOEnv env)
<$> TyCon
-> [PredType]
-> Maybe (DerivStrategy GhcTc)
-> [TyVar]
-> Class
-> [PredType]
-> PredType
-> IOEnv (Env TcGblEnv TcLclEnv) EarlyDerivSpec
deriveTyData TyCon
tc [PredType]
tys Maybe (DerivStrategy GhcTc)
mb_deriv_strat
[TyVar]
deriv_tvs Class
cls [PredType]
cls_tys PredType
cls_arg_kind
deriveStandalone :: LDerivDecl GhcRn -> TcM (Maybe EarlyDerivSpec)
deriveStandalone :: LDerivDecl GhcRn
-> IOEnv (Env TcGblEnv TcLclEnv) (Maybe EarlyDerivSpec)
deriveStandalone (L SrcSpan
loc (DerivDecl XCDerivDecl GhcRn
_ LHsSigWcType GhcRn
deriv_ty Maybe (LDerivStrategy GhcRn)
mb_lderiv_strat Maybe (Located OverlapMode)
overlap_mode))
= SrcSpan
-> IOEnv (Env TcGblEnv TcLclEnv) (Maybe EarlyDerivSpec)
-> IOEnv (Env TcGblEnv TcLclEnv) (Maybe EarlyDerivSpec)
forall a. SrcSpan -> TcRn a -> TcRn a
setSrcSpan SrcSpan
loc (IOEnv (Env TcGblEnv TcLclEnv) (Maybe EarlyDerivSpec)
-> IOEnv (Env TcGblEnv TcLclEnv) (Maybe EarlyDerivSpec))
-> IOEnv (Env TcGblEnv TcLclEnv) (Maybe EarlyDerivSpec)
-> IOEnv (Env TcGblEnv TcLclEnv) (Maybe EarlyDerivSpec)
forall a b. (a -> b) -> a -> b
$
SDoc
-> IOEnv (Env TcGblEnv TcLclEnv) (Maybe EarlyDerivSpec)
-> IOEnv (Env TcGblEnv TcLclEnv) (Maybe EarlyDerivSpec)
forall a. SDoc -> TcM a -> TcM a
addErrCtxt (LHsSigWcType GhcRn -> SDoc
standaloneCtxt LHsSigWcType GhcRn
deriv_ty) (IOEnv (Env TcGblEnv TcLclEnv) (Maybe EarlyDerivSpec)
-> IOEnv (Env TcGblEnv TcLclEnv) (Maybe EarlyDerivSpec))
-> IOEnv (Env TcGblEnv TcLclEnv) (Maybe EarlyDerivSpec)
-> IOEnv (Env TcGblEnv TcLclEnv) (Maybe EarlyDerivSpec)
forall a b. (a -> b) -> a -> b
$
do { [Char] -> SDoc -> TcRn ()
traceTc [Char]
"Standalone deriving decl for" (LHsSigWcType GhcRn -> SDoc
forall a. Outputable a => a -> SDoc
External instance of the constraint type forall thing (p :: Pass).
Outputable thing =>
Outputable (HsWildCardBndrs (GhcPass p) thing)
External instance of the constraint type forall thing (p :: Pass).
Outputable thing =>
Outputable (HsImplicitBndrs (GhcPass p) thing)
External instance of the constraint type forall l e.
(Outputable l, Outputable e) =>
Outputable (GenLocated l e)
External instance of the constraint type Outputable SrcSpan
External instance of the constraint type forall (p :: Pass).
OutputableBndrId p =>
Outputable (HsType (GhcPass p))
External instance of the constraint type OutputableBndr Name
External instance of the constraint type OutputableBndr Name
External instance of the constraint type IsPass 'Renamed
ppr LHsSigWcType GhcRn
deriv_ty)
; let ctxt :: UserTypeCtxt
ctxt = Bool -> UserTypeCtxt
GHC.Tc.Types.Origin.InstDeclCtxt Bool
True
; [Char] -> SDoc -> TcRn ()
traceTc [Char]
"Deriving strategy (standalone deriving)" (SDoc -> TcRn ()) -> SDoc -> TcRn ()
forall a b. (a -> b) -> a -> b
$
[SDoc] -> SDoc
vcat [Maybe (LDerivStrategy GhcRn) -> SDoc
forall a. Outputable a => a -> SDoc
External instance of the constraint type forall a. Outputable a => Outputable (Maybe a)
External instance of the constraint type forall l e.
(Outputable l, Outputable e) =>
Outputable (GenLocated l e)
External instance of the constraint type Outputable SrcSpan
External instance of the constraint type forall (p :: Pass).
OutputableBndrId p =>
Outputable (DerivStrategy (GhcPass p))
External instance of the constraint type OutputableBndr Name
External instance of the constraint type OutputableBndr Name
External instance of the constraint type IsPass 'Renamed
ppr Maybe (LDerivStrategy GhcRn)
mb_lderiv_strat, LHsSigWcType GhcRn -> SDoc
forall a. Outputable a => a -> SDoc
External instance of the constraint type forall thing (p :: Pass).
Outputable thing =>
Outputable (HsWildCardBndrs (GhcPass p) thing)
External instance of the constraint type forall thing (p :: Pass).
Outputable thing =>
Outputable (HsImplicitBndrs (GhcPass p) thing)
External instance of the constraint type forall l e.
(Outputable l, Outputable e) =>
Outputable (GenLocated l e)
External instance of the constraint type Outputable SrcSpan
External instance of the constraint type forall (p :: Pass).
OutputableBndrId p =>
Outputable (HsType (GhcPass p))
External instance of the constraint type OutputableBndr Name
External instance of the constraint type OutputableBndr Name
External instance of the constraint type IsPass 'Renamed
ppr LHsSigWcType GhcRn
deriv_ty]
; (Maybe (LDerivStrategy GhcTc)
mb_lderiv_strat, [TyVar]
via_tvs) <- Maybe (LDerivStrategy GhcRn)
-> TcM (Maybe (LDerivStrategy GhcTc), [TyVar])
tcDerivStrategy Maybe (LDerivStrategy GhcRn)
mb_lderiv_strat
; ([TyVar]
cls_tvs, DerivContext
deriv_ctxt, Class
cls, [PredType]
inst_tys)
<- [TyVar]
-> TcM ([TyVar], DerivContext, Class, [PredType])
-> TcM ([TyVar], DerivContext, Class, [PredType])
forall r. [TyVar] -> TcM r -> TcM r
tcExtendTyVarEnv [TyVar]
via_tvs (TcM ([TyVar], DerivContext, Class, [PredType])
-> TcM ([TyVar], DerivContext, Class, [PredType]))
-> TcM ([TyVar], DerivContext, Class, [PredType])
-> TcM ([TyVar], DerivContext, Class, [PredType])
forall a b. (a -> b) -> a -> b
$
UserTypeCtxt
-> LHsSigWcType GhcRn
-> TcM ([TyVar], DerivContext, Class, [PredType])
tcStandaloneDerivInstType UserTypeCtxt
ctxt LHsSigWcType GhcRn
deriv_ty
; let mb_deriv_strat :: Maybe (DerivStrategy GhcTc)
mb_deriv_strat = (LDerivStrategy GhcTc -> DerivStrategy GhcTc)
-> Maybe (LDerivStrategy GhcTc) -> Maybe (DerivStrategy GhcTc)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
External instance of the constraint type Functor Maybe
fmap LDerivStrategy GhcTc -> DerivStrategy GhcTc
forall l e. GenLocated l e -> e
unLoc Maybe (LDerivStrategy GhcTc)
mb_lderiv_strat
tvs :: [TyVar]
tvs = [TyVar]
via_tvs [TyVar] -> [TyVar] -> [TyVar]
forall a. [a] -> [a] -> [a]
++ [TyVar]
cls_tvs
; ([TyVar]
tvs', DerivContext
deriv_ctxt', [PredType]
inst_tys', Maybe (DerivStrategy GhcTc)
mb_deriv_strat') <-
case Maybe (DerivStrategy GhcTc)
mb_deriv_strat of
Just (ViaStrategy XViaStrategy GhcTc
via_ty)
| Just PredType
inst_ty <- [PredType] -> Maybe PredType
forall a. [a] -> Maybe a
lastMaybe [PredType]
inst_tys
-> do
let via_kind :: PredType
via_kind = HasDebugCallStack => PredType -> PredType
PredType -> PredType
External instance of the constraint type HasDebugCallStack
tcTypeKind PredType
XViaStrategy GhcTc
via_ty
inst_ty_kind :: PredType
inst_ty_kind = HasDebugCallStack => PredType -> PredType
PredType -> PredType
External instance of the constraint type HasDebugCallStack
tcTypeKind PredType
inst_ty
mb_match :: Maybe TCvSubst
mb_match = PredType -> PredType -> Maybe TCvSubst
tcUnifyTy PredType
inst_ty_kind PredType
via_kind
Bool -> SDoc -> TcRn ()
checkTc (Maybe TCvSubst -> Bool
forall a. Maybe a -> Bool
isJust Maybe TCvSubst
mb_match)
(Class -> PredType -> PredType -> PredType -> SDoc
derivingViaKindErr Class
cls PredType
inst_ty_kind
PredType
XViaStrategy GhcTc
via_ty PredType
via_kind)
let Just TCvSubst
kind_subst = Maybe TCvSubst
mb_match
ki_subst_range :: VarSet
ki_subst_range = TCvSubst -> VarSet
getTCvSubstRangeFVs TCvSubst
kind_subst
unmapped_tkvs :: [TyVar]
unmapped_tkvs = (TyVar -> Bool) -> [TyVar] -> [TyVar]
forall a. (a -> Bool) -> [a] -> [a]
filter (\TyVar
v -> TyVar
v TyVar -> TCvSubst -> Bool
`notElemTCvSubst` TCvSubst
kind_subst
Bool -> Bool -> Bool
&& Bool -> Bool
not (TyVar
v TyVar -> VarSet -> Bool
`elemVarSet` VarSet
ki_subst_range))
[TyVar]
tvs
(TCvSubst
subst, [TyVar]
_) = HasCallStack => TCvSubst -> [TyVar] -> (TCvSubst, [TyVar])
TCvSubst -> [TyVar] -> (TCvSubst, [TyVar])
substTyVarBndrs TCvSubst
kind_subst [TyVar]
unmapped_tkvs
(DerivContext
final_deriv_ctxt, [PredType]
final_deriv_ctxt_tys)
= case DerivContext
deriv_ctxt of
InferContext Maybe SrcSpan
wc -> (Maybe SrcSpan -> DerivContext
InferContext Maybe SrcSpan
wc, [])
SupplyContext [PredType]
theta ->
let final_theta :: [PredType]
final_theta = HasCallStack => TCvSubst -> [PredType] -> [PredType]
TCvSubst -> [PredType] -> [PredType]
substTheta TCvSubst
subst [PredType]
theta
in ([PredType] -> DerivContext
SupplyContext [PredType]
final_theta, [PredType]
final_theta)
final_inst_tys :: [PredType]
final_inst_tys = HasCallStack => TCvSubst -> [PredType] -> [PredType]
TCvSubst -> [PredType] -> [PredType]
substTys TCvSubst
subst [PredType]
inst_tys
final_via_ty :: PredType
final_via_ty = HasCallStack => TCvSubst -> PredType -> PredType
TCvSubst -> PredType -> PredType
substTy TCvSubst
subst PredType
XViaStrategy GhcTc
via_ty
final_tvs :: [TyVar]
final_tvs = [PredType] -> [TyVar]
tyCoVarsOfTypesWellScoped ([PredType] -> [TyVar]) -> [PredType] -> [TyVar]
forall a b. (a -> b) -> a -> b
$
[PredType]
final_deriv_ctxt_tys [PredType] -> [PredType] -> [PredType]
forall a. [a] -> [a] -> [a]
++ [PredType]
final_inst_tys
[PredType] -> [PredType] -> [PredType]
forall a. [a] -> [a] -> [a]
++ [PredType
final_via_ty]
([TyVar], DerivContext, [PredType], Maybe (DerivStrategy GhcTc))
-> IOEnv
(Env TcGblEnv TcLclEnv)
([TyVar], DerivContext, [PredType], Maybe (DerivStrategy GhcTc))
forall (f :: * -> *) a. Applicative f => a -> f a
External instance of the constraint type forall m. Applicative (IOEnv m)
pure ( [TyVar]
final_tvs, DerivContext
final_deriv_ctxt, [PredType]
final_inst_tys
, DerivStrategy GhcTc -> Maybe (DerivStrategy GhcTc)
forall a. a -> Maybe a
Just (XViaStrategy GhcTc -> DerivStrategy GhcTc
forall pass. XViaStrategy pass -> DerivStrategy pass
ViaStrategy PredType
XViaStrategy GhcTc
final_via_ty) )
Maybe (DerivStrategy GhcTc)
_ -> ([TyVar], DerivContext, [PredType], Maybe (DerivStrategy GhcTc))
-> IOEnv
(Env TcGblEnv TcLclEnv)
([TyVar], DerivContext, [PredType], Maybe (DerivStrategy GhcTc))
forall (f :: * -> *) a. Applicative f => a -> f a
External instance of the constraint type forall m. Applicative (IOEnv m)
pure ([TyVar]
tvs, DerivContext
deriv_ctxt, [PredType]
inst_tys, Maybe (DerivStrategy GhcTc)
mb_deriv_strat)
; [Char] -> SDoc -> TcRn ()
traceTc [Char]
"Standalone deriving;" (SDoc -> TcRn ()) -> SDoc -> TcRn ()
forall a b. (a -> b) -> a -> b
$ [SDoc] -> SDoc
vcat
[ [Char] -> SDoc
text [Char]
"tvs':" SDoc -> SDoc -> SDoc
<+> [TyVar] -> SDoc
forall a. Outputable a => a -> SDoc
External instance of the constraint type forall a. Outputable a => Outputable [a]
External instance of the constraint type Outputable TyVar
ppr [TyVar]
tvs'
, [Char] -> SDoc
text [Char]
"mb_deriv_strat':" SDoc -> SDoc -> SDoc
<+> Maybe (DerivStrategy GhcTc) -> SDoc
forall a. Outputable a => a -> SDoc
External instance of the constraint type forall a. Outputable a => Outputable (Maybe a)
External instance of the constraint type forall (p :: Pass).
OutputableBndrId p =>
Outputable (DerivStrategy (GhcPass p))
External instance of the constraint type OutputableBndr TyVar
External instance of the constraint type OutputableBndr Name
External instance of the constraint type IsPass 'Typechecked
ppr Maybe (DerivStrategy GhcTc)
mb_deriv_strat'
, [Char] -> SDoc
text [Char]
"deriv_ctxt':" SDoc -> SDoc -> SDoc
<+> DerivContext -> SDoc
forall a. Outputable a => a -> SDoc
External instance of the constraint type Outputable DerivContext
ppr DerivContext
deriv_ctxt'
, [Char] -> SDoc
text [Char]
"cls:" SDoc -> SDoc -> SDoc
<+> Class -> SDoc
forall a. Outputable a => a -> SDoc
External instance of the constraint type Outputable Class
ppr Class
cls
, [Char] -> SDoc
text [Char]
"inst_tys':" SDoc -> SDoc -> SDoc
<+> [PredType] -> SDoc
forall a. Outputable a => a -> SDoc
External instance of the constraint type forall a. Outputable a => Outputable [a]
External instance of the constraint type Outputable PredType
ppr [PredType]
inst_tys' ]
; if Class -> Name
className Class
cls Name -> Name -> Bool
forall a. Eq a => a -> a -> Bool
External instance of the constraint type Eq Name
== Name
typeableClassName
then do TcRn ()
warnUselessTypeable
Maybe EarlyDerivSpec
-> IOEnv (Env TcGblEnv TcLclEnv) (Maybe EarlyDerivSpec)
forall (m :: * -> *) a. Monad m => a -> m a
External instance of the constraint type forall m. Monad (IOEnv m)
return Maybe EarlyDerivSpec
forall a. Maybe a
Nothing
else EarlyDerivSpec -> Maybe EarlyDerivSpec
forall a. a -> Maybe a
Just (EarlyDerivSpec -> Maybe EarlyDerivSpec)
-> IOEnv (Env TcGblEnv TcLclEnv) EarlyDerivSpec
-> IOEnv (Env TcGblEnv TcLclEnv) (Maybe EarlyDerivSpec)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
External instance of the constraint type forall env. Functor (IOEnv env)
<$> Maybe OverlapMode
-> [TyVar]
-> Class
-> [PredType]
-> DerivContext
-> Maybe (DerivStrategy GhcTc)
-> IOEnv (Env TcGblEnv TcLclEnv) EarlyDerivSpec
mkEqnHelp ((Located OverlapMode -> OverlapMode)
-> Maybe (Located OverlapMode) -> Maybe OverlapMode
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
External instance of the constraint type Functor Maybe
fmap Located OverlapMode -> OverlapMode
forall l e. GenLocated l e -> e
unLoc Maybe (Located OverlapMode)
overlap_mode)
[TyVar]
tvs' Class
cls [PredType]
inst_tys'
DerivContext
deriv_ctxt' Maybe (DerivStrategy GhcTc)
mb_deriv_strat' }
tcStandaloneDerivInstType
:: UserTypeCtxt -> LHsSigWcType GhcRn
-> TcM ([TyVar], DerivContext, Class, [Type])
tcStandaloneDerivInstType :: UserTypeCtxt
-> LHsSigWcType GhcRn
-> TcM ([TyVar], DerivContext, Class, [PredType])
tcStandaloneDerivInstType UserTypeCtxt
ctxt
(HsWC { hswc_body :: forall pass thing. HsWildCardBndrs pass thing -> thing
hswc_body = deriv_ty :: LHsSigType GhcRn
deriv_ty@(HsIB { hsib_ext :: forall pass thing. HsImplicitBndrs pass thing -> XHsIB pass thing
hsib_ext = XHsIB GhcRn (GenLocated SrcSpan (HsType GhcRn))
vars
, hsib_body :: forall pass thing. HsImplicitBndrs pass thing -> thing
hsib_body = GenLocated SrcSpan (HsType GhcRn)
deriv_ty_body })})
| ([LHsTyVarBndr Specificity GhcRn]
tvs, LHsContext GhcRn
theta, GenLocated SrcSpan (HsType GhcRn)
rho) <- GenLocated SrcSpan (HsType GhcRn)
-> ([LHsTyVarBndr Specificity GhcRn], LHsContext GhcRn,
GenLocated SrcSpan (HsType GhcRn))
forall pass.
LHsType pass
-> ([LHsTyVarBndr Specificity pass], LHsContext pass, LHsType pass)
splitLHsSigmaTyInvis GenLocated SrcSpan (HsType GhcRn)
deriv_ty_body
, L SrcSpan
_ [GenLocated SrcSpan (HsType GhcRn)
wc_pred] <- LHsContext GhcRn
theta
, L SrcSpan
wc_span (HsWildCardTy XWildCardTy GhcRn
_) <- GenLocated SrcSpan (HsType GhcRn)
-> GenLocated SrcSpan (HsType GhcRn)
forall pass. LHsType pass -> LHsType pass
ignoreParens GenLocated SrcSpan (HsType GhcRn)
wc_pred
= do PredType
dfun_ty <- UserTypeCtxt -> LHsSigType GhcRn -> TcM PredType
tcHsClsInstType UserTypeCtxt
ctxt (LHsSigType GhcRn -> TcM PredType)
-> LHsSigType GhcRn -> TcM PredType
forall a b. (a -> b) -> a -> b
$
HsIB :: forall pass thing.
XHsIB pass thing -> thing -> HsImplicitBndrs pass thing
HsIB { hsib_ext :: XHsIB GhcRn (GenLocated SrcSpan (HsType GhcRn))
hsib_ext = XHsIB GhcRn (GenLocated SrcSpan (HsType GhcRn))
vars
, hsib_body :: GenLocated SrcSpan (HsType GhcRn)
hsib_body
= SrcSpan -> HsType GhcRn -> GenLocated SrcSpan (HsType GhcRn)
forall l e. l -> e -> GenLocated l e
L (GenLocated SrcSpan (HsType GhcRn) -> SrcSpan
forall l e. GenLocated l e -> l
getLoc GenLocated SrcSpan (HsType GhcRn)
deriv_ty_body) (HsType GhcRn -> GenLocated SrcSpan (HsType GhcRn))
-> HsType GhcRn -> GenLocated SrcSpan (HsType GhcRn)
forall a b. (a -> b) -> a -> b
$
HsForAllTy :: forall pass.
XForAllTy pass
-> ForallVisFlag
-> [LHsTyVarBndr Specificity pass]
-> LHsType pass
-> HsType pass
HsForAllTy { hst_fvf :: ForallVisFlag
hst_fvf = ForallVisFlag
ForallInvis
, hst_bndrs :: [LHsTyVarBndr Specificity GhcRn]
hst_bndrs = [LHsTyVarBndr Specificity GhcRn]
tvs
, hst_xforall :: XForAllTy GhcRn
hst_xforall = XForAllTy GhcRn
NoExtField
noExtField
, hst_body :: GenLocated SrcSpan (HsType GhcRn)
hst_body = GenLocated SrcSpan (HsType GhcRn)
rho }}
let ([TyVar]
tvs, [PredType]
_theta, Class
cls, [PredType]
inst_tys) = PredType -> ([TyVar], [PredType], Class, [PredType])
tcSplitDFunTy PredType
dfun_ty
([TyVar], DerivContext, Class, [PredType])
-> TcM ([TyVar], DerivContext, Class, [PredType])
forall (f :: * -> *) a. Applicative f => a -> f a
External instance of the constraint type forall m. Applicative (IOEnv m)
pure ([TyVar]
tvs, Maybe SrcSpan -> DerivContext
InferContext (SrcSpan -> Maybe SrcSpan
forall a. a -> Maybe a
Just SrcSpan
wc_span), Class
cls, [PredType]
inst_tys)
| Bool
otherwise
= do PredType
dfun_ty <- UserTypeCtxt -> LHsSigType GhcRn -> TcM PredType
tcHsClsInstType UserTypeCtxt
ctxt LHsSigType GhcRn
deriv_ty
let ([TyVar]
tvs, [PredType]
theta, Class
cls, [PredType]
inst_tys) = PredType -> ([TyVar], [PredType], Class, [PredType])
tcSplitDFunTy PredType
dfun_ty
([TyVar], DerivContext, Class, [PredType])
-> TcM ([TyVar], DerivContext, Class, [PredType])
forall (f :: * -> *) a. Applicative f => a -> f a
External instance of the constraint type forall m. Applicative (IOEnv m)
pure ([TyVar]
tvs, [PredType] -> DerivContext
SupplyContext [PredType]
theta, Class
cls, [PredType]
inst_tys)
warnUselessTypeable :: TcM ()
warnUselessTypeable :: TcRn ()
warnUselessTypeable
= do { Bool
warn <- WarningFlag -> TcRnIf TcGblEnv TcLclEnv Bool
forall gbl lcl. WarningFlag -> TcRnIf gbl lcl Bool
woptM WarningFlag
Opt_WarnDerivingTypeable
; Bool -> TcRn () -> TcRn ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
External instance of the constraint type forall m. Applicative (IOEnv m)
when Bool
warn (TcRn () -> TcRn ()) -> TcRn () -> TcRn ()
forall a b. (a -> b) -> a -> b
$ WarnReason -> SDoc -> TcRn ()
addWarnTc (WarningFlag -> WarnReason
Reason WarningFlag
Opt_WarnDerivingTypeable)
(SDoc -> TcRn ()) -> SDoc -> TcRn ()
forall a b. (a -> b) -> a -> b
$ [Char] -> SDoc
text [Char]
"Deriving" SDoc -> SDoc -> SDoc
<+> SDoc -> SDoc
quotes (Name -> SDoc
forall a. Outputable a => a -> SDoc
External instance of the constraint type Outputable Name
ppr Name
typeableClassName) SDoc -> SDoc -> SDoc
<+>
[Char] -> SDoc
text [Char]
"has no effect: all types now auto-derive Typeable" }
deriveTyData :: TyCon -> [Type]
-> Maybe (DerivStrategy GhcTc)
-> [TyVar]
-> Class
-> [Type]
-> Kind
-> TcM EarlyDerivSpec
deriveTyData :: TyCon
-> [PredType]
-> Maybe (DerivStrategy GhcTc)
-> [TyVar]
-> Class
-> [PredType]
-> PredType
-> IOEnv (Env TcGblEnv TcLclEnv) EarlyDerivSpec
deriveTyData TyCon
tc [PredType]
tc_args Maybe (DerivStrategy GhcTc)
mb_deriv_strat [TyVar]
deriv_tvs Class
cls [PredType]
cls_tys PredType
cls_arg_kind
= do {
let ([PredType]
arg_kinds, PredType
_) = PredType -> ([PredType], PredType)
splitFunTys PredType
cls_arg_kind
n_args_to_drop :: Arity
n_args_to_drop = [PredType] -> Arity
forall (t :: * -> *) a. Foldable t => t a -> Arity
External instance of the constraint type Foldable []
length [PredType]
arg_kinds
n_args_to_keep :: Arity
n_args_to_keep = [PredType] -> Arity
forall (t :: * -> *) a. Foldable t => t a -> Arity
External instance of the constraint type Foldable []
length [PredType]
tc_args Arity -> Arity -> Arity
forall a. Num a => a -> a -> a
External instance of the constraint type Num Arity
- Arity
n_args_to_drop
([PredType]
tc_args_to_keep, [PredType]
args_to_drop)
= Arity -> [PredType] -> ([PredType], [PredType])
forall a. Arity -> [a] -> ([a], [a])
splitAt Arity
n_args_to_keep [PredType]
tc_args
inst_ty_kind :: PredType
inst_ty_kind = HasDebugCallStack => PredType -> PredType
PredType -> PredType
External instance of the constraint type HasDebugCallStack
tcTypeKind (TyCon -> [PredType] -> PredType
mkTyConApp TyCon
tc [PredType]
tc_args_to_keep)
mb_match :: Maybe TCvSubst
mb_match = PredType -> PredType -> Maybe TCvSubst
tcUnifyTy PredType
inst_ty_kind PredType
cls_arg_kind
enough_args :: Bool
enough_args = Arity
n_args_to_keep Arity -> Arity -> Bool
forall a. Ord a => a -> a -> Bool
External instance of the constraint type Ord Arity
>= Arity
0
; Bool -> SDoc -> TcRn ()
checkTc (Bool
enough_args Bool -> Bool -> Bool
&& Maybe TCvSubst -> Bool
forall a. Maybe a -> Bool
isJust Maybe TCvSubst
mb_match)
(TyCon -> Class -> [PredType] -> PredType -> Bool -> SDoc
derivingKindErr TyCon
tc Class
cls [PredType]
cls_tys PredType
cls_arg_kind Bool
enough_args)
; let
deriv_strat_tys :: Maybe (DerivStrategy GhcTc) -> [Type]
deriv_strat_tys :: Maybe (DerivStrategy GhcTc) -> [PredType]
deriv_strat_tys = (DerivStrategy GhcTc -> [PredType])
-> Maybe (DerivStrategy GhcTc) -> [PredType]
forall (t :: * -> *) m a.
(Foldable t, Monoid m) =>
(a -> m) -> t a -> m
External instance of the constraint type forall a. Monoid [a]
External instance of the constraint type Foldable Maybe
foldMap ([PredType]
-> (XViaStrategy GhcTc -> [PredType])
-> DerivStrategy GhcTc
-> [PredType]
forall p (pass :: Pass) r.
(p ~ GhcPass pass) =>
r -> (XViaStrategy p -> r) -> DerivStrategy p -> r
foldDerivStrategy [] (PredType -> [PredType] -> [PredType]
forall a. a -> [a] -> [a]
:[]))
propagate_subst :: TCvSubst
-> [TyVar]
-> [PredType]
-> [PredType]
-> Maybe (DerivStrategy GhcTc)
-> ([TyVar], [PredType], [PredType], Maybe (DerivStrategy GhcTc))
propagate_subst TCvSubst
kind_subst [TyVar]
tkvs' [PredType]
cls_tys' [PredType]
tc_args' Maybe (DerivStrategy GhcTc)
mb_deriv_strat'
= ([TyVar]
final_tkvs, [PredType]
final_cls_tys, [PredType]
final_tc_args, Maybe (DerivStrategy GhcTc)
final_mb_deriv_strat)
where
ki_subst_range :: VarSet
ki_subst_range = TCvSubst -> VarSet
getTCvSubstRangeFVs TCvSubst
kind_subst
unmapped_tkvs :: [TyVar]
unmapped_tkvs = (TyVar -> Bool) -> [TyVar] -> [TyVar]
forall a. (a -> Bool) -> [a] -> [a]
filter (\TyVar
v -> TyVar
v TyVar -> TCvSubst -> Bool
`notElemTCvSubst` TCvSubst
kind_subst
Bool -> Bool -> Bool
&& Bool -> Bool
not (TyVar
v TyVar -> VarSet -> Bool
`elemVarSet` VarSet
ki_subst_range))
[TyVar]
tkvs'
(TCvSubst
subst, [TyVar]
_) = HasCallStack => TCvSubst -> [TyVar] -> (TCvSubst, [TyVar])
TCvSubst -> [TyVar] -> (TCvSubst, [TyVar])
substTyVarBndrs TCvSubst
kind_subst [TyVar]
unmapped_tkvs
final_tc_args :: [PredType]
final_tc_args = HasCallStack => TCvSubst -> [PredType] -> [PredType]
TCvSubst -> [PredType] -> [PredType]
substTys TCvSubst
subst [PredType]
tc_args'
final_cls_tys :: [PredType]
final_cls_tys = HasCallStack => TCvSubst -> [PredType] -> [PredType]
TCvSubst -> [PredType] -> [PredType]
substTys TCvSubst
subst [PredType]
cls_tys'
final_mb_deriv_strat :: Maybe (DerivStrategy GhcTc)
final_mb_deriv_strat = (DerivStrategy GhcTc -> DerivStrategy GhcTc)
-> Maybe (DerivStrategy GhcTc) -> Maybe (DerivStrategy GhcTc)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
External instance of the constraint type Functor Maybe
fmap ((XViaStrategy GhcTc -> XViaStrategy GhcTc)
-> DerivStrategy GhcTc -> DerivStrategy GhcTc
forall p (pass :: Pass).
(p ~ GhcPass pass) =>
(XViaStrategy p -> XViaStrategy p)
-> DerivStrategy p -> DerivStrategy p
mapDerivStrategy (HasCallStack => TCvSubst -> PredType -> PredType
TCvSubst -> PredType -> PredType
substTy TCvSubst
subst))
Maybe (DerivStrategy GhcTc)
mb_deriv_strat'
final_tkvs :: [TyVar]
final_tkvs = [PredType] -> [TyVar]
tyCoVarsOfTypesWellScoped ([PredType] -> [TyVar]) -> [PredType] -> [TyVar]
forall a b. (a -> b) -> a -> b
$
[PredType]
final_cls_tys [PredType] -> [PredType] -> [PredType]
forall a. [a] -> [a] -> [a]
++ [PredType]
final_tc_args
[PredType] -> [PredType] -> [PredType]
forall a. [a] -> [a] -> [a]
++ Maybe (DerivStrategy GhcTc) -> [PredType]
deriv_strat_tys Maybe (DerivStrategy GhcTc)
final_mb_deriv_strat
; let tkvs :: [TyVar]
tkvs = [TyVar] -> [TyVar]
scopedSort ([TyVar] -> [TyVar]) -> [TyVar] -> [TyVar]
forall a b. (a -> b) -> a -> b
$ FV -> [TyVar]
fvVarList (FV -> [TyVar]) -> FV -> [TyVar]
forall a b. (a -> b) -> a -> b
$
FV -> FV -> FV
unionFV ([PredType] -> FV
tyCoFVsOfTypes [PredType]
tc_args_to_keep)
([TyVar] -> FV
FV.mkFVs [TyVar]
deriv_tvs)
Just TCvSubst
kind_subst = Maybe TCvSubst
mb_match
([TyVar]
tkvs', [PredType]
cls_tys', [PredType]
tc_args', Maybe (DerivStrategy GhcTc)
mb_deriv_strat')
= TCvSubst
-> [TyVar]
-> [PredType]
-> [PredType]
-> Maybe (DerivStrategy GhcTc)
-> ([TyVar], [PredType], [PredType], Maybe (DerivStrategy GhcTc))
propagate_subst TCvSubst
kind_subst [TyVar]
tkvs [PredType]
cls_tys
[PredType]
tc_args_to_keep Maybe (DerivStrategy GhcTc)
mb_deriv_strat
; ([TyVar]
final_tkvs, [PredType]
final_cls_tys, [PredType]
final_tc_args, Maybe (DerivStrategy GhcTc)
final_mb_deriv_strat) <-
case Maybe (DerivStrategy GhcTc)
mb_deriv_strat' of
Just (ViaStrategy XViaStrategy GhcTc
via_ty) -> do
let via_kind :: PredType
via_kind = HasDebugCallStack => PredType -> PredType
PredType -> PredType
External instance of the constraint type HasDebugCallStack
tcTypeKind PredType
XViaStrategy GhcTc
via_ty
inst_ty_kind :: PredType
inst_ty_kind
= HasDebugCallStack => PredType -> PredType
PredType -> PredType
External instance of the constraint type HasDebugCallStack
tcTypeKind (TyCon -> [PredType] -> PredType
mkTyConApp TyCon
tc [PredType]
tc_args')
via_match :: Maybe TCvSubst
via_match = PredType -> PredType -> Maybe TCvSubst
tcUnifyTy PredType
inst_ty_kind PredType
via_kind
Bool -> SDoc -> TcRn ()
checkTc (Maybe TCvSubst -> Bool
forall a. Maybe a -> Bool
isJust Maybe TCvSubst
via_match)
(Class -> PredType -> PredType -> PredType -> SDoc
derivingViaKindErr Class
cls PredType
inst_ty_kind PredType
XViaStrategy GhcTc
via_ty PredType
via_kind)
let Just TCvSubst
via_subst = Maybe TCvSubst
via_match
([TyVar], [PredType], [PredType], Maybe (DerivStrategy GhcTc))
-> IOEnv
(Env TcGblEnv TcLclEnv)
([TyVar], [PredType], [PredType], Maybe (DerivStrategy GhcTc))
forall (f :: * -> *) a. Applicative f => a -> f a
External instance of the constraint type forall m. Applicative (IOEnv m)
pure (([TyVar], [PredType], [PredType], Maybe (DerivStrategy GhcTc))
-> IOEnv
(Env TcGblEnv TcLclEnv)
([TyVar], [PredType], [PredType], Maybe (DerivStrategy GhcTc)))
-> ([TyVar], [PredType], [PredType], Maybe (DerivStrategy GhcTc))
-> IOEnv
(Env TcGblEnv TcLclEnv)
([TyVar], [PredType], [PredType], Maybe (DerivStrategy GhcTc))
forall a b. (a -> b) -> a -> b
$ TCvSubst
-> [TyVar]
-> [PredType]
-> [PredType]
-> Maybe (DerivStrategy GhcTc)
-> ([TyVar], [PredType], [PredType], Maybe (DerivStrategy GhcTc))
propagate_subst TCvSubst
via_subst [TyVar]
tkvs' [PredType]
cls_tys'
[PredType]
tc_args' Maybe (DerivStrategy GhcTc)
mb_deriv_strat'
Maybe (DerivStrategy GhcTc)
_ -> ([TyVar], [PredType], [PredType], Maybe (DerivStrategy GhcTc))
-> IOEnv
(Env TcGblEnv TcLclEnv)
([TyVar], [PredType], [PredType], Maybe (DerivStrategy GhcTc))
forall (f :: * -> *) a. Applicative f => a -> f a
External instance of the constraint type forall m. Applicative (IOEnv m)
pure ([TyVar]
tkvs', [PredType]
cls_tys', [PredType]
tc_args', Maybe (DerivStrategy GhcTc)
mb_deriv_strat')
; [Char] -> SDoc -> TcRn ()
traceTc [Char]
"deriveTyData 1" (SDoc -> TcRn ()) -> SDoc -> TcRn ()
forall a b. (a -> b) -> a -> b
$ [SDoc] -> SDoc
vcat
[ Maybe (DerivStrategy GhcTc) -> SDoc
forall a. Outputable a => a -> SDoc
External instance of the constraint type forall a. Outputable a => Outputable (Maybe a)
External instance of the constraint type forall (p :: Pass).
OutputableBndrId p =>
Outputable (DerivStrategy (GhcPass p))
External instance of the constraint type OutputableBndr TyVar
External instance of the constraint type OutputableBndr Name
External instance of the constraint type IsPass 'Typechecked
ppr Maybe (DerivStrategy GhcTc)
final_mb_deriv_strat, [TyVar] -> SDoc
pprTyVars [TyVar]
deriv_tvs, TyCon -> SDoc
forall a. Outputable a => a -> SDoc
External instance of the constraint type Outputable TyCon
ppr TyCon
tc, [PredType] -> SDoc
forall a. Outputable a => a -> SDoc
External instance of the constraint type forall a. Outputable a => Outputable [a]
External instance of the constraint type Outputable PredType
ppr [PredType]
tc_args
, [TyVar] -> SDoc
pprTyVars ([PredType] -> [TyVar]
tyCoVarsOfTypesList [PredType]
tc_args)
, Arity -> SDoc
forall a. Outputable a => a -> SDoc
External instance of the constraint type Outputable Arity
ppr Arity
n_args_to_keep, Arity -> SDoc
forall a. Outputable a => a -> SDoc
External instance of the constraint type Outputable Arity
ppr Arity
n_args_to_drop
, PredType -> SDoc
forall a. Outputable a => a -> SDoc
External instance of the constraint type Outputable PredType
ppr PredType
inst_ty_kind, PredType -> SDoc
forall a. Outputable a => a -> SDoc
External instance of the constraint type Outputable PredType
ppr PredType
cls_arg_kind, Maybe TCvSubst -> SDoc
forall a. Outputable a => a -> SDoc
External instance of the constraint type forall a. Outputable a => Outputable (Maybe a)
External instance of the constraint type Outputable TCvSubst
ppr Maybe TCvSubst
mb_match
, [PredType] -> SDoc
forall a. Outputable a => a -> SDoc
External instance of the constraint type forall a. Outputable a => Outputable [a]
External instance of the constraint type Outputable PredType
ppr [PredType]
final_tc_args, [PredType] -> SDoc
forall a. Outputable a => a -> SDoc
External instance of the constraint type forall a. Outputable a => Outputable [a]
External instance of the constraint type Outputable PredType
ppr [PredType]
final_cls_tys ]
; [Char] -> SDoc -> TcRn ()
traceTc [Char]
"deriveTyData 2" (SDoc -> TcRn ()) -> SDoc -> TcRn ()
forall a b. (a -> b) -> a -> b
$ [SDoc] -> SDoc
vcat
[ [TyVar] -> SDoc
forall a. Outputable a => a -> SDoc
External instance of the constraint type forall a. Outputable a => Outputable [a]
External instance of the constraint type Outputable TyVar
ppr [TyVar]
final_tkvs ]
; let final_tc_app :: PredType
final_tc_app = TyCon -> [PredType] -> PredType
mkTyConApp TyCon
tc [PredType]
final_tc_args
final_cls_args :: [PredType]
final_cls_args = [PredType]
final_cls_tys [PredType] -> [PredType] -> [PredType]
forall a. [a] -> [a] -> [a]
++ [PredType
final_tc_app]
; Bool -> SDoc -> TcRn ()
checkTc (VarSet -> [PredType] -> Bool
allDistinctTyVars ([TyVar] -> VarSet
mkVarSet [TyVar]
final_tkvs) [PredType]
args_to_drop)
(Class -> [PredType] -> PredType -> SDoc
derivingEtaErr Class
cls [PredType]
final_cls_tys PredType
final_tc_app)
; UserTypeCtxt -> Class -> [PredType] -> TcRn ()
checkValidInstHead UserTypeCtxt
DerivClauseCtxt Class
cls [PredType]
final_cls_args
; EarlyDerivSpec
spec <- Maybe OverlapMode
-> [TyVar]
-> Class
-> [PredType]
-> DerivContext
-> Maybe (DerivStrategy GhcTc)
-> IOEnv (Env TcGblEnv TcLclEnv) EarlyDerivSpec
mkEqnHelp Maybe OverlapMode
forall a. Maybe a
Nothing [TyVar]
final_tkvs Class
cls [PredType]
final_cls_args
(Maybe SrcSpan -> DerivContext
InferContext Maybe SrcSpan
forall a. Maybe a
Nothing) Maybe (DerivStrategy GhcTc)
final_mb_deriv_strat
; [Char] -> SDoc -> TcRn ()
traceTc [Char]
"deriveTyData 3" (EarlyDerivSpec -> SDoc
forall a. Outputable a => a -> SDoc
Instance of class: Outputable of the constraint type Outputable EarlyDerivSpec
ppr EarlyDerivSpec
spec)
; EarlyDerivSpec -> IOEnv (Env TcGblEnv TcLclEnv) EarlyDerivSpec
forall (m :: * -> *) a. Monad m => a -> m a
External instance of the constraint type forall m. Monad (IOEnv m)
return EarlyDerivSpec
spec }
mkEqnHelp :: Maybe OverlapMode
-> [TyVar]
-> Class -> [Type]
-> DerivContext
-> Maybe (DerivStrategy GhcTc)
-> TcRn EarlyDerivSpec
mkEqnHelp :: Maybe OverlapMode
-> [TyVar]
-> Class
-> [PredType]
-> DerivContext
-> Maybe (DerivStrategy GhcTc)
-> IOEnv (Env TcGblEnv TcLclEnv) EarlyDerivSpec
mkEqnHelp Maybe OverlapMode
overlap_mode [TyVar]
tvs Class
cls [PredType]
cls_args DerivContext
deriv_ctxt Maybe (DerivStrategy GhcTc)
deriv_strat = do
Bool
is_boot <- TcRnIf TcGblEnv TcLclEnv Bool
tcIsHsBootOrSig
Bool -> TcRn () -> TcRn ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
External instance of the constraint type forall m. Applicative (IOEnv m)
when Bool
is_boot (TcRn () -> TcRn ()) -> TcRn () -> TcRn ()
forall a b. (a -> b) -> a -> b
$
SDoc -> TcRn ()
bale_out ([Char] -> SDoc
text [Char]
"Cannot derive instances in hs-boot files"
SDoc -> SDoc -> SDoc
$+$ [Char] -> SDoc
text [Char]
"Write an instance declaration instead")
ReaderT DerivEnv TcRn EarlyDerivSpec
-> DerivEnv -> IOEnv (Env TcGblEnv TcLclEnv) EarlyDerivSpec
forall r (m :: * -> *) a. ReaderT r m a -> r -> m a
runReaderT ReaderT DerivEnv TcRn EarlyDerivSpec
mk_eqn DerivEnv
deriv_env
where
deriv_env :: DerivEnv
deriv_env = DerivEnv :: Maybe OverlapMode
-> [TyVar]
-> Class
-> [PredType]
-> DerivContext
-> Maybe (DerivStrategy GhcTc)
-> DerivEnv
DerivEnv { denv_overlap_mode :: Maybe OverlapMode
denv_overlap_mode = Maybe OverlapMode
overlap_mode
, denv_tvs :: [TyVar]
denv_tvs = [TyVar]
tvs
, denv_cls :: Class
denv_cls = Class
cls
, denv_inst_tys :: [PredType]
denv_inst_tys = [PredType]
cls_args
, denv_ctxt :: DerivContext
denv_ctxt = DerivContext
deriv_ctxt
, denv_strat :: Maybe (DerivStrategy GhcTc)
denv_strat = Maybe (DerivStrategy GhcTc)
deriv_strat }
bale_out :: SDoc -> TcRn ()
bale_out SDoc
msg = SDoc -> TcRn ()
forall a. SDoc -> TcM a
failWithTc (SDoc -> TcRn ()) -> SDoc -> TcRn ()
forall a b. (a -> b) -> a -> b
$ Bool
-> Class
-> [PredType]
-> Maybe (DerivStrategy GhcTc)
-> SDoc
-> SDoc
derivingThingErr Bool
False Class
cls [PredType]
cls_args Maybe (DerivStrategy GhcTc)
deriv_strat SDoc
msg
mk_eqn :: DerivM EarlyDerivSpec
mk_eqn :: ReaderT DerivEnv TcRn EarlyDerivSpec
mk_eqn = do
DerivEnv { denv_inst_tys :: DerivEnv -> [PredType]
denv_inst_tys = [PredType]
cls_args
, denv_strat :: DerivEnv -> Maybe (DerivStrategy GhcTc)
denv_strat = Maybe (DerivStrategy GhcTc)
mb_strat } <- ReaderT DerivEnv TcRn DerivEnv
forall (m :: * -> *) r. Monad m => ReaderT r m r
External instance of the constraint type forall m. Monad (IOEnv m)
ask
case Maybe (DerivStrategy GhcTc)
mb_strat of
Just DerivStrategy GhcTc
StockStrategy -> do
([PredType]
cls_tys, PredType
inst_ty) <- [PredType] -> DerivM ([PredType], PredType)
expectNonNullaryClsArgs [PredType]
cls_args
DerivInstTys
dit <- [PredType] -> PredType -> DerivM DerivInstTys
expectAlgTyConApp [PredType]
cls_tys PredType
inst_ty
DerivInstTys -> ReaderT DerivEnv TcRn EarlyDerivSpec
mk_eqn_stock DerivInstTys
dit
Just DerivStrategy GhcTc
AnyclassStrategy -> ReaderT DerivEnv TcRn EarlyDerivSpec
mk_eqn_anyclass
Just (ViaStrategy XViaStrategy GhcTc
via_ty) -> do
([PredType]
cls_tys, PredType
inst_ty) <- [PredType] -> DerivM ([PredType], PredType)
expectNonNullaryClsArgs [PredType]
cls_args
[PredType]
-> PredType -> PredType -> ReaderT DerivEnv TcRn EarlyDerivSpec
mk_eqn_via [PredType]
cls_tys PredType
inst_ty PredType
XViaStrategy GhcTc
via_ty
Just DerivStrategy GhcTc
NewtypeStrategy -> do
([PredType]
cls_tys, PredType
inst_ty) <- [PredType] -> DerivM ([PredType], PredType)
expectNonNullaryClsArgs [PredType]
cls_args
DerivInstTys
dit <- [PredType] -> PredType -> DerivM DerivInstTys
expectAlgTyConApp [PredType]
cls_tys PredType
inst_ty
Bool -> ReaderT DerivEnv TcRn () -> ReaderT DerivEnv TcRn ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
External instance of the constraint type forall (m :: * -> *) r. Applicative m => Applicative (ReaderT r m)
External instance of the constraint type forall m. Applicative (IOEnv m)
unless (TyCon -> Bool
isNewTyCon (DerivInstTys -> TyCon
dit_rep_tc DerivInstTys
dit)) (ReaderT DerivEnv TcRn () -> ReaderT DerivEnv TcRn ())
-> ReaderT DerivEnv TcRn () -> ReaderT DerivEnv TcRn ()
forall a b. (a -> b) -> a -> b
$
Bool -> SDoc -> ReaderT DerivEnv TcRn ()
forall a. Bool -> SDoc -> DerivM a
derivingThingFailWith Bool
False SDoc
gndNonNewtypeErr
Bool -> DerivInstTys -> ReaderT DerivEnv TcRn EarlyDerivSpec
mkNewTypeEqn Bool
True DerivInstTys
dit
Maybe (DerivStrategy GhcTc)
Nothing -> ReaderT DerivEnv TcRn EarlyDerivSpec
mk_eqn_no_strategy
expectNonNullaryClsArgs :: [Type] -> DerivM ([Type], Type)
expectNonNullaryClsArgs :: [PredType] -> DerivM ([PredType], PredType)
expectNonNullaryClsArgs [PredType]
inst_tys =
DerivM ([PredType], PredType)
-> (([PredType], PredType) -> DerivM ([PredType], PredType))
-> Maybe ([PredType], PredType)
-> DerivM ([PredType], PredType)
forall b a. b -> (a -> b) -> Maybe a -> b
maybe (Bool -> SDoc -> DerivM ([PredType], PredType)
forall a. Bool -> SDoc -> DerivM a
derivingThingFailWith Bool
False SDoc
derivingNullaryErr) ([PredType], PredType) -> DerivM ([PredType], PredType)
forall (f :: * -> *) a. Applicative f => a -> f a
External instance of the constraint type forall (m :: * -> *) r. Applicative m => Applicative (ReaderT r m)
External instance of the constraint type forall m. Applicative (IOEnv m)
pure (Maybe ([PredType], PredType) -> DerivM ([PredType], PredType))
-> Maybe ([PredType], PredType) -> DerivM ([PredType], PredType)
forall a b. (a -> b) -> a -> b
$
[PredType] -> Maybe ([PredType], PredType)
forall a. [a] -> Maybe ([a], a)
snocView [PredType]
inst_tys
expectAlgTyConApp :: [Type]
-> Type
-> DerivM DerivInstTys
expectAlgTyConApp :: [PredType] -> PredType -> DerivM DerivInstTys
expectAlgTyConApp [PredType]
cls_tys PredType
inst_ty = do
FamInstEnvs
fam_envs <- IOEnv (Env TcGblEnv TcLclEnv) FamInstEnvs
-> ReaderT DerivEnv TcRn FamInstEnvs
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
External instance of the constraint type forall m. Monad (IOEnv m)
External instance of the constraint type forall r. MonadTrans (ReaderT r)
lift IOEnv (Env TcGblEnv TcLclEnv) FamInstEnvs
tcGetFamInstEnvs
case FamInstEnvs -> [PredType] -> PredType -> Maybe DerivInstTys
mk_deriv_inst_tys_maybe FamInstEnvs
fam_envs [PredType]
cls_tys PredType
inst_ty of
Maybe DerivInstTys
Nothing -> Bool -> SDoc -> DerivM DerivInstTys
forall a. Bool -> SDoc -> DerivM a
derivingThingFailWith Bool
False (SDoc -> DerivM DerivInstTys) -> SDoc -> DerivM DerivInstTys
forall a b. (a -> b) -> a -> b
$
[Char] -> SDoc
text [Char]
"The last argument of the instance must be a"
SDoc -> SDoc -> SDoc
<+> [Char] -> SDoc
text [Char]
"data or newtype application"
Just DerivInstTys
dit -> do DerivInstTys -> ReaderT DerivEnv TcRn ()
expectNonDataFamTyCon DerivInstTys
dit
DerivInstTys -> DerivM DerivInstTys
forall (f :: * -> *) a. Applicative f => a -> f a
External instance of the constraint type forall (m :: * -> *) r. Applicative m => Applicative (ReaderT r m)
External instance of the constraint type forall m. Applicative (IOEnv m)
pure DerivInstTys
dit
expectNonDataFamTyCon :: DerivInstTys -> DerivM ()
expectNonDataFamTyCon :: DerivInstTys -> ReaderT DerivEnv TcRn ()
expectNonDataFamTyCon (DerivInstTys { dit_tc :: DerivInstTys -> TyCon
dit_tc = TyCon
tc
, dit_tc_args :: DerivInstTys -> [PredType]
dit_tc_args = [PredType]
tc_args
, dit_rep_tc :: DerivInstTys -> TyCon
dit_rep_tc = TyCon
rep_tc }) =
Bool -> ReaderT DerivEnv TcRn () -> ReaderT DerivEnv TcRn ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
External instance of the constraint type forall (m :: * -> *) r. Applicative m => Applicative (ReaderT r m)
External instance of the constraint type forall m. Applicative (IOEnv m)
when (TyCon -> Bool
isDataFamilyTyCon TyCon
rep_tc) (ReaderT DerivEnv TcRn () -> ReaderT DerivEnv TcRn ())
-> ReaderT DerivEnv TcRn () -> ReaderT DerivEnv TcRn ()
forall a b. (a -> b) -> a -> b
$
Bool -> SDoc -> ReaderT DerivEnv TcRn ()
forall a. Bool -> SDoc -> DerivM a
derivingThingFailWith Bool
False (SDoc -> ReaderT DerivEnv TcRn ())
-> SDoc -> ReaderT DerivEnv TcRn ()
forall a b. (a -> b) -> a -> b
$
[Char] -> SDoc
text [Char]
"No family instance for" SDoc -> SDoc -> SDoc
<+> SDoc -> SDoc
quotes (TyCon -> [PredType] -> SDoc
pprTypeApp TyCon
tc [PredType]
tc_args)
mk_deriv_inst_tys_maybe :: FamInstEnvs
-> [Type] -> Type -> Maybe DerivInstTys
mk_deriv_inst_tys_maybe :: FamInstEnvs -> [PredType] -> PredType -> Maybe DerivInstTys
mk_deriv_inst_tys_maybe FamInstEnvs
fam_envs [PredType]
cls_tys PredType
inst_ty =
((TyCon, [PredType]) -> DerivInstTys)
-> Maybe (TyCon, [PredType]) -> Maybe DerivInstTys
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
External instance of the constraint type Functor Maybe
fmap (TyCon, [PredType]) -> DerivInstTys
lookup (Maybe (TyCon, [PredType]) -> Maybe DerivInstTys)
-> Maybe (TyCon, [PredType]) -> Maybe DerivInstTys
forall a b. (a -> b) -> a -> b
$ HasCallStack => PredType -> Maybe (TyCon, [PredType])
PredType -> Maybe (TyCon, [PredType])
tcSplitTyConApp_maybe PredType
inst_ty
where
lookup :: (TyCon, [Type]) -> DerivInstTys
lookup :: (TyCon, [PredType]) -> DerivInstTys
lookup (TyCon
tc, [PredType]
tc_args) =
let (TyCon
rep_tc, [PredType]
rep_tc_args, Coercion
_co) = FamInstEnvs -> TyCon -> [PredType] -> (TyCon, [PredType], Coercion)
tcLookupDataFamInst FamInstEnvs
fam_envs TyCon
tc [PredType]
tc_args
in DerivInstTys :: [PredType]
-> TyCon -> [PredType] -> TyCon -> [PredType] -> DerivInstTys
DerivInstTys { dit_cls_tys :: [PredType]
dit_cls_tys = [PredType]
cls_tys
, dit_tc :: TyCon
dit_tc = TyCon
tc
, dit_tc_args :: [PredType]
dit_tc_args = [PredType]
tc_args
, dit_rep_tc :: TyCon
dit_rep_tc = TyCon
rep_tc
, dit_rep_tc_args :: [PredType]
dit_rep_tc_args = [PredType]
rep_tc_args }
mk_eqn_from_mechanism :: DerivSpecMechanism -> DerivM EarlyDerivSpec
mk_eqn_from_mechanism :: DerivSpecMechanism -> ReaderT DerivEnv TcRn EarlyDerivSpec
mk_eqn_from_mechanism DerivSpecMechanism
mechanism
= do DerivEnv { denv_overlap_mode :: DerivEnv -> Maybe OverlapMode
denv_overlap_mode = Maybe OverlapMode
overlap_mode
, denv_tvs :: DerivEnv -> [TyVar]
denv_tvs = [TyVar]
tvs
, denv_cls :: DerivEnv -> Class
denv_cls = Class
cls
, denv_inst_tys :: DerivEnv -> [PredType]
denv_inst_tys = [PredType]
inst_tys
, denv_ctxt :: DerivEnv -> DerivContext
denv_ctxt = DerivContext
deriv_ctxt } <- ReaderT DerivEnv TcRn DerivEnv
forall (m :: * -> *) r. Monad m => ReaderT r m r
External instance of the constraint type forall m. Monad (IOEnv m)
ask
DerivSpecMechanism -> ReaderT DerivEnv TcRn ()
doDerivInstErrorChecks1 DerivSpecMechanism
mechanism
SrcSpan
loc <- TcRn SrcSpan -> ReaderT DerivEnv TcRn SrcSpan
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
External instance of the constraint type forall m. Monad (IOEnv m)
External instance of the constraint type forall r. MonadTrans (ReaderT r)
lift TcRn SrcSpan
getSrcSpanM
Name
dfun_name <- IOEnv (Env TcGblEnv TcLclEnv) Name -> ReaderT DerivEnv TcRn Name
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
External instance of the constraint type forall m. Monad (IOEnv m)
External instance of the constraint type forall r. MonadTrans (ReaderT r)
lift (IOEnv (Env TcGblEnv TcLclEnv) Name -> ReaderT DerivEnv TcRn Name)
-> IOEnv (Env TcGblEnv TcLclEnv) Name -> ReaderT DerivEnv TcRn Name
forall a b. (a -> b) -> a -> b
$ Class
-> [PredType] -> SrcSpan -> IOEnv (Env TcGblEnv TcLclEnv) Name
newDFunName Class
cls [PredType]
inst_tys SrcSpan
loc
case DerivContext
deriv_ctxt of
InferContext Maybe SrcSpan
wildcard ->
do { ([ThetaOrigin]
inferred_constraints, [TyVar]
tvs', [PredType]
inst_tys')
<- DerivSpecMechanism -> DerivM ([ThetaOrigin], [TyVar], [PredType])
inferConstraints DerivSpecMechanism
mechanism
; EarlyDerivSpec -> ReaderT DerivEnv TcRn EarlyDerivSpec
forall (m :: * -> *) a. Monad m => a -> m a
External instance of the constraint type forall (m :: * -> *) r. Monad m => Monad (ReaderT r m)
External instance of the constraint type forall m. Monad (IOEnv m)
return (EarlyDerivSpec -> ReaderT DerivEnv TcRn EarlyDerivSpec)
-> EarlyDerivSpec -> ReaderT DerivEnv TcRn EarlyDerivSpec
forall a b. (a -> b) -> a -> b
$ DerivSpec [ThetaOrigin] -> EarlyDerivSpec
InferTheta (DerivSpec [ThetaOrigin] -> EarlyDerivSpec)
-> DerivSpec [ThetaOrigin] -> EarlyDerivSpec
forall a b. (a -> b) -> a -> b
$ DS :: forall theta.
SrcSpan
-> Name
-> [TyVar]
-> theta
-> Class
-> [PredType]
-> Maybe OverlapMode
-> Maybe SrcSpan
-> DerivSpecMechanism
-> DerivSpec theta
DS
{ ds_loc :: SrcSpan
ds_loc = SrcSpan
loc
, ds_name :: Name
ds_name = Name
dfun_name, ds_tvs :: [TyVar]
ds_tvs = [TyVar]
tvs'
, ds_cls :: Class
ds_cls = Class
cls, ds_tys :: [PredType]
ds_tys = [PredType]
inst_tys'
, ds_theta :: [ThetaOrigin]
ds_theta = [ThetaOrigin]
inferred_constraints
, ds_overlap :: Maybe OverlapMode
ds_overlap = Maybe OverlapMode
overlap_mode
, ds_standalone_wildcard :: Maybe SrcSpan
ds_standalone_wildcard = Maybe SrcSpan
wildcard
, ds_mechanism :: DerivSpecMechanism
ds_mechanism = DerivSpecMechanism
mechanism } }
SupplyContext [PredType]
theta ->
EarlyDerivSpec -> ReaderT DerivEnv TcRn EarlyDerivSpec
forall (m :: * -> *) a. Monad m => a -> m a
External instance of the constraint type forall (m :: * -> *) r. Monad m => Monad (ReaderT r m)
External instance of the constraint type forall m. Monad (IOEnv m)
return (EarlyDerivSpec -> ReaderT DerivEnv TcRn EarlyDerivSpec)
-> EarlyDerivSpec -> ReaderT DerivEnv TcRn EarlyDerivSpec
forall a b. (a -> b) -> a -> b
$ DerivSpec [PredType] -> EarlyDerivSpec
GivenTheta (DerivSpec [PredType] -> EarlyDerivSpec)
-> DerivSpec [PredType] -> EarlyDerivSpec
forall a b. (a -> b) -> a -> b
$ DS :: forall theta.
SrcSpan
-> Name
-> [TyVar]
-> theta
-> Class
-> [PredType]
-> Maybe OverlapMode
-> Maybe SrcSpan
-> DerivSpecMechanism
-> DerivSpec theta
DS
{ ds_loc :: SrcSpan
ds_loc = SrcSpan
loc
, ds_name :: Name
ds_name = Name
dfun_name, ds_tvs :: [TyVar]
ds_tvs = [TyVar]
tvs
, ds_cls :: Class
ds_cls = Class
cls, ds_tys :: [PredType]
ds_tys = [PredType]
inst_tys
, ds_theta :: [PredType]
ds_theta = [PredType]
theta
, ds_overlap :: Maybe OverlapMode
ds_overlap = Maybe OverlapMode
overlap_mode
, ds_standalone_wildcard :: Maybe SrcSpan
ds_standalone_wildcard = Maybe SrcSpan
forall a. Maybe a
Nothing
, ds_mechanism :: DerivSpecMechanism
ds_mechanism = DerivSpecMechanism
mechanism }
mk_eqn_stock :: DerivInstTys
-> DerivM EarlyDerivSpec
mk_eqn_stock :: DerivInstTys -> ReaderT DerivEnv TcRn EarlyDerivSpec
mk_eqn_stock dit :: DerivInstTys
dit@(DerivInstTys { dit_cls_tys :: DerivInstTys -> [PredType]
dit_cls_tys = [PredType]
cls_tys
, dit_tc :: DerivInstTys -> TyCon
dit_tc = TyCon
tc
, dit_rep_tc :: DerivInstTys -> TyCon
dit_rep_tc = TyCon
rep_tc })
= do DerivEnv { denv_cls :: DerivEnv -> Class
denv_cls = Class
cls
, denv_ctxt :: DerivEnv -> DerivContext
denv_ctxt = DerivContext
deriv_ctxt } <- ReaderT DerivEnv TcRn DerivEnv
forall (m :: * -> *) r. Monad m => ReaderT r m r
External instance of the constraint type forall m. Monad (IOEnv m)
ask
DynFlags
dflags <- ReaderT DerivEnv TcRn DynFlags
forall (m :: * -> *). HasDynFlags m => m DynFlags
External instance of the constraint type forall (m :: * -> *) a.
(Monad m, HasDynFlags m) =>
HasDynFlags (ReaderT a m)
External instance of the constraint type forall m. Monad (IOEnv m)
External instance of the constraint type forall env. ContainsDynFlags env => HasDynFlags (IOEnv env)
External instance of the constraint type forall gbl lcl. ContainsDynFlags (Env gbl lcl)
getDynFlags
case DynFlags
-> DerivContext
-> Class
-> [PredType]
-> TyCon
-> TyCon
-> OriginativeDerivStatus
checkOriginativeSideConditions DynFlags
dflags DerivContext
deriv_ctxt Class
cls [PredType]
cls_tys
TyCon
tc TyCon
rep_tc of
CanDeriveStock SrcSpan
-> TyCon
-> [PredType]
-> TcM (Bag (LHsBind GhcPs), BagDerivStuff, [Name])
gen_fn -> DerivSpecMechanism -> ReaderT DerivEnv TcRn EarlyDerivSpec
mk_eqn_from_mechanism (DerivSpecMechanism -> ReaderT DerivEnv TcRn EarlyDerivSpec)
-> DerivSpecMechanism -> ReaderT DerivEnv TcRn EarlyDerivSpec
forall a b. (a -> b) -> a -> b
$
DerivSpecStock :: DerivInstTys
-> (SrcSpan
-> TyCon
-> [PredType]
-> TcM (Bag (LHsBind GhcPs), BagDerivStuff, [Name]))
-> DerivSpecMechanism
DerivSpecStock { dsm_stock_dit :: DerivInstTys
dsm_stock_dit = DerivInstTys
dit
, dsm_stock_gen_fn :: SrcSpan
-> TyCon
-> [PredType]
-> TcM (Bag (LHsBind GhcPs), BagDerivStuff, [Name])
dsm_stock_gen_fn = SrcSpan
-> TyCon
-> [PredType]
-> TcM (Bag (LHsBind GhcPs), BagDerivStuff, [Name])
gen_fn }
StockClassError SDoc
msg -> Bool -> SDoc -> ReaderT DerivEnv TcRn EarlyDerivSpec
forall a. Bool -> SDoc -> DerivM a
derivingThingFailWith Bool
False SDoc
msg
OriginativeDerivStatus
_ -> Bool -> SDoc -> ReaderT DerivEnv TcRn EarlyDerivSpec
forall a. Bool -> SDoc -> DerivM a
derivingThingFailWith Bool
False (Class -> SDoc
nonStdErr Class
cls)
mk_eqn_anyclass :: DerivM EarlyDerivSpec
mk_eqn_anyclass :: ReaderT DerivEnv TcRn EarlyDerivSpec
mk_eqn_anyclass
= do DynFlags
dflags <- ReaderT DerivEnv TcRn DynFlags
forall (m :: * -> *). HasDynFlags m => m DynFlags
External instance of the constraint type forall (m :: * -> *) a.
(Monad m, HasDynFlags m) =>
HasDynFlags (ReaderT a m)
External instance of the constraint type forall m. Monad (IOEnv m)
External instance of the constraint type forall env. ContainsDynFlags env => HasDynFlags (IOEnv env)
External instance of the constraint type forall gbl lcl. ContainsDynFlags (Env gbl lcl)
getDynFlags
case DynFlags -> Validity
canDeriveAnyClass DynFlags
dflags of
Validity
IsValid -> DerivSpecMechanism -> ReaderT DerivEnv TcRn EarlyDerivSpec
mk_eqn_from_mechanism DerivSpecMechanism
DerivSpecAnyClass
NotValid SDoc
msg -> Bool -> SDoc -> ReaderT DerivEnv TcRn EarlyDerivSpec
forall a. Bool -> SDoc -> DerivM a
derivingThingFailWith Bool
False SDoc
msg
mk_eqn_newtype :: DerivInstTys
-> Type
-> DerivM EarlyDerivSpec
mk_eqn_newtype :: DerivInstTys -> PredType -> ReaderT DerivEnv TcRn EarlyDerivSpec
mk_eqn_newtype DerivInstTys
dit PredType
rep_ty =
DerivSpecMechanism -> ReaderT DerivEnv TcRn EarlyDerivSpec
mk_eqn_from_mechanism (DerivSpecMechanism -> ReaderT DerivEnv TcRn EarlyDerivSpec)
-> DerivSpecMechanism -> ReaderT DerivEnv TcRn EarlyDerivSpec
forall a b. (a -> b) -> a -> b
$ DerivSpecNewtype :: DerivInstTys -> PredType -> DerivSpecMechanism
DerivSpecNewtype { dsm_newtype_dit :: DerivInstTys
dsm_newtype_dit = DerivInstTys
dit
, dsm_newtype_rep_ty :: PredType
dsm_newtype_rep_ty = PredType
rep_ty }
mk_eqn_via :: [Type]
-> Type
-> Type
-> DerivM EarlyDerivSpec
mk_eqn_via :: [PredType]
-> PredType -> PredType -> ReaderT DerivEnv TcRn EarlyDerivSpec
mk_eqn_via [PredType]
cls_tys PredType
inst_ty PredType
via_ty =
DerivSpecMechanism -> ReaderT DerivEnv TcRn EarlyDerivSpec
mk_eqn_from_mechanism (DerivSpecMechanism -> ReaderT DerivEnv TcRn EarlyDerivSpec)
-> DerivSpecMechanism -> ReaderT DerivEnv TcRn EarlyDerivSpec
forall a b. (a -> b) -> a -> b
$ DerivSpecVia :: [PredType] -> PredType -> PredType -> DerivSpecMechanism
DerivSpecVia { dsm_via_cls_tys :: [PredType]
dsm_via_cls_tys = [PredType]
cls_tys
, dsm_via_inst_ty :: PredType
dsm_via_inst_ty = PredType
inst_ty
, dsm_via_ty :: PredType
dsm_via_ty = PredType
via_ty }
mk_eqn_no_strategy :: DerivM EarlyDerivSpec
mk_eqn_no_strategy :: ReaderT DerivEnv TcRn EarlyDerivSpec
mk_eqn_no_strategy = do
DerivEnv { denv_cls :: DerivEnv -> Class
denv_cls = Class
cls
, denv_inst_tys :: DerivEnv -> [PredType]
denv_inst_tys = [PredType]
cls_args } <- ReaderT DerivEnv TcRn DerivEnv
forall (m :: * -> *) r. Monad m => ReaderT r m r
External instance of the constraint type forall m. Monad (IOEnv m)
ask
FamInstEnvs
fam_envs <- IOEnv (Env TcGblEnv TcLclEnv) FamInstEnvs
-> ReaderT DerivEnv TcRn FamInstEnvs
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
External instance of the constraint type forall m. Monad (IOEnv m)
External instance of the constraint type forall r. MonadTrans (ReaderT r)
lift IOEnv (Env TcGblEnv TcLclEnv) FamInstEnvs
tcGetFamInstEnvs
if | Just ([PredType]
cls_tys, PredType
inst_ty) <- [PredType] -> Maybe ([PredType], PredType)
forall a. [a] -> Maybe ([a], a)
snocView [PredType]
cls_args
, Just DerivInstTys
dit <- FamInstEnvs -> [PredType] -> PredType -> Maybe DerivInstTys
mk_deriv_inst_tys_maybe FamInstEnvs
fam_envs [PredType]
cls_tys PredType
inst_ty
-> if | TyCon -> Bool
isNewTyCon (DerivInstTys -> TyCon
dit_rep_tc DerivInstTys
dit)
-> Bool -> DerivInstTys -> ReaderT DerivEnv TcRn EarlyDerivSpec
mkNewTypeEqn Bool
False DerivInstTys
dit
| Bool
otherwise
-> do
Maybe
(SrcSpan
-> TyCon
-> [PredType]
-> TcM (Bag (LHsBind GhcPs), BagDerivStuff, [Name]))
-> ((SrcSpan
-> TyCon
-> [PredType]
-> TcM (Bag (LHsBind GhcPs), BagDerivStuff, [Name]))
-> ReaderT DerivEnv TcRn ())
-> ReaderT DerivEnv TcRn ()
forall (m :: * -> *) a. Monad m => Maybe a -> (a -> m ()) -> m ()
External instance of the constraint type forall (m :: * -> *) r. Monad m => Monad (ReaderT r m)
External instance of the constraint type forall m. Monad (IOEnv m)
whenIsJust (Class
-> Maybe
(SrcSpan
-> TyCon
-> [PredType]
-> TcM (Bag (LHsBind GhcPs), BagDerivStuff, [Name]))
hasStockDeriving Class
cls) (((SrcSpan
-> TyCon
-> [PredType]
-> TcM (Bag (LHsBind GhcPs), BagDerivStuff, [Name]))
-> ReaderT DerivEnv TcRn ())
-> ReaderT DerivEnv TcRn ())
-> ((SrcSpan
-> TyCon
-> [PredType]
-> TcM (Bag (LHsBind GhcPs), BagDerivStuff, [Name]))
-> ReaderT DerivEnv TcRn ())
-> ReaderT DerivEnv TcRn ()
forall a b. (a -> b) -> a -> b
$ \SrcSpan
-> TyCon
-> [PredType]
-> TcM (Bag (LHsBind GhcPs), BagDerivStuff, [Name])
_ ->
DerivInstTys -> ReaderT DerivEnv TcRn ()
expectNonDataFamTyCon DerivInstTys
dit
DerivInstTys -> ReaderT DerivEnv TcRn EarlyDerivSpec
mk_eqn_originative DerivInstTys
dit
| Bool
otherwise
-> ReaderT DerivEnv TcRn EarlyDerivSpec
mk_eqn_anyclass
where
mk_eqn_originative :: DerivInstTys -> DerivM EarlyDerivSpec
mk_eqn_originative :: DerivInstTys -> ReaderT DerivEnv TcRn EarlyDerivSpec
mk_eqn_originative dit :: DerivInstTys
dit@(DerivInstTys { dit_cls_tys :: DerivInstTys -> [PredType]
dit_cls_tys = [PredType]
cls_tys
, dit_tc :: DerivInstTys -> TyCon
dit_tc = TyCon
tc
, dit_rep_tc :: DerivInstTys -> TyCon
dit_rep_tc = TyCon
rep_tc }) = do
DerivEnv { denv_cls :: DerivEnv -> Class
denv_cls = Class
cls
, denv_ctxt :: DerivEnv -> DerivContext
denv_ctxt = DerivContext
deriv_ctxt } <- ReaderT DerivEnv TcRn DerivEnv
forall (m :: * -> *) r. Monad m => ReaderT r m r
External instance of the constraint type forall m. Monad (IOEnv m)
ask
DynFlags
dflags <- ReaderT DerivEnv TcRn DynFlags
forall (m :: * -> *). HasDynFlags m => m DynFlags
External instance of the constraint type forall (m :: * -> *) a.
(Monad m, HasDynFlags m) =>
HasDynFlags (ReaderT a m)
External instance of the constraint type forall m. Monad (IOEnv m)
External instance of the constraint type forall env. ContainsDynFlags env => HasDynFlags (IOEnv env)
External instance of the constraint type forall gbl lcl. ContainsDynFlags (Env gbl lcl)
getDynFlags
let dac_error :: SDoc -> SDoc
dac_error SDoc
msg
| TyCon -> Bool
isClassTyCon TyCon
rep_tc
= SDoc -> SDoc
quotes (TyCon -> SDoc
forall a. Outputable a => a -> SDoc
External instance of the constraint type Outputable TyCon
ppr TyCon
tc) SDoc -> SDoc -> SDoc
<+> [Char] -> SDoc
text [Char]
"is a type class,"
SDoc -> SDoc -> SDoc
<+> [Char] -> SDoc
text [Char]
"and can only have a derived instance"
SDoc -> SDoc -> SDoc
$+$ [Char] -> SDoc
text [Char]
"if DeriveAnyClass is enabled"
| Bool
otherwise
= Class -> SDoc
nonStdErr Class
cls SDoc -> SDoc -> SDoc
$$ SDoc
msg
case DynFlags
-> DerivContext
-> Class
-> [PredType]
-> TyCon
-> TyCon
-> OriginativeDerivStatus
checkOriginativeSideConditions DynFlags
dflags DerivContext
deriv_ctxt Class
cls
[PredType]
cls_tys TyCon
tc TyCon
rep_tc of
NonDerivableClass SDoc
msg -> Bool -> SDoc -> ReaderT DerivEnv TcRn EarlyDerivSpec
forall a. Bool -> SDoc -> DerivM a
derivingThingFailWith Bool
False (SDoc -> SDoc
dac_error SDoc
msg)
StockClassError SDoc
msg -> Bool -> SDoc -> ReaderT DerivEnv TcRn EarlyDerivSpec
forall a. Bool -> SDoc -> DerivM a
derivingThingFailWith Bool
False SDoc
msg
CanDeriveStock SrcSpan
-> TyCon
-> [PredType]
-> TcM (Bag (LHsBind GhcPs), BagDerivStuff, [Name])
gen_fn -> DerivSpecMechanism -> ReaderT DerivEnv TcRn EarlyDerivSpec
mk_eqn_from_mechanism (DerivSpecMechanism -> ReaderT DerivEnv TcRn EarlyDerivSpec)
-> DerivSpecMechanism -> ReaderT DerivEnv TcRn EarlyDerivSpec
forall a b. (a -> b) -> a -> b
$
DerivSpecStock :: DerivInstTys
-> (SrcSpan
-> TyCon
-> [PredType]
-> TcM (Bag (LHsBind GhcPs), BagDerivStuff, [Name]))
-> DerivSpecMechanism
DerivSpecStock { dsm_stock_dit :: DerivInstTys
dsm_stock_dit = DerivInstTys
dit
, dsm_stock_gen_fn :: SrcSpan
-> TyCon
-> [PredType]
-> TcM (Bag (LHsBind GhcPs), BagDerivStuff, [Name])
dsm_stock_gen_fn = SrcSpan
-> TyCon
-> [PredType]
-> TcM (Bag (LHsBind GhcPs), BagDerivStuff, [Name])
gen_fn }
OriginativeDerivStatus
CanDeriveAnyClass -> DerivSpecMechanism -> ReaderT DerivEnv TcRn EarlyDerivSpec
mk_eqn_from_mechanism DerivSpecMechanism
DerivSpecAnyClass
mkNewTypeEqn :: Bool
-> DerivInstTys -> DerivM EarlyDerivSpec
mkNewTypeEqn :: Bool -> DerivInstTys -> ReaderT DerivEnv TcRn EarlyDerivSpec
mkNewTypeEqn Bool
newtype_strat dit :: DerivInstTys
dit@(DerivInstTys { dit_cls_tys :: DerivInstTys -> [PredType]
dit_cls_tys = [PredType]
cls_tys
, dit_tc :: DerivInstTys -> TyCon
dit_tc = TyCon
tycon
, dit_rep_tc :: DerivInstTys -> TyCon
dit_rep_tc = TyCon
rep_tycon
, dit_rep_tc_args :: DerivInstTys -> [PredType]
dit_rep_tc_args = [PredType]
rep_tc_args })
= do DerivEnv { denv_cls :: DerivEnv -> Class
denv_cls = Class
cls
, denv_ctxt :: DerivEnv -> DerivContext
denv_ctxt = DerivContext
deriv_ctxt } <- ReaderT DerivEnv TcRn DerivEnv
forall (m :: * -> *) r. Monad m => ReaderT r m r
External instance of the constraint type forall m. Monad (IOEnv m)
ask
DynFlags
dflags <- ReaderT DerivEnv TcRn DynFlags
forall (m :: * -> *). HasDynFlags m => m DynFlags
External instance of the constraint type forall (m :: * -> *) a.
(Monad m, HasDynFlags m) =>
HasDynFlags (ReaderT a m)
External instance of the constraint type forall m. Monad (IOEnv m)
External instance of the constraint type forall env. ContainsDynFlags env => HasDynFlags (IOEnv env)
External instance of the constraint type forall gbl lcl. ContainsDynFlags (Env gbl lcl)
getDynFlags
let newtype_deriving :: Bool
newtype_deriving = Extension -> DynFlags -> Bool
xopt Extension
LangExt.GeneralizedNewtypeDeriving DynFlags
dflags
deriveAnyClass :: Bool
deriveAnyClass = Extension -> DynFlags -> Bool
xopt Extension
LangExt.DeriveAnyClass DynFlags
dflags
bale_out :: SDoc -> ReaderT DerivEnv TcRn EarlyDerivSpec
bale_out = Bool -> SDoc -> ReaderT DerivEnv TcRn EarlyDerivSpec
forall a. Bool -> SDoc -> DerivM a
derivingThingFailWith Bool
newtype_deriving
non_std :: SDoc
non_std = Class -> SDoc
nonStdErr Class
cls
suggest_gnd :: SDoc
suggest_gnd = [Char] -> SDoc
text [Char]
"Try GeneralizedNewtypeDeriving for GHC's"
SDoc -> SDoc -> SDoc
<+> [Char] -> SDoc
text [Char]
"newtype-deriving extension"
nt_eta_arity :: Arity
nt_eta_arity = TyCon -> Arity
newTyConEtadArity TyCon
rep_tycon
rep_inst_ty :: PredType
rep_inst_ty = TyCon -> [PredType] -> PredType
newTyConInstRhs TyCon
rep_tycon [PredType]
rep_tc_args
might_be_newtype_derivable :: Bool
might_be_newtype_derivable
= Bool -> Bool
not (Class -> Bool
non_coercible_class Class
cls)
Bool -> Bool -> Bool
&& Bool
eta_ok
eta_ok :: Bool
eta_ok = [PredType]
rep_tc_args [PredType] -> Arity -> Bool
forall a. [a] -> Arity -> Bool
`lengthAtLeast` Arity
nt_eta_arity
cant_derive_err :: SDoc
cant_derive_err = Bool -> SDoc -> SDoc
ppUnless Bool
eta_ok SDoc
eta_msg
eta_msg :: SDoc
eta_msg = [Char] -> SDoc
text [Char]
"cannot eta-reduce the representation type enough"
MASSERT( cls_tys `lengthIs` (classArity cls - 1) )
if Bool
newtype_strat
then
if Bool
eta_ok Bool -> Bool -> Bool
&& Bool
newtype_deriving
then DerivInstTys -> PredType -> ReaderT DerivEnv TcRn EarlyDerivSpec
mk_eqn_newtype DerivInstTys
dit PredType
rep_inst_ty
else SDoc -> ReaderT DerivEnv TcRn EarlyDerivSpec
bale_out (SDoc
cant_derive_err SDoc -> SDoc -> SDoc
$$
if Bool
newtype_deriving then SDoc
empty else SDoc
suggest_gnd)
else
if Bool
might_be_newtype_derivable
Bool -> Bool -> Bool
&& ((Bool
newtype_deriving Bool -> Bool -> Bool
&& Bool -> Bool
not Bool
deriveAnyClass)
Bool -> Bool -> Bool
|| Class -> Bool
std_class_via_coercible Class
cls)
then DerivInstTys -> PredType -> ReaderT DerivEnv TcRn EarlyDerivSpec
mk_eqn_newtype DerivInstTys
dit PredType
rep_inst_ty
else case DynFlags
-> DerivContext
-> Class
-> [PredType]
-> TyCon
-> TyCon
-> OriginativeDerivStatus
checkOriginativeSideConditions DynFlags
dflags DerivContext
deriv_ctxt Class
cls [PredType]
cls_tys
TyCon
tycon TyCon
rep_tycon of
StockClassError SDoc
msg
| Bool
might_be_newtype_derivable Bool -> Bool -> Bool
&& Bool
newtype_deriving
-> DerivInstTys -> PredType -> ReaderT DerivEnv TcRn EarlyDerivSpec
mk_eqn_newtype DerivInstTys
dit PredType
rep_inst_ty
| Bool
might_be_newtype_derivable Bool -> Bool -> Bool
&& Bool -> Bool
not Bool
newtype_deriving
-> SDoc -> ReaderT DerivEnv TcRn EarlyDerivSpec
bale_out (SDoc
msg SDoc -> SDoc -> SDoc
$$ SDoc
suggest_gnd)
| Bool
otherwise
-> SDoc -> ReaderT DerivEnv TcRn EarlyDerivSpec
bale_out SDoc
msg
NonDerivableClass SDoc
_msg
| Bool
newtype_deriving -> SDoc -> ReaderT DerivEnv TcRn EarlyDerivSpec
bale_out SDoc
cant_derive_err
| Bool
otherwise -> SDoc -> ReaderT DerivEnv TcRn EarlyDerivSpec
bale_out (SDoc
non_std SDoc -> SDoc -> SDoc
$$ SDoc
suggest_gnd)
OriginativeDerivStatus
CanDeriveAnyClass -> do
Bool -> ReaderT DerivEnv TcRn () -> ReaderT DerivEnv TcRn ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
External instance of the constraint type forall (m :: * -> *) r. Applicative m => Applicative (ReaderT r m)
External instance of the constraint type forall m. Applicative (IOEnv m)
when (Bool
newtype_deriving Bool -> Bool -> Bool
&& Bool
deriveAnyClass) (ReaderT DerivEnv TcRn () -> ReaderT DerivEnv TcRn ())
-> ReaderT DerivEnv TcRn () -> ReaderT DerivEnv TcRn ()
forall a b. (a -> b) -> a -> b
$
TcRn () -> ReaderT DerivEnv TcRn ()
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
External instance of the constraint type forall m. Monad (IOEnv m)
External instance of the constraint type forall r. MonadTrans (ReaderT r)
lift (TcRn () -> ReaderT DerivEnv TcRn ())
-> TcRn () -> ReaderT DerivEnv TcRn ()
forall a b. (a -> b) -> a -> b
$ WarningFlag -> TcRn () -> TcRn ()
forall gbl lcl.
WarningFlag -> TcRnIf gbl lcl () -> TcRnIf gbl lcl ()
whenWOptM WarningFlag
Opt_WarnDerivingDefaults (TcRn () -> TcRn ()) -> TcRn () -> TcRn ()
forall a b. (a -> b) -> a -> b
$
WarnReason -> SDoc -> TcRn ()
addWarnTc (WarningFlag -> WarnReason
Reason WarningFlag
Opt_WarnDerivingDefaults) (SDoc -> TcRn ()) -> SDoc -> TcRn ()
forall a b. (a -> b) -> a -> b
$ [SDoc] -> SDoc
sep
[ [Char] -> SDoc
text [Char]
"Both DeriveAnyClass and"
SDoc -> SDoc -> SDoc
<+> [Char] -> SDoc
text [Char]
"GeneralizedNewtypeDeriving are enabled"
, [Char] -> SDoc
text [Char]
"Defaulting to the DeriveAnyClass strategy"
SDoc -> SDoc -> SDoc
<+> [Char] -> SDoc
text [Char]
"for instantiating" SDoc -> SDoc -> SDoc
<+> Class -> SDoc
forall a. Outputable a => a -> SDoc
External instance of the constraint type Outputable Class
ppr Class
cls
, [Char] -> SDoc
text [Char]
"Use DerivingStrategies to pick"
SDoc -> SDoc -> SDoc
<+> [Char] -> SDoc
text [Char]
"a different strategy"
]
DerivSpecMechanism -> ReaderT DerivEnv TcRn EarlyDerivSpec
mk_eqn_from_mechanism DerivSpecMechanism
DerivSpecAnyClass
CanDeriveStock SrcSpan
-> TyCon
-> [PredType]
-> TcM (Bag (LHsBind GhcPs), BagDerivStuff, [Name])
gen_fn -> DerivSpecMechanism -> ReaderT DerivEnv TcRn EarlyDerivSpec
mk_eqn_from_mechanism (DerivSpecMechanism -> ReaderT DerivEnv TcRn EarlyDerivSpec)
-> DerivSpecMechanism -> ReaderT DerivEnv TcRn EarlyDerivSpec
forall a b. (a -> b) -> a -> b
$
DerivSpecStock :: DerivInstTys
-> (SrcSpan
-> TyCon
-> [PredType]
-> TcM (Bag (LHsBind GhcPs), BagDerivStuff, [Name]))
-> DerivSpecMechanism
DerivSpecStock { dsm_stock_dit :: DerivInstTys
dsm_stock_dit = DerivInstTys
dit
, dsm_stock_gen_fn :: SrcSpan
-> TyCon
-> [PredType]
-> TcM (Bag (LHsBind GhcPs), BagDerivStuff, [Name])
dsm_stock_gen_fn = SrcSpan
-> TyCon
-> [PredType]
-> TcM (Bag (LHsBind GhcPs), BagDerivStuff, [Name])
gen_fn }
genInst :: DerivSpec theta
-> TcM (ThetaType -> TcM (InstInfo GhcPs), BagDerivStuff, [Name])
genInst :: DerivSpec theta
-> IOEnv
(Env TcGblEnv TcLclEnv)
([PredType] -> TcM (InstInfo GhcPs), BagDerivStuff, [Name])
genInst spec :: DerivSpec theta
spec@(DS { ds_tvs :: forall theta. DerivSpec theta -> [TyVar]
ds_tvs = [TyVar]
tvs, ds_mechanism :: forall theta. DerivSpec theta -> DerivSpecMechanism
ds_mechanism = DerivSpecMechanism
mechanism
, ds_tys :: forall theta. DerivSpec theta -> [PredType]
ds_tys = [PredType]
tys, ds_cls :: forall theta. DerivSpec theta -> Class
ds_cls = Class
clas, ds_loc :: forall theta. DerivSpec theta -> SrcSpan
ds_loc = SrcSpan
loc
, ds_standalone_wildcard :: forall theta. DerivSpec theta -> Maybe SrcSpan
ds_standalone_wildcard = Maybe SrcSpan
wildcard })
= do (Bag (LHsBind GhcPs)
meth_binds, [LSig GhcPs]
meth_sigs, BagDerivStuff
deriv_stuff, [Name]
unusedNames)
<- TcM (Bag (LHsBind GhcPs), [LSig GhcPs], BagDerivStuff, [Name])
-> TcM (Bag (LHsBind GhcPs), [LSig GhcPs], BagDerivStuff, [Name])
forall a. TcRn a -> TcRn a
set_span_and_ctxt (TcM (Bag (LHsBind GhcPs), [LSig GhcPs], BagDerivStuff, [Name])
-> TcM (Bag (LHsBind GhcPs), [LSig GhcPs], BagDerivStuff, [Name]))
-> TcM (Bag (LHsBind GhcPs), [LSig GhcPs], BagDerivStuff, [Name])
-> TcM (Bag (LHsBind GhcPs), [LSig GhcPs], BagDerivStuff, [Name])
forall a b. (a -> b) -> a -> b
$
DerivSpecMechanism
-> SrcSpan
-> Class
-> [PredType]
-> [TyVar]
-> TcM (Bag (LHsBind GhcPs), [LSig GhcPs], BagDerivStuff, [Name])
genDerivStuff DerivSpecMechanism
mechanism SrcSpan
loc Class
clas [PredType]
tys [TyVar]
tvs
let mk_inst_info :: [PredType] -> TcM (InstInfo GhcPs)
mk_inst_info [PredType]
theta = TcM (InstInfo GhcPs) -> TcM (InstInfo GhcPs)
forall a. TcRn a -> TcRn a
set_span_and_ctxt (TcM (InstInfo GhcPs) -> TcM (InstInfo GhcPs))
-> TcM (InstInfo GhcPs) -> TcM (InstInfo GhcPs)
forall a b. (a -> b) -> a -> b
$ do
ClsInst
inst_spec <- [PredType] -> DerivSpec theta -> TcM ClsInst
forall theta. [PredType] -> DerivSpec theta -> TcM ClsInst
newDerivClsInst [PredType]
theta DerivSpec theta
spec
Class
-> ClsInst
-> [PredType]
-> Maybe SrcSpan
-> DerivSpecMechanism
-> TcRn ()
doDerivInstErrorChecks2 Class
clas ClsInst
inst_spec [PredType]
theta Maybe SrcSpan
wildcard DerivSpecMechanism
mechanism
[Char] -> SDoc -> TcRn ()
traceTc [Char]
"newder" (ClsInst -> SDoc
forall a. Outputable a => a -> SDoc
External instance of the constraint type Outputable ClsInst
ppr ClsInst
inst_spec)
InstInfo GhcPs -> TcM (InstInfo GhcPs)
forall (m :: * -> *) a. Monad m => a -> m a
External instance of the constraint type forall m. Monad (IOEnv m)
return (InstInfo GhcPs -> TcM (InstInfo GhcPs))
-> InstInfo GhcPs -> TcM (InstInfo GhcPs)
forall a b. (a -> b) -> a -> b
$ InstInfo :: forall a. ClsInst -> InstBindings a -> InstInfo a
InstInfo
{ iSpec :: ClsInst
iSpec = ClsInst
inst_spec
, iBinds :: InstBindings GhcPs
iBinds = InstBindings :: forall a.
[Name]
-> LHsBinds a -> [LSig a] -> [Extension] -> Bool -> InstBindings a
InstBindings
{ ib_binds :: Bag (LHsBind GhcPs)
ib_binds = Bag (LHsBind GhcPs)
meth_binds
, ib_tyvars :: [Name]
ib_tyvars = (TyVar -> Name) -> [TyVar] -> [Name]
forall a b. (a -> b) -> [a] -> [b]
map TyVar -> Name
Var.varName [TyVar]
tvs
, ib_pragmas :: [LSig GhcPs]
ib_pragmas = [LSig GhcPs]
meth_sigs
, ib_extensions :: [Extension]
ib_extensions = [Extension]
extensions
, ib_derived :: Bool
ib_derived = Bool
True } }
([PredType] -> TcM (InstInfo GhcPs), BagDerivStuff, [Name])
-> IOEnv
(Env TcGblEnv TcLclEnv)
([PredType] -> TcM (InstInfo GhcPs), BagDerivStuff, [Name])
forall (m :: * -> *) a. Monad m => a -> m a
External instance of the constraint type forall m. Monad (IOEnv m)
return ([PredType] -> TcM (InstInfo GhcPs)
mk_inst_info, BagDerivStuff
deriv_stuff, [Name]
unusedNames)
where
extensions :: [LangExt.Extension]
extensions :: [Extension]
extensions
| DerivSpecMechanism -> Bool
isDerivSpecNewtype DerivSpecMechanism
mechanism Bool -> Bool -> Bool
|| DerivSpecMechanism -> Bool
isDerivSpecVia DerivSpecMechanism
mechanism
= [
Extension
LangExt.ImpredicativeTypes, Extension
LangExt.RankNTypes
, Extension
LangExt.InstanceSigs
]
| Bool
otherwise
= []
set_span_and_ctxt :: TcM a -> TcM a
set_span_and_ctxt :: TcM a -> TcM a
set_span_and_ctxt = SrcSpan -> TcM a -> TcM a
forall a. SrcSpan -> TcRn a -> TcRn a
setSrcSpan SrcSpan
loc (TcM a -> TcM a) -> (TcM a -> TcM a) -> TcM a -> TcM a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. SDoc -> TcM a -> TcM a
forall a. SDoc -> TcM a -> TcM a
addErrCtxt (Class -> [PredType] -> SDoc
instDeclCtxt3 Class
clas [PredType]
tys)
doDerivInstErrorChecks1 :: DerivSpecMechanism -> DerivM ()
doDerivInstErrorChecks1 :: DerivSpecMechanism -> ReaderT DerivEnv TcRn ()
doDerivInstErrorChecks1 DerivSpecMechanism
mechanism =
case DerivSpecMechanism
mechanism of
DerivSpecStock{dsm_stock_dit :: DerivSpecMechanism -> DerivInstTys
dsm_stock_dit = DerivInstTys
dit}
-> DerivInstTys -> ReaderT DerivEnv TcRn ()
data_cons_in_scope_check DerivInstTys
dit
DerivSpecNewtype{dsm_newtype_dit :: DerivSpecMechanism -> DerivInstTys
dsm_newtype_dit = DerivInstTys
dit}
-> do ReaderT DerivEnv TcRn ()
atf_coerce_based_error_checks
DerivInstTys -> ReaderT DerivEnv TcRn ()
data_cons_in_scope_check DerivInstTys
dit
DerivSpecAnyClass{}
-> () -> ReaderT DerivEnv TcRn ()
forall (f :: * -> *) a. Applicative f => a -> f a
External instance of the constraint type forall (m :: * -> *) r. Applicative m => Applicative (ReaderT r m)
External instance of the constraint type forall m. Applicative (IOEnv m)
pure ()
DerivSpecVia{}
-> ReaderT DerivEnv TcRn ()
atf_coerce_based_error_checks
where
data_cons_in_scope_check :: DerivInstTys -> DerivM ()
data_cons_in_scope_check :: DerivInstTys -> ReaderT DerivEnv TcRn ()
data_cons_in_scope_check (DerivInstTys { dit_tc :: DerivInstTys -> TyCon
dit_tc = TyCon
tc
, dit_rep_tc :: DerivInstTys -> TyCon
dit_rep_tc = TyCon
rep_tc }) = do
Bool
standalone <- DerivM Bool
isStandaloneDeriv
Bool -> ReaderT DerivEnv TcRn () -> ReaderT DerivEnv TcRn ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
External instance of the constraint type forall (m :: * -> *) r. Applicative m => Applicative (ReaderT r m)
External instance of the constraint type forall m. Applicative (IOEnv m)
when Bool
standalone (ReaderT DerivEnv TcRn () -> ReaderT DerivEnv TcRn ())
-> ReaderT DerivEnv TcRn () -> ReaderT DerivEnv TcRn ()
forall a b. (a -> b) -> a -> b
$ do
let bale_out :: SDoc -> ReaderT DerivEnv TcRn ()
bale_out SDoc
msg = do SDoc
err <- DerivSpecMechanism -> SDoc -> DerivM SDoc
derivingThingErrMechanism DerivSpecMechanism
mechanism SDoc
msg
TcRn () -> ReaderT DerivEnv TcRn ()
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
External instance of the constraint type forall m. Monad (IOEnv m)
External instance of the constraint type forall r. MonadTrans (ReaderT r)
lift (TcRn () -> ReaderT DerivEnv TcRn ())
-> TcRn () -> ReaderT DerivEnv TcRn ()
forall a b. (a -> b) -> a -> b
$ SDoc -> TcRn ()
forall a. SDoc -> TcM a
failWithTc SDoc
err
GlobalRdrEnv
rdr_env <- IOEnv (Env TcGblEnv TcLclEnv) GlobalRdrEnv
-> ReaderT DerivEnv TcRn GlobalRdrEnv
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
External instance of the constraint type forall m. Monad (IOEnv m)
External instance of the constraint type forall r. MonadTrans (ReaderT r)
lift IOEnv (Env TcGblEnv TcLclEnv) GlobalRdrEnv
getGlobalRdrEnv
let data_con_names :: [Name]
data_con_names = (DataCon -> Name) -> [DataCon] -> [Name]
forall a b. (a -> b) -> [a] -> [b]
map DataCon -> Name
dataConName (TyCon -> [DataCon]
tyConDataCons TyCon
rep_tc)
hidden_data_cons :: Bool
hidden_data_cons = Bool -> Bool
not (TyCon -> Bool
forall thing. NamedThing thing => thing -> Bool
External instance of the constraint type NamedThing TyCon
isWiredIn TyCon
rep_tc) Bool -> Bool -> Bool
&&
(TyCon -> Bool
isAbstractTyCon TyCon
rep_tc Bool -> Bool -> Bool
||
(Name -> Bool) -> [Name] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
External instance of the constraint type Foldable []
any Name -> Bool
not_in_scope [Name]
data_con_names)
not_in_scope :: Name -> Bool
not_in_scope Name
dc = Maybe GlobalRdrElt -> Bool
forall a. Maybe a -> Bool
isNothing (GlobalRdrEnv -> Name -> Maybe GlobalRdrElt
lookupGRE_Name GlobalRdrEnv
rdr_env Name
dc)
TcRn () -> ReaderT DerivEnv TcRn ()
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
External instance of the constraint type forall m. Monad (IOEnv m)
External instance of the constraint type forall r. MonadTrans (ReaderT r)
lift (TcRn () -> ReaderT DerivEnv TcRn ())
-> TcRn () -> ReaderT DerivEnv TcRn ()
forall a b. (a -> b) -> a -> b
$ GlobalRdrEnv -> TyCon -> TcRn ()
addUsedDataCons GlobalRdrEnv
rdr_env TyCon
rep_tc
Bool -> ReaderT DerivEnv TcRn () -> ReaderT DerivEnv TcRn ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
External instance of the constraint type forall (m :: * -> *) r. Applicative m => Applicative (ReaderT r m)
External instance of the constraint type forall m. Applicative (IOEnv m)
unless (Bool -> Bool
not Bool
hidden_data_cons) (ReaderT DerivEnv TcRn () -> ReaderT DerivEnv TcRn ())
-> ReaderT DerivEnv TcRn () -> ReaderT DerivEnv TcRn ()
forall a b. (a -> b) -> a -> b
$
SDoc -> ReaderT DerivEnv TcRn ()
bale_out (SDoc -> ReaderT DerivEnv TcRn ())
-> SDoc -> ReaderT DerivEnv TcRn ()
forall a b. (a -> b) -> a -> b
$ TyCon -> SDoc
derivingHiddenErr TyCon
tc
atf_coerce_based_error_checks :: DerivM ()
atf_coerce_based_error_checks :: ReaderT DerivEnv TcRn ()
atf_coerce_based_error_checks = do
Class
cls <- (DerivEnv -> Class) -> ReaderT DerivEnv TcRn Class
forall (m :: * -> *) r a. Monad m => (r -> a) -> ReaderT r m a
External instance of the constraint type forall m. Monad (IOEnv m)
asks DerivEnv -> Class
denv_cls
let bale_out :: SDoc -> ReaderT DerivEnv TcRn ()
bale_out SDoc
msg = do SDoc
err <- DerivSpecMechanism -> SDoc -> DerivM SDoc
derivingThingErrMechanism DerivSpecMechanism
mechanism SDoc
msg
TcRn () -> ReaderT DerivEnv TcRn ()
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
External instance of the constraint type forall m. Monad (IOEnv m)
External instance of the constraint type forall r. MonadTrans (ReaderT r)
lift (TcRn () -> ReaderT DerivEnv TcRn ())
-> TcRn () -> ReaderT DerivEnv TcRn ()
forall a b. (a -> b) -> a -> b
$ SDoc -> TcRn ()
forall a. SDoc -> TcM a
failWithTc SDoc
err
cls_tyvars :: [TyVar]
cls_tyvars = Class -> [TyVar]
classTyVars Class
cls
ats_look_sensible :: Bool
ats_look_sensible
=
Bool
no_adfs
Bool -> Bool -> Bool
&& Maybe TyCon -> Bool
forall a. Maybe a -> Bool
isNothing Maybe TyCon
at_without_last_cls_tv
Bool -> Bool -> Bool
&& Maybe TyCon -> Bool
forall a. Maybe a -> Bool
isNothing Maybe TyCon
at_last_cls_tv_in_kinds
([TyCon]
adf_tcs, [TyCon]
atf_tcs) = (TyCon -> Bool) -> [TyCon] -> ([TyCon], [TyCon])
forall a. (a -> Bool) -> [a] -> ([a], [a])
partition TyCon -> Bool
isDataFamilyTyCon [TyCon]
at_tcs
no_adfs :: Bool
no_adfs = [TyCon] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
External instance of the constraint type Foldable []
null [TyCon]
adf_tcs
at_without_last_cls_tv :: Maybe TyCon
at_without_last_cls_tv
= (TyCon -> Bool) -> [TyCon] -> Maybe TyCon
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Maybe a
External instance of the constraint type Foldable []
find (\TyCon
tc -> TyVar
last_cls_tv TyVar -> [TyVar] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
External instance of the constraint type Eq TyVar
External instance of the constraint type Foldable []
`notElem` TyCon -> [TyVar]
tyConTyVars TyCon
tc) [TyCon]
atf_tcs
at_last_cls_tv_in_kinds :: Maybe TyCon
at_last_cls_tv_in_kinds
= (TyCon -> Bool) -> [TyCon] -> Maybe TyCon
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Maybe a
External instance of the constraint type Foldable []
find (\TyCon
tc -> (TyVar -> Bool) -> [TyVar] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
External instance of the constraint type Foldable []
any (PredType -> Bool
at_last_cls_tv_in_kind (PredType -> Bool) -> (TyVar -> PredType) -> TyVar -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. TyVar -> PredType
tyVarKind)
(TyCon -> [TyVar]
tyConTyVars TyCon
tc)
Bool -> Bool -> Bool
|| PredType -> Bool
at_last_cls_tv_in_kind (TyCon -> PredType
tyConResKind TyCon
tc)) [TyCon]
atf_tcs
at_last_cls_tv_in_kind :: PredType -> Bool
at_last_cls_tv_in_kind PredType
kind
= TyVar
last_cls_tv TyVar -> VarSet -> Bool
`elemVarSet` PredType -> VarSet
exactTyCoVarsOfType PredType
kind
at_tcs :: [TyCon]
at_tcs = Class -> [TyCon]
classATs Class
cls
last_cls_tv :: TyVar
last_cls_tv = ASSERT( notNull cls_tyvars )
[TyVar] -> TyVar
forall a. [a] -> a
last [TyVar]
cls_tyvars
cant_derive_err :: SDoc
cant_derive_err
= [SDoc] -> SDoc
vcat [ Bool -> SDoc -> SDoc
ppUnless Bool
no_adfs SDoc
adfs_msg
, SDoc -> (TyCon -> SDoc) -> Maybe TyCon -> SDoc
forall b a. b -> (a -> b) -> Maybe a -> b
maybe SDoc
empty TyCon -> SDoc
at_without_last_cls_tv_msg
Maybe TyCon
at_without_last_cls_tv
, SDoc -> (TyCon -> SDoc) -> Maybe TyCon -> SDoc
forall b a. b -> (a -> b) -> Maybe a -> b
maybe SDoc
empty TyCon -> SDoc
at_last_cls_tv_in_kinds_msg
Maybe TyCon
at_last_cls_tv_in_kinds
]
adfs_msg :: SDoc
adfs_msg = [Char] -> SDoc
text [Char]
"the class has associated data types"
at_without_last_cls_tv_msg :: TyCon -> SDoc
at_without_last_cls_tv_msg TyCon
at_tc = SDoc -> Arity -> SDoc -> SDoc
hang
([Char] -> SDoc
text [Char]
"the associated type" SDoc -> SDoc -> SDoc
<+> SDoc -> SDoc
quotes (TyCon -> SDoc
forall a. Outputable a => a -> SDoc
External instance of the constraint type Outputable TyCon
ppr TyCon
at_tc)
SDoc -> SDoc -> SDoc
<+> [Char] -> SDoc
text [Char]
"is not parameterized over the last type variable")
Arity
2 ([Char] -> SDoc
text [Char]
"of the class" SDoc -> SDoc -> SDoc
<+> SDoc -> SDoc
quotes (Class -> SDoc
forall a. Outputable a => a -> SDoc
External instance of the constraint type Outputable Class
ppr Class
cls))
at_last_cls_tv_in_kinds_msg :: TyCon -> SDoc
at_last_cls_tv_in_kinds_msg TyCon
at_tc = SDoc -> Arity -> SDoc -> SDoc
hang
([Char] -> SDoc
text [Char]
"the associated type" SDoc -> SDoc -> SDoc
<+> SDoc -> SDoc
quotes (TyCon -> SDoc
forall a. Outputable a => a -> SDoc
External instance of the constraint type Outputable TyCon
ppr TyCon
at_tc)
SDoc -> SDoc -> SDoc
<+> [Char] -> SDoc
text [Char]
"contains the last type variable")
Arity
2 ([Char] -> SDoc
text [Char]
"of the class" SDoc -> SDoc -> SDoc
<+> SDoc -> SDoc
quotes (Class -> SDoc
forall a. Outputable a => a -> SDoc
External instance of the constraint type Outputable Class
ppr Class
cls)
SDoc -> SDoc -> SDoc
<+> [Char] -> SDoc
text [Char]
"in a kind, which is not (yet) allowed")
Bool -> ReaderT DerivEnv TcRn () -> ReaderT DerivEnv TcRn ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
External instance of the constraint type forall (m :: * -> *) r. Applicative m => Applicative (ReaderT r m)
External instance of the constraint type forall m. Applicative (IOEnv m)
unless Bool
ats_look_sensible (ReaderT DerivEnv TcRn () -> ReaderT DerivEnv TcRn ())
-> ReaderT DerivEnv TcRn () -> ReaderT DerivEnv TcRn ()
forall a b. (a -> b) -> a -> b
$ SDoc -> ReaderT DerivEnv TcRn ()
bale_out SDoc
cant_derive_err
doDerivInstErrorChecks2 :: Class -> ClsInst -> ThetaType -> Maybe SrcSpan
-> DerivSpecMechanism -> TcM ()
doDerivInstErrorChecks2 :: Class
-> ClsInst
-> [PredType]
-> Maybe SrcSpan
-> DerivSpecMechanism
-> TcRn ()
doDerivInstErrorChecks2 Class
clas ClsInst
clas_inst [PredType]
theta Maybe SrcSpan
wildcard DerivSpecMechanism
mechanism
= do { [Char] -> SDoc -> TcRn ()
traceTc [Char]
"doDerivInstErrorChecks2" (ClsInst -> SDoc
forall a. Outputable a => a -> SDoc
External instance of the constraint type Outputable ClsInst
ppr ClsInst
clas_inst)
; DynFlags
dflags <- IOEnv (Env TcGblEnv TcLclEnv) DynFlags
forall (m :: * -> *). HasDynFlags m => m DynFlags
External instance of the constraint type forall env. ContainsDynFlags env => HasDynFlags (IOEnv env)
External instance of the constraint type forall gbl lcl. ContainsDynFlags (Env gbl lcl)
getDynFlags
; Bool
xpartial_sigs <- Extension -> TcRnIf TcGblEnv TcLclEnv Bool
forall gbl lcl. Extension -> TcRnIf gbl lcl Bool
xoptM Extension
LangExt.PartialTypeSignatures
; Bool
wpartial_sigs <- WarningFlag -> TcRnIf TcGblEnv TcLclEnv Bool
forall gbl lcl. WarningFlag -> TcRnIf gbl lcl Bool
woptM WarningFlag
Opt_WarnPartialTypeSignatures
; case Maybe SrcSpan
wildcard of
Maybe SrcSpan
Nothing -> () -> TcRn ()
forall (f :: * -> *) a. Applicative f => a -> f a
External instance of the constraint type forall m. Applicative (IOEnv m)
pure ()
Just SrcSpan
span -> SrcSpan -> TcRn () -> TcRn ()
forall a. SrcSpan -> TcRn a -> TcRn a
setSrcSpan SrcSpan
span (TcRn () -> TcRn ()) -> TcRn () -> TcRn ()
forall a b. (a -> b) -> a -> b
$ do
Bool -> SDoc -> TcRn ()
checkTc Bool
xpartial_sigs (SDoc -> Arity -> SDoc -> SDoc
hang SDoc
partial_sig_msg Arity
2 SDoc
pts_suggestion)
WarnReason -> Bool -> SDoc -> TcRn ()
warnTc (WarningFlag -> WarnReason
Reason WarningFlag
Opt_WarnPartialTypeSignatures)
Bool
wpartial_sigs SDoc
partial_sig_msg
; Bool -> TcRn () -> TcRn ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
External instance of the constraint type forall m. Applicative (IOEnv m)
when (Bool
exotic_mechanism Bool -> Bool -> Bool
&& Class -> Name
className Class
clas Name -> [Name] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
External instance of the constraint type Eq Name
External instance of the constraint type Foldable []
`elem` [Name]
genericClassNames) (TcRn () -> TcRn ()) -> TcRn () -> TcRn ()
forall a b. (a -> b) -> a -> b
$
do { Bool -> SDoc -> TcRn ()
failIfTc (DynFlags -> Bool
safeLanguageOn DynFlags
dflags) SDoc
gen_inst_err
; Bool -> TcRn () -> TcRn ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
External instance of the constraint type forall m. Applicative (IOEnv m)
when (DynFlags -> Bool
safeInferOn DynFlags
dflags) (WarningMessages -> TcRn ()
recordUnsafeInfer WarningMessages
forall a. Bag a
emptyBag) } }
where
exotic_mechanism :: Bool
exotic_mechanism = Bool -> Bool
not (Bool -> Bool) -> Bool -> Bool
forall a b. (a -> b) -> a -> b
$ DerivSpecMechanism -> Bool
isDerivSpecStock DerivSpecMechanism
mechanism
partial_sig_msg :: SDoc
partial_sig_msg = [Char] -> SDoc
text [Char]
"Found type wildcard" SDoc -> SDoc -> SDoc
<+> SDoc -> SDoc
quotes (Char -> SDoc
char Char
'_')
SDoc -> SDoc -> SDoc
<+> [Char] -> SDoc
text [Char]
"standing for" SDoc -> SDoc -> SDoc
<+> SDoc -> SDoc
quotes ([PredType] -> SDoc
pprTheta [PredType]
theta)
pts_suggestion :: SDoc
pts_suggestion
= [Char] -> SDoc
text [Char]
"To use the inferred type, enable PartialTypeSignatures"
gen_inst_err :: SDoc
gen_inst_err = [Char] -> SDoc
text [Char]
"Generic instances can only be derived in"
SDoc -> SDoc -> SDoc
<+> [Char] -> SDoc
text [Char]
"Safe Haskell using the stock strategy."
derivingThingFailWith :: Bool
-> SDoc
-> DerivM a
derivingThingFailWith :: Bool -> SDoc -> DerivM a
derivingThingFailWith Bool
newtype_deriving SDoc
msg = do
SDoc
err <- Bool -> SDoc -> DerivM SDoc
derivingThingErrM Bool
newtype_deriving SDoc
msg
IOEnv (Env TcGblEnv TcLclEnv) a -> DerivM a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
External instance of the constraint type forall m. Monad (IOEnv m)
External instance of the constraint type forall r. MonadTrans (ReaderT r)
lift (IOEnv (Env TcGblEnv TcLclEnv) a -> DerivM a)
-> IOEnv (Env TcGblEnv TcLclEnv) a -> DerivM a
forall a b. (a -> b) -> a -> b
$ SDoc -> IOEnv (Env TcGblEnv TcLclEnv) a
forall a. SDoc -> TcM a
failWithTc SDoc
err
genDerivStuff :: DerivSpecMechanism -> SrcSpan -> Class
-> [Type] -> [TyVar]
-> TcM (LHsBinds GhcPs, [LSig GhcPs], BagDerivStuff, [Name])
genDerivStuff :: DerivSpecMechanism
-> SrcSpan
-> Class
-> [PredType]
-> [TyVar]
-> TcM (Bag (LHsBind GhcPs), [LSig GhcPs], BagDerivStuff, [Name])
genDerivStuff DerivSpecMechanism
mechanism SrcSpan
loc Class
clas [PredType]
inst_tys [TyVar]
tyvars
= case DerivSpecMechanism
mechanism of
DerivSpecNewtype { dsm_newtype_rep_ty :: DerivSpecMechanism -> PredType
dsm_newtype_rep_ty = PredType
rhs_ty}
-> PredType
-> TcM (Bag (LHsBind GhcPs), [LSig GhcPs], BagDerivStuff, [Name])
gen_newtype_or_via PredType
rhs_ty
DerivSpecStock { dsm_stock_dit :: DerivSpecMechanism -> DerivInstTys
dsm_stock_dit = DerivInstTys{dit_rep_tc :: DerivInstTys -> TyCon
dit_rep_tc = TyCon
rep_tc}
, dsm_stock_gen_fn :: DerivSpecMechanism
-> SrcSpan
-> TyCon
-> [PredType]
-> TcM (Bag (LHsBind GhcPs), BagDerivStuff, [Name])
dsm_stock_gen_fn = SrcSpan
-> TyCon
-> [PredType]
-> TcM (Bag (LHsBind GhcPs), BagDerivStuff, [Name])
gen_fn }
-> do (Bag (LHsBind GhcPs)
binds, BagDerivStuff
faminsts, [Name]
field_names) <- SrcSpan
-> TyCon
-> [PredType]
-> TcM (Bag (LHsBind GhcPs), BagDerivStuff, [Name])
gen_fn SrcSpan
loc TyCon
rep_tc [PredType]
inst_tys
(Bag (LHsBind GhcPs), [LSig GhcPs], BagDerivStuff, [Name])
-> TcM (Bag (LHsBind GhcPs), [LSig GhcPs], BagDerivStuff, [Name])
forall (f :: * -> *) a. Applicative f => a -> f a
External instance of the constraint type forall m. Applicative (IOEnv m)
pure (Bag (LHsBind GhcPs)
binds, [], BagDerivStuff
faminsts, [Name]
field_names)
DerivSpecMechanism
DerivSpecAnyClass -> do
let mini_env :: VarEnv PredType
mini_env = [(TyVar, PredType)] -> VarEnv PredType
forall a. [(TyVar, a)] -> VarEnv a
mkVarEnv (Class -> [TyVar]
classTyVars Class
clas [TyVar] -> [PredType] -> [(TyVar, PredType)]
forall a b. [a] -> [b] -> [(a, b)]
`zip` [PredType]
inst_tys)
mini_subst :: TCvSubst
mini_subst = InScopeSet -> VarEnv PredType -> TCvSubst
mkTvSubst (VarSet -> InScopeSet
mkInScopeSet ([TyVar] -> VarSet
mkVarSet [TyVar]
tyvars)) VarEnv PredType
mini_env
DynFlags
dflags <- IOEnv (Env TcGblEnv TcLclEnv) DynFlags
forall (m :: * -> *). HasDynFlags m => m DynFlags
External instance of the constraint type forall env. ContainsDynFlags env => HasDynFlags (IOEnv env)
External instance of the constraint type forall gbl lcl. ContainsDynFlags (Env gbl lcl)
getDynFlags
[[FamInst]]
tyfam_insts <-
ASSERT2( isValid (canDeriveAnyClass dflags)
, ppr "genDerivStuff: bad derived class" <+> ppr clas )
(ClassATItem -> IOEnv (Env TcGblEnv TcLclEnv) [FamInst])
-> [ClassATItem] -> IOEnv (Env TcGblEnv TcLclEnv) [[FamInst]]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
External instance of the constraint type forall m. Monad (IOEnv m)
External instance of the constraint type Traversable []
mapM (SrcSpan
-> TCvSubst
-> Uses
-> ClassATItem
-> IOEnv (Env TcGblEnv TcLclEnv) [FamInst]
tcATDefault SrcSpan
loc TCvSubst
mini_subst Uses
emptyNameSet)
(Class -> [ClassATItem]
classATItems Class
clas)
(Bag (LHsBind GhcPs), [LSig GhcPs], BagDerivStuff, [Name])
-> TcM (Bag (LHsBind GhcPs), [LSig GhcPs], BagDerivStuff, [Name])
forall (m :: * -> *) a. Monad m => a -> m a
External instance of the constraint type forall m. Monad (IOEnv m)
return ( Bag (LHsBind GhcPs)
forall a. Bag a
emptyBag, []
, [DerivStuff] -> BagDerivStuff
forall a. [a] -> Bag a
listToBag ((FamInst -> DerivStuff) -> [FamInst] -> [DerivStuff]
forall a b. (a -> b) -> [a] -> [b]
map FamInst -> DerivStuff
DerivFamInst ([[FamInst]] -> [FamInst]
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
External instance of the constraint type Foldable []
concat [[FamInst]]
tyfam_insts))
, [] )
DerivSpecVia{dsm_via_ty :: DerivSpecMechanism -> PredType
dsm_via_ty = PredType
via_ty}
-> PredType
-> TcM (Bag (LHsBind GhcPs), [LSig GhcPs], BagDerivStuff, [Name])
gen_newtype_or_via PredType
via_ty
where
gen_newtype_or_via :: PredType
-> TcM (Bag (LHsBind GhcPs), [LSig GhcPs], BagDerivStuff, [Name])
gen_newtype_or_via PredType
ty = do
(Bag (LHsBind GhcPs)
binds, [LSig GhcPs]
sigs, BagDerivStuff
faminsts) <- SrcSpan
-> Class
-> [TyVar]
-> [PredType]
-> PredType
-> TcM (Bag (LHsBind GhcPs), [LSig GhcPs], BagDerivStuff)
gen_Newtype_binds SrcSpan
loc Class
clas [TyVar]
tyvars [PredType]
inst_tys PredType
ty
(Bag (LHsBind GhcPs), [LSig GhcPs], BagDerivStuff, [Name])
-> TcM (Bag (LHsBind GhcPs), [LSig GhcPs], BagDerivStuff, [Name])
forall (m :: * -> *) a. Monad m => a -> m a
External instance of the constraint type forall m. Monad (IOEnv m)
return (Bag (LHsBind GhcPs)
binds, [LSig GhcPs]
sigs, BagDerivStuff
faminsts, [])
nonUnaryErr :: LHsSigType GhcRn -> SDoc
nonUnaryErr :: LHsSigType GhcRn -> SDoc
nonUnaryErr LHsSigType GhcRn
ct = SDoc -> SDoc
quotes (LHsSigType GhcRn -> SDoc
forall a. Outputable a => a -> SDoc
External instance of the constraint type forall thing (p :: Pass).
Outputable thing =>
Outputable (HsImplicitBndrs (GhcPass p) thing)
External instance of the constraint type forall l e.
(Outputable l, Outputable e) =>
Outputable (GenLocated l e)
External instance of the constraint type Outputable SrcSpan
External instance of the constraint type forall (p :: Pass).
OutputableBndrId p =>
Outputable (HsType (GhcPass p))
External instance of the constraint type OutputableBndr Name
External instance of the constraint type OutputableBndr Name
External instance of the constraint type IsPass 'Renamed
ppr LHsSigType GhcRn
ct)
SDoc -> SDoc -> SDoc
<+> [Char] -> SDoc
text [Char]
"is not a unary constraint, as expected by a deriving clause"
nonStdErr :: Class -> SDoc
nonStdErr :: Class -> SDoc
nonStdErr Class
cls =
SDoc -> SDoc
quotes (Class -> SDoc
forall a. Outputable a => a -> SDoc
External instance of the constraint type Outputable Class
ppr Class
cls)
SDoc -> SDoc -> SDoc
<+> [Char] -> SDoc
text [Char]
"is not a stock derivable class (Eq, Show, etc.)"
gndNonNewtypeErr :: SDoc
gndNonNewtypeErr :: SDoc
gndNonNewtypeErr =
[Char] -> SDoc
text [Char]
"GeneralizedNewtypeDeriving cannot be used on non-newtypes"
derivingNullaryErr :: MsgDoc
derivingNullaryErr :: SDoc
derivingNullaryErr = [Char] -> SDoc
text [Char]
"Cannot derive instances for nullary classes"
derivingKindErr :: TyCon -> Class -> [Type] -> Kind -> Bool -> MsgDoc
derivingKindErr :: TyCon -> Class -> [PredType] -> PredType -> Bool -> SDoc
derivingKindErr TyCon
tc Class
cls [PredType]
cls_tys PredType
cls_kind Bool
enough_args
= [SDoc] -> SDoc
sep [ SDoc -> Arity -> SDoc -> SDoc
hang ([Char] -> SDoc
text [Char]
"Cannot derive well-kinded instance of form"
SDoc -> SDoc -> SDoc
<+> SDoc -> SDoc
quotes (Class -> [PredType] -> SDoc
pprClassPred Class
cls [PredType]
cls_tys
SDoc -> SDoc -> SDoc
<+> SDoc -> SDoc
parens (TyCon -> SDoc
forall a. Outputable a => a -> SDoc
External instance of the constraint type Outputable TyCon
ppr TyCon
tc SDoc -> SDoc -> SDoc
<+> [Char] -> SDoc
text [Char]
"...")))
Arity
2 SDoc
gen1_suggestion
, Arity -> SDoc -> SDoc
nest Arity
2 ([Char] -> SDoc
text [Char]
"Class" SDoc -> SDoc -> SDoc
<+> SDoc -> SDoc
quotes (Class -> SDoc
forall a. Outputable a => a -> SDoc
External instance of the constraint type Outputable Class
ppr Class
cls)
SDoc -> SDoc -> SDoc
<+> [Char] -> SDoc
text [Char]
"expects an argument of kind"
SDoc -> SDoc -> SDoc
<+> SDoc -> SDoc
quotes (PredType -> SDoc
pprKind PredType
cls_kind))
]
where
gen1_suggestion :: SDoc
gen1_suggestion | Class
cls Class -> Unique -> Bool
forall a. Uniquable a => a -> Unique -> Bool
External instance of the constraint type Uniquable Class
`hasKey` Unique
gen1ClassKey Bool -> Bool -> Bool
&& Bool
enough_args
= [Char] -> SDoc
text [Char]
"(Perhaps you intended to use PolyKinds)"
| Bool
otherwise = SDoc
Outputable.empty
derivingViaKindErr :: Class -> Kind -> Type -> Kind -> MsgDoc
derivingViaKindErr :: Class -> PredType -> PredType -> PredType -> SDoc
derivingViaKindErr Class
cls PredType
cls_kind PredType
via_ty PredType
via_kind
= SDoc -> Arity -> SDoc -> SDoc
hang ([Char] -> SDoc
text [Char]
"Cannot derive instance via" SDoc -> SDoc -> SDoc
<+> SDoc -> SDoc
quotes (PredType -> SDoc
pprType PredType
via_ty))
Arity
2 ([Char] -> SDoc
text [Char]
"Class" SDoc -> SDoc -> SDoc
<+> SDoc -> SDoc
quotes (Class -> SDoc
forall a. Outputable a => a -> SDoc
External instance of the constraint type Outputable Class
ppr Class
cls)
SDoc -> SDoc -> SDoc
<+> [Char] -> SDoc
text [Char]
"expects an argument of kind"
SDoc -> SDoc -> SDoc
<+> SDoc -> SDoc
quotes (PredType -> SDoc
pprKind PredType
cls_kind) SDoc -> SDoc -> SDoc
<> Char -> SDoc
char Char
','
SDoc -> SDoc -> SDoc
$+$ [Char] -> SDoc
text [Char]
"but" SDoc -> SDoc -> SDoc
<+> SDoc -> SDoc
quotes (PredType -> SDoc
pprType PredType
via_ty)
SDoc -> SDoc -> SDoc
<+> [Char] -> SDoc
text [Char]
"has kind" SDoc -> SDoc -> SDoc
<+> SDoc -> SDoc
quotes (PredType -> SDoc
pprKind PredType
via_kind))
derivingEtaErr :: Class -> [Type] -> Type -> MsgDoc
derivingEtaErr :: Class -> [PredType] -> PredType -> SDoc
derivingEtaErr Class
cls [PredType]
cls_tys PredType
inst_ty
= [SDoc] -> SDoc
sep [[Char] -> SDoc
text [Char]
"Cannot eta-reduce to an instance of form",
Arity -> SDoc -> SDoc
nest Arity
2 ([Char] -> SDoc
text [Char]
"instance (...) =>"
SDoc -> SDoc -> SDoc
<+> Class -> [PredType] -> SDoc
pprClassPred Class
cls ([PredType]
cls_tys [PredType] -> [PredType] -> [PredType]
forall a. [a] -> [a] -> [a]
++ [PredType
inst_ty]))]
derivingThingErr :: Bool -> Class -> [Type]
-> Maybe (DerivStrategy GhcTc) -> MsgDoc -> MsgDoc
derivingThingErr :: Bool
-> Class
-> [PredType]
-> Maybe (DerivStrategy GhcTc)
-> SDoc
-> SDoc
derivingThingErr Bool
newtype_deriving Class
cls [PredType]
cls_args Maybe (DerivStrategy GhcTc)
mb_strat SDoc
why
= Bool
-> Class
-> [PredType]
-> Maybe (DerivStrategy GhcTc)
-> SDoc
-> SDoc
-> SDoc
derivingThingErr' Bool
newtype_deriving Class
cls [PredType]
cls_args Maybe (DerivStrategy GhcTc)
mb_strat
(SDoc
-> (DerivStrategy GhcTc -> SDoc)
-> Maybe (DerivStrategy GhcTc)
-> SDoc
forall b a. b -> (a -> b) -> Maybe a -> b
maybe SDoc
empty DerivStrategy GhcTc -> SDoc
forall a. DerivStrategy a -> SDoc
derivStrategyName Maybe (DerivStrategy GhcTc)
mb_strat) SDoc
why
derivingThingErrM :: Bool -> MsgDoc -> DerivM MsgDoc
derivingThingErrM :: Bool -> SDoc -> DerivM SDoc
derivingThingErrM Bool
newtype_deriving SDoc
why
= do DerivEnv { denv_cls :: DerivEnv -> Class
denv_cls = Class
cls
, denv_inst_tys :: DerivEnv -> [PredType]
denv_inst_tys = [PredType]
cls_args
, denv_strat :: DerivEnv -> Maybe (DerivStrategy GhcTc)
denv_strat = Maybe (DerivStrategy GhcTc)
mb_strat } <- ReaderT DerivEnv TcRn DerivEnv
forall (m :: * -> *) r. Monad m => ReaderT r m r
External instance of the constraint type forall m. Monad (IOEnv m)
ask
SDoc -> DerivM SDoc
forall (f :: * -> *) a. Applicative f => a -> f a
External instance of the constraint type forall (m :: * -> *) r. Applicative m => Applicative (ReaderT r m)
External instance of the constraint type forall m. Applicative (IOEnv m)
pure (SDoc -> DerivM SDoc) -> SDoc -> DerivM SDoc
forall a b. (a -> b) -> a -> b
$ Bool
-> Class
-> [PredType]
-> Maybe (DerivStrategy GhcTc)
-> SDoc
-> SDoc
derivingThingErr Bool
newtype_deriving Class
cls [PredType]
cls_args Maybe (DerivStrategy GhcTc)
mb_strat SDoc
why
derivingThingErrMechanism :: DerivSpecMechanism -> MsgDoc -> DerivM MsgDoc
derivingThingErrMechanism :: DerivSpecMechanism -> SDoc -> DerivM SDoc
derivingThingErrMechanism DerivSpecMechanism
mechanism SDoc
why
= do DerivEnv { denv_cls :: DerivEnv -> Class
denv_cls = Class
cls
, denv_inst_tys :: DerivEnv -> [PredType]
denv_inst_tys = [PredType]
cls_args
, denv_strat :: DerivEnv -> Maybe (DerivStrategy GhcTc)
denv_strat = Maybe (DerivStrategy GhcTc)
mb_strat } <- ReaderT DerivEnv TcRn DerivEnv
forall (m :: * -> *) r. Monad m => ReaderT r m r
External instance of the constraint type forall m. Monad (IOEnv m)
ask
SDoc -> DerivM SDoc
forall (f :: * -> *) a. Applicative f => a -> f a
External instance of the constraint type forall (m :: * -> *) r. Applicative m => Applicative (ReaderT r m)
External instance of the constraint type forall m. Applicative (IOEnv m)
pure (SDoc -> DerivM SDoc) -> SDoc -> DerivM SDoc
forall a b. (a -> b) -> a -> b
$ Bool
-> Class
-> [PredType]
-> Maybe (DerivStrategy GhcTc)
-> SDoc
-> SDoc
-> SDoc
derivingThingErr' (DerivSpecMechanism -> Bool
isDerivSpecNewtype DerivSpecMechanism
mechanism) Class
cls [PredType]
cls_args Maybe (DerivStrategy GhcTc)
mb_strat
(DerivStrategy GhcTc -> SDoc
forall a. DerivStrategy a -> SDoc
derivStrategyName (DerivStrategy GhcTc -> SDoc) -> DerivStrategy GhcTc -> SDoc
forall a b. (a -> b) -> a -> b
$ DerivSpecMechanism -> DerivStrategy GhcTc
derivSpecMechanismToStrategy DerivSpecMechanism
mechanism) SDoc
why
derivingThingErr' :: Bool -> Class -> [Type]
-> Maybe (DerivStrategy GhcTc) -> MsgDoc -> MsgDoc -> MsgDoc
derivingThingErr' :: Bool
-> Class
-> [PredType]
-> Maybe (DerivStrategy GhcTc)
-> SDoc
-> SDoc
-> SDoc
derivingThingErr' Bool
newtype_deriving Class
cls [PredType]
cls_args Maybe (DerivStrategy GhcTc)
mb_strat SDoc
strat_msg SDoc
why
= [SDoc] -> SDoc
sep [(SDoc -> Arity -> SDoc -> SDoc
hang ([Char] -> SDoc
text [Char]
"Can't make a derived instance of")
Arity
2 (SDoc -> SDoc
quotes (PredType -> SDoc
forall a. Outputable a => a -> SDoc
External instance of the constraint type Outputable PredType
ppr PredType
pred) SDoc -> SDoc -> SDoc
<+> SDoc
via_mechanism)
SDoc -> SDoc -> SDoc
$$ Arity -> SDoc -> SDoc
nest Arity
2 SDoc
extra) SDoc -> SDoc -> SDoc
<> SDoc
colon,
Arity -> SDoc -> SDoc
nest Arity
2 SDoc
why]
where
strat_used :: Bool
strat_used = Maybe (DerivStrategy GhcTc) -> Bool
forall a. Maybe a -> Bool
isJust Maybe (DerivStrategy GhcTc)
mb_strat
extra :: SDoc
extra | Bool -> Bool
not Bool
strat_used, Bool
newtype_deriving
= [Char] -> SDoc
text [Char]
"(even with cunning GeneralizedNewtypeDeriving)"
| Bool
otherwise = SDoc
empty
pred :: PredType
pred = Class -> [PredType] -> PredType
mkClassPred Class
cls [PredType]
cls_args
via_mechanism :: SDoc
via_mechanism | Bool
strat_used
= [Char] -> SDoc
text [Char]
"with the" SDoc -> SDoc -> SDoc
<+> SDoc
strat_msg SDoc -> SDoc -> SDoc
<+> [Char] -> SDoc
text [Char]
"strategy"
| Bool
otherwise
= SDoc
empty
derivingHiddenErr :: TyCon -> SDoc
derivingHiddenErr :: TyCon -> SDoc
derivingHiddenErr TyCon
tc
= SDoc -> Arity -> SDoc -> SDoc
hang ([Char] -> SDoc
text [Char]
"The data constructors of" SDoc -> SDoc -> SDoc
<+> SDoc -> SDoc
quotes (TyCon -> SDoc
forall a. Outputable a => a -> SDoc
External instance of the constraint type Outputable TyCon
ppr TyCon
tc) SDoc -> SDoc -> SDoc
<+> PtrString -> SDoc
ptext ([Char] -> PtrString
sLit [Char]
"are not all in scope"))
Arity
2 ([Char] -> SDoc
text [Char]
"so you cannot derive an instance for it")
standaloneCtxt :: LHsSigWcType GhcRn -> SDoc
standaloneCtxt :: LHsSigWcType GhcRn -> SDoc
standaloneCtxt LHsSigWcType GhcRn
ty = SDoc -> Arity -> SDoc -> SDoc
hang ([Char] -> SDoc
text [Char]
"In the stand-alone deriving instance for")
Arity
2 (SDoc -> SDoc
quotes (LHsSigWcType GhcRn -> SDoc
forall a. Outputable a => a -> SDoc
External instance of the constraint type forall thing (p :: Pass).
Outputable thing =>
Outputable (HsWildCardBndrs (GhcPass p) thing)
External instance of the constraint type forall thing (p :: Pass).
Outputable thing =>
Outputable (HsImplicitBndrs (GhcPass p) thing)
External instance of the constraint type forall l e.
(Outputable l, Outputable e) =>
Outputable (GenLocated l e)
External instance of the constraint type Outputable SrcSpan
External instance of the constraint type forall (p :: Pass).
OutputableBndrId p =>
Outputable (HsType (GhcPass p))
External instance of the constraint type OutputableBndr Name
External instance of the constraint type OutputableBndr Name
External instance of the constraint type IsPass 'Renamed
ppr LHsSigWcType GhcRn
ty))