{-# LANGUAGE CPP #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE TypeFamilies #-}
module TcInstDcls ( tcInstDecls1, tcInstDeclsDeriv, tcInstDecls2 ) where
#include "HsVersions.h"
import GhcPrelude
import HsSyn
import TcBinds
import TcTyClsDecls
import TcTyDecls ( addTyConsToGblEnv )
import TcClassDcl( tcClassDecl2, tcATDefault,
HsSigFun, mkHsSigFun, badMethodErr,
findMethodBind, instantiateMethod )
import TcSigs
import TcRnMonad
import TcValidity
import TcHsSyn
import TcMType
import TcType
import BuildTyCl
import Inst
import ClsInst( AssocInstInfo(..), isNotAssociated )
import InstEnv
import FamInst
import FamInstEnv
import TcDeriv
import TcEnv
import TcHsType
import TcUnify
import CoreSyn ( Expr(..), mkApps, mkVarApps, mkLams )
import MkCore ( nO_METHOD_BINDING_ERROR_ID )
import CoreUnfold ( mkInlineUnfoldingWithArity, mkDFunUnfolding )
import Type
import TcEvidence
import TyCon
import CoAxiom
import DataCon
import ConLike
import Class
import Var
import VarEnv
import VarSet
import Bag
import BasicTypes
import DynFlags
import ErrUtils
import FastString
import Id
import ListSetOps
import Name
import NameSet
import Outputable
import SrcLoc
import Util
import BooleanFormula ( isUnsatisfied, pprBooleanFormulaNice )
import qualified GHC.LanguageExtensions as LangExt
import Control.Monad
import Maybes
import Data.List( mapAccumL )
tcInstDecls1
:: [LInstDecl GhcRn]
-> TcM (TcGblEnv,
[InstInfo GhcRn],
[DerivInfo])
tcInstDecls1 :: [LInstDecl GhcRn] -> TcM (TcGblEnv, [InstInfo GhcRn], [DerivInfo])
tcInstDecls1 inst_decls :: [LInstDecl GhcRn]
inst_decls
= do {
; [([InstInfo GhcRn], [FamInst], [DerivInfo])]
stuff <- (LInstDecl GhcRn
-> TcRn ([InstInfo GhcRn], [FamInst], [DerivInfo]))
-> [LInstDecl GhcRn]
-> TcRn [([InstInfo GhcRn], [FamInst], [DerivInfo])]
forall a b. (a -> TcRn b) -> [a] -> TcRn [b]
mapAndRecoverM LInstDecl GhcRn -> TcRn ([InstInfo GhcRn], [FamInst], [DerivInfo])
tcLocalInstDecl [LInstDecl GhcRn]
inst_decls
; let (local_infos_s :: [[InstInfo GhcRn]]
local_infos_s, fam_insts_s :: [[FamInst]]
fam_insts_s, datafam_deriv_infos :: [[DerivInfo]]
datafam_deriv_infos) = [([InstInfo GhcRn], [FamInst], [DerivInfo])]
-> ([[InstInfo GhcRn]], [[FamInst]], [[DerivInfo]])
forall a b c. [(a, b, c)] -> ([a], [b], [c])
unzip3 [([InstInfo GhcRn], [FamInst], [DerivInfo])]
stuff
fam_insts :: [FamInst]
fam_insts = [[FamInst]] -> [FamInst]
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat [[FamInst]]
fam_insts_s
local_infos :: [InstInfo GhcRn]
local_infos = [[InstInfo GhcRn]] -> [InstInfo GhcRn]
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat [[InstInfo GhcRn]]
local_infos_s
; TcGblEnv
gbl_env <- [InstInfo GhcRn] -> TcM TcGblEnv -> TcM TcGblEnv
forall a. [InstInfo GhcRn] -> TcM a -> TcM a
addClsInsts [InstInfo GhcRn]
local_infos (TcM TcGblEnv -> TcM TcGblEnv) -> TcM TcGblEnv -> TcM TcGblEnv
forall a b. (a -> b) -> a -> b
$
[FamInst] -> TcM TcGblEnv -> TcM TcGblEnv
forall a. [FamInst] -> TcM a -> TcM a
addFamInsts [FamInst]
fam_insts (TcM TcGblEnv -> TcM TcGblEnv) -> TcM TcGblEnv -> TcM TcGblEnv
forall a b. (a -> b) -> a -> b
$
TcM TcGblEnv
forall gbl lcl. TcRnIf gbl lcl gbl
getGblEnv
; (TcGblEnv, [InstInfo GhcRn], [DerivInfo])
-> TcM (TcGblEnv, [InstInfo GhcRn], [DerivInfo])
forall (m :: * -> *) a. Monad m => a -> m a
return ( TcGblEnv
gbl_env
, [InstInfo GhcRn]
local_infos
, [[DerivInfo]] -> [DerivInfo]
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat [[DerivInfo]]
datafam_deriv_infos ) }
tcInstDeclsDeriv
:: [DerivInfo]
-> [LTyClDecl GhcRn]
-> [LDerivDecl GhcRn]
-> TcM (TcGblEnv, [InstInfo GhcRn], HsValBinds GhcRn)
tcInstDeclsDeriv :: [DerivInfo]
-> [LTyClDecl GhcRn]
-> [LDerivDecl GhcRn]
-> TcM (TcGblEnv, [InstInfo GhcRn], HsValBinds GhcRn)
tcInstDeclsDeriv datafam_deriv_infos :: [DerivInfo]
datafam_deriv_infos tyclds :: [LTyClDecl GhcRn]
tyclds derivds :: [LDerivDecl GhcRn]
derivds
= do ThStage
th_stage <- TcM ThStage
getStage
if ThStage -> Bool
isBrackStage ThStage
th_stage
then do { TcGblEnv
gbl_env <- TcM TcGblEnv
forall gbl lcl. TcRnIf gbl lcl gbl
getGblEnv
; (TcGblEnv, [InstInfo GhcRn], HsValBinds GhcRn)
-> TcM (TcGblEnv, [InstInfo GhcRn], HsValBinds GhcRn)
forall (m :: * -> *) a. Monad m => a -> m a
return (TcGblEnv
gbl_env, Bag (InstInfo GhcRn) -> [InstInfo GhcRn]
forall a. Bag a -> [a]
bagToList Bag (InstInfo GhcRn)
forall a. Bag a
emptyBag, HsValBinds GhcRn
forall (a :: Pass) (b :: Pass).
HsValBindsLR (GhcPass a) (GhcPass b)
emptyValBindsOut) }
else do { [DerivInfo]
data_deriv_infos <- [LTyClDecl GhcRn] -> TcM [DerivInfo]
mkDerivInfos [LTyClDecl GhcRn]
tyclds
; let deriv_infos :: [DerivInfo]
deriv_infos = [DerivInfo]
datafam_deriv_infos [DerivInfo] -> [DerivInfo] -> [DerivInfo]
forall a. [a] -> [a] -> [a]
++ [DerivInfo]
data_deriv_infos
; (tcg_env :: TcGblEnv
tcg_env, info_bag :: Bag (InstInfo GhcRn)
info_bag, valbinds :: HsValBinds GhcRn
valbinds) <- [DerivInfo]
-> [LDerivDecl GhcRn]
-> TcM (TcGblEnv, Bag (InstInfo GhcRn), HsValBinds GhcRn)
tcDeriving [DerivInfo]
deriv_infos [LDerivDecl GhcRn]
derivds
; (TcGblEnv, [InstInfo GhcRn], HsValBinds GhcRn)
-> TcM (TcGblEnv, [InstInfo GhcRn], HsValBinds GhcRn)
forall (m :: * -> *) a. Monad m => a -> m a
return (TcGblEnv
tcg_env, Bag (InstInfo GhcRn) -> [InstInfo GhcRn]
forall a. Bag a -> [a]
bagToList Bag (InstInfo GhcRn)
info_bag, HsValBinds GhcRn
valbinds) }
addClsInsts :: [InstInfo GhcRn] -> TcM a -> TcM a
addClsInsts :: [InstInfo GhcRn] -> TcM a -> TcM a
addClsInsts infos :: [InstInfo GhcRn]
infos thing_inside :: TcM a
thing_inside
= [ClsInst] -> TcM a -> TcM a
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 [InstInfo GhcRn]
infos) TcM a
thing_inside
addFamInsts :: [FamInst] -> TcM a -> TcM a
addFamInsts :: [FamInst] -> TcM a -> TcM a
addFamInsts fam_insts :: [FamInst]
fam_insts thing_inside :: TcM a
thing_inside
= [FamInst] -> TcM a -> TcM a
forall a. [FamInst] -> TcM a -> TcM a
tcExtendLocalFamInstEnv [FamInst]
fam_insts (TcM a -> TcM a) -> TcM a -> TcM a
forall a b. (a -> b) -> a -> b
$
[TyThing] -> TcM a -> TcM a
forall r. [TyThing] -> TcM r -> TcM r
tcExtendGlobalEnv [TyThing]
axioms (TcM a -> TcM a) -> TcM a -> TcM a
forall a b. (a -> b) -> a -> b
$
do { String -> SDoc -> TcRn ()
traceTc "addFamInsts" ([FamInst] -> SDoc
pprFamInsts [FamInst]
fam_insts)
; TcGblEnv
gbl_env <- [TyCon] -> TcM TcGblEnv
addTyConsToGblEnv [TyCon]
data_rep_tycons
; TcGblEnv -> TcM a -> TcM a
forall gbl lcl a. gbl -> TcRnIf gbl lcl a -> TcRnIf gbl lcl a
setGblEnv TcGblEnv
gbl_env TcM a
thing_inside }
where
axioms :: [TyThing]
axioms = (FamInst -> TyThing) -> [FamInst] -> [TyThing]
forall a b. (a -> b) -> [a] -> [b]
map (CoAxiom Branched -> TyThing
ACoAxiom (CoAxiom Branched -> TyThing)
-> (FamInst -> CoAxiom Branched) -> FamInst -> TyThing
forall b c a. (b -> c) -> (a -> b) -> a -> c
. CoAxiom Unbranched -> CoAxiom Branched
forall (br :: BranchFlag). CoAxiom br -> CoAxiom Branched
toBranchedAxiom (CoAxiom Unbranched -> CoAxiom Branched)
-> (FamInst -> CoAxiom Unbranched) -> FamInst -> CoAxiom Branched
forall b c a. (b -> c) -> (a -> b) -> a -> c
. FamInst -> CoAxiom Unbranched
famInstAxiom) [FamInst]
fam_insts
data_rep_tycons :: [TyCon]
data_rep_tycons = [FamInst] -> [TyCon]
famInstsRepTyCons [FamInst]
fam_insts
tcLocalInstDecl :: LInstDecl GhcRn
-> TcM ([InstInfo GhcRn], [FamInst], [DerivInfo])
tcLocalInstDecl :: LInstDecl GhcRn -> TcRn ([InstInfo GhcRn], [FamInst], [DerivInfo])
tcLocalInstDecl (L loc :: SrcSpan
loc (TyFamInstD { tfid_inst :: forall pass. InstDecl pass -> TyFamInstDecl pass
tfid_inst = TyFamInstDecl GhcRn
decl }))
= do { FamInst
fam_inst <- AssocInstInfo -> LTyFamInstDecl GhcRn -> TcM FamInst
tcTyFamInstDecl AssocInstInfo
NotAssociated (SrcSpan -> TyFamInstDecl GhcRn -> LTyFamInstDecl GhcRn
forall l e. l -> e -> GenLocated l e
L SrcSpan
loc TyFamInstDecl GhcRn
decl)
; ([InstInfo GhcRn], [FamInst], [DerivInfo])
-> TcRn ([InstInfo GhcRn], [FamInst], [DerivInfo])
forall (m :: * -> *) a. Monad m => a -> m a
return ([], [FamInst
fam_inst], []) }
tcLocalInstDecl (L loc :: SrcSpan
loc (DataFamInstD { dfid_inst :: forall pass. InstDecl pass -> DataFamInstDecl pass
dfid_inst = DataFamInstDecl GhcRn
decl }))
= do { (fam_inst :: FamInst
fam_inst, m_deriv_info :: Maybe DerivInfo
m_deriv_info) <- AssocInstInfo
-> LDataFamInstDecl GhcRn -> TcM (FamInst, Maybe DerivInfo)
tcDataFamInstDecl AssocInstInfo
NotAssociated (SrcSpan -> DataFamInstDecl GhcRn -> LDataFamInstDecl GhcRn
forall l e. l -> e -> GenLocated l e
L SrcSpan
loc DataFamInstDecl GhcRn
decl)
; ([InstInfo GhcRn], [FamInst], [DerivInfo])
-> TcRn ([InstInfo GhcRn], [FamInst], [DerivInfo])
forall (m :: * -> *) a. Monad m => a -> m a
return ([], [FamInst
fam_inst], Maybe DerivInfo -> [DerivInfo]
forall a. Maybe a -> [a]
maybeToList Maybe DerivInfo
m_deriv_info) }
tcLocalInstDecl (L loc :: SrcSpan
loc (ClsInstD { cid_inst :: forall pass. InstDecl pass -> ClsInstDecl pass
cid_inst = ClsInstDecl GhcRn
decl }))
= do { (insts :: [InstInfo GhcRn]
insts, fam_insts :: [FamInst]
fam_insts, deriv_infos :: [DerivInfo]
deriv_infos) <- LClsInstDecl GhcRn
-> TcRn ([InstInfo GhcRn], [FamInst], [DerivInfo])
tcClsInstDecl (SrcSpan -> ClsInstDecl GhcRn -> LClsInstDecl GhcRn
forall l e. l -> e -> GenLocated l e
L SrcSpan
loc ClsInstDecl GhcRn
decl)
; ([InstInfo GhcRn], [FamInst], [DerivInfo])
-> TcRn ([InstInfo GhcRn], [FamInst], [DerivInfo])
forall (m :: * -> *) a. Monad m => a -> m a
return ([InstInfo GhcRn]
insts, [FamInst]
fam_insts, [DerivInfo]
deriv_infos) }
tcLocalInstDecl (L _ (XInstDecl _)) = String -> TcRn ([InstInfo GhcRn], [FamInst], [DerivInfo])
forall a. String -> a
panic "tcLocalInstDecl"
tcClsInstDecl :: LClsInstDecl GhcRn
-> TcM ([InstInfo GhcRn], [FamInst], [DerivInfo])
tcClsInstDecl :: LClsInstDecl GhcRn
-> TcRn ([InstInfo GhcRn], [FamInst], [DerivInfo])
tcClsInstDecl (L loc :: SrcSpan
loc (ClsInstDecl { cid_poly_ty :: forall pass. ClsInstDecl pass -> LHsSigType pass
cid_poly_ty = LHsSigType GhcRn
hs_ty, cid_binds :: forall pass. ClsInstDecl pass -> LHsBinds pass
cid_binds = LHsBinds GhcRn
binds
, cid_sigs :: forall pass. ClsInstDecl pass -> [LSig pass]
cid_sigs = [LSig GhcRn]
uprags, cid_tyfam_insts :: forall pass. ClsInstDecl pass -> [LTyFamInstDecl pass]
cid_tyfam_insts = [LTyFamInstDecl GhcRn]
ats
, cid_overlap_mode :: forall pass. ClsInstDecl pass -> Maybe (Located OverlapMode)
cid_overlap_mode = Maybe (Located OverlapMode)
overlap_mode
, cid_datafam_insts :: forall pass. ClsInstDecl pass -> [LDataFamInstDecl pass]
cid_datafam_insts = [LDataFamInstDecl GhcRn]
adts }))
= SrcSpan
-> TcRn ([InstInfo GhcRn], [FamInst], [DerivInfo])
-> TcRn ([InstInfo GhcRn], [FamInst], [DerivInfo])
forall a. SrcSpan -> TcRn a -> TcRn a
setSrcSpan SrcSpan
loc (TcRn ([InstInfo GhcRn], [FamInst], [DerivInfo])
-> TcRn ([InstInfo GhcRn], [FamInst], [DerivInfo]))
-> TcRn ([InstInfo GhcRn], [FamInst], [DerivInfo])
-> TcRn ([InstInfo GhcRn], [FamInst], [DerivInfo])
forall a b. (a -> b) -> a -> b
$
SDoc
-> TcRn ([InstInfo GhcRn], [FamInst], [DerivInfo])
-> TcRn ([InstInfo GhcRn], [FamInst], [DerivInfo])
forall a. SDoc -> TcM a -> TcM a
addErrCtxt (LHsSigType GhcRn -> SDoc
instDeclCtxt1 LHsSigType GhcRn
hs_ty) (TcRn ([InstInfo GhcRn], [FamInst], [DerivInfo])
-> TcRn ([InstInfo GhcRn], [FamInst], [DerivInfo]))
-> TcRn ([InstInfo GhcRn], [FamInst], [DerivInfo])
-> TcRn ([InstInfo GhcRn], [FamInst], [DerivInfo])
forall a b. (a -> b) -> a -> b
$
do { String -> SDoc -> TcRn ()
traceTc "tcLocalInstDecl" (LHsSigType GhcRn -> SDoc
forall a. Outputable a => a -> SDoc
ppr LHsSigType GhcRn
hs_ty)
; Type
dfun_ty <- UserTypeCtxt -> LHsSigType GhcRn -> TcM Type
tcHsClsInstType (Bool -> UserTypeCtxt
InstDeclCtxt Bool
False) LHsSigType GhcRn
hs_ty
; let (tyvars :: [TyVar]
tyvars, theta :: [Type]
theta, clas :: Class
clas, inst_tys :: [Type]
inst_tys) = Type -> ([TyVar], [Type], Class, [Type])
tcSplitDFunTy Type
dfun_ty
; (subst :: TCvSubst
subst, skol_tvs :: [TyVar]
skol_tvs) <- [TyVar] -> TcM (TCvSubst, [TyVar])
tcInstSkolTyVars [TyVar]
tyvars
; let tv_skol_prs :: [(Name, TyVar)]
tv_skol_prs = [ (TyVar -> Name
tyVarName TyVar
tv, TyVar
skol_tv)
| (tv :: TyVar
tv, skol_tv :: TyVar
skol_tv) <- [TyVar]
tyvars [TyVar] -> [TyVar] -> [(TyVar, TyVar)]
forall a b. [a] -> [b] -> [(a, b)]
`zip` [TyVar]
skol_tvs ]
n_inferred :: Int
n_inferred = (VarBndr TyVar ArgFlag -> Bool) -> [VarBndr TyVar ArgFlag] -> Int
forall a. (a -> Bool) -> [a] -> Int
countWhile ((ArgFlag -> ArgFlag -> Bool
forall a. Eq a => a -> a -> Bool
== ArgFlag
Inferred) (ArgFlag -> Bool)
-> (VarBndr TyVar ArgFlag -> ArgFlag)
-> VarBndr TyVar ArgFlag
-> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. VarBndr TyVar ArgFlag -> ArgFlag
forall tv argf. VarBndr tv argf -> argf
binderArgFlag) ([VarBndr TyVar ArgFlag] -> Int) -> [VarBndr TyVar ArgFlag] -> Int
forall a b. (a -> b) -> a -> b
$
([VarBndr TyVar ArgFlag], Type) -> [VarBndr TyVar ArgFlag]
forall a b. (a, b) -> a
fst (([VarBndr TyVar ArgFlag], Type) -> [VarBndr TyVar ArgFlag])
-> ([VarBndr TyVar ArgFlag], Type) -> [VarBndr TyVar ArgFlag]
forall a b. (a -> b) -> a -> b
$ Type -> ([VarBndr TyVar ArgFlag], Type)
splitForAllVarBndrs Type
dfun_ty
visible_skol_tvs :: [TyVar]
visible_skol_tvs = Int -> [TyVar] -> [TyVar]
forall a. Int -> [a] -> [a]
drop Int
n_inferred [TyVar]
skol_tvs
; String -> SDoc -> TcRn ()
traceTc "tcLocalInstDecl 1" (Type -> SDoc
forall a. Outputable a => a -> SDoc
ppr Type
dfun_ty SDoc -> SDoc -> SDoc
$$ Int -> SDoc
forall a. Outputable a => a -> SDoc
ppr (Type -> Int
invisibleTyBndrCount Type
dfun_ty) SDoc -> SDoc -> SDoc
$$ [TyVar] -> SDoc
forall a. Outputable a => a -> SDoc
ppr [TyVar]
skol_tvs)
; (datafam_stuff :: [(FamInst, Maybe DerivInfo)]
datafam_stuff, tyfam_insts :: [FamInst]
tyfam_insts)
<- [(Name, TyVar)]
-> TcM ([(FamInst, Maybe DerivInfo)], [FamInst])
-> TcM ([(FamInst, Maybe DerivInfo)], [FamInst])
forall r. [(Name, TyVar)] -> TcM r -> TcM r
tcExtendNameTyVarEnv [(Name, TyVar)]
tv_skol_prs (TcM ([(FamInst, Maybe DerivInfo)], [FamInst])
-> TcM ([(FamInst, Maybe DerivInfo)], [FamInst]))
-> TcM ([(FamInst, Maybe DerivInfo)], [FamInst])
-> TcM ([(FamInst, Maybe DerivInfo)], [FamInst])
forall a b. (a -> b) -> a -> b
$
do { let mini_env :: VarEnv Type
mini_env = [(TyVar, Type)] -> VarEnv Type
forall a. [(TyVar, a)] -> VarEnv a
mkVarEnv (Class -> [TyVar]
classTyVars Class
clas [TyVar] -> [Type] -> [(TyVar, Type)]
forall a b. [a] -> [b] -> [(a, b)]
`zip` HasCallStack => TCvSubst -> [Type] -> [Type]
TCvSubst -> [Type] -> [Type]
substTys TCvSubst
subst [Type]
inst_tys)
mini_subst :: TCvSubst
mini_subst = InScopeSet -> VarEnv Type -> TCvSubst
mkTvSubst (VarSet -> InScopeSet
mkInScopeSet ([TyVar] -> VarSet
mkVarSet [TyVar]
skol_tvs)) VarEnv Type
mini_env
mb_info :: AssocInstInfo
mb_info = InClsInst :: Class -> [TyVar] -> VarEnv Type -> AssocInstInfo
InClsInst { ai_class :: Class
ai_class = Class
clas
, ai_tyvars :: [TyVar]
ai_tyvars = [TyVar]
visible_skol_tvs
, ai_inst_env :: VarEnv Type
ai_inst_env = VarEnv Type
mini_env }
; [(FamInst, Maybe DerivInfo)]
df_stuff <- (LDataFamInstDecl GhcRn -> TcM (FamInst, Maybe DerivInfo))
-> [LDataFamInstDecl GhcRn] -> TcRn [(FamInst, Maybe DerivInfo)]
forall a b. (a -> TcRn b) -> [a] -> TcRn [b]
mapAndRecoverM (AssocInstInfo
-> LDataFamInstDecl GhcRn -> TcM (FamInst, Maybe DerivInfo)
tcDataFamInstDecl AssocInstInfo
mb_info) [LDataFamInstDecl GhcRn]
adts
; [FamInst]
tf_insts1 <- (LTyFamInstDecl GhcRn -> TcM FamInst)
-> [LTyFamInstDecl GhcRn] -> TcRn [FamInst]
forall a b. (a -> TcRn b) -> [a] -> TcRn [b]
mapAndRecoverM (AssocInstInfo -> LTyFamInstDecl GhcRn -> TcM FamInst
tcTyFamInstDecl AssocInstInfo
mb_info) [LTyFamInstDecl GhcRn]
ats
; [[FamInst]]
tf_insts2 <- (ClassATItem -> TcRn [FamInst])
-> [ClassATItem] -> IOEnv (Env TcGblEnv TcLclEnv) [[FamInst]]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM (SrcSpan -> TCvSubst -> NameSet -> ClassATItem -> TcRn [FamInst]
tcATDefault SrcSpan
loc TCvSubst
mini_subst NameSet
defined_ats)
(Class -> [ClassATItem]
classATItems Class
clas)
; ([(FamInst, Maybe DerivInfo)], [FamInst])
-> TcM ([(FamInst, Maybe DerivInfo)], [FamInst])
forall (m :: * -> *) a. Monad m => a -> m a
return ([(FamInst, Maybe DerivInfo)]
df_stuff, [FamInst]
tf_insts1 [FamInst] -> [FamInst] -> [FamInst]
forall a. [a] -> [a] -> [a]
++ [[FamInst]] -> [FamInst]
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat [[FamInst]]
tf_insts2) }
; Name
dfun_name <- Class -> [Type] -> SrcSpan -> TcM Name
newDFunName Class
clas [Type]
inst_tys (LHsType GhcRn -> SrcSpan
forall a. HasSrcSpan a => a -> SrcSpan
getLoc (LHsSigType GhcRn -> LHsType GhcRn
forall pass. LHsSigType pass -> LHsType pass
hsSigType LHsSigType GhcRn
hs_ty))
; ClsInst
ispec <- Maybe OverlapMode
-> Name -> [TyVar] -> [Type] -> Class -> [Type] -> TcM ClsInst
newClsInst ((Located OverlapMode -> OverlapMode)
-> Maybe (Located OverlapMode) -> Maybe OverlapMode
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Located OverlapMode -> OverlapMode
forall a. HasSrcSpan a => a -> SrcSpanLess a
unLoc Maybe (Located OverlapMode)
overlap_mode) Name
dfun_name
[TyVar]
tyvars [Type]
theta Class
clas [Type]
inst_tys
; let inst_binds :: InstBindings GhcRn
inst_binds = InstBindings :: forall a.
[Name]
-> LHsBinds a -> [LSig a] -> [Extension] -> Bool -> InstBindings a
InstBindings
{ ib_binds :: LHsBinds GhcRn
ib_binds = LHsBinds GhcRn
binds
, ib_tyvars :: [Name]
ib_tyvars = (TyVar -> Name) -> [TyVar] -> [Name]
forall a b. (a -> b) -> [a] -> [b]
map TyVar -> Name
Var.varName [TyVar]
tyvars
, ib_pragmas :: [LSig GhcRn]
ib_pragmas = [LSig GhcRn]
uprags
, ib_extensions :: [Extension]
ib_extensions = []
, ib_derived :: Bool
ib_derived = Bool
False }
inst_info :: InstInfo GhcRn
inst_info = InstInfo :: forall a. ClsInst -> InstBindings a -> InstInfo a
InstInfo { iSpec :: ClsInst
iSpec = ClsInst
ispec, iBinds :: InstBindings GhcRn
iBinds = InstBindings GhcRn
inst_binds }
(datafam_insts :: [FamInst]
datafam_insts, m_deriv_infos :: [Maybe DerivInfo]
m_deriv_infos) = [(FamInst, Maybe DerivInfo)] -> ([FamInst], [Maybe DerivInfo])
forall a b. [(a, b)] -> ([a], [b])
unzip [(FamInst, Maybe DerivInfo)]
datafam_stuff
deriv_infos :: [DerivInfo]
deriv_infos = [Maybe DerivInfo] -> [DerivInfo]
forall a. [Maybe a] -> [a]
catMaybes [Maybe DerivInfo]
m_deriv_infos
all_insts :: [FamInst]
all_insts = [FamInst]
tyfam_insts [FamInst] -> [FamInst] -> [FamInst]
forall a. [a] -> [a] -> [a]
++ [FamInst]
datafam_insts
; Bool
is_boot <- TcRn Bool
tcIsHsBootOrSig
; let no_binds :: Bool
no_binds = LHsBinds GhcRn -> Bool
forall idL idR. LHsBindsLR idL idR -> Bool
isEmptyLHsBinds LHsBinds GhcRn
binds Bool -> Bool -> Bool
&& [LSig GhcRn] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [LSig GhcRn]
uprags
; Bool -> SDoc -> TcRn ()
failIfTc (Bool
is_boot Bool -> Bool -> Bool
&& Bool -> Bool
not Bool
no_binds) SDoc
badBootDeclErr
; ([InstInfo GhcRn], [FamInst], [DerivInfo])
-> TcRn ([InstInfo GhcRn], [FamInst], [DerivInfo])
forall (m :: * -> *) a. Monad m => a -> m a
return ( [InstInfo GhcRn
inst_info], [FamInst]
all_insts, [DerivInfo]
deriv_infos ) }
where
defined_ats :: NameSet
defined_ats = [Name] -> NameSet
mkNameSet ((LTyFamInstDecl GhcRn -> Name) -> [LTyFamInstDecl GhcRn] -> [Name]
forall a b. (a -> b) -> [a] -> [b]
map (TyFamInstDecl GhcRn -> Name
forall pass. TyFamInstDecl pass -> IdP pass
tyFamInstDeclName (TyFamInstDecl GhcRn -> Name)
-> (LTyFamInstDecl GhcRn -> TyFamInstDecl GhcRn)
-> LTyFamInstDecl GhcRn
-> Name
forall b c a. (b -> c) -> (a -> b) -> a -> c
. LTyFamInstDecl GhcRn -> TyFamInstDecl GhcRn
forall a. HasSrcSpan a => a -> SrcSpanLess a
unLoc) [LTyFamInstDecl GhcRn]
ats)
NameSet -> NameSet -> NameSet
`unionNameSet`
[Name] -> NameSet
mkNameSet ((LDataFamInstDecl GhcRn -> Name)
-> [LDataFamInstDecl GhcRn] -> [Name]
forall a b. (a -> b) -> [a] -> [b]
map (Located Name -> Name
forall a. HasSrcSpan a => a -> SrcSpanLess a
unLoc (Located Name -> Name)
-> (LDataFamInstDecl GhcRn -> Located Name)
-> LDataFamInstDecl GhcRn
-> Name
forall b c a. (b -> c) -> (a -> b) -> a -> c
. FamEqn GhcRn (HsTyPats GhcRn) (HsDataDefn GhcRn) -> Located Name
forall pass pats rhs. FamEqn pass pats rhs -> Located (IdP pass)
feqn_tycon
(FamEqn GhcRn (HsTyPats GhcRn) (HsDataDefn GhcRn) -> Located Name)
-> (LDataFamInstDecl GhcRn
-> FamEqn GhcRn (HsTyPats GhcRn) (HsDataDefn GhcRn))
-> LDataFamInstDecl GhcRn
-> Located Name
forall b c a. (b -> c) -> (a -> b) -> a -> c
. HsImplicitBndrs
GhcRn (FamEqn GhcRn (HsTyPats GhcRn) (HsDataDefn GhcRn))
-> FamEqn GhcRn (HsTyPats GhcRn) (HsDataDefn GhcRn)
forall pass thing. HsImplicitBndrs pass thing -> thing
hsib_body
(HsImplicitBndrs
GhcRn (FamEqn GhcRn (HsTyPats GhcRn) (HsDataDefn GhcRn))
-> FamEqn GhcRn (HsTyPats GhcRn) (HsDataDefn GhcRn))
-> (LDataFamInstDecl GhcRn
-> HsImplicitBndrs
GhcRn (FamEqn GhcRn (HsTyPats GhcRn) (HsDataDefn GhcRn)))
-> LDataFamInstDecl GhcRn
-> FamEqn GhcRn (HsTyPats GhcRn) (HsDataDefn GhcRn)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. DataFamInstDecl GhcRn
-> HsImplicitBndrs
GhcRn (FamEqn GhcRn (HsTyPats GhcRn) (HsDataDefn GhcRn))
forall pass.
DataFamInstDecl pass -> FamInstEqn pass (HsDataDefn pass)
dfid_eqn
(DataFamInstDecl GhcRn
-> HsImplicitBndrs
GhcRn (FamEqn GhcRn (HsTyPats GhcRn) (HsDataDefn GhcRn)))
-> (LDataFamInstDecl GhcRn -> DataFamInstDecl GhcRn)
-> LDataFamInstDecl GhcRn
-> HsImplicitBndrs
GhcRn (FamEqn GhcRn (HsTyPats GhcRn) (HsDataDefn GhcRn))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. LDataFamInstDecl GhcRn -> DataFamInstDecl GhcRn
forall a. HasSrcSpan a => a -> SrcSpanLess a
unLoc) [LDataFamInstDecl GhcRn]
adts)
tcClsInstDecl (L _ (XClsInstDecl _)) = String -> TcRn ([InstInfo GhcRn], [FamInst], [DerivInfo])
forall a. String -> a
panic "tcClsInstDecl"
tcTyFamInstDecl :: AssocInstInfo
-> LTyFamInstDecl GhcRn -> TcM FamInst
tcTyFamInstDecl :: AssocInstInfo -> LTyFamInstDecl GhcRn -> TcM FamInst
tcTyFamInstDecl mb_clsinfo :: AssocInstInfo
mb_clsinfo (L loc :: SrcSpan
loc decl :: TyFamInstDecl GhcRn
decl@(TyFamInstDecl { tfid_eqn :: forall pass. TyFamInstDecl pass -> TyFamInstEqn pass
tfid_eqn = TyFamInstEqn GhcRn
eqn }))
= SrcSpan -> TcM FamInst -> TcM FamInst
forall a. SrcSpan -> TcRn a -> TcRn a
setSrcSpan SrcSpan
loc (TcM FamInst -> TcM FamInst) -> TcM FamInst -> TcM FamInst
forall a b. (a -> b) -> a -> b
$
TyFamInstDecl GhcRn -> TcM FamInst -> TcM FamInst
forall a. TyFamInstDecl GhcRn -> TcM a -> TcM a
tcAddTyFamInstCtxt TyFamInstDecl GhcRn
decl (TcM FamInst -> TcM FamInst) -> TcM FamInst -> TcM FamInst
forall a b. (a -> b) -> a -> b
$
do { let fam_lname :: Located (IdP GhcRn)
fam_lname = FamEqn GhcRn (HsTyPats GhcRn) (LHsType GhcRn)
-> Located (IdP GhcRn)
forall pass pats rhs. FamEqn pass pats rhs -> Located (IdP pass)
feqn_tycon (TyFamInstEqn GhcRn -> FamEqn GhcRn (HsTyPats GhcRn) (LHsType GhcRn)
forall pass thing. HsImplicitBndrs pass thing -> thing
hsib_body TyFamInstEqn GhcRn
eqn)
; TyCon
fam_tc <- Located Name -> TcM TyCon
tcLookupLocatedTyCon Located Name
Located (IdP GhcRn)
fam_lname
; AssocInstInfo -> TyCon -> TcRn ()
tcFamInstDeclChecks AssocInstInfo
mb_clsinfo TyCon
fam_tc
; Bool -> SDoc -> TcRn ()
checkTc (TyCon -> Bool
isTypeFamilyTyCon TyCon
fam_tc) (TyCon -> SDoc
wrongKindOfFamily TyCon
fam_tc)
; Bool -> SDoc -> TcRn ()
checkTc (TyCon -> Bool
isOpenTypeFamilyTyCon TyCon
fam_tc) (TyCon -> SDoc
notOpenFamily TyCon
fam_tc)
; KnotTied CoAxBranch
co_ax_branch <- TyCon
-> AssocInstInfo
-> LTyFamInstEqn GhcRn
-> TcM (KnotTied CoAxBranch)
tcTyFamInstEqn TyCon
fam_tc AssocInstInfo
mb_clsinfo
(SrcSpan -> TyFamInstEqn GhcRn -> LTyFamInstEqn GhcRn
forall l e. l -> e -> GenLocated l e
L (Located Name -> SrcSpan
forall a. HasSrcSpan a => a -> SrcSpan
getLoc Located Name
Located (IdP GhcRn)
fam_lname) TyFamInstEqn GhcRn
eqn)
; AssocInstInfo -> TyCon -> KnotTied CoAxBranch -> TcRn ()
checkConsistentFamInst AssocInstInfo
mb_clsinfo TyCon
fam_tc KnotTied CoAxBranch
co_ax_branch
; TyCon -> KnotTied CoAxBranch -> TcRn ()
checkValidCoAxBranch TyCon
fam_tc KnotTied CoAxBranch
co_ax_branch
; Name
rep_tc_name <- Located Name -> [[Type]] -> TcM Name
newFamInstAxiomName Located Name
Located (IdP GhcRn)
fam_lname [KnotTied CoAxBranch -> [Type]
coAxBranchLHS KnotTied CoAxBranch
co_ax_branch]
; let axiom :: CoAxiom Unbranched
axiom = Name -> TyCon -> KnotTied CoAxBranch -> CoAxiom Unbranched
mkUnbranchedCoAxiom Name
rep_tc_name TyCon
fam_tc KnotTied CoAxBranch
co_ax_branch
; FamFlavor -> CoAxiom Unbranched -> TcM FamInst
newFamInst FamFlavor
SynFamilyInst CoAxiom Unbranched
axiom }
tcFamInstDeclChecks :: AssocInstInfo -> TyCon -> TcM ()
tcFamInstDeclChecks :: AssocInstInfo -> TyCon -> TcRn ()
tcFamInstDeclChecks mb_clsinfo :: AssocInstInfo
mb_clsinfo fam_tc :: TyCon
fam_tc
= do {
; String -> SDoc -> TcRn ()
traceTc "tcFamInstDecl" (TyCon -> SDoc
forall a. Outputable a => a -> SDoc
ppr TyCon
fam_tc)
; Bool
type_families <- Extension -> TcRn Bool
forall gbl lcl. Extension -> TcRnIf gbl lcl Bool
xoptM Extension
LangExt.TypeFamilies
; Bool
is_boot <- TcRn Bool
tcIsHsBootOrSig
; Bool -> SDoc -> TcRn ()
checkTc Bool
type_families (SDoc -> TcRn ()) -> SDoc -> TcRn ()
forall a b. (a -> b) -> a -> b
$ TyCon -> SDoc
badFamInstDecl TyCon
fam_tc
; Bool -> SDoc -> TcRn ()
checkTc (Bool -> Bool
not Bool
is_boot) (SDoc -> TcRn ()) -> SDoc -> TcRn ()
forall a b. (a -> b) -> a -> b
$ SDoc
badBootFamInstDeclErr
; Bool -> SDoc -> TcRn ()
checkTc (TyCon -> Bool
isFamilyTyCon TyCon
fam_tc) (TyCon -> SDoc
notFamily TyCon
fam_tc)
; Bool -> TcRn () -> TcRn ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (AssocInstInfo -> Bool
isNotAssociated AssocInstInfo
mb_clsinfo Bool -> Bool -> Bool
&&
TyCon -> Bool
isTyConAssoc TyCon
fam_tc)
(SDoc -> TcRn ()
addErr (SDoc -> TcRn ()) -> SDoc -> TcRn ()
forall a b. (a -> b) -> a -> b
$ TyCon -> SDoc
assocInClassErr TyCon
fam_tc)
}
tcDataFamInstDecl :: AssocInstInfo
-> LDataFamInstDecl GhcRn -> TcM (FamInst, Maybe DerivInfo)
tcDataFamInstDecl :: AssocInstInfo
-> LDataFamInstDecl GhcRn -> TcM (FamInst, Maybe DerivInfo)
tcDataFamInstDecl mb_clsinfo :: AssocInstInfo
mb_clsinfo
(L loc :: SrcSpan
loc decl :: DataFamInstDecl GhcRn
decl@(DataFamInstDecl { dfid_eqn :: forall pass.
DataFamInstDecl pass -> FamInstEqn pass (HsDataDefn pass)
dfid_eqn = HsIB { hsib_ext :: forall pass thing. HsImplicitBndrs pass thing -> XHsIB pass thing
hsib_ext = XHsIB GhcRn (FamEqn GhcRn (HsTyPats GhcRn) (HsDataDefn GhcRn))
imp_vars
, hsib_body :: forall pass thing. HsImplicitBndrs pass thing -> thing
hsib_body =
FamEqn { feqn_bndrs :: forall pass pats rhs.
FamEqn pass pats rhs -> Maybe [LHsTyVarBndr pass]
feqn_bndrs = Maybe [LHsTyVarBndr GhcRn]
mb_bndrs
, feqn_pats :: forall pass pats rhs. FamEqn pass pats rhs -> pats
feqn_pats = HsTyPats GhcRn
hs_pats
, feqn_tycon :: forall pass pats rhs. FamEqn pass pats rhs -> Located (IdP pass)
feqn_tycon = lfam_name :: Located (IdP GhcRn)
lfam_name@(L _ fam_name :: IdP GhcRn
fam_name)
, feqn_fixity :: forall pass pats rhs. FamEqn pass pats rhs -> LexicalFixity
feqn_fixity = LexicalFixity
fixity
, feqn_rhs :: forall pass pats rhs. FamEqn pass pats rhs -> rhs
feqn_rhs = HsDataDefn { dd_ND :: forall pass. HsDataDefn pass -> NewOrData
dd_ND = NewOrData
new_or_data
, dd_cType :: forall pass. HsDataDefn pass -> Maybe (Located CType)
dd_cType = Maybe (Located CType)
cType
, dd_ctxt :: forall pass. HsDataDefn pass -> LHsContext pass
dd_ctxt = LHsContext GhcRn
hs_ctxt
, dd_cons :: forall pass. HsDataDefn pass -> [LConDecl pass]
dd_cons = [LConDecl GhcRn]
hs_cons
, dd_kindSig :: forall pass. HsDataDefn pass -> Maybe (LHsKind pass)
dd_kindSig = Maybe (LHsType GhcRn)
m_ksig
, dd_derivs :: forall pass. HsDataDefn pass -> HsDeriving pass
dd_derivs = HsDeriving GhcRn
derivs } }}}))
= SrcSpan
-> TcM (FamInst, Maybe DerivInfo) -> TcM (FamInst, Maybe DerivInfo)
forall a. SrcSpan -> TcRn a -> TcRn a
setSrcSpan SrcSpan
loc (TcM (FamInst, Maybe DerivInfo) -> TcM (FamInst, Maybe DerivInfo))
-> TcM (FamInst, Maybe DerivInfo) -> TcM (FamInst, Maybe DerivInfo)
forall a b. (a -> b) -> a -> b
$
DataFamInstDecl GhcRn
-> TcM (FamInst, Maybe DerivInfo) -> TcM (FamInst, Maybe DerivInfo)
forall a. DataFamInstDecl GhcRn -> TcM a -> TcM a
tcAddDataFamInstCtxt DataFamInstDecl GhcRn
decl (TcM (FamInst, Maybe DerivInfo) -> TcM (FamInst, Maybe DerivInfo))
-> TcM (FamInst, Maybe DerivInfo) -> TcM (FamInst, Maybe DerivInfo)
forall a b. (a -> b) -> a -> b
$
do { TyCon
fam_tc <- Located Name -> TcM TyCon
tcLookupLocatedTyCon Located Name
Located (IdP GhcRn)
lfam_name
; AssocInstInfo -> TyCon -> TcRn ()
tcFamInstDeclChecks AssocInstInfo
mb_clsinfo TyCon
fam_tc
; Bool -> SDoc -> TcRn ()
checkTc (TyCon -> Bool
isDataFamilyTyCon TyCon
fam_tc) (TyCon -> SDoc
wrongKindOfFamily TyCon
fam_tc)
; Bool
gadt_syntax <- Name
-> NewOrData -> LHsContext GhcRn -> [LConDecl GhcRn] -> TcRn Bool
dataDeclChecks Name
IdP GhcRn
fam_name NewOrData
new_or_data LHsContext GhcRn
hs_ctxt [LConDecl GhcRn]
hs_cons
; (qtvs :: [TyVar]
qtvs, pats :: [Type]
pats, res_kind :: Type
res_kind, stupid_theta :: [Type]
stupid_theta)
<- AssocInstInfo
-> TyCon
-> [Name]
-> Maybe [LHsTyVarBndr GhcRn]
-> LexicalFixity
-> LHsContext GhcRn
-> HsTyPats GhcRn
-> Maybe (LHsType GhcRn)
-> [LConDecl GhcRn]
-> TcM ([TyVar], [Type], Type, [Type])
tcDataFamHeader AssocInstInfo
mb_clsinfo TyCon
fam_tc [Name]
XHsIB GhcRn (FamEqn GhcRn (HsTyPats GhcRn) (HsDataDefn GhcRn))
imp_vars Maybe [LHsTyVarBndr GhcRn]
mb_bndrs
LexicalFixity
fixity LHsContext GhcRn
hs_ctxt HsTyPats GhcRn
hs_pats Maybe (LHsType GhcRn)
m_ksig [LConDecl GhcRn]
hs_cons
; let (eta_pats :: [Type]
eta_pats, eta_tcbs :: [TyConBinder]
eta_tcbs) = TyCon -> [Type] -> ([Type], [TyConBinder])
eta_reduce TyCon
fam_tc [Type]
pats
eta_tvs :: [TyVar]
eta_tvs = (TyConBinder -> TyVar) -> [TyConBinder] -> [TyVar]
forall a b. (a -> b) -> [a] -> [b]
map TyConBinder -> TyVar
forall tv argf. VarBndr tv argf -> tv
binderVar [TyConBinder]
eta_tcbs
post_eta_qtvs :: [TyVar]
post_eta_qtvs = (TyVar -> Bool) -> [TyVar] -> [TyVar]
forall a. (a -> Bool) -> [a] -> [a]
filterOut (TyVar -> [TyVar] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [TyVar]
eta_tvs) [TyVar]
qtvs
full_tcbs :: [TyConBinder]
full_tcbs = [TyVar] -> VarSet -> [TyConBinder]
mkTyConBindersPreferAnon [TyVar]
post_eta_qtvs
(Type -> VarSet
tyCoVarsOfType ([TyVar] -> Type -> Type
mkSpecForAllTys [TyVar]
eta_tvs Type
res_kind))
[TyConBinder] -> [TyConBinder] -> [TyConBinder]
forall a. [a] -> [a] -> [a]
++ [TyConBinder]
eta_tcbs
; (extra_tcbs :: [TyConBinder]
extra_tcbs, final_res_kind :: Type
final_res_kind) <- [TyConBinder] -> Type -> TcM ([TyConBinder], Type)
etaExpandAlgTyCon [TyConBinder]
full_tcbs Type
res_kind
; Bool -> SDoc -> TcRn ()
checkTc (Type -> Bool
tcIsLiftedTypeKind Type
final_res_kind) (Bool -> Type -> SDoc
badKindSig Bool
True Type
res_kind)
; let extra_pats :: [Type]
extra_pats = (TyConBinder -> Type) -> [TyConBinder] -> [Type]
forall a b. (a -> b) -> [a] -> [b]
map (TyVar -> Type
mkTyVarTy (TyVar -> Type) -> (TyConBinder -> TyVar) -> TyConBinder -> Type
forall b c a. (b -> c) -> (a -> b) -> a -> c
. TyConBinder -> TyVar
forall tv argf. VarBndr tv argf -> tv
binderVar) [TyConBinder]
extra_tcbs
all_pats :: [Type]
all_pats = [Type]
pats [Type] -> [Type] -> [Type]
forall a. [a] -> [a] -> [a]
`chkAppend` [Type]
extra_pats
orig_res_ty :: Type
orig_res_ty = TyCon -> [Type] -> Type
mkTyConApp TyCon
fam_tc [Type]
all_pats
ty_binders :: [TyConBinder]
ty_binders = [TyConBinder]
full_tcbs [TyConBinder] -> [TyConBinder] -> [TyConBinder]
forall a. [a] -> [a] -> [a]
`chkAppend` [TyConBinder]
extra_tcbs
; String -> SDoc -> TcRn ()
traceTc "tcDataFamInstDecl" (SDoc -> TcRn ()) -> SDoc -> TcRn ()
forall a b. (a -> b) -> a -> b
$
[SDoc] -> SDoc
vcat [ String -> SDoc
text "Fam tycon:" SDoc -> SDoc -> SDoc
<+> TyCon -> SDoc
forall a. Outputable a => a -> SDoc
ppr TyCon
fam_tc
, String -> SDoc
text "Pats:" SDoc -> SDoc -> SDoc
<+> [Type] -> SDoc
forall a. Outputable a => a -> SDoc
ppr [Type]
pats
, String -> SDoc
text "visibliities:" SDoc -> SDoc -> SDoc
<+> [TyConBndrVis] -> SDoc
forall a. Outputable a => a -> SDoc
ppr (TyCon -> [Type] -> [TyConBndrVis]
tcbVisibilities TyCon
fam_tc [Type]
pats)
, String -> SDoc
text "all_pats:" SDoc -> SDoc -> SDoc
<+> [Type] -> SDoc
forall a. Outputable a => a -> SDoc
ppr [Type]
all_pats
, String -> SDoc
text "ty_binders" SDoc -> SDoc -> SDoc
<+> [TyConBinder] -> SDoc
forall a. Outputable a => a -> SDoc
ppr [TyConBinder]
ty_binders
, String -> SDoc
text "fam_tc_binders:" SDoc -> SDoc -> SDoc
<+> [TyConBinder] -> SDoc
forall a. Outputable a => a -> SDoc
ppr (TyCon -> [TyConBinder]
tyConBinders TyCon
fam_tc)
, String -> SDoc
text "eta_pats" SDoc -> SDoc -> SDoc
<+> [Type] -> SDoc
forall a. Outputable a => a -> SDoc
ppr [Type]
eta_pats
, String -> SDoc
text "eta_tcbs" SDoc -> SDoc -> SDoc
<+> [TyConBinder] -> SDoc
forall a. Outputable a => a -> SDoc
ppr [TyConBinder]
eta_tcbs ]
; (rep_tc :: TyCon
rep_tc, axiom :: CoAxiom Unbranched
axiom) <- ((TyCon, CoAxiom Unbranched)
-> IOEnv (Env TcGblEnv TcLclEnv) (TyCon, CoAxiom Unbranched))
-> IOEnv (Env TcGblEnv TcLclEnv) (TyCon, CoAxiom Unbranched)
forall a env. (a -> IOEnv env a) -> IOEnv env a
fixM (((TyCon, CoAxiom Unbranched)
-> IOEnv (Env TcGblEnv TcLclEnv) (TyCon, CoAxiom Unbranched))
-> IOEnv (Env TcGblEnv TcLclEnv) (TyCon, CoAxiom Unbranched))
-> ((TyCon, CoAxiom Unbranched)
-> IOEnv (Env TcGblEnv TcLclEnv) (TyCon, CoAxiom Unbranched))
-> IOEnv (Env TcGblEnv TcLclEnv) (TyCon, CoAxiom Unbranched)
forall a b. (a -> b) -> a -> b
$ \ ~(rec_rep_tc :: TyCon
rec_rep_tc, _) ->
do { [DataCon]
data_cons <- [TyVar] -> TcM [DataCon] -> TcM [DataCon]
forall r. [TyVar] -> TcM r -> TcM r
tcExtendTyVarEnv [TyVar]
qtvs (TcM [DataCon] -> TcM [DataCon]) -> TcM [DataCon] -> TcM [DataCon]
forall a b. (a -> b) -> a -> b
$
TyCon -> [TyConBinder] -> Type -> [LConDecl GhcRn] -> TcM [DataCon]
tcConDecls TyCon
rec_rep_tc [TyConBinder]
ty_binders Type
orig_res_ty [LConDecl GhcRn]
hs_cons
; Name
rep_tc_name <- Located Name -> [Type] -> TcM Name
newFamInstTyConName Located Name
Located (IdP GhcRn)
lfam_name [Type]
pats
; Name
axiom_name <- Located Name -> [[Type]] -> TcM Name
newFamInstAxiomName Located Name
Located (IdP GhcRn)
lfam_name [[Type]
pats]
; AlgTyConRhs
tc_rhs <- case NewOrData
new_or_data of
DataType -> AlgTyConRhs -> IOEnv (Env TcGblEnv TcLclEnv) AlgTyConRhs
forall (m :: * -> *) a. Monad m => a -> m a
return ([DataCon] -> AlgTyConRhs
mkDataTyConRhs [DataCon]
data_cons)
NewType -> ASSERT( not (null data_cons) )
Name
-> TyCon -> DataCon -> IOEnv (Env TcGblEnv TcLclEnv) AlgTyConRhs
forall m n. Name -> TyCon -> DataCon -> TcRnIf m n AlgTyConRhs
mkNewTyConRhs Name
rep_tc_name TyCon
rec_rep_tc ([DataCon] -> DataCon
forall a. [a] -> a
head [DataCon]
data_cons)
; let axiom :: CoAxiom Unbranched
axiom = Role
-> Name
-> [TyVar]
-> [TyVar]
-> [TyVar]
-> TyCon
-> [Type]
-> Type
-> CoAxiom Unbranched
mkSingleCoAxiom Role
Representational Name
axiom_name
[TyVar]
post_eta_qtvs [TyVar]
eta_tvs [] TyCon
fam_tc [Type]
eta_pats
(TyCon -> [Type] -> Type
mkTyConApp TyCon
rep_tc ([TyVar] -> [Type]
mkTyVarTys [TyVar]
post_eta_qtvs))
parent :: AlgTyConFlav
parent = CoAxiom Unbranched -> TyCon -> [Type] -> AlgTyConFlav
DataFamInstTyCon CoAxiom Unbranched
axiom TyCon
fam_tc [Type]
all_pats
rep_tc :: TyCon
rep_tc = Name
-> [TyConBinder]
-> Type
-> [Role]
-> Maybe CType
-> [Type]
-> AlgTyConRhs
-> AlgTyConFlav
-> Bool
-> TyCon
mkAlgTyCon Name
rep_tc_name
[TyConBinder]
ty_binders Type
liftedTypeKind
((TyConBinder -> Role) -> [TyConBinder] -> [Role]
forall a b. (a -> b) -> [a] -> [b]
map (Role -> TyConBinder -> Role
forall a b. a -> b -> a
const Role
Nominal) [TyConBinder]
ty_binders)
((Located CType -> CType) -> Maybe (Located CType) -> Maybe CType
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Located CType -> CType
forall a. HasSrcSpan a => a -> SrcSpanLess a
unLoc Maybe (Located CType)
cType) [Type]
stupid_theta
AlgTyConRhs
tc_rhs AlgTyConFlav
parent
Bool
gadt_syntax
; (TyCon, CoAxiom Unbranched)
-> IOEnv (Env TcGblEnv TcLclEnv) (TyCon, CoAxiom Unbranched)
forall (m :: * -> *) a. Monad m => a -> m a
return (TyCon
rep_tc, CoAxiom Unbranched
axiom) }
; let ax_branch :: KnotTied CoAxBranch
ax_branch = CoAxiom Unbranched -> KnotTied CoAxBranch
coAxiomSingleBranch CoAxiom Unbranched
axiom
; AssocInstInfo -> TyCon -> KnotTied CoAxBranch -> TcRn ()
checkConsistentFamInst AssocInstInfo
mb_clsinfo TyCon
fam_tc KnotTied CoAxBranch
ax_branch
; TyCon -> KnotTied CoAxBranch -> TcRn ()
checkValidCoAxBranch TyCon
fam_tc KnotTied CoAxBranch
ax_branch
; TyCon -> TcRn ()
checkValidTyCon TyCon
rep_tc
; let m_deriv_info :: Maybe DerivInfo
m_deriv_info = case HsDeriving GhcRn
derivs of
L _ [] -> Maybe DerivInfo
forall a. Maybe a
Nothing
L _ preds :: [LHsDerivingClause GhcRn]
preds ->
DerivInfo -> Maybe DerivInfo
forall a. a -> Maybe a
Just (DerivInfo -> Maybe DerivInfo) -> DerivInfo -> Maybe DerivInfo
forall a b. (a -> b) -> a -> b
$ DerivInfo :: TyCon -> [LHsDerivingClause GhcRn] -> SDoc -> DerivInfo
DerivInfo { di_rep_tc :: TyCon
di_rep_tc = TyCon
rep_tc
, di_clauses :: [LHsDerivingClause GhcRn]
di_clauses = [LHsDerivingClause GhcRn]
preds
, di_ctxt :: SDoc
di_ctxt = DataFamInstDecl GhcRn -> SDoc
tcMkDataFamInstCtxt DataFamInstDecl GhcRn
decl }
; FamInst
fam_inst <- FamFlavor -> CoAxiom Unbranched -> TcM FamInst
newFamInst (TyCon -> FamFlavor
DataFamilyInst TyCon
rep_tc) CoAxiom Unbranched
axiom
; (FamInst, Maybe DerivInfo) -> TcM (FamInst, Maybe DerivInfo)
forall (m :: * -> *) a. Monad m => a -> m a
return (FamInst
fam_inst, Maybe DerivInfo
m_deriv_info) }
where
eta_reduce :: TyCon -> [Type] -> ([Type], [TyConBinder])
eta_reduce :: TyCon -> [Type] -> ([Type], [TyConBinder])
eta_reduce fam_tc :: TyCon
fam_tc pats :: [Type]
pats
= [(Type, VarSet, TyConBndrVis)]
-> [TyConBinder] -> ([Type], [TyConBinder])
forall c.
[(Type, VarSet, c)]
-> [VarBndr TyVar c] -> ([Type], [VarBndr TyVar c])
go ([(Type, VarSet, TyConBndrVis)] -> [(Type, VarSet, TyConBndrVis)]
forall a. [a] -> [a]
reverse ([Type]
-> [VarSet] -> [TyConBndrVis] -> [(Type, VarSet, TyConBndrVis)]
forall a b c. [a] -> [b] -> [c] -> [(a, b, c)]
zip3 [Type]
pats [VarSet]
fvs_s [TyConBndrVis]
vis_s)) []
where
vis_s :: [TyConBndrVis]
vis_s :: [TyConBndrVis]
vis_s = TyCon -> [Type] -> [TyConBndrVis]
tcbVisibilities TyCon
fam_tc [Type]
pats
fvs_s :: [TyCoVarSet]
(_, fvs_s :: [VarSet]
fvs_s) = (VarSet -> Type -> (VarSet, VarSet))
-> VarSet -> [Type] -> (VarSet, [VarSet])
forall (t :: * -> *) a b c.
Traversable t =>
(a -> b -> (a, c)) -> a -> t b -> (a, t c)
mapAccumL VarSet -> Type -> (VarSet, VarSet)
add_fvs VarSet
emptyVarSet [Type]
pats
add_fvs :: VarSet -> Type -> (VarSet, VarSet)
add_fvs fvs :: VarSet
fvs pat :: Type
pat = (VarSet
fvs VarSet -> VarSet -> VarSet
`unionVarSet` Type -> VarSet
tyCoVarsOfType Type
pat, VarSet
fvs)
go :: [(Type, VarSet, c)]
-> [VarBndr TyVar c] -> ([Type], [VarBndr TyVar c])
go ((pat :: Type
pat, fvs_to_the_left :: VarSet
fvs_to_the_left, tcb_vis :: c
tcb_vis):pats :: [(Type, VarSet, c)]
pats) etad_tvs :: [VarBndr TyVar c]
etad_tvs
| Just tv :: TyVar
tv <- Type -> Maybe TyVar
getTyVar_maybe Type
pat
, Bool -> Bool
not (TyVar
tv TyVar -> VarSet -> Bool
`elemVarSet` VarSet
fvs_to_the_left)
= [(Type, VarSet, c)]
-> [VarBndr TyVar c] -> ([Type], [VarBndr TyVar c])
go [(Type, VarSet, c)]
pats (TyVar -> c -> VarBndr TyVar c
forall var argf. var -> argf -> VarBndr var argf
Bndr TyVar
tv c
tcb_vis VarBndr TyVar c -> [VarBndr TyVar c] -> [VarBndr TyVar c]
forall a. a -> [a] -> [a]
: [VarBndr TyVar c]
etad_tvs)
go pats :: [(Type, VarSet, c)]
pats etad_tvs :: [VarBndr TyVar c]
etad_tvs = ([Type] -> [Type]
forall a. [a] -> [a]
reverse (((Type, VarSet, c) -> Type) -> [(Type, VarSet, c)] -> [Type]
forall a b. (a -> b) -> [a] -> [b]
map (Type, VarSet, c) -> Type
forall a b c. (a, b, c) -> a
fstOf3 [(Type, VarSet, c)]
pats), [VarBndr TyVar c]
etad_tvs)
tcDataFamInstDecl _ _ = String -> TcM (FamInst, Maybe DerivInfo)
forall a. String -> a
panic "tcDataFamInstDecl"
tcDataFamHeader :: AssocInstInfo -> TyCon -> [Name] -> Maybe [LHsTyVarBndr GhcRn]
-> LexicalFixity -> LHsContext GhcRn
-> HsTyPats GhcRn -> Maybe (LHsKind GhcRn) -> [LConDecl GhcRn]
-> TcM ([TyVar], [Type], Kind, ThetaType)
mb_clsinfo :: AssocInstInfo
mb_clsinfo fam_tc :: TyCon
fam_tc imp_vars :: [Name]
imp_vars mb_bndrs :: Maybe [LHsTyVarBndr GhcRn]
mb_bndrs fixity :: LexicalFixity
fixity hs_ctxt :: LHsContext GhcRn
hs_ctxt hs_pats :: HsTyPats GhcRn
hs_pats m_ksig :: Maybe (LHsType GhcRn)
m_ksig hs_cons :: [LConDecl GhcRn]
hs_cons
= do { (imp_tvs :: [TyVar]
imp_tvs, (exp_tvs :: [TyVar]
exp_tvs, (stupid_theta :: [Type]
stupid_theta, lhs_ty :: Type
lhs_ty, res_kind :: Type
res_kind)))
<- TcM ([TyVar], ([TyVar], ([Type], Type, Type)))
-> TcM ([TyVar], ([TyVar], ([Type], Type, Type)))
forall a. TcM a -> TcM a
pushTcLevelM_ (TcM ([TyVar], ([TyVar], ([Type], Type, Type)))
-> TcM ([TyVar], ([TyVar], ([Type], Type, Type))))
-> TcM ([TyVar], ([TyVar], ([Type], Type, Type)))
-> TcM ([TyVar], ([TyVar], ([Type], Type, Type)))
forall a b. (a -> b) -> a -> b
$
TcM ([TyVar], ([TyVar], ([Type], Type, Type)))
-> TcM ([TyVar], ([TyVar], ([Type], Type, Type)))
forall a. TcM a -> TcM a
solveEqualities (TcM ([TyVar], ([TyVar], ([Type], Type, Type)))
-> TcM ([TyVar], ([TyVar], ([Type], Type, Type))))
-> TcM ([TyVar], ([TyVar], ([Type], Type, Type)))
-> TcM ([TyVar], ([TyVar], ([Type], Type, Type)))
forall a b. (a -> b) -> a -> b
$
[Name]
-> TcM ([TyVar], ([Type], Type, Type))
-> TcM ([TyVar], ([TyVar], ([Type], Type, Type)))
forall a. [Name] -> TcM a -> TcM ([TyVar], a)
bindImplicitTKBndrs_Q_Skol [Name]
imp_vars (TcM ([TyVar], ([Type], Type, Type))
-> TcM ([TyVar], ([TyVar], ([Type], Type, Type))))
-> TcM ([TyVar], ([Type], Type, Type))
-> TcM ([TyVar], ([TyVar], ([Type], Type, Type)))
forall a b. (a -> b) -> a -> b
$
ContextKind
-> [LHsTyVarBndr GhcRn]
-> TcM ([Type], Type, Type)
-> TcM ([TyVar], ([Type], Type, Type))
forall a.
ContextKind -> [LHsTyVarBndr GhcRn] -> TcM a -> TcM ([TyVar], a)
bindExplicitTKBndrs_Q_Skol ContextKind
AnyKind [LHsTyVarBndr GhcRn]
exp_bndrs (TcM ([Type], Type, Type) -> TcM ([TyVar], ([Type], Type, Type)))
-> TcM ([Type], Type, Type) -> TcM ([TyVar], ([Type], Type, Type))
forall a b. (a -> b) -> a -> b
$
do { [Type]
stupid_theta <- LHsContext GhcRn -> TcM [Type]
tcHsContext LHsContext GhcRn
hs_ctxt
; (lhs_ty :: Type
lhs_ty, lhs_kind :: Type
lhs_kind) <- TyCon -> HsTyPats GhcRn -> TcM (Type, Type)
tcFamTyPats TyCon
fam_tc HsTyPats GhcRn
hs_pats
; AssocInstInfo -> Type -> TcRn ()
addConsistencyConstraints AssocInstInfo
mb_clsinfo Type
lhs_ty
; (LConDecl GhcRn -> TcRn ()) -> [LConDecl GhcRn] -> TcRn ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ ((SrcSpanLess (LConDecl GhcRn) -> TcRn ())
-> LConDecl GhcRn -> TcRn ()
forall a.
HasSrcSpan a =>
(SrcSpanLess a -> TcRn ()) -> a -> TcRn ()
wrapLocM_ SrcSpanLess (LConDecl GhcRn) -> TcRn ()
ConDecl GhcRn -> TcRn ()
kcConDecl) [LConDecl GhcRn]
hs_cons
; Type
res_kind <- Maybe (LHsType GhcRn) -> TcM Type
tc_kind_sig Maybe (LHsType GhcRn)
m_ksig
; Type
lhs_ty <- HasDebugCallStack =>
RequireSaturation -> SDoc -> Type -> Type -> Type -> TcM Type
RequireSaturation -> SDoc -> Type -> Type -> Type -> TcM Type
checkExpectedKind RequireSaturation
YesSaturation SDoc
pp_lhs Type
lhs_ty Type
lhs_kind Type
res_kind
; ([Type], Type, Type) -> TcM ([Type], Type, Type)
forall (m :: * -> *) a. Monad m => a -> m a
return ([Type]
stupid_theta, Type
lhs_ty, Type
res_kind) }
; let scoped_tvs :: [TyVar]
scoped_tvs = [TyVar]
imp_tvs [TyVar] -> [TyVar] -> [TyVar]
forall a. [a] -> [a] -> [a]
++ [TyVar]
exp_tvs
; CandidatesQTvs
dvs <- [Type] -> TcM CandidatesQTvs
candidateQTyVarsOfTypes (Type
lhs_ty Type -> [Type] -> [Type]
forall a. a -> [a] -> [a]
: [TyVar] -> [Type]
mkTyVarTys [TyVar]
scoped_tvs)
; [TyVar]
qtvs <- VarSet -> CandidatesQTvs -> TcM [TyVar]
quantifyTyVars VarSet
emptyVarSet CandidatesQTvs
dvs
; (ze :: ZonkEnv
ze, qtvs :: [TyVar]
qtvs) <- [TyVar] -> TcM (ZonkEnv, [TyVar])
zonkTyBndrs [TyVar]
qtvs
; Type
lhs_ty <- ZonkEnv -> Type -> TcM Type
zonkTcTypeToTypeX ZonkEnv
ze Type
lhs_ty
; Type
res_kind <- ZonkEnv -> Type -> TcM Type
zonkTcTypeToTypeX ZonkEnv
ze Type
res_kind
; [Type]
stupid_theta <- ZonkEnv -> [Type] -> TcM [Type]
zonkTcTypesToTypesX ZonkEnv
ze [Type]
stupid_theta
; let pats :: [Type]
pats = Type -> [Type]
unravelFamInstPats Type
lhs_ty
; ([TyVar], [Type], Type, [Type])
-> TcM ([TyVar], [Type], Type, [Type])
forall (m :: * -> *) a. Monad m => a -> m a
return ([TyVar]
qtvs, [Type]
pats, Type
res_kind, [Type]
stupid_theta) }
where
fam_name :: Name
fam_name = TyCon -> Name
tyConName TyCon
fam_tc
data_ctxt :: UserTypeCtxt
data_ctxt = Name -> UserTypeCtxt
DataKindCtxt Name
fam_name
pp_lhs :: SDoc
pp_lhs = IdP GhcRn
-> Maybe [LHsTyVarBndr GhcRn]
-> HsTyPats GhcRn
-> LexicalFixity
-> LHsContext GhcRn
-> SDoc
forall (p :: Pass).
OutputableBndrId (GhcPass p) =>
IdP (GhcPass p)
-> Maybe [LHsTyVarBndr (GhcPass p)]
-> HsTyPats (GhcPass p)
-> LexicalFixity
-> LHsContext (GhcPass p)
-> SDoc
pprHsFamInstLHS Name
IdP GhcRn
fam_name Maybe [LHsTyVarBndr GhcRn]
mb_bndrs HsTyPats GhcRn
hs_pats LexicalFixity
fixity LHsContext GhcRn
hs_ctxt
exp_bndrs :: [LHsTyVarBndr GhcRn]
exp_bndrs = Maybe [LHsTyVarBndr GhcRn]
mb_bndrs Maybe [LHsTyVarBndr GhcRn]
-> [LHsTyVarBndr GhcRn] -> [LHsTyVarBndr GhcRn]
forall a. Maybe a -> a -> a
`orElse` []
tc_kind_sig :: Maybe (LHsType GhcRn) -> TcM Type
tc_kind_sig Nothing
= Type -> TcM Type
forall (m :: * -> *) a. Monad m => a -> m a
return Type
liftedTypeKind
tc_kind_sig (Just hs_kind :: LHsType GhcRn
hs_kind)
= do { Type
sig_kind <- UserTypeCtxt -> LHsType GhcRn -> TcM Type
tcLHsKindSig UserTypeCtxt
data_ctxt LHsType GhcRn
hs_kind
; let (tvs :: [TyVar]
tvs, inner_kind :: Type
inner_kind) = Type -> ([TyVar], Type)
tcSplitForAllTys Type
sig_kind
; TcLevel
lvl <- TcM TcLevel
getTcLevel
; (subst :: TCvSubst
subst, _tvs' :: [TyVar]
_tvs') <- TcLevel -> Bool -> TCvSubst -> [TyVar] -> TcM (TCvSubst, [TyVar])
tcInstSkolTyVarsAt TcLevel
lvl Bool
False TCvSubst
emptyTCvSubst [TyVar]
tvs
; Type -> TcM Type
forall (m :: * -> *) a. Monad m => a -> m a
return (HasCallStack => TCvSubst -> Type -> Type
TCvSubst -> Type -> Type
substTy TCvSubst
subst Type
inner_kind) }
tcInstDecls2 :: [LTyClDecl GhcRn] -> [InstInfo GhcRn]
-> TcM (LHsBinds GhcTc)
tcInstDecls2 :: [LTyClDecl GhcRn] -> [InstInfo GhcRn] -> TcM (LHsBinds GhcTc)
tcInstDecls2 tycl_decls :: [LTyClDecl GhcRn]
tycl_decls inst_decls :: [InstInfo GhcRn]
inst_decls
= do {
let class_decls :: [LTyClDecl GhcRn]
class_decls = (LTyClDecl GhcRn -> Bool) -> [LTyClDecl GhcRn] -> [LTyClDecl GhcRn]
forall a. (a -> Bool) -> [a] -> [a]
filter (TyClDecl GhcRn -> Bool
forall pass. TyClDecl pass -> Bool
isClassDecl (TyClDecl GhcRn -> Bool)
-> (LTyClDecl GhcRn -> TyClDecl GhcRn) -> LTyClDecl GhcRn -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. LTyClDecl GhcRn -> TyClDecl GhcRn
forall a. HasSrcSpan a => a -> SrcSpanLess a
unLoc) [LTyClDecl GhcRn]
tycl_decls
; [LHsBinds GhcTc]
dm_binds_s <- (LTyClDecl GhcRn -> TcM (LHsBinds GhcTc))
-> [LTyClDecl GhcRn]
-> IOEnv (Env TcGblEnv TcLclEnv) [LHsBinds GhcTc]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM LTyClDecl GhcRn -> TcM (LHsBinds GhcTc)
tcClassDecl2 [LTyClDecl GhcRn]
class_decls
; let dm_binds :: LHsBinds GhcTc
dm_binds = [LHsBinds GhcTc] -> LHsBinds GhcTc
forall a. [Bag a] -> Bag a
unionManyBags [LHsBinds GhcTc]
dm_binds_s
; let dm_ids :: [IdP GhcTc]
dm_ids = LHsBinds GhcTc -> [IdP GhcTc]
forall (p :: Pass) idR.
LHsBindsLR (GhcPass p) idR -> [IdP (GhcPass p)]
collectHsBindsBinders LHsBinds GhcTc
dm_binds
; [LHsBinds GhcTc]
inst_binds_s <- [TyVar]
-> IOEnv (Env TcGblEnv TcLclEnv) [LHsBinds GhcTc]
-> IOEnv (Env TcGblEnv TcLclEnv) [LHsBinds GhcTc]
forall r. [TyVar] -> TcM r -> TcM r
tcExtendGlobalValEnv [TyVar]
[IdP GhcTc]
dm_ids (IOEnv (Env TcGblEnv TcLclEnv) [LHsBinds GhcTc]
-> IOEnv (Env TcGblEnv TcLclEnv) [LHsBinds GhcTc])
-> IOEnv (Env TcGblEnv TcLclEnv) [LHsBinds GhcTc]
-> IOEnv (Env TcGblEnv TcLclEnv) [LHsBinds GhcTc]
forall a b. (a -> b) -> a -> b
$
(InstInfo GhcRn -> TcM (LHsBinds GhcTc))
-> [InstInfo GhcRn]
-> IOEnv (Env TcGblEnv TcLclEnv) [LHsBinds GhcTc]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM InstInfo GhcRn -> TcM (LHsBinds GhcTc)
tcInstDecl2 [InstInfo GhcRn]
inst_decls
; LHsBinds GhcTc -> TcM (LHsBinds GhcTc)
forall (m :: * -> *) a. Monad m => a -> m a
return (LHsBinds GhcTc
dm_binds LHsBinds GhcTc -> LHsBinds GhcTc -> LHsBinds GhcTc
forall a. Bag a -> Bag a -> Bag a
`unionBags` [LHsBinds GhcTc] -> LHsBinds GhcTc
forall a. [Bag a] -> Bag a
unionManyBags [LHsBinds GhcTc]
inst_binds_s) }
tcInstDecl2 :: InstInfo GhcRn -> TcM (LHsBinds GhcTc)
tcInstDecl2 :: InstInfo GhcRn -> TcM (LHsBinds GhcTc)
tcInstDecl2 (InstInfo { iSpec :: forall a. InstInfo a -> ClsInst
iSpec = ClsInst
ispec, iBinds :: forall a. InstInfo a -> InstBindings a
iBinds = InstBindings GhcRn
ibinds })
= TcM (LHsBinds GhcTc)
-> TcM (LHsBinds GhcTc) -> TcM (LHsBinds GhcTc)
forall r. TcRn r -> TcRn r -> TcRn r
recoverM (LHsBinds GhcTc -> TcM (LHsBinds GhcTc)
forall (m :: * -> *) a. Monad m => a -> m a
return LHsBinds GhcTc
forall idL idR. LHsBindsLR idL idR
emptyLHsBinds) (TcM (LHsBinds GhcTc) -> TcM (LHsBinds GhcTc))
-> TcM (LHsBinds GhcTc) -> TcM (LHsBinds GhcTc)
forall a b. (a -> b) -> a -> b
$
SrcSpan -> TcM (LHsBinds GhcTc) -> TcM (LHsBinds GhcTc)
forall a. SrcSpan -> TcRn a -> TcRn a
setSrcSpan SrcSpan
loc (TcM (LHsBinds GhcTc) -> TcM (LHsBinds GhcTc))
-> TcM (LHsBinds GhcTc) -> TcM (LHsBinds GhcTc)
forall a b. (a -> b) -> a -> b
$
SDoc -> TcM (LHsBinds GhcTc) -> TcM (LHsBinds GhcTc)
forall a. SDoc -> TcM a -> TcM a
addErrCtxt (Type -> SDoc
instDeclCtxt2 (TyVar -> Type
idType TyVar
dfun_id)) (TcM (LHsBinds GhcTc) -> TcM (LHsBinds GhcTc))
-> TcM (LHsBinds GhcTc) -> TcM (LHsBinds GhcTc)
forall a b. (a -> b) -> a -> b
$
do {
; (inst_tyvars :: [TyVar]
inst_tyvars, dfun_theta :: [Type]
dfun_theta, inst_head :: Type
inst_head) <- TyVar -> TcM ([TyVar], [Type], Type)
tcSkolDFunType TyVar
dfun_id
; [TyVar]
dfun_ev_vars <- [Type] -> TcM [TyVar]
newEvVars [Type]
dfun_theta
; let (clas :: Class
clas, inst_tys :: [Type]
inst_tys) = Type -> (Class, [Type])
tcSplitDFunHead Type
inst_head
(class_tyvars :: [TyVar]
class_tyvars, sc_theta :: [Type]
sc_theta, _, op_items :: [ClassOpItem]
op_items) = Class -> ([TyVar], [Type], [TyVar], [ClassOpItem])
classBigSig Class
clas
sc_theta' :: [Type]
sc_theta' = HasCallStack => TCvSubst -> [Type] -> [Type]
TCvSubst -> [Type] -> [Type]
substTheta ([TyVar] -> [Type] -> TCvSubst
HasDebugCallStack => [TyVar] -> [Type] -> TCvSubst
zipTvSubst [TyVar]
class_tyvars [Type]
inst_tys) [Type]
sc_theta
; String -> SDoc -> TcRn ()
traceTc "tcInstDecl2" ([SDoc] -> SDoc
vcat [[TyVar] -> SDoc
forall a. Outputable a => a -> SDoc
ppr [TyVar]
inst_tyvars, [Type] -> SDoc
forall a. Outputable a => a -> SDoc
ppr [Type]
inst_tys, [Type] -> SDoc
forall a. Outputable a => a -> SDoc
ppr [Type]
dfun_theta, [Type] -> SDoc
forall a. Outputable a => a -> SDoc
ppr [Type]
sc_theta'])
; spec_inst_info :: ([Located TcSpecPrag], TcPragEnv)
spec_inst_info@(spec_inst_prags :: [Located TcSpecPrag]
spec_inst_prags,_) <- TyVar
-> InstBindings GhcRn -> TcM ([Located TcSpecPrag], TcPragEnv)
tcSpecInstPrags TyVar
dfun_id InstBindings GhcRn
ibinds
; EvBindsVar
dfun_ev_binds_var <- TcM EvBindsVar
newTcEvBinds
; let dfun_ev_binds :: TcEvBinds
dfun_ev_binds = EvBindsVar -> TcEvBinds
TcEvBinds EvBindsVar
dfun_ev_binds_var
; (tclvl :: TcLevel
tclvl, (sc_meth_ids :: [TyVar]
sc_meth_ids, sc_meth_binds :: LHsBinds GhcTc
sc_meth_binds, sc_meth_implics :: Bag Implication
sc_meth_implics))
<- TcM ([TyVar], LHsBinds GhcTc, Bag Implication)
-> TcM (TcLevel, ([TyVar], LHsBinds GhcTc, Bag Implication))
forall a. TcM a -> TcM (TcLevel, a)
pushTcLevelM (TcM ([TyVar], LHsBinds GhcTc, Bag Implication)
-> TcM (TcLevel, ([TyVar], LHsBinds GhcTc, Bag Implication)))
-> TcM ([TyVar], LHsBinds GhcTc, Bag Implication)
-> TcM (TcLevel, ([TyVar], LHsBinds GhcTc, Bag Implication))
forall a b. (a -> b) -> a -> b
$
do { (sc_ids :: [TyVar]
sc_ids, sc_binds :: LHsBinds GhcTc
sc_binds, sc_implics :: Bag Implication
sc_implics)
<- TyVar
-> Class
-> [TyVar]
-> [TyVar]
-> [Type]
-> TcEvBinds
-> [Type]
-> TcM ([TyVar], LHsBinds GhcTc, Bag Implication)
tcSuperClasses TyVar
dfun_id Class
clas [TyVar]
inst_tyvars [TyVar]
dfun_ev_vars
[Type]
inst_tys TcEvBinds
dfun_ev_binds
[Type]
sc_theta'
; (meth_ids :: [TyVar]
meth_ids, meth_binds :: LHsBinds GhcTc
meth_binds, meth_implics :: Bag Implication
meth_implics)
<- TyVar
-> Class
-> [TyVar]
-> [TyVar]
-> [Type]
-> TcEvBinds
-> ([Located TcSpecPrag], TcPragEnv)
-> [ClassOpItem]
-> InstBindings GhcRn
-> TcM ([TyVar], LHsBinds GhcTc, Bag Implication)
tcMethods TyVar
dfun_id Class
clas [TyVar]
inst_tyvars [TyVar]
dfun_ev_vars
[Type]
inst_tys TcEvBinds
dfun_ev_binds ([Located TcSpecPrag], TcPragEnv)
spec_inst_info
[ClassOpItem]
op_items InstBindings GhcRn
ibinds
; ([TyVar], LHsBinds GhcTc, Bag Implication)
-> TcM ([TyVar], LHsBinds GhcTc, Bag Implication)
forall (m :: * -> *) a. Monad m => a -> m a
return ( [TyVar]
sc_ids [TyVar] -> [TyVar] -> [TyVar]
forall a. [a] -> [a] -> [a]
++ [TyVar]
meth_ids
, LHsBinds GhcTc
sc_binds LHsBinds GhcTc -> LHsBinds GhcTc -> LHsBinds GhcTc
forall a. Bag a -> Bag a -> Bag a
`unionBags` LHsBinds GhcTc
meth_binds
, Bag Implication
sc_implics Bag Implication -> Bag Implication -> Bag Implication
forall a. Bag a -> Bag a -> Bag a
`unionBags` Bag Implication
meth_implics ) }
; Implication
imp <- TcM Implication
newImplication
; Implication -> TcRn ()
emitImplication (Implication -> TcRn ()) -> Implication -> TcRn ()
forall a b. (a -> b) -> a -> b
$
Implication
imp { ic_tclvl :: TcLevel
ic_tclvl = TcLevel
tclvl
, ic_skols :: [TyVar]
ic_skols = [TyVar]
inst_tyvars
, ic_given :: [TyVar]
ic_given = [TyVar]
dfun_ev_vars
, ic_wanted :: WantedConstraints
ic_wanted = Bag Implication -> WantedConstraints
mkImplicWC Bag Implication
sc_meth_implics
, ic_binds :: EvBindsVar
ic_binds = EvBindsVar
dfun_ev_binds_var
, ic_info :: SkolemInfo
ic_info = SkolemInfo
InstSkol }
; TyVar
self_dict <- Class -> [Type] -> TcM TyVar
newDict Class
clas [Type]
inst_tys
; let class_tc :: TyCon
class_tc = Class -> TyCon
classTyCon Class
clas
[dict_constr :: DataCon
dict_constr] = TyCon -> [DataCon]
tyConDataCons TyCon
class_tc
dict_bind :: LHsBind GhcTc
dict_bind = IdP GhcTc -> LHsExpr GhcTc -> LHsBind GhcTc
forall (p :: Pass).
IdP (GhcPass p) -> LHsExpr (GhcPass p) -> LHsBind (GhcPass p)
mkVarBind TyVar
IdP GhcTc
self_dict (SrcSpan -> HsExpr GhcTc -> LHsExpr GhcTc
forall l e. l -> e -> GenLocated l e
L SrcSpan
loc HsExpr GhcTc
con_app_args)
con_app_tys :: HsExpr GhcTc
con_app_tys = HsWrapper -> HsExpr GhcTc -> HsExpr GhcTc
forall (id :: Pass).
HsWrapper -> HsExpr (GhcPass id) -> HsExpr (GhcPass id)
mkHsWrap ([Type] -> HsWrapper
mkWpTyApps [Type]
inst_tys)
(XConLikeOut GhcTc -> ConLike -> HsExpr GhcTc
forall p. XConLikeOut p -> ConLike -> HsExpr p
HsConLikeOut XConLikeOut GhcTc
NoExt
noExt (DataCon -> ConLike
RealDataCon DataCon
dict_constr))
con_app_args :: HsExpr GhcTc
con_app_args = (HsExpr GhcTc -> TyVar -> HsExpr GhcTc)
-> HsExpr GhcTc -> [TyVar] -> HsExpr GhcTc
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl' HsExpr GhcTc -> TyVar -> HsExpr GhcTc
app_to_meth HsExpr GhcTc
con_app_tys [TyVar]
sc_meth_ids
app_to_meth :: HsExpr GhcTc -> Id -> HsExpr GhcTc
app_to_meth :: HsExpr GhcTc -> TyVar -> HsExpr GhcTc
app_to_meth fun :: HsExpr GhcTc
fun meth_id :: TyVar
meth_id = XApp GhcTc -> LHsExpr GhcTc -> LHsExpr GhcTc -> HsExpr GhcTc
forall p. XApp p -> LHsExpr p -> LHsExpr p -> HsExpr p
HsApp XApp GhcTc
NoExt
noExt (SrcSpan -> HsExpr GhcTc -> LHsExpr GhcTc
forall l e. l -> e -> GenLocated l e
L SrcSpan
loc HsExpr GhcTc
fun)
(SrcSpan -> HsExpr GhcTc -> LHsExpr GhcTc
forall l e. l -> e -> GenLocated l e
L SrcSpan
loc (HsWrapper -> IdP GhcTc -> HsExpr GhcTc
forall (id :: Pass).
HsWrapper -> IdP (GhcPass id) -> HsExpr (GhcPass id)
wrapId HsWrapper
arg_wrapper TyVar
IdP GhcTc
meth_id))
inst_tv_tys :: [Type]
inst_tv_tys = [TyVar] -> [Type]
mkTyVarTys [TyVar]
inst_tyvars
arg_wrapper :: HsWrapper
arg_wrapper = [TyVar] -> HsWrapper
mkWpEvVarApps [TyVar]
dfun_ev_vars HsWrapper -> HsWrapper -> HsWrapper
<.> [Type] -> HsWrapper
mkWpTyApps [Type]
inst_tv_tys
is_newtype :: Bool
is_newtype = TyCon -> Bool
isNewTyCon TyCon
class_tc
dfun_id_w_prags :: TyVar
dfun_id_w_prags = TyVar -> [TyVar] -> TyVar
addDFunPrags TyVar
dfun_id [TyVar]
sc_meth_ids
dfun_spec_prags :: TcSpecPrags
dfun_spec_prags
| Bool
is_newtype = [Located TcSpecPrag] -> TcSpecPrags
SpecPrags []
| Bool
otherwise = [Located TcSpecPrag] -> TcSpecPrags
SpecPrags [Located TcSpecPrag]
spec_inst_prags
export :: ABExport GhcTc
export = ABE :: forall p.
XABE p -> IdP p -> IdP p -> HsWrapper -> TcSpecPrags -> ABExport p
ABE { abe_ext :: XABE GhcTc
abe_ext = XABE GhcTc
NoExt
noExt
, abe_wrap :: HsWrapper
abe_wrap = HsWrapper
idHsWrapper
, abe_poly :: IdP GhcTc
abe_poly = TyVar
IdP GhcTc
dfun_id_w_prags
, abe_mono :: IdP GhcTc
abe_mono = TyVar
IdP GhcTc
self_dict
, abe_prags :: TcSpecPrags
abe_prags = TcSpecPrags
dfun_spec_prags }
main_bind :: HsBindLR GhcTc GhcTc
main_bind = AbsBinds :: forall idL idR.
XAbsBinds idL idR
-> [TyVar]
-> [TyVar]
-> [ABExport idL]
-> [TcEvBinds]
-> LHsBinds idL
-> Bool
-> HsBindLR idL idR
AbsBinds { abs_ext :: XAbsBinds GhcTc GhcTc
abs_ext = XAbsBinds GhcTc GhcTc
NoExt
noExt
, abs_tvs :: [TyVar]
abs_tvs = [TyVar]
inst_tyvars
, abs_ev_vars :: [TyVar]
abs_ev_vars = [TyVar]
dfun_ev_vars
, abs_exports :: [ABExport GhcTc]
abs_exports = [ABExport GhcTc
export]
, abs_ev_binds :: [TcEvBinds]
abs_ev_binds = []
, abs_binds :: LHsBinds GhcTc
abs_binds = LHsBind GhcTc -> LHsBinds GhcTc
forall a. a -> Bag a
unitBag LHsBind GhcTc
dict_bind
, abs_sig :: Bool
abs_sig = Bool
True }
; LHsBinds GhcTc -> TcM (LHsBinds GhcTc)
forall (m :: * -> *) a. Monad m => a -> m a
return (LHsBind GhcTc -> LHsBinds GhcTc
forall a. a -> Bag a
unitBag (SrcSpan -> HsBindLR GhcTc GhcTc -> LHsBind GhcTc
forall l e. l -> e -> GenLocated l e
L SrcSpan
loc HsBindLR GhcTc GhcTc
main_bind) LHsBinds GhcTc -> LHsBinds GhcTc -> LHsBinds GhcTc
forall a. Bag a -> Bag a -> Bag a
`unionBags` LHsBinds GhcTc
sc_meth_binds)
}
where
dfun_id :: TyVar
dfun_id = ClsInst -> TyVar
instanceDFunId ClsInst
ispec
loc :: SrcSpan
loc = TyVar -> SrcSpan
forall a. NamedThing a => a -> SrcSpan
getSrcSpan TyVar
dfun_id
addDFunPrags :: DFunId -> [Id] -> DFunId
addDFunPrags :: TyVar -> [TyVar] -> TyVar
addDFunPrags dfun_id :: TyVar
dfun_id sc_meth_ids :: [TyVar]
sc_meth_ids
| Bool
is_newtype
= TyVar
dfun_id TyVar -> Unfolding -> TyVar
`setIdUnfolding` Int -> CoreExpr -> Unfolding
mkInlineUnfoldingWithArity 0 CoreExpr
con_app
TyVar -> InlinePragma -> TyVar
`setInlinePragma` InlinePragma
alwaysInlinePragma { inl_sat :: Maybe Int
inl_sat = Int -> Maybe Int
forall a. a -> Maybe a
Just 0 }
| Bool
otherwise
= TyVar
dfun_id TyVar -> Unfolding -> TyVar
`setIdUnfolding` [TyVar] -> DataCon -> [CoreExpr] -> Unfolding
mkDFunUnfolding [TyVar]
dfun_bndrs DataCon
dict_con [CoreExpr]
dict_args
TyVar -> InlinePragma -> TyVar
`setInlinePragma` InlinePragma
dfunInlinePragma
where
con_app :: CoreExpr
con_app = [TyVar] -> CoreExpr -> CoreExpr
forall b. [b] -> Expr b -> Expr b
mkLams [TyVar]
dfun_bndrs (CoreExpr -> CoreExpr) -> CoreExpr -> CoreExpr
forall a b. (a -> b) -> a -> b
$
CoreExpr -> [CoreExpr] -> CoreExpr
forall b. Expr b -> [Expr b] -> Expr b
mkApps (TyVar -> CoreExpr
forall b. TyVar -> Expr b
Var (DataCon -> TyVar
dataConWrapId DataCon
dict_con)) [CoreExpr]
dict_args
dict_args :: [CoreExpr]
dict_args = (Type -> CoreExpr) -> [Type] -> [CoreExpr]
forall a b. (a -> b) -> [a] -> [b]
map Type -> CoreExpr
forall b. Type -> Expr b
Type [Type]
inst_tys [CoreExpr] -> [CoreExpr] -> [CoreExpr]
forall a. [a] -> [a] -> [a]
++
[CoreExpr -> [TyVar] -> CoreExpr
forall b. Expr b -> [TyVar] -> Expr b
mkVarApps (TyVar -> CoreExpr
forall b. TyVar -> Expr b
Var TyVar
id) [TyVar]
dfun_bndrs | TyVar
id <- [TyVar]
sc_meth_ids]
(dfun_tvs :: [TyVar]
dfun_tvs, dfun_theta :: [Type]
dfun_theta, clas :: Class
clas, inst_tys :: [Type]
inst_tys) = Type -> ([TyVar], [Type], Class, [Type])
tcSplitDFunTy (TyVar -> Type
idType TyVar
dfun_id)
ev_ids :: [TyVar]
ev_ids = Int -> [Type] -> [TyVar]
mkTemplateLocalsNum 1 [Type]
dfun_theta
dfun_bndrs :: [TyVar]
dfun_bndrs = [TyVar]
dfun_tvs [TyVar] -> [TyVar] -> [TyVar]
forall a. [a] -> [a] -> [a]
++ [TyVar]
ev_ids
clas_tc :: TyCon
clas_tc = Class -> TyCon
classTyCon Class
clas
[dict_con :: DataCon
dict_con] = TyCon -> [DataCon]
tyConDataCons TyCon
clas_tc
is_newtype :: Bool
is_newtype = TyCon -> Bool
isNewTyCon TyCon
clas_tc
wrapId :: HsWrapper -> IdP (GhcPass id) -> HsExpr (GhcPass id)
wrapId :: HsWrapper -> IdP (GhcPass id) -> HsExpr (GhcPass id)
wrapId wrapper :: HsWrapper
wrapper id :: IdP (GhcPass id)
id = HsWrapper -> HsExpr (GhcPass id) -> HsExpr (GhcPass id)
forall (id :: Pass).
HsWrapper -> HsExpr (GhcPass id) -> HsExpr (GhcPass id)
mkHsWrap HsWrapper
wrapper (XVar (GhcPass id)
-> Located (IdP (GhcPass id)) -> HsExpr (GhcPass id)
forall p. XVar p -> Located (IdP p) -> HsExpr p
HsVar XVar (GhcPass id)
NoExt
noExt (SrcSpanLess (Located (IdP (GhcPass id)))
-> Located (IdP (GhcPass id))
forall a. HasSrcSpan a => SrcSpanLess a -> a
noLoc SrcSpanLess (Located (IdP (GhcPass id)))
IdP (GhcPass id)
id))
tcSuperClasses :: DFunId -> Class -> [TcTyVar] -> [EvVar] -> [TcType]
-> TcEvBinds
-> TcThetaType
-> TcM ([EvVar], LHsBinds GhcTc, Bag Implication)
tcSuperClasses :: TyVar
-> Class
-> [TyVar]
-> [TyVar]
-> [Type]
-> TcEvBinds
-> [Type]
-> TcM ([TyVar], LHsBinds GhcTc, Bag Implication)
tcSuperClasses dfun_id :: TyVar
dfun_id cls :: Class
cls tyvars :: [TyVar]
tyvars dfun_evs :: [TyVar]
dfun_evs inst_tys :: [Type]
inst_tys dfun_ev_binds :: TcEvBinds
dfun_ev_binds sc_theta :: [Type]
sc_theta
= do { (ids :: [TyVar]
ids, binds :: [LHsBind GhcTc]
binds, implics :: [Implication]
implics) <- ((Type, Int)
-> IOEnv
(Env TcGblEnv TcLclEnv) (TyVar, LHsBind GhcTc, Implication))
-> [(Type, Int)]
-> IOEnv
(Env TcGblEnv TcLclEnv) ([TyVar], [LHsBind GhcTc], [Implication])
forall (m :: * -> *) a b c d.
Monad m =>
(a -> m (b, c, d)) -> [a] -> m ([b], [c], [d])
mapAndUnzip3M (Type, Int)
-> IOEnv
(Env TcGblEnv TcLclEnv) (TyVar, LHsBind GhcTc, Implication)
tc_super ([Type] -> [Int] -> [(Type, Int)]
forall a b. [a] -> [b] -> [(a, b)]
zip [Type]
sc_theta [Int
fIRST_TAG..])
; ([TyVar], LHsBinds GhcTc, Bag Implication)
-> TcM ([TyVar], LHsBinds GhcTc, Bag Implication)
forall (m :: * -> *) a. Monad m => a -> m a
return ([TyVar]
ids, [LHsBind GhcTc] -> LHsBinds GhcTc
forall a. [a] -> Bag a
listToBag [LHsBind GhcTc]
binds, [Implication] -> Bag Implication
forall a. [a] -> Bag a
listToBag [Implication]
implics) }
where
loc :: SrcSpan
loc = TyVar -> SrcSpan
forall a. NamedThing a => a -> SrcSpan
getSrcSpan TyVar
dfun_id
size :: TypeSize
size = [Type] -> TypeSize
sizeTypes [Type]
inst_tys
tc_super :: (Type, Int)
-> IOEnv
(Env TcGblEnv TcLclEnv) (TyVar, LHsBind GhcTc, Implication)
tc_super (sc_pred :: Type
sc_pred, n :: Int
n)
= do { (sc_implic :: Implication
sc_implic, ev_binds_var :: EvBindsVar
ev_binds_var, sc_ev_tm :: EvTerm
sc_ev_tm)
<- TcM EvTerm -> TcM (Implication, EvBindsVar, EvTerm)
forall result. TcM result -> TcM (Implication, EvBindsVar, result)
checkInstConstraints (TcM EvTerm -> TcM (Implication, EvBindsVar, EvTerm))
-> TcM EvTerm -> TcM (Implication, EvBindsVar, EvTerm)
forall a b. (a -> b) -> a -> b
$ CtOrigin -> Type -> TcM EvTerm
emitWanted (TypeSize -> CtOrigin
ScOrigin TypeSize
size) Type
sc_pred
; Name
sc_top_name <- OccName -> TcM Name
newName (Int -> OccName -> OccName
mkSuperDictAuxOcc Int
n (Class -> OccName
forall a. NamedThing a => a -> OccName
getOccName Class
cls))
; TyVar
sc_ev_id <- Type -> TcM TyVar
forall gbl lcl. Type -> TcRnIf gbl lcl TyVar
newEvVar Type
sc_pred
; EvBindsVar -> EvBind -> TcRn ()
addTcEvBind EvBindsVar
ev_binds_var (EvBind -> TcRn ()) -> EvBind -> TcRn ()
forall a b. (a -> b) -> a -> b
$ TyVar -> EvTerm -> EvBind
mkWantedEvBind TyVar
sc_ev_id EvTerm
sc_ev_tm
; let sc_top_ty :: Type
sc_top_ty = [TyVar] -> Type -> Type
mkInvForAllTys [TyVar]
tyvars ([TyVar] -> Type -> Type
mkLamTypes [TyVar]
dfun_evs Type
sc_pred)
sc_top_id :: TyVar
sc_top_id = Name -> Type -> TyVar
mkLocalId Name
sc_top_name Type
sc_top_ty
export :: ABExport GhcTc
export = ABE :: forall p.
XABE p -> IdP p -> IdP p -> HsWrapper -> TcSpecPrags -> ABExport p
ABE { abe_ext :: XABE GhcTc
abe_ext = XABE GhcTc
NoExt
noExt
, abe_wrap :: HsWrapper
abe_wrap = HsWrapper
idHsWrapper
, abe_poly :: IdP GhcTc
abe_poly = TyVar
IdP GhcTc
sc_top_id
, abe_mono :: IdP GhcTc
abe_mono = TyVar
IdP GhcTc
sc_ev_id
, abe_prags :: TcSpecPrags
abe_prags = TcSpecPrags
noSpecPrags }
local_ev_binds :: TcEvBinds
local_ev_binds = EvBindsVar -> TcEvBinds
TcEvBinds EvBindsVar
ev_binds_var
bind :: HsBindLR GhcTc GhcTc
bind = AbsBinds :: forall idL idR.
XAbsBinds idL idR
-> [TyVar]
-> [TyVar]
-> [ABExport idL]
-> [TcEvBinds]
-> LHsBinds idL
-> Bool
-> HsBindLR idL idR
AbsBinds { abs_ext :: XAbsBinds GhcTc GhcTc
abs_ext = XAbsBinds GhcTc GhcTc
NoExt
noExt
, abs_tvs :: [TyVar]
abs_tvs = [TyVar]
tyvars
, abs_ev_vars :: [TyVar]
abs_ev_vars = [TyVar]
dfun_evs
, abs_exports :: [ABExport GhcTc]
abs_exports = [ABExport GhcTc
export]
, abs_ev_binds :: [TcEvBinds]
abs_ev_binds = [TcEvBinds
dfun_ev_binds, TcEvBinds
local_ev_binds]
, abs_binds :: LHsBinds GhcTc
abs_binds = LHsBinds GhcTc
forall a. Bag a
emptyBag
, abs_sig :: Bool
abs_sig = Bool
False }
; (TyVar, LHsBind GhcTc, Implication)
-> IOEnv
(Env TcGblEnv TcLclEnv) (TyVar, LHsBind GhcTc, Implication)
forall (m :: * -> *) a. Monad m => a -> m a
return (TyVar
sc_top_id, SrcSpan -> HsBindLR GhcTc GhcTc -> LHsBind GhcTc
forall l e. l -> e -> GenLocated l e
L SrcSpan
loc HsBindLR GhcTc GhcTc
bind, Implication
sc_implic) }
checkInstConstraints :: TcM result
-> TcM (Implication, EvBindsVar, result)
checkInstConstraints :: TcM result -> TcM (Implication, EvBindsVar, result)
checkInstConstraints thing_inside :: TcM result
thing_inside
= do { (tclvl :: TcLevel
tclvl, wanted :: WantedConstraints
wanted, result :: result
result) <- TcM result -> TcM (TcLevel, WantedConstraints, result)
forall a. TcM a -> TcM (TcLevel, WantedConstraints, a)
pushLevelAndCaptureConstraints (TcM result -> TcM (TcLevel, WantedConstraints, result))
-> TcM result -> TcM (TcLevel, WantedConstraints, result)
forall a b. (a -> b) -> a -> b
$
TcM result
thing_inside
; EvBindsVar
ev_binds_var <- TcM EvBindsVar
newTcEvBinds
; Implication
implic <- TcM Implication
newImplication
; let implic' :: Implication
implic' = Implication
implic { ic_tclvl :: TcLevel
ic_tclvl = TcLevel
tclvl
, ic_wanted :: WantedConstraints
ic_wanted = WantedConstraints
wanted
, ic_binds :: EvBindsVar
ic_binds = EvBindsVar
ev_binds_var
, ic_info :: SkolemInfo
ic_info = SkolemInfo
InstSkol }
; (Implication, EvBindsVar, result)
-> TcM (Implication, EvBindsVar, result)
forall (m :: * -> *) a. Monad m => a -> m a
return (Implication
implic', EvBindsVar
ev_binds_var, result
result) }
tcMethods :: DFunId -> Class
-> [TcTyVar] -> [EvVar]
-> [TcType]
-> TcEvBinds
-> ([Located TcSpecPrag], TcPragEnv)
-> [ClassOpItem]
-> InstBindings GhcRn
-> TcM ([Id], LHsBinds GhcTc, Bag Implication)
tcMethods :: TyVar
-> Class
-> [TyVar]
-> [TyVar]
-> [Type]
-> TcEvBinds
-> ([Located TcSpecPrag], TcPragEnv)
-> [ClassOpItem]
-> InstBindings GhcRn
-> TcM ([TyVar], LHsBinds GhcTc, Bag Implication)
tcMethods dfun_id :: TyVar
dfun_id clas :: Class
clas tyvars :: [TyVar]
tyvars dfun_ev_vars :: [TyVar]
dfun_ev_vars inst_tys :: [Type]
inst_tys
dfun_ev_binds :: TcEvBinds
dfun_ev_binds (spec_inst_prags :: [Located TcSpecPrag]
spec_inst_prags, prag_fn :: TcPragEnv
prag_fn) op_items :: [ClassOpItem]
op_items
(InstBindings { ib_binds :: forall a. InstBindings a -> LHsBinds a
ib_binds = LHsBinds GhcRn
binds
, ib_tyvars :: forall a. InstBindings a -> [Name]
ib_tyvars = [Name]
lexical_tvs
, ib_pragmas :: forall a. InstBindings a -> [LSig a]
ib_pragmas = [LSig GhcRn]
sigs
, ib_extensions :: forall a. InstBindings a -> [Extension]
ib_extensions = [Extension]
exts
, ib_derived :: forall a. InstBindings a -> Bool
ib_derived = Bool
is_derived })
= [(Name, TyVar)]
-> TcM ([TyVar], LHsBinds GhcTc, Bag Implication)
-> TcM ([TyVar], LHsBinds GhcTc, Bag Implication)
forall r. [(Name, TyVar)] -> TcM r -> TcM r
tcExtendNameTyVarEnv ([Name]
lexical_tvs [Name] -> [TyVar] -> [(Name, TyVar)]
forall a b. [a] -> [b] -> [(a, b)]
`zip` [TyVar]
tyvars) (TcM ([TyVar], LHsBinds GhcTc, Bag Implication)
-> TcM ([TyVar], LHsBinds GhcTc, Bag Implication))
-> TcM ([TyVar], LHsBinds GhcTc, Bag Implication)
-> TcM ([TyVar], LHsBinds GhcTc, Bag Implication)
forall a b. (a -> b) -> a -> b
$
do { String -> SDoc -> TcRn ()
traceTc "tcInstMeth" ([LSig GhcRn] -> SDoc
forall a. Outputable a => a -> SDoc
ppr [LSig GhcRn]
sigs SDoc -> SDoc -> SDoc
$$ LHsBinds GhcRn -> SDoc
forall a. Outputable a => a -> SDoc
ppr LHsBinds GhcRn
binds)
; TcRn ()
checkMinimalDefinition
; TcRn ()
checkMethBindMembership
; (ids :: [TyVar]
ids, binds :: [LHsBind GhcTc]
binds, mb_implics :: [Maybe Implication]
mb_implics) <- [Extension]
-> TcM ([TyVar], [LHsBind GhcTc], [Maybe Implication])
-> TcM ([TyVar], [LHsBind GhcTc], [Maybe Implication])
forall a. [Extension] -> TcM a -> TcM a
set_exts [Extension]
exts (TcM ([TyVar], [LHsBind GhcTc], [Maybe Implication])
-> TcM ([TyVar], [LHsBind GhcTc], [Maybe Implication]))
-> TcM ([TyVar], [LHsBind GhcTc], [Maybe Implication])
-> TcM ([TyVar], [LHsBind GhcTc], [Maybe Implication])
forall a b. (a -> b) -> a -> b
$
TcM ([TyVar], [LHsBind GhcTc], [Maybe Implication])
-> TcM ([TyVar], [LHsBind GhcTc], [Maybe Implication])
forall a. TcM a -> TcM a
unset_warnings_deriving (TcM ([TyVar], [LHsBind GhcTc], [Maybe Implication])
-> TcM ([TyVar], [LHsBind GhcTc], [Maybe Implication]))
-> TcM ([TyVar], [LHsBind GhcTc], [Maybe Implication])
-> TcM ([TyVar], [LHsBind GhcTc], [Maybe Implication])
forall a b. (a -> b) -> a -> b
$
(ClassOpItem
-> IOEnv
(Env TcGblEnv TcLclEnv) (TyVar, LHsBind GhcTc, Maybe Implication))
-> [ClassOpItem]
-> TcM ([TyVar], [LHsBind GhcTc], [Maybe Implication])
forall (m :: * -> *) a b c d.
Monad m =>
(a -> m (b, c, d)) -> [a] -> m ([b], [c], [d])
mapAndUnzip3M ClassOpItem
-> IOEnv
(Env TcGblEnv TcLclEnv) (TyVar, LHsBind GhcTc, Maybe Implication)
tc_item [ClassOpItem]
op_items
; ([TyVar], LHsBinds GhcTc, Bag Implication)
-> TcM ([TyVar], LHsBinds GhcTc, Bag Implication)
forall (m :: * -> *) a. Monad m => a -> m a
return ([TyVar]
ids, [LHsBind GhcTc] -> LHsBinds GhcTc
forall a. [a] -> Bag a
listToBag [LHsBind GhcTc]
binds, [Implication] -> Bag Implication
forall a. [a] -> Bag a
listToBag ([Maybe Implication] -> [Implication]
forall a. [Maybe a] -> [a]
catMaybes [Maybe Implication]
mb_implics)) }
where
set_exts :: [LangExt.Extension] -> TcM a -> TcM a
set_exts :: [Extension] -> TcM a -> TcM a
set_exts es :: [Extension]
es thing :: TcM a
thing = (Extension -> TcM a -> TcM a) -> TcM a -> [Extension] -> TcM a
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr Extension -> TcM a -> TcM a
forall gbl lcl a. Extension -> TcRnIf gbl lcl a -> TcRnIf gbl lcl a
setXOptM TcM a
thing [Extension]
es
unset_warnings_deriving :: TcM a -> TcM a
unset_warnings_deriving :: TcM a -> TcM a
unset_warnings_deriving
| Bool
is_derived = WarningFlag -> TcM a -> TcM a
forall gbl lcl a.
WarningFlag -> TcRnIf gbl lcl a -> TcRnIf gbl lcl a
unsetWOptM WarningFlag
Opt_WarnInaccessibleCode
| Bool
otherwise = TcM a -> TcM a
forall a. a -> a
id
hs_sig_fn :: HsSigFun
hs_sig_fn = [LSig GhcRn] -> HsSigFun
mkHsSigFun [LSig GhcRn]
sigs
inst_loc :: SrcSpan
inst_loc = TyVar -> SrcSpan
forall a. NamedThing a => a -> SrcSpan
getSrcSpan TyVar
dfun_id
tc_item :: ClassOpItem -> TcM (Id, LHsBind GhcTc, Maybe Implication)
tc_item :: ClassOpItem
-> IOEnv
(Env TcGblEnv TcLclEnv) (TyVar, LHsBind GhcTc, Maybe Implication)
tc_item (sel_id :: TyVar
sel_id, dm_info :: DefMethInfo
dm_info)
| Just (user_bind :: LHsBind GhcRn
user_bind, bndr_loc :: SrcSpan
bndr_loc, prags :: [LSig GhcRn]
prags) <- Name
-> LHsBinds GhcRn
-> TcPragEnv
-> Maybe (LHsBind GhcRn, SrcSpan, [LSig GhcRn])
findMethodBind (TyVar -> Name
idName TyVar
sel_id) LHsBinds GhcRn
binds TcPragEnv
prag_fn
= Class
-> [TyVar]
-> [TyVar]
-> [Type]
-> TcEvBinds
-> Bool
-> HsSigFun
-> [Located TcSpecPrag]
-> [LSig GhcRn]
-> TyVar
-> LHsBind GhcRn
-> SrcSpan
-> IOEnv
(Env TcGblEnv TcLclEnv) (TyVar, LHsBind GhcTc, Maybe Implication)
tcMethodBody Class
clas [TyVar]
tyvars [TyVar]
dfun_ev_vars [Type]
inst_tys
TcEvBinds
dfun_ev_binds Bool
is_derived HsSigFun
hs_sig_fn
[Located TcSpecPrag]
spec_inst_prags [LSig GhcRn]
prags
TyVar
sel_id LHsBind GhcRn
user_bind SrcSpan
bndr_loc
| Bool
otherwise
= do { String -> SDoc -> TcRn ()
traceTc "tc_def" (TyVar -> SDoc
forall a. Outputable a => a -> SDoc
ppr TyVar
sel_id)
; TyVar
-> DefMethInfo
-> IOEnv
(Env TcGblEnv TcLclEnv) (TyVar, LHsBind GhcTc, Maybe Implication)
tc_default TyVar
sel_id DefMethInfo
dm_info }
tc_default :: Id -> DefMethInfo
-> TcM (TcId, LHsBind GhcTc, Maybe Implication)
tc_default :: TyVar
-> DefMethInfo
-> IOEnv
(Env TcGblEnv TcLclEnv) (TyVar, LHsBind GhcTc, Maybe Implication)
tc_default sel_id :: TyVar
sel_id (Just (dm_name :: Name
dm_name, _))
= do { (meth_bind :: LHsBind GhcRn
meth_bind, inline_prags :: [LSig GhcRn]
inline_prags) <- Class
-> [Type] -> TyVar -> Name -> TcM (LHsBind GhcRn, [LSig GhcRn])
mkDefMethBind Class
clas [Type]
inst_tys TyVar
sel_id Name
dm_name
; Class
-> [TyVar]
-> [TyVar]
-> [Type]
-> TcEvBinds
-> Bool
-> HsSigFun
-> [Located TcSpecPrag]
-> [LSig GhcRn]
-> TyVar
-> LHsBind GhcRn
-> SrcSpan
-> IOEnv
(Env TcGblEnv TcLclEnv) (TyVar, LHsBind GhcTc, Maybe Implication)
tcMethodBody Class
clas [TyVar]
tyvars [TyVar]
dfun_ev_vars [Type]
inst_tys
TcEvBinds
dfun_ev_binds Bool
is_derived HsSigFun
hs_sig_fn
[Located TcSpecPrag]
spec_inst_prags [LSig GhcRn]
inline_prags
TyVar
sel_id LHsBind GhcRn
meth_bind SrcSpan
inst_loc }
tc_default sel_id :: TyVar
sel_id Nothing
= do { String -> SDoc -> TcRn ()
traceTc "tc_def: warn" (TyVar -> SDoc
forall a. Outputable a => a -> SDoc
ppr TyVar
sel_id)
; (meth_id :: TyVar
meth_id, _) <- Class
-> [TyVar] -> [TyVar] -> [Type] -> TyVar -> TcM (TyVar, TyVar)
mkMethIds Class
clas [TyVar]
tyvars [TyVar]
dfun_ev_vars
[Type]
inst_tys TyVar
sel_id
; DynFlags
dflags <- IOEnv (Env TcGblEnv TcLclEnv) DynFlags
forall (m :: * -> *). HasDynFlags m => m DynFlags
getDynFlags
; let meth_bind :: LHsBind GhcTc
meth_bind = IdP GhcTc -> LHsExpr GhcTc -> LHsBind GhcTc
forall (p :: Pass).
IdP (GhcPass p) -> LHsExpr (GhcPass p) -> LHsBind (GhcPass p)
mkVarBind TyVar
IdP GhcTc
meth_id (LHsExpr GhcTc -> LHsBind GhcTc) -> LHsExpr GhcTc -> LHsBind GhcTc
forall a b. (a -> b) -> a -> b
$
HsWrapper -> LHsExpr GhcTc -> LHsExpr GhcTc
forall (id :: Pass).
HsWrapper -> LHsExpr (GhcPass id) -> LHsExpr (GhcPass id)
mkLHsWrap HsWrapper
lam_wrapper (DynFlags -> LHsExpr GhcTc
error_rhs DynFlags
dflags)
; (TyVar, LHsBind GhcTc, Maybe Implication)
-> IOEnv
(Env TcGblEnv TcLclEnv) (TyVar, LHsBind GhcTc, Maybe Implication)
forall (m :: * -> *) a. Monad m => a -> m a
return (TyVar
meth_id, LHsBind GhcTc
meth_bind, Maybe Implication
forall a. Maybe a
Nothing) }
where
error_rhs :: DynFlags -> LHsExpr GhcTc
error_rhs dflags :: DynFlags
dflags = SrcSpan -> HsExpr GhcTc -> LHsExpr GhcTc
forall l e. l -> e -> GenLocated l e
L SrcSpan
inst_loc (HsExpr GhcTc -> LHsExpr GhcTc) -> HsExpr GhcTc -> LHsExpr GhcTc
forall a b. (a -> b) -> a -> b
$ XApp GhcTc -> LHsExpr GhcTc -> LHsExpr GhcTc -> HsExpr GhcTc
forall p. XApp p -> LHsExpr p -> LHsExpr p -> HsExpr p
HsApp XApp GhcTc
NoExt
noExt LHsExpr GhcTc
error_fun (DynFlags -> LHsExpr GhcTc
error_msg DynFlags
dflags)
error_fun :: LHsExpr GhcTc
error_fun = SrcSpan -> HsExpr GhcTc -> LHsExpr GhcTc
forall l e. l -> e -> GenLocated l e
L SrcSpan
inst_loc (HsExpr GhcTc -> LHsExpr GhcTc) -> HsExpr GhcTc -> LHsExpr GhcTc
forall a b. (a -> b) -> a -> b
$
HsWrapper -> IdP GhcTc -> HsExpr GhcTc
forall (id :: Pass).
HsWrapper -> IdP (GhcPass id) -> HsExpr (GhcPass id)
wrapId ([Type] -> HsWrapper
mkWpTyApps
[ HasDebugCallStack => Type -> Type
Type -> Type
getRuntimeRep Type
meth_tau, Type
meth_tau])
TyVar
IdP GhcTc
nO_METHOD_BINDING_ERROR_ID
error_msg :: DynFlags -> LHsExpr GhcTc
error_msg dflags :: DynFlags
dflags = SrcSpan -> HsExpr GhcTc -> LHsExpr GhcTc
forall l e. l -> e -> GenLocated l e
L SrcSpan
inst_loc (XLitE GhcTc -> HsLit GhcTc -> HsExpr GhcTc
forall p. XLitE p -> HsLit p -> HsExpr p
HsLit XLitE GhcTc
NoExt
noExt (XHsStringPrim GhcTc -> ByteString -> HsLit GhcTc
forall x. XHsStringPrim x -> ByteString -> HsLit x
HsStringPrim SourceText
XHsStringPrim GhcTc
NoSourceText
(String -> ByteString
unsafeMkByteString (DynFlags -> String
error_string DynFlags
dflags))))
meth_tau :: Type
meth_tau = Type -> Type
funResultTy (HasDebugCallStack => Type -> [Type] -> Type
Type -> [Type] -> Type
piResultTys (TyVar -> Type
idType TyVar
sel_id) [Type]
inst_tys)
error_string :: DynFlags -> String
error_string dflags :: DynFlags
dflags = DynFlags -> SDoc -> String
showSDoc DynFlags
dflags
([SDoc] -> SDoc
hcat [SrcSpan -> SDoc
forall a. Outputable a => a -> SDoc
ppr SrcSpan
inst_loc, SDoc
vbar, TyVar -> SDoc
forall a. Outputable a => a -> SDoc
ppr TyVar
sel_id ])
lam_wrapper :: HsWrapper
lam_wrapper = [TyVar] -> HsWrapper
mkWpTyLams [TyVar]
tyvars HsWrapper -> HsWrapper -> HsWrapper
<.> [TyVar] -> HsWrapper
mkWpLams [TyVar]
dfun_ev_vars
checkMinimalDefinition :: TcRn ()
checkMinimalDefinition
= Maybe (BooleanFormula Name)
-> (BooleanFormula Name -> TcRn ()) -> TcRn ()
forall (m :: * -> *) a. Monad m => Maybe a -> (a -> m ()) -> m ()
whenIsJust ((Name -> Bool)
-> BooleanFormula Name -> Maybe (BooleanFormula Name)
forall a.
Eq a =>
(a -> Bool) -> BooleanFormula a -> Maybe (BooleanFormula a)
isUnsatisfied Name -> Bool
methodExists (Class -> BooleanFormula Name
classMinimalDef Class
clas)) ((BooleanFormula Name -> TcRn ()) -> TcRn ())
-> (BooleanFormula Name -> TcRn ()) -> TcRn ()
forall a b. (a -> b) -> a -> b
$
BooleanFormula Name -> TcRn ()
warnUnsatisfiedMinimalDefinition
methodExists :: Name -> Bool
methodExists meth :: Name
meth = Maybe (LHsBind GhcRn, SrcSpan, [LSig GhcRn]) -> Bool
forall a. Maybe a -> Bool
isJust (Name
-> LHsBinds GhcRn
-> TcPragEnv
-> Maybe (LHsBind GhcRn, SrcSpan, [LSig GhcRn])
findMethodBind Name
meth LHsBinds GhcRn
binds TcPragEnv
prag_fn)
checkMethBindMembership :: TcRn ()
checkMethBindMembership
= (Name -> TcRn ()) -> [Name] -> TcRn ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ (SDoc -> TcRn ()
addErrTc (SDoc -> TcRn ()) -> (Name -> SDoc) -> Name -> TcRn ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Class -> Name -> SDoc
forall a. Outputable a => a -> Name -> SDoc
badMethodErr Class
clas) [Name]
mismatched_meths
where
bind_nms :: [Name]
bind_nms = (Located Name -> Name) -> [Located Name] -> [Name]
forall a b. (a -> b) -> [a] -> [b]
map Located Name -> Name
forall a. HasSrcSpan a => a -> SrcSpanLess a
unLoc ([Located Name] -> [Name]) -> [Located Name] -> [Name]
forall a b. (a -> b) -> a -> b
$ LHsBinds GhcRn -> [Located (IdP GhcRn)]
forall idL idR. LHsBindsLR idL idR -> [Located (IdP idL)]
collectMethodBinders LHsBinds GhcRn
binds
cls_meth_nms :: [Name]
cls_meth_nms = (ClassOpItem -> Name) -> [ClassOpItem] -> [Name]
forall a b. (a -> b) -> [a] -> [b]
map (TyVar -> Name
idName (TyVar -> Name) -> (ClassOpItem -> TyVar) -> ClassOpItem -> Name
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ClassOpItem -> TyVar
forall a b. (a, b) -> a
fst) [ClassOpItem]
op_items
mismatched_meths :: [Name]
mismatched_meths = [Name]
bind_nms [Name] -> [Name] -> [Name]
forall a. Ord a => [a] -> [a] -> [a]
`minusList` [Name]
cls_meth_nms
tcMethodBody :: Class -> [TcTyVar] -> [EvVar] -> [TcType]
-> TcEvBinds -> Bool
-> HsSigFun
-> [LTcSpecPrag] -> [LSig GhcRn]
-> Id -> LHsBind GhcRn -> SrcSpan
-> TcM (TcId, LHsBind GhcTc, Maybe Implication)
tcMethodBody :: Class
-> [TyVar]
-> [TyVar]
-> [Type]
-> TcEvBinds
-> Bool
-> HsSigFun
-> [Located TcSpecPrag]
-> [LSig GhcRn]
-> TyVar
-> LHsBind GhcRn
-> SrcSpan
-> IOEnv
(Env TcGblEnv TcLclEnv) (TyVar, LHsBind GhcTc, Maybe Implication)
tcMethodBody clas :: Class
clas tyvars :: [TyVar]
tyvars dfun_ev_vars :: [TyVar]
dfun_ev_vars inst_tys :: [Type]
inst_tys
dfun_ev_binds :: TcEvBinds
dfun_ev_binds is_derived :: Bool
is_derived
sig_fn :: HsSigFun
sig_fn spec_inst_prags :: [Located TcSpecPrag]
spec_inst_prags prags :: [LSig GhcRn]
prags
sel_id :: TyVar
sel_id (L bind_loc :: SrcSpan
bind_loc meth_bind :: HsBindLR GhcRn GhcRn
meth_bind) bndr_loc :: SrcSpan
bndr_loc
= IOEnv
(Env TcGblEnv TcLclEnv) (TyVar, LHsBind GhcTc, Maybe Implication)
-> IOEnv
(Env TcGblEnv TcLclEnv) (TyVar, LHsBind GhcTc, Maybe Implication)
add_meth_ctxt (IOEnv
(Env TcGblEnv TcLclEnv) (TyVar, LHsBind GhcTc, Maybe Implication)
-> IOEnv
(Env TcGblEnv TcLclEnv) (TyVar, LHsBind GhcTc, Maybe Implication))
-> IOEnv
(Env TcGblEnv TcLclEnv) (TyVar, LHsBind GhcTc, Maybe Implication)
-> IOEnv
(Env TcGblEnv TcLclEnv) (TyVar, LHsBind GhcTc, Maybe Implication)
forall a b. (a -> b) -> a -> b
$
do { String -> SDoc -> TcRn ()
traceTc "tcMethodBody" (TyVar -> SDoc
forall a. Outputable a => a -> SDoc
ppr TyVar
sel_id SDoc -> SDoc -> SDoc
<+> Type -> SDoc
forall a. Outputable a => a -> SDoc
ppr (TyVar -> Type
idType TyVar
sel_id) SDoc -> SDoc -> SDoc
$$ SrcSpan -> SDoc
forall a. Outputable a => a -> SDoc
ppr SrcSpan
bndr_loc)
; (global_meth_id :: TyVar
global_meth_id, local_meth_id :: TyVar
local_meth_id) <- SrcSpan -> TcM (TyVar, TyVar) -> TcM (TyVar, TyVar)
forall a. SrcSpan -> TcRn a -> TcRn a
setSrcSpan SrcSpan
bndr_loc (TcM (TyVar, TyVar) -> TcM (TyVar, TyVar))
-> TcM (TyVar, TyVar) -> TcM (TyVar, TyVar)
forall a b. (a -> b) -> a -> b
$
Class
-> [TyVar] -> [TyVar] -> [Type] -> TyVar -> TcM (TyVar, TyVar)
mkMethIds Class
clas [TyVar]
tyvars [TyVar]
dfun_ev_vars
[Type]
inst_tys TyVar
sel_id
; let lm_bind :: HsBindLR GhcRn GhcRn
lm_bind = HsBindLR GhcRn GhcRn
meth_bind { fun_id :: Located (IdP GhcRn)
fun_id = SrcSpan -> Name -> Located Name
forall l e. l -> e -> GenLocated l e
L SrcSpan
bndr_loc (TyVar -> Name
idName TyVar
local_meth_id) }
; (meth_implic :: Implication
meth_implic, ev_binds_var :: EvBindsVar
ev_binds_var, tc_bind :: LHsBinds GhcTc
tc_bind)
<- TcM (LHsBinds GhcTc)
-> TcM (Implication, EvBindsVar, LHsBinds GhcTc)
forall result. TcM result -> TcM (Implication, EvBindsVar, result)
checkInstConstraints (TcM (LHsBinds GhcTc)
-> TcM (Implication, EvBindsVar, LHsBinds GhcTc))
-> TcM (LHsBinds GhcTc)
-> TcM (Implication, EvBindsVar, LHsBinds GhcTc)
forall a b. (a -> b) -> a -> b
$
HsSigFun -> TyVar -> TyVar -> LHsBind GhcRn -> TcM (LHsBinds GhcTc)
tcMethodBodyHelp HsSigFun
sig_fn TyVar
sel_id TyVar
local_meth_id (SrcSpan -> HsBindLR GhcRn GhcRn -> LHsBind GhcRn
forall l e. l -> e -> GenLocated l e
L SrcSpan
bind_loc HsBindLR GhcRn GhcRn
lm_bind)
; TyVar
global_meth_id <- TyVar -> [LSig GhcRn] -> TcM TyVar
addInlinePrags TyVar
global_meth_id [LSig GhcRn]
prags
; [Located TcSpecPrag]
spec_prags <- TyVar -> [LSig GhcRn] -> TcM [Located TcSpecPrag]
tcSpecPrags TyVar
global_meth_id [LSig GhcRn]
prags
; let specs :: TcSpecPrags
specs = TyVar
-> [Located TcSpecPrag] -> [Located TcSpecPrag] -> TcSpecPrags
mk_meth_spec_prags TyVar
global_meth_id [Located TcSpecPrag]
spec_inst_prags [Located TcSpecPrag]
spec_prags
export :: ABExport GhcTc
export = ABE :: forall p.
XABE p -> IdP p -> IdP p -> HsWrapper -> TcSpecPrags -> ABExport p
ABE { abe_ext :: XABE GhcTc
abe_ext = XABE GhcTc
NoExt
noExt
, abe_poly :: IdP GhcTc
abe_poly = TyVar
IdP GhcTc
global_meth_id
, abe_mono :: IdP GhcTc
abe_mono = TyVar
IdP GhcTc
local_meth_id
, abe_wrap :: HsWrapper
abe_wrap = HsWrapper
idHsWrapper
, abe_prags :: TcSpecPrags
abe_prags = TcSpecPrags
specs }
local_ev_binds :: TcEvBinds
local_ev_binds = EvBindsVar -> TcEvBinds
TcEvBinds EvBindsVar
ev_binds_var
full_bind :: HsBindLR GhcTc GhcTc
full_bind = AbsBinds :: forall idL idR.
XAbsBinds idL idR
-> [TyVar]
-> [TyVar]
-> [ABExport idL]
-> [TcEvBinds]
-> LHsBinds idL
-> Bool
-> HsBindLR idL idR
AbsBinds { abs_ext :: XAbsBinds GhcTc GhcTc
abs_ext = XAbsBinds GhcTc GhcTc
NoExt
noExt
, abs_tvs :: [TyVar]
abs_tvs = [TyVar]
tyvars
, abs_ev_vars :: [TyVar]
abs_ev_vars = [TyVar]
dfun_ev_vars
, abs_exports :: [ABExport GhcTc]
abs_exports = [ABExport GhcTc
export]
, abs_ev_binds :: [TcEvBinds]
abs_ev_binds = [TcEvBinds
dfun_ev_binds, TcEvBinds
local_ev_binds]
, abs_binds :: LHsBinds GhcTc
abs_binds = LHsBinds GhcTc
tc_bind
, abs_sig :: Bool
abs_sig = Bool
True }
; (TyVar, LHsBind GhcTc, Maybe Implication)
-> IOEnv
(Env TcGblEnv TcLclEnv) (TyVar, LHsBind GhcTc, Maybe Implication)
forall (m :: * -> *) a. Monad m => a -> m a
return (TyVar
global_meth_id, SrcSpan -> HsBindLR GhcTc GhcTc -> LHsBind GhcTc
forall l e. l -> e -> GenLocated l e
L SrcSpan
bind_loc HsBindLR GhcTc GhcTc
full_bind, Implication -> Maybe Implication
forall a. a -> Maybe a
Just Implication
meth_implic) }
where
add_meth_ctxt :: IOEnv
(Env TcGblEnv TcLclEnv) (TyVar, LHsBind GhcTc, Maybe Implication)
-> IOEnv
(Env TcGblEnv TcLclEnv) (TyVar, LHsBind GhcTc, Maybe Implication)
add_meth_ctxt thing :: IOEnv
(Env TcGblEnv TcLclEnv) (TyVar, LHsBind GhcTc, Maybe Implication)
thing
| Bool
is_derived = SDoc
-> IOEnv
(Env TcGblEnv TcLclEnv) (TyVar, LHsBind GhcTc, Maybe Implication)
-> IOEnv
(Env TcGblEnv TcLclEnv) (TyVar, LHsBind GhcTc, Maybe Implication)
forall a. SDoc -> TcM a -> TcM a
addLandmarkErrCtxt (TyVar -> Class -> [Type] -> SDoc
derivBindCtxt TyVar
sel_id Class
clas [Type]
inst_tys) IOEnv
(Env TcGblEnv TcLclEnv) (TyVar, LHsBind GhcTc, Maybe Implication)
thing
| Bool
otherwise = IOEnv
(Env TcGblEnv TcLclEnv) (TyVar, LHsBind GhcTc, Maybe Implication)
thing
tcMethodBodyHelp :: HsSigFun -> Id -> TcId
-> LHsBind GhcRn -> TcM (LHsBinds GhcTcId)
tcMethodBodyHelp :: HsSigFun -> TyVar -> TyVar -> LHsBind GhcRn -> TcM (LHsBinds GhcTc)
tcMethodBodyHelp hs_sig_fn :: HsSigFun
hs_sig_fn sel_id :: TyVar
sel_id local_meth_id :: TyVar
local_meth_id meth_bind :: LHsBind GhcRn
meth_bind
| Just hs_sig_ty :: LHsSigType GhcRn
hs_sig_ty <- HsSigFun
hs_sig_fn Name
sel_name
= do { let ctxt :: UserTypeCtxt
ctxt = Name -> Bool -> UserTypeCtxt
FunSigCtxt Name
sel_name Bool
True
; (sig_ty :: Type
sig_ty, hs_wrap :: HsWrapper
hs_wrap)
<- SrcSpan -> TcRn (Type, HsWrapper) -> TcRn (Type, HsWrapper)
forall a. SrcSpan -> TcRn a -> TcRn a
setSrcSpan (LHsType GhcRn -> SrcSpan
forall a. HasSrcSpan a => a -> SrcSpan
getLoc (LHsSigType GhcRn -> LHsType GhcRn
forall pass. LHsSigType pass -> LHsType pass
hsSigType LHsSigType GhcRn
hs_sig_ty)) (TcRn (Type, HsWrapper) -> TcRn (Type, HsWrapper))
-> TcRn (Type, HsWrapper) -> TcRn (Type, HsWrapper)
forall a b. (a -> b) -> a -> b
$
do { Bool
inst_sigs <- Extension -> TcRn Bool
forall gbl lcl. Extension -> TcRnIf gbl lcl Bool
xoptM Extension
LangExt.InstanceSigs
; Bool -> SDoc -> TcRn ()
checkTc Bool
inst_sigs (Name -> LHsSigType GhcRn -> SDoc
misplacedInstSig Name
sel_name LHsSigType GhcRn
hs_sig_ty)
; Type
sig_ty <- UserTypeCtxt -> LHsSigType GhcRn -> TcM Type
tcHsSigType (Name -> Bool -> UserTypeCtxt
FunSigCtxt Name
sel_name Bool
False) LHsSigType GhcRn
hs_sig_ty
; let local_meth_ty :: Type
local_meth_ty = TyVar -> Type
idType TyVar
local_meth_id
; HsWrapper
hs_wrap <- (TidyEnv -> TcM (TidyEnv, SDoc)) -> TcM HsWrapper -> TcM HsWrapper
forall a. (TidyEnv -> TcM (TidyEnv, SDoc)) -> TcM a -> TcM a
addErrCtxtM (Name -> Type -> Type -> TidyEnv -> TcM (TidyEnv, SDoc)
methSigCtxt Name
sel_name Type
sig_ty Type
local_meth_ty) (TcM HsWrapper -> TcM HsWrapper) -> TcM HsWrapper -> TcM HsWrapper
forall a b. (a -> b) -> a -> b
$
UserTypeCtxt -> Type -> Type -> TcM HsWrapper
tcSubType_NC UserTypeCtxt
ctxt Type
sig_ty Type
local_meth_ty
; (Type, HsWrapper) -> TcRn (Type, HsWrapper)
forall (m :: * -> *) a. Monad m => a -> m a
return (Type
sig_ty, HsWrapper
hs_wrap) }
; Name
inner_meth_name <- OccName -> TcM Name
newName (Name -> OccName
nameOccName Name
sel_name)
; let inner_meth_id :: TyVar
inner_meth_id = Name -> Type -> TyVar
mkLocalId Name
inner_meth_name Type
sig_ty
inner_meth_sig :: TcIdSigInfo
inner_meth_sig = CompleteSig :: TyVar -> UserTypeCtxt -> SrcSpan -> TcIdSigInfo
CompleteSig { sig_bndr :: TyVar
sig_bndr = TyVar
inner_meth_id
, sig_ctxt :: UserTypeCtxt
sig_ctxt = UserTypeCtxt
ctxt
, sig_loc :: SrcSpan
sig_loc = LHsType GhcRn -> SrcSpan
forall a. HasSrcSpan a => a -> SrcSpan
getLoc (LHsSigType GhcRn -> LHsType GhcRn
forall pass. LHsSigType pass -> LHsType pass
hsSigType LHsSigType GhcRn
hs_sig_ty) }
; (tc_bind :: LHsBinds GhcTc
tc_bind, [inner_id :: TyVar
inner_id]) <- TcPragEnv
-> TcIdSigInfo -> LHsBind GhcRn -> TcM (LHsBinds GhcTc, [TyVar])
tcPolyCheck TcPragEnv
no_prag_fn TcIdSigInfo
inner_meth_sig LHsBind GhcRn
meth_bind
; let export :: ABExport GhcTc
export = ABE :: forall p.
XABE p -> IdP p -> IdP p -> HsWrapper -> TcSpecPrags -> ABExport p
ABE { abe_ext :: XABE GhcTc
abe_ext = XABE GhcTc
NoExt
noExt
, abe_poly :: IdP GhcTc
abe_poly = TyVar
IdP GhcTc
local_meth_id
, abe_mono :: IdP GhcTc
abe_mono = TyVar
IdP GhcTc
inner_id
, abe_wrap :: HsWrapper
abe_wrap = HsWrapper
hs_wrap
, abe_prags :: TcSpecPrags
abe_prags = TcSpecPrags
noSpecPrags }
; LHsBinds GhcTc -> TcM (LHsBinds GhcTc)
forall (m :: * -> *) a. Monad m => a -> m a
return (LHsBind GhcTc -> LHsBinds GhcTc
forall a. a -> Bag a
unitBag (LHsBind GhcTc -> LHsBinds GhcTc)
-> LHsBind GhcTc -> LHsBinds GhcTc
forall a b. (a -> b) -> a -> b
$ SrcSpan -> HsBindLR GhcTc GhcTc -> LHsBind GhcTc
forall l e. l -> e -> GenLocated l e
L (LHsBind GhcRn -> SrcSpan
forall a. HasSrcSpan a => a -> SrcSpan
getLoc LHsBind GhcRn
meth_bind) (HsBindLR GhcTc GhcTc -> LHsBind GhcTc)
-> HsBindLR GhcTc GhcTc -> LHsBind GhcTc
forall a b. (a -> b) -> a -> b
$
AbsBinds :: forall idL idR.
XAbsBinds idL idR
-> [TyVar]
-> [TyVar]
-> [ABExport idL]
-> [TcEvBinds]
-> LHsBinds idL
-> Bool
-> HsBindLR idL idR
AbsBinds { abs_ext :: XAbsBinds GhcTc GhcTc
abs_ext = XAbsBinds GhcTc GhcTc
NoExt
noExt, abs_tvs :: [TyVar]
abs_tvs = [], abs_ev_vars :: [TyVar]
abs_ev_vars = []
, abs_exports :: [ABExport GhcTc]
abs_exports = [ABExport GhcTc
export]
, abs_binds :: LHsBinds GhcTc
abs_binds = LHsBinds GhcTc
tc_bind, abs_ev_binds :: [TcEvBinds]
abs_ev_binds = []
, abs_sig :: Bool
abs_sig = Bool
True }) }
| Bool
otherwise
= do { let ctxt :: UserTypeCtxt
ctxt = Name -> Bool -> UserTypeCtxt
FunSigCtxt Name
sel_name Bool
False
tc_sig :: TcIdSigInfo
tc_sig = UserTypeCtxt -> TyVar -> TcIdSigInfo
completeSigFromId UserTypeCtxt
ctxt TyVar
local_meth_id
; (tc_bind :: LHsBinds GhcTc
tc_bind, _) <- TcPragEnv
-> TcIdSigInfo -> LHsBind GhcRn -> TcM (LHsBinds GhcTc, [TyVar])
tcPolyCheck TcPragEnv
no_prag_fn TcIdSigInfo
tc_sig LHsBind GhcRn
meth_bind
; LHsBinds GhcTc -> TcM (LHsBinds GhcTc)
forall (m :: * -> *) a. Monad m => a -> m a
return LHsBinds GhcTc
tc_bind }
where
sel_name :: Name
sel_name = TyVar -> Name
idName TyVar
sel_id
no_prag_fn :: TcPragEnv
no_prag_fn = TcPragEnv
emptyPragEnv
mkMethIds :: Class -> [TcTyVar] -> [EvVar]
-> [TcType] -> Id -> TcM (TcId, TcId)
mkMethIds :: Class
-> [TyVar] -> [TyVar] -> [Type] -> TyVar -> TcM (TyVar, TyVar)
mkMethIds clas :: Class
clas tyvars :: [TyVar]
tyvars dfun_ev_vars :: [TyVar]
dfun_ev_vars inst_tys :: [Type]
inst_tys sel_id :: TyVar
sel_id
= do { Name
poly_meth_name <- OccName -> TcM Name
newName (OccName -> OccName
mkClassOpAuxOcc OccName
sel_occ)
; Name
local_meth_name <- OccName -> TcM Name
newName OccName
sel_occ
; let poly_meth_id :: TyVar
poly_meth_id = Name -> Type -> TyVar
mkLocalId Name
poly_meth_name Type
poly_meth_ty
local_meth_id :: TyVar
local_meth_id = Name -> Type -> TyVar
mkLocalId Name
local_meth_name Type
local_meth_ty
; (TyVar, TyVar) -> TcM (TyVar, TyVar)
forall (m :: * -> *) a. Monad m => a -> m a
return (TyVar
poly_meth_id, TyVar
local_meth_id) }
where
sel_name :: Name
sel_name = TyVar -> Name
idName TyVar
sel_id
sel_occ :: OccName
sel_occ = Name -> OccName
nameOccName Name
sel_name
local_meth_ty :: Type
local_meth_ty = Class -> TyVar -> [Type] -> Type
instantiateMethod Class
clas TyVar
sel_id [Type]
inst_tys
poly_meth_ty :: Type
poly_meth_ty = [TyVar] -> [Type] -> Type -> Type
mkSpecSigmaTy [TyVar]
tyvars [Type]
theta Type
local_meth_ty
theta :: [Type]
theta = (TyVar -> Type) -> [TyVar] -> [Type]
forall a b. (a -> b) -> [a] -> [b]
map TyVar -> Type
idType [TyVar]
dfun_ev_vars
methSigCtxt :: Name -> TcType -> TcType -> TidyEnv -> TcM (TidyEnv, MsgDoc)
methSigCtxt :: Name -> Type -> Type -> TidyEnv -> TcM (TidyEnv, SDoc)
methSigCtxt sel_name :: Name
sel_name sig_ty :: Type
sig_ty meth_ty :: Type
meth_ty env0 :: TidyEnv
env0
= do { (env1 :: TidyEnv
env1, sig_ty :: Type
sig_ty) <- TidyEnv -> Type -> TcM (TidyEnv, Type)
zonkTidyTcType TidyEnv
env0 Type
sig_ty
; (env2 :: TidyEnv
env2, meth_ty :: Type
meth_ty) <- TidyEnv -> Type -> TcM (TidyEnv, Type)
zonkTidyTcType TidyEnv
env1 Type
meth_ty
; let msg :: SDoc
msg = SDoc -> Int -> SDoc -> SDoc
hang (String -> SDoc
text "When checking that instance signature for" SDoc -> SDoc -> SDoc
<+> SDoc -> SDoc
quotes (Name -> SDoc
forall a. Outputable a => a -> SDoc
ppr Name
sel_name))
2 ([SDoc] -> SDoc
vcat [ String -> SDoc
text "is more general than its signature in the class"
, String -> SDoc
text "Instance sig:" SDoc -> SDoc -> SDoc
<+> Type -> SDoc
forall a. Outputable a => a -> SDoc
ppr Type
sig_ty
, String -> SDoc
text " Class sig:" SDoc -> SDoc -> SDoc
<+> Type -> SDoc
forall a. Outputable a => a -> SDoc
ppr Type
meth_ty ])
; (TidyEnv, SDoc) -> TcM (TidyEnv, SDoc)
forall (m :: * -> *) a. Monad m => a -> m a
return (TidyEnv
env2, SDoc
msg) }
misplacedInstSig :: Name -> LHsSigType GhcRn -> SDoc
misplacedInstSig :: Name -> LHsSigType GhcRn -> SDoc
misplacedInstSig name :: Name
name hs_ty :: LHsSigType GhcRn
hs_ty
= [SDoc] -> SDoc
vcat [ SDoc -> Int -> SDoc -> SDoc
hang (String -> SDoc
text "Illegal type signature in instance declaration:")
2 (SDoc -> Int -> SDoc -> SDoc
hang (Name -> SDoc
forall a. NamedThing a => a -> SDoc
pprPrefixName Name
name)
2 (SDoc
dcolon SDoc -> SDoc -> SDoc
<+> LHsSigType GhcRn -> SDoc
forall a. Outputable a => a -> SDoc
ppr LHsSigType GhcRn
hs_ty))
, String -> SDoc
text "(Use InstanceSigs to allow this)" ]
mk_meth_spec_prags :: Id -> [LTcSpecPrag] -> [LTcSpecPrag] -> TcSpecPrags
mk_meth_spec_prags :: TyVar
-> [Located TcSpecPrag] -> [Located TcSpecPrag] -> TcSpecPrags
mk_meth_spec_prags meth_id :: TyVar
meth_id spec_inst_prags :: [Located TcSpecPrag]
spec_inst_prags spec_prags_for_me :: [Located TcSpecPrag]
spec_prags_for_me
= [Located TcSpecPrag] -> TcSpecPrags
SpecPrags ([Located TcSpecPrag]
spec_prags_for_me [Located TcSpecPrag]
-> [Located TcSpecPrag] -> [Located TcSpecPrag]
forall a. [a] -> [a] -> [a]
++ [Located TcSpecPrag]
spec_prags_from_inst)
where
spec_prags_from_inst :: [Located TcSpecPrag]
spec_prags_from_inst
| InlinePragma -> Bool
isInlinePragma (TyVar -> InlinePragma
idInlinePragma TyVar
meth_id)
= []
| Bool
otherwise
= [ SrcSpan -> TcSpecPrag -> Located TcSpecPrag
forall l e. l -> e -> GenLocated l e
L SrcSpan
inst_loc (TyVar -> HsWrapper -> InlinePragma -> TcSpecPrag
SpecPrag TyVar
meth_id HsWrapper
wrap InlinePragma
inl)
| L inst_loc :: SrcSpan
inst_loc (SpecPrag _ wrap :: HsWrapper
wrap inl :: InlinePragma
inl) <- [Located TcSpecPrag]
spec_inst_prags]
mkDefMethBind :: Class -> [Type] -> Id -> Name
-> TcM (LHsBind GhcRn, [LSig GhcRn])
mkDefMethBind :: Class
-> [Type] -> TyVar -> Name -> TcM (LHsBind GhcRn, [LSig GhcRn])
mkDefMethBind clas :: Class
clas inst_tys :: [Type]
inst_tys sel_id :: TyVar
sel_id dm_name :: Name
dm_name
= do { DynFlags
dflags <- IOEnv (Env TcGblEnv TcLclEnv) DynFlags
forall (m :: * -> *). HasDynFlags m => m DynFlags
getDynFlags
; TyVar
dm_id <- Name -> TcM TyVar
tcLookupId Name
dm_name
; let inline_prag :: InlinePragma
inline_prag = TyVar -> InlinePragma
idInlinePragma TyVar
dm_id
inline_prags :: [LSig GhcRn]
inline_prags | InlinePragma -> Bool
isAnyInlinePragma InlinePragma
inline_prag
= [SrcSpanLess (LSig GhcRn) -> LSig GhcRn
forall a. HasSrcSpan a => SrcSpanLess a -> a
noLoc (XInlineSig GhcRn
-> Located (IdP GhcRn) -> InlinePragma -> Sig GhcRn
forall pass.
XInlineSig pass -> Located (IdP pass) -> InlinePragma -> Sig pass
InlineSig XInlineSig GhcRn
NoExt
noExt Located Name
Located (IdP GhcRn)
fn InlinePragma
inline_prag)]
| Bool
otherwise
= []
fn :: Located Name
fn = SrcSpanLess (Located Name) -> Located Name
forall a. HasSrcSpan a => SrcSpanLess a -> a
noLoc (TyVar -> Name
idName TyVar
sel_id)
visible_inst_tys :: [Type]
visible_inst_tys = [ Type
ty | (tcb :: TyConBinder
tcb, ty :: Type
ty) <- TyCon -> [TyConBinder]
tyConBinders (Class -> TyCon
classTyCon Class
clas) [TyConBinder] -> [Type] -> [(TyConBinder, Type)]
forall a b. [a] -> [b] -> [(a, b)]
`zip` [Type]
inst_tys
, TyConBinder -> ArgFlag
tyConBinderArgFlag TyConBinder
tcb ArgFlag -> ArgFlag -> Bool
forall a. Eq a => a -> a -> Bool
/= ArgFlag
Inferred ]
rhs :: LHsExpr GhcRn
rhs = (LHsExpr GhcRn -> Type -> LHsExpr GhcRn)
-> LHsExpr GhcRn -> [Type] -> LHsExpr GhcRn
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl' LHsExpr GhcRn -> Type -> LHsExpr GhcRn
mk_vta (IdP GhcRn -> LHsExpr GhcRn
forall (id :: Pass). IdP (GhcPass id) -> LHsExpr (GhcPass id)
nlHsVar Name
IdP GhcRn
dm_name) [Type]
visible_inst_tys
bind :: LHsBind GhcRn
bind = SrcSpanLess (LHsBind GhcRn) -> LHsBind GhcRn
forall a. HasSrcSpan a => SrcSpanLess a -> a
noLoc (SrcSpanLess (LHsBind GhcRn) -> LHsBind GhcRn)
-> SrcSpanLess (LHsBind GhcRn) -> LHsBind GhcRn
forall a b. (a -> b) -> a -> b
$ Origin
-> Located Name
-> [LMatch GhcRn (LHsExpr GhcRn)]
-> HsBindLR GhcRn GhcRn
mkTopFunBind Origin
Generated Located Name
fn ([LMatch GhcRn (LHsExpr GhcRn)] -> SrcSpanLess (LHsBind GhcRn))
-> [LMatch GhcRn (LHsExpr GhcRn)] -> SrcSpanLess (LHsBind GhcRn)
forall a b. (a -> b) -> a -> b
$
[HsMatchContext (NameOrRdrName (IdP GhcRn))
-> [LPat GhcRn] -> LHsExpr GhcRn -> LMatch GhcRn (LHsExpr GhcRn)
forall (p :: Pass) (body :: * -> *).
HsMatchContext (NameOrRdrName (IdP (GhcPass p)))
-> [LPat (GhcPass p)]
-> Located (body (GhcPass p))
-> LMatch (GhcPass p) (Located (body (GhcPass p)))
mkSimpleMatch (Located Name -> HsMatchContext Name
forall id. Located id -> HsMatchContext id
mkPrefixFunRhs Located Name
fn) [] LHsExpr GhcRn
rhs]
; IO () -> TcRn ()
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (DynFlags -> DumpFlag -> String -> SDoc -> IO ()
dumpIfSet_dyn DynFlags
dflags DumpFlag
Opt_D_dump_deriv "Filling in method body"
([SDoc] -> SDoc
vcat [Class -> SDoc
forall a. Outputable a => a -> SDoc
ppr Class
clas SDoc -> SDoc -> SDoc
<+> [Type] -> SDoc
forall a. Outputable a => a -> SDoc
ppr [Type]
inst_tys,
Int -> SDoc -> SDoc
nest 2 (TyVar -> SDoc
forall a. Outputable a => a -> SDoc
ppr TyVar
sel_id SDoc -> SDoc -> SDoc
<+> SDoc
equals SDoc -> SDoc -> SDoc
<+> LHsExpr GhcRn -> SDoc
forall a. Outputable a => a -> SDoc
ppr LHsExpr GhcRn
rhs)]))
; (LHsBind GhcRn, [LSig GhcRn]) -> TcM (LHsBind GhcRn, [LSig GhcRn])
forall (m :: * -> *) a. Monad m => a -> m a
return (LHsBind GhcRn
bind, [LSig GhcRn]
inline_prags) }
where
mk_vta :: LHsExpr GhcRn -> Type -> LHsExpr GhcRn
mk_vta :: LHsExpr GhcRn -> Type -> LHsExpr GhcRn
mk_vta fun :: LHsExpr GhcRn
fun ty :: Type
ty = SrcSpanLess (LHsExpr GhcRn) -> LHsExpr GhcRn
forall a. HasSrcSpan a => SrcSpanLess a -> a
noLoc (XAppTypeE GhcRn
-> LHsExpr GhcRn -> LHsWcType (NoGhcTc GhcRn) -> HsExpr GhcRn
forall p.
XAppTypeE p -> LHsExpr p -> LHsWcType (NoGhcTc p) -> HsExpr p
HsAppType XAppTypeE GhcRn
NoExt
noExt LHsExpr GhcRn
fun (LHsType GhcRn -> LHsWcType (NoGhcTc GhcRn)
forall thing. thing -> HsWildCardBndrs GhcRn thing
mkEmptyWildCardBndrs (LHsType GhcRn -> LHsWcType (NoGhcTc GhcRn))
-> LHsType GhcRn -> LHsWcType (NoGhcTc GhcRn)
forall a b. (a -> b) -> a -> b
$ LHsType GhcRn -> LHsType GhcRn
forall (p :: Pass). LHsType (GhcPass p) -> LHsType (GhcPass p)
nlHsParTy
(LHsType GhcRn -> LHsType GhcRn) -> LHsType GhcRn -> LHsType GhcRn
forall a b. (a -> b) -> a -> b
$ SrcSpanLess (LHsType GhcRn) -> LHsType GhcRn
forall a. HasSrcSpan a => SrcSpanLess a -> a
noLoc (SrcSpanLess (LHsType GhcRn) -> LHsType GhcRn)
-> SrcSpanLess (LHsType GhcRn) -> LHsType GhcRn
forall a b. (a -> b) -> a -> b
$ XXType GhcRn -> SrcSpanLess (LHsType GhcRn)
forall pass. XXType pass -> HsType pass
XHsType (XXType GhcRn -> SrcSpanLess (LHsType GhcRn))
-> XXType GhcRn -> SrcSpanLess (LHsType GhcRn)
forall a b. (a -> b) -> a -> b
$ Type -> NewHsTypeX
NHsCoreTy Type
ty))
derivBindCtxt :: Id -> Class -> [Type ] -> SDoc
derivBindCtxt :: TyVar -> Class -> [Type] -> SDoc
derivBindCtxt sel_id :: TyVar
sel_id clas :: Class
clas tys :: [Type]
tys
= [SDoc] -> SDoc
vcat [ String -> SDoc
text "When typechecking the code for" SDoc -> SDoc -> SDoc
<+> SDoc -> SDoc
quotes (TyVar -> SDoc
forall a. Outputable a => a -> SDoc
ppr TyVar
sel_id)
, Int -> SDoc -> SDoc
nest 2 (String -> SDoc
text "in a derived instance for"
SDoc -> SDoc -> SDoc
<+> SDoc -> SDoc
quotes (Class -> [Type] -> SDoc
pprClassPred Class
clas [Type]
tys) SDoc -> SDoc -> SDoc
<> SDoc
colon)
, Int -> SDoc -> SDoc
nest 2 (SDoc -> SDoc) -> SDoc -> SDoc
forall a b. (a -> b) -> a -> b
$ String -> SDoc
text "To see the code I am typechecking, use -ddump-deriv" ]
warnUnsatisfiedMinimalDefinition :: ClassMinimalDef -> TcM ()
warnUnsatisfiedMinimalDefinition :: BooleanFormula Name -> TcRn ()
warnUnsatisfiedMinimalDefinition mindef :: BooleanFormula Name
mindef
= do { Bool
warn <- WarningFlag -> TcRn Bool
forall gbl lcl. WarningFlag -> TcRnIf gbl lcl Bool
woptM WarningFlag
Opt_WarnMissingMethods
; WarnReason -> Bool -> SDoc -> TcRn ()
warnTc (WarningFlag -> WarnReason
Reason WarningFlag
Opt_WarnMissingMethods) Bool
warn SDoc
message
}
where
message :: SDoc
message = [SDoc] -> SDoc
vcat [String -> SDoc
text "No explicit implementation for"
,Int -> SDoc -> SDoc
nest 2 (SDoc -> SDoc) -> SDoc -> SDoc
forall a b. (a -> b) -> a -> b
$ BooleanFormula Name -> SDoc
forall a. Outputable a => BooleanFormula a -> SDoc
pprBooleanFormulaNice BooleanFormula Name
mindef
]
tcSpecInstPrags :: DFunId -> InstBindings GhcRn
-> TcM ([Located TcSpecPrag], TcPragEnv)
tcSpecInstPrags :: TyVar
-> InstBindings GhcRn -> TcM ([Located TcSpecPrag], TcPragEnv)
tcSpecInstPrags dfun_id :: TyVar
dfun_id (InstBindings { ib_binds :: forall a. InstBindings a -> LHsBinds a
ib_binds = LHsBinds GhcRn
binds, ib_pragmas :: forall a. InstBindings a -> [LSig a]
ib_pragmas = [LSig GhcRn]
uprags })
= do { [Located TcSpecPrag]
spec_inst_prags <- (LSig GhcRn -> IOEnv (Env TcGblEnv TcLclEnv) (Located TcSpecPrag))
-> [LSig GhcRn] -> TcM [Located TcSpecPrag]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM ((SrcSpanLess (LSig GhcRn)
-> TcM (SrcSpanLess (Located TcSpecPrag)))
-> LSig GhcRn -> IOEnv (Env TcGblEnv TcLclEnv) (Located TcSpecPrag)
forall a b.
(HasSrcSpan a, HasSrcSpan b) =>
(SrcSpanLess a -> TcM (SrcSpanLess b)) -> a -> TcM b
wrapLocM (TyVar -> Sig GhcRn -> TcM TcSpecPrag
tcSpecInst TyVar
dfun_id)) ([LSig GhcRn] -> TcM [Located TcSpecPrag])
-> [LSig GhcRn] -> TcM [Located TcSpecPrag]
forall a b. (a -> b) -> a -> b
$
(LSig GhcRn -> Bool) -> [LSig GhcRn] -> [LSig GhcRn]
forall a. (a -> Bool) -> [a] -> [a]
filter LSig GhcRn -> Bool
forall name. LSig name -> Bool
isSpecInstLSig [LSig GhcRn]
uprags
; ([Located TcSpecPrag], TcPragEnv)
-> TcM ([Located TcSpecPrag], TcPragEnv)
forall (m :: * -> *) a. Monad m => a -> m a
return ([Located TcSpecPrag]
spec_inst_prags, [LSig GhcRn] -> LHsBinds GhcRn -> TcPragEnv
mkPragEnv [LSig GhcRn]
uprags LHsBinds GhcRn
binds) }
tcSpecInst :: Id -> Sig GhcRn -> TcM TcSpecPrag
tcSpecInst :: TyVar -> Sig GhcRn -> TcM TcSpecPrag
tcSpecInst dfun_id :: TyVar
dfun_id prag :: Sig GhcRn
prag@(SpecInstSig _ _ hs_ty :: LHsSigType GhcRn
hs_ty)
= SDoc -> TcM TcSpecPrag -> TcM TcSpecPrag
forall a. SDoc -> TcM a -> TcM a
addErrCtxt (Sig GhcRn -> SDoc
forall a. Outputable a => a -> SDoc
spec_ctxt Sig GhcRn
prag) (TcM TcSpecPrag -> TcM TcSpecPrag)
-> TcM TcSpecPrag -> TcM TcSpecPrag
forall a b. (a -> b) -> a -> b
$
do { Type
spec_dfun_ty <- UserTypeCtxt -> LHsSigType GhcRn -> TcM Type
tcHsClsInstType UserTypeCtxt
SpecInstCtxt LHsSigType GhcRn
hs_ty
; HsWrapper
co_fn <- UserTypeCtxt -> Type -> Type -> TcM HsWrapper
tcSpecWrapper UserTypeCtxt
SpecInstCtxt (TyVar -> Type
idType TyVar
dfun_id) Type
spec_dfun_ty
; TcSpecPrag -> TcM TcSpecPrag
forall (m :: * -> *) a. Monad m => a -> m a
return (TyVar -> HsWrapper -> InlinePragma -> TcSpecPrag
SpecPrag TyVar
dfun_id HsWrapper
co_fn InlinePragma
defaultInlinePragma) }
where
spec_ctxt :: a -> SDoc
spec_ctxt prag :: a
prag = SDoc -> Int -> SDoc -> SDoc
hang (String -> SDoc
text "In the SPECIALISE pragma") 2 (a -> SDoc
forall a. Outputable a => a -> SDoc
ppr a
prag)
tcSpecInst _ _ = String -> TcM TcSpecPrag
forall a. String -> a
panic "tcSpecInst"
instDeclCtxt1 :: LHsSigType GhcRn -> SDoc
instDeclCtxt1 :: LHsSigType GhcRn -> SDoc
instDeclCtxt1 hs_inst_ty :: LHsSigType GhcRn
hs_inst_ty
= SDoc -> SDoc
inst_decl_ctxt (LHsType GhcRn -> SDoc
forall a. Outputable a => a -> SDoc
ppr (LHsSigType GhcRn -> LHsType GhcRn
forall pass. LHsSigType pass -> LHsType pass
getLHsInstDeclHead LHsSigType GhcRn
hs_inst_ty))
instDeclCtxt2 :: Type -> SDoc
instDeclCtxt2 :: Type -> SDoc
instDeclCtxt2 dfun_ty :: Type
dfun_ty
= SDoc -> SDoc
inst_decl_ctxt (Type -> SDoc
forall a. Outputable a => a -> SDoc
ppr (Class -> [Type] -> Type
mkClassPred Class
cls [Type]
tys))
where
(_,_,cls :: Class
cls,tys :: [Type]
tys) = Type -> ([TyVar], [Type], Class, [Type])
tcSplitDFunTy Type
dfun_ty
inst_decl_ctxt :: SDoc -> SDoc
inst_decl_ctxt :: SDoc -> SDoc
inst_decl_ctxt doc :: SDoc
doc = SDoc -> Int -> SDoc -> SDoc
hang (String -> SDoc
text "In the instance declaration for")
2 (SDoc -> SDoc
quotes SDoc
doc)
badBootFamInstDeclErr :: SDoc
badBootFamInstDeclErr :: SDoc
badBootFamInstDeclErr
= String -> SDoc
text "Illegal family instance in hs-boot file"
notFamily :: TyCon -> SDoc
notFamily :: TyCon -> SDoc
notFamily tycon :: TyCon
tycon
= [SDoc] -> SDoc
vcat [ String -> SDoc
text "Illegal family instance for" SDoc -> SDoc -> SDoc
<+> SDoc -> SDoc
quotes (TyCon -> SDoc
forall a. Outputable a => a -> SDoc
ppr TyCon
tycon)
, Int -> SDoc -> SDoc
nest 2 (SDoc -> SDoc) -> SDoc -> SDoc
forall a b. (a -> b) -> a -> b
$ SDoc -> SDoc
parens (TyCon -> SDoc
forall a. Outputable a => a -> SDoc
ppr TyCon
tycon SDoc -> SDoc -> SDoc
<+> String -> SDoc
text "is not an indexed type family")]
assocInClassErr :: TyCon -> SDoc
assocInClassErr :: TyCon -> SDoc
assocInClassErr name :: TyCon
name
= String -> SDoc
text "Associated type" SDoc -> SDoc -> SDoc
<+> SDoc -> SDoc
quotes (TyCon -> SDoc
forall a. Outputable a => a -> SDoc
ppr TyCon
name) SDoc -> SDoc -> SDoc
<+>
String -> SDoc
text "must be inside a class instance"
badFamInstDecl :: TyCon -> SDoc
badFamInstDecl :: TyCon -> SDoc
badFamInstDecl tc_name :: TyCon
tc_name
= [SDoc] -> SDoc
vcat [ String -> SDoc
text "Illegal family instance for" SDoc -> SDoc -> SDoc
<+>
SDoc -> SDoc
quotes (TyCon -> SDoc
forall a. Outputable a => a -> SDoc
ppr TyCon
tc_name)
, Int -> SDoc -> SDoc
nest 2 (SDoc -> SDoc
parens (SDoc -> SDoc) -> SDoc -> SDoc
forall a b. (a -> b) -> a -> b
$ String -> SDoc
text "Use TypeFamilies to allow indexed type families") ]
notOpenFamily :: TyCon -> SDoc
notOpenFamily :: TyCon -> SDoc
notOpenFamily tc :: TyCon
tc
= String -> SDoc
text "Illegal instance for closed family" SDoc -> SDoc -> SDoc
<+> SDoc -> SDoc
quotes (TyCon -> SDoc
forall a. Outputable a => a -> SDoc
ppr TyCon
tc)