{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE TypeFamilies #-}
module GHC.Tc.Gen.Bind
( tcLocalBinds
, tcTopBinds
, tcValBinds
, tcHsBootSigs
, tcPolyCheck
, chooseInferredQuantifiers
)
where
import GHC.Prelude
import {-# SOURCE #-} GHC.Tc.Gen.Match ( tcGRHSsPat, tcMatchesFun )
import {-# SOURCE #-} GHC.Tc.Gen.Expr ( tcCheckMonoExpr )
import {-# SOURCE #-} GHC.Tc.TyCl.PatSyn ( tcPatSynDecl, tcPatSynBuilderBind )
import GHC.Types.Tickish (CoreTickish, GenTickish (..))
import GHC.Types.CostCentre (mkUserCC, mkDeclCCFlavour)
import GHC.Driver.DynFlags
import GHC.Data.FastString
import GHC.Hs
import GHC.Rename.Bind ( rejectBootDecls )
import GHC.Tc.Errors.Types
import GHC.Tc.Gen.Sig
import GHC.Tc.Utils.Concrete ( hasFixedRuntimeRep_syntactic )
import GHC.Tc.Utils.Monad
import GHC.Tc.Types.Origin
import GHC.Tc.Utils.Env
import GHC.Tc.Utils.Unify
import GHC.Tc.Solver
import GHC.Tc.Types.Evidence
import GHC.Tc.Types.Constraint
import GHC.Tc.Gen.HsType
import GHC.Tc.Gen.Pat
import GHC.Tc.Utils.TcMType
import GHC.Tc.Instance.Family( tcGetFamInstEnvs )
import GHC.Tc.Utils.TcType
import GHC.Tc.Validity (checkValidType, checkEscapingKind)
import GHC.Tc.Zonk.TcType
import GHC.Core.Predicate ( getEqPredTys_maybe )
import GHC.Core.Reduction ( Reduction(..) )
import GHC.Core.Multiplicity
import GHC.Core.FamInstEnv( normaliseType )
import GHC.Core.Class ( Class )
import GHC.Core.Coercion( mkSymCo )
import GHC.Core.Type (mkStrLitTy, tidyOpenType, mkCastTy)
import GHC.Core.TyCo.Ppr( pprTyVars )
import GHC.Builtin.Types ( mkConstraintTupleTy )
import GHC.Builtin.Types.Prim
import GHC.Unit.Module
import GHC.Types.SourceText
import GHC.Types.Id
import GHC.Types.Var as Var
import GHC.Types.Var.Set
import GHC.Types.Var.Env( TidyEnv, TyVarEnv, mkVarEnv, lookupVarEnv )
import GHC.Types.Name
import GHC.Types.Name.Set
import GHC.Types.Name.Env
import GHC.Types.SourceFile
import GHC.Types.SrcLoc
import GHC.Utils.Error
import GHC.Utils.Misc
import GHC.Types.Basic
import GHC.Types.CompleteMatch
import GHC.Utils.Outputable as Outputable
import GHC.Utils.Panic
import GHC.Builtin.Names( ipClassName )
import GHC.Types.Unique.FM
import GHC.Types.Unique.DSet
import GHC.Types.Unique.Set
import qualified GHC.LanguageExtensions as LangExt
import GHC.Data.Bag
import GHC.Data.Graph.Directed
import GHC.Data.Maybe
import Control.Monad
import Data.Foldable (find)
tcTopBinds :: [(RecFlag, LHsBinds GhcRn)] -> [LSig GhcRn]
-> TcM (TcGblEnv, TcLclEnv)
tcTopBinds :: [(RecFlag, LHsBinds GhcRn)]
-> [LSig GhcRn] -> TcM (TcGblEnv, TcLclEnv)
tcTopBinds [(RecFlag, LHsBinds GhcRn)]
binds [LSig GhcRn]
sigs
= do {
([(RecFlag, Bag (GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc)))]
binds', (TcGblEnv
tcg_env, TcLclEnv
tcl_env)) <- TopLevelFlag
-> [(RecFlag, LHsBinds GhcRn)]
-> [LSig GhcRn]
-> TcM (TcGblEnv, TcLclEnv)
-> TcM ([(RecFlag, LHsBinds GhcTc)], (TcGblEnv, TcLclEnv))
forall thing.
TopLevelFlag
-> [(RecFlag, LHsBinds GhcRn)]
-> [LSig GhcRn]
-> TcM thing
-> TcM ([(RecFlag, LHsBinds GhcTc)], thing)
tcValBinds TopLevelFlag
TopLevel [(RecFlag, LHsBinds GhcRn)]
binds [LSig GhcRn]
sigs TcM (TcGblEnv, TcLclEnv)
forall gbl lcl. TcRnIf gbl lcl (gbl, lcl)
getEnvs
; [LTcSpecPrag]
specs <- [LSig GhcRn] -> TcM [LTcSpecPrag]
tcImpPrags [LSig GhcRn]
sigs
; [CompleteMatch]
complete_matches <- (TcGblEnv, TcLclEnv)
-> TcRn [CompleteMatch] -> TcRn [CompleteMatch]
forall a. (TcGblEnv, TcLclEnv) -> TcRn a -> TcRn a
restoreEnvs (TcGblEnv
tcg_env, TcLclEnv
tcl_env) (TcRn [CompleteMatch] -> TcRn [CompleteMatch])
-> TcRn [CompleteMatch] -> TcRn [CompleteMatch]
forall a b. (a -> b) -> a -> b
$ [LSig GhcRn] -> TcRn [CompleteMatch]
tcCompleteSigs [LSig GhcRn]
sigs
; String -> SDoc -> TcRn ()
traceTc String
"complete_matches" ([(RecFlag, Bag (GenLocated SrcSpanAnnA (HsBind GhcRn)))] -> SDoc
forall a. Outputable a => a -> SDoc
ppr [(RecFlag, LHsBinds GhcRn)]
[(RecFlag, Bag (GenLocated SrcSpanAnnA (HsBind GhcRn)))]
binds SDoc -> SDoc -> SDoc
forall doc. IsDoc doc => doc -> doc -> doc
$$ [GenLocated SrcSpanAnnA (Sig GhcRn)] -> SDoc
forall a. Outputable a => a -> SDoc
ppr [LSig GhcRn]
[GenLocated SrcSpanAnnA (Sig GhcRn)]
sigs)
; String -> SDoc -> TcRn ()
traceTc String
"complete_matches" ([CompleteMatch] -> SDoc
forall a. Outputable a => a -> SDoc
ppr [CompleteMatch]
complete_matches)
; let { tcg_env' :: TcGblEnv
tcg_env' = TcGblEnv
tcg_env { tcg_imp_specs
= specs ++ tcg_imp_specs tcg_env
, tcg_complete_matches
= complete_matches
++ tcg_complete_matches tcg_env }
TcGblEnv -> [LHsBinds GhcTc] -> TcGblEnv
`addTypecheckedBinds` ((RecFlag, Bag (GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc)))
-> Bag (GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc)))
-> [(RecFlag, Bag (GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc)))]
-> [Bag (GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc))]
forall a b. (a -> b) -> [a] -> [b]
map (RecFlag, Bag (GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc)))
-> Bag (GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc))
forall a b. (a, b) -> b
snd [(RecFlag, Bag (GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc)))]
binds' }
; (TcGblEnv, TcLclEnv) -> TcM (TcGblEnv, TcLclEnv)
forall a. a -> IOEnv (Env TcGblEnv TcLclEnv) a
forall (m :: * -> *) a. Monad m => a -> m a
return (TcGblEnv
tcg_env', TcLclEnv
tcl_env) }
tcCompleteSigs :: [LSig GhcRn] -> TcM [CompleteMatch]
tcCompleteSigs :: [LSig GhcRn] -> TcRn [CompleteMatch]
tcCompleteSigs [LSig GhcRn]
sigs =
let
doOne :: LSig GhcRn -> TcM (Maybe CompleteMatch)
doOne :: LSig GhcRn -> TcM (Maybe CompleteMatch)
doOne (L SrcSpanAnnA
loc c :: Sig GhcRn
c@(CompleteMatchSig (EpAnn [AddEpAnn]
_ext, SourceText
_src_txt) (L SrcSpan
_ [GenLocated SrcSpanAnnN Name]
ns) Maybe (LIdP GhcRn)
mb_tc_nm))
= (CompleteMatch -> Maybe CompleteMatch)
-> IOEnv (Env TcGblEnv TcLclEnv) CompleteMatch
-> TcM (Maybe CompleteMatch)
forall a b.
(a -> b)
-> IOEnv (Env TcGblEnv TcLclEnv) a
-> IOEnv (Env TcGblEnv TcLclEnv) b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap CompleteMatch -> Maybe CompleteMatch
forall a. a -> Maybe a
Just (IOEnv (Env TcGblEnv TcLclEnv) CompleteMatch
-> TcM (Maybe CompleteMatch))
-> IOEnv (Env TcGblEnv TcLclEnv) CompleteMatch
-> TcM (Maybe CompleteMatch)
forall a b. (a -> b) -> a -> b
$ SrcSpanAnnA
-> IOEnv (Env TcGblEnv TcLclEnv) CompleteMatch
-> IOEnv (Env TcGblEnv TcLclEnv) CompleteMatch
forall ann a. SrcSpanAnn' ann -> TcRn a -> TcRn a
setSrcSpanA SrcSpanAnnA
loc (IOEnv (Env TcGblEnv TcLclEnv) CompleteMatch
-> IOEnv (Env TcGblEnv TcLclEnv) CompleteMatch)
-> IOEnv (Env TcGblEnv TcLclEnv) CompleteMatch
-> IOEnv (Env TcGblEnv TcLclEnv) CompleteMatch
forall a b. (a -> b) -> a -> b
$ SDoc
-> IOEnv (Env TcGblEnv TcLclEnv) CompleteMatch
-> IOEnv (Env TcGblEnv TcLclEnv) CompleteMatch
forall a. SDoc -> TcM a -> TcM a
addErrCtxt (String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"In" SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> Sig GhcRn -> SDoc
forall a. Outputable a => a -> SDoc
ppr Sig GhcRn
c) (IOEnv (Env TcGblEnv TcLclEnv) CompleteMatch
-> IOEnv (Env TcGblEnv TcLclEnv) CompleteMatch)
-> IOEnv (Env TcGblEnv TcLclEnv) CompleteMatch
-> IOEnv (Env TcGblEnv TcLclEnv) CompleteMatch
forall a b. (a -> b) -> a -> b
$ do
UniqDSet ConLike
cls <- [ConLike] -> UniqDSet ConLike
forall a. Uniquable a => [a] -> UniqDSet a
mkUniqDSet ([ConLike] -> UniqDSet ConLike)
-> IOEnv (Env TcGblEnv TcLclEnv) [ConLike]
-> IOEnv (Env TcGblEnv TcLclEnv) (UniqDSet ConLike)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (GenLocated SrcSpanAnnN Name
-> IOEnv (Env TcGblEnv TcLclEnv) ConLike)
-> [GenLocated SrcSpanAnnN Name]
-> IOEnv (Env TcGblEnv TcLclEnv) [ConLike]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> [a] -> m [b]
mapM ((Name -> IOEnv (Env TcGblEnv TcLclEnv) ConLike)
-> GenLocated SrcSpanAnnN Name
-> IOEnv (Env TcGblEnv TcLclEnv) ConLike
forall a b ann.
(a -> TcM b) -> GenLocated (SrcSpanAnn' ann) a -> TcM b
addLocMA Name -> IOEnv (Env TcGblEnv TcLclEnv) ConLike
tcLookupConLike) [GenLocated SrcSpanAnnN Name]
ns
Maybe TyCon
mb_tc <- forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
traverse @Maybe GenLocated SrcSpanAnnN Name -> IOEnv (Env TcGblEnv TcLclEnv) TyCon
tcLookupLocatedTyCon Maybe (LIdP GhcRn)
Maybe (GenLocated SrcSpanAnnN Name)
mb_tc_nm
CompleteMatch -> IOEnv (Env TcGblEnv TcLclEnv) CompleteMatch
forall a. a -> IOEnv (Env TcGblEnv TcLclEnv) a
forall (f :: * -> *) a. Applicative f => a -> f a
pure CompleteMatch { cmConLikes :: UniqDSet ConLike
cmConLikes = UniqDSet ConLike
cls, cmResultTyCon :: Maybe TyCon
cmResultTyCon = Maybe TyCon
mb_tc }
doOne LSig GhcRn
_ = Maybe CompleteMatch -> TcM (Maybe CompleteMatch)
forall a. a -> IOEnv (Env TcGblEnv TcLclEnv) a
forall (m :: * -> *) a. Monad m => a -> m a
return Maybe CompleteMatch
forall a. Maybe a
Nothing
in (GenLocated SrcSpanAnnA (Sig GhcRn) -> TcM (Maybe CompleteMatch))
-> [GenLocated SrcSpanAnnA (Sig GhcRn)] -> TcRn [CompleteMatch]
forall (m :: * -> *) a b.
Applicative m =>
(a -> m (Maybe b)) -> [a] -> m [b]
mapMaybeM LSig GhcRn -> TcM (Maybe CompleteMatch)
GenLocated SrcSpanAnnA (Sig GhcRn) -> TcM (Maybe CompleteMatch)
doOne ([GenLocated SrcSpanAnnA (Sig GhcRn)] -> TcRn [CompleteMatch])
-> [GenLocated SrcSpanAnnA (Sig GhcRn)] -> TcRn [CompleteMatch]
forall a b. (a -> b) -> a -> b
$ [GenLocated SrcSpanAnnA (Sig GhcRn)]
-> [GenLocated SrcSpanAnnA (Sig GhcRn)]
forall a. [a] -> [a]
reverse [LSig GhcRn]
[GenLocated SrcSpanAnnA (Sig GhcRn)]
sigs
tcHsBootSigs :: [(RecFlag, LHsBinds GhcRn)] -> [LSig GhcRn] -> TcM [Id]
tcHsBootSigs :: [(RecFlag, LHsBinds GhcRn)] -> [LSig GhcRn] -> TcM [TcId]
tcHsBootSigs [(RecFlag, LHsBinds GhcRn)]
binds [LSig GhcRn]
sigs
= do { Bool -> TcRn () -> TcRn ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
unless ([(RecFlag, Bag (GenLocated SrcSpanAnnA (HsBind GhcRn)))] -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [(RecFlag, LHsBinds GhcRn)]
[(RecFlag, Bag (GenLocated SrcSpanAnnA (HsBind GhcRn)))]
binds) (TcRn () -> TcRn ()) -> TcRn () -> TcRn ()
forall a b. (a -> b) -> a -> b
$
HsBootOrSig
-> (NonEmpty (GenLocated SrcSpanAnnA (HsBind GhcRn))
-> BadBootDecls)
-> [GenLocated SrcSpanAnnA (HsBind GhcRn)]
-> TcRn ()
forall decl.
HsBootOrSig
-> (NonEmpty (LocatedA decl) -> BadBootDecls)
-> [LocatedA decl]
-> TcRn ()
rejectBootDecls HsBootOrSig
HsBoot NonEmpty (LHsBindLR GhcRn GhcRn) -> BadBootDecls
NonEmpty (GenLocated SrcSpanAnnA (HsBind GhcRn)) -> BadBootDecls
BootBindsRn (((RecFlag, Bag (GenLocated SrcSpanAnnA (HsBind GhcRn)))
-> [GenLocated SrcSpanAnnA (HsBind GhcRn)])
-> [(RecFlag, Bag (GenLocated SrcSpanAnnA (HsBind GhcRn)))]
-> [GenLocated SrcSpanAnnA (HsBind GhcRn)]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap (Bag (GenLocated SrcSpanAnnA (HsBind GhcRn))
-> [GenLocated SrcSpanAnnA (HsBind GhcRn)]
forall a. Bag a -> [a]
bagToList (Bag (GenLocated SrcSpanAnnA (HsBind GhcRn))
-> [GenLocated SrcSpanAnnA (HsBind GhcRn)])
-> ((RecFlag, Bag (GenLocated SrcSpanAnnA (HsBind GhcRn)))
-> Bag (GenLocated SrcSpanAnnA (HsBind GhcRn)))
-> (RecFlag, Bag (GenLocated SrcSpanAnnA (HsBind GhcRn)))
-> [GenLocated SrcSpanAnnA (HsBind GhcRn)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (RecFlag, Bag (GenLocated SrcSpanAnnA (HsBind GhcRn)))
-> Bag (GenLocated SrcSpanAnnA (HsBind GhcRn))
forall a b. (a, b) -> b
snd) [(RecFlag, LHsBinds GhcRn)]
[(RecFlag, Bag (GenLocated SrcSpanAnnA (HsBind GhcRn)))]
binds)
; (GenLocated SrcSpanAnnA (Sig GhcRn) -> TcM [TcId])
-> [GenLocated SrcSpanAnnA (Sig GhcRn)] -> TcM [TcId]
forall (m :: * -> *) (f :: * -> *) a b.
(Monad m, Traversable f) =>
(a -> m [b]) -> f a -> m [b]
concatMapM ((Sig GhcRn -> TcM [TcId])
-> GenLocated SrcSpanAnnA (Sig GhcRn) -> TcM [TcId]
forall a b ann.
(a -> TcM b) -> GenLocated (SrcSpanAnn' ann) a -> TcM b
addLocMA Sig GhcRn -> TcM [TcId]
tc_boot_sig) ((GenLocated SrcSpanAnnA (Sig GhcRn) -> Bool)
-> [GenLocated SrcSpanAnnA (Sig GhcRn)]
-> [GenLocated SrcSpanAnnA (Sig GhcRn)]
forall a. (a -> Bool) -> [a] -> [a]
filter LSig GhcRn -> Bool
GenLocated SrcSpanAnnA (Sig GhcRn) -> Bool
forall p. UnXRec p => LSig p -> Bool
isTypeLSig [LSig GhcRn]
[GenLocated SrcSpanAnnA (Sig GhcRn)]
sigs) }
where
tc_boot_sig :: Sig GhcRn -> TcM [TcId]
tc_boot_sig (TypeSig XTypeSig GhcRn
_ [LIdP GhcRn]
lnames LHsSigWcType GhcRn
hs_ty) = (GenLocated SrcSpanAnnN Name -> IOEnv (Env TcGblEnv TcLclEnv) TcId)
-> [GenLocated SrcSpanAnnN Name] -> TcM [TcId]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> [a] -> m [b]
mapM GenLocated SrcSpanAnnN Name -> IOEnv (Env TcGblEnv TcLclEnv) TcId
f [LIdP GhcRn]
[GenLocated SrcSpanAnnN Name]
lnames
where
f :: GenLocated SrcSpanAnnN Name -> IOEnv (Env TcGblEnv TcLclEnv) TcId
f (L SrcSpanAnnN
_ Name
name)
= do { Kind
sigma_ty <- UserTypeCtxt -> LHsSigWcType GhcRn -> TcM Kind
tcHsSigWcType (Name -> ReportRedundantConstraints -> UserTypeCtxt
FunSigCtxt Name
name ReportRedundantConstraints
NoRRC) LHsSigWcType GhcRn
hs_ty
; TcId -> IOEnv (Env TcGblEnv TcLclEnv) TcId
forall a. a -> IOEnv (Env TcGblEnv TcLclEnv) a
forall (m :: * -> *) a. Monad m => a -> m a
return (HasDebugCallStack => Name -> Kind -> TcId
Name -> Kind -> TcId
mkVanillaGlobal Name
name Kind
sigma_ty) }
tc_boot_sig Sig GhcRn
s = String -> SDoc -> TcM [TcId]
forall a. HasCallStack => String -> SDoc -> a
pprPanic String
"tcHsBootSigs/tc_boot_sig" (Sig GhcRn -> SDoc
forall a. Outputable a => a -> SDoc
ppr Sig GhcRn
s)
tcLocalBinds :: HsLocalBinds GhcRn -> TcM thing
-> TcM (HsLocalBinds GhcTc, thing)
tcLocalBinds :: forall thing.
HsLocalBinds GhcRn -> TcM thing -> TcM (HsLocalBinds GhcTc, thing)
tcLocalBinds (EmptyLocalBinds XEmptyLocalBinds GhcRn GhcRn
x) TcM thing
thing_inside
= do { thing
thing <- TcM thing
thing_inside
; (HsLocalBinds GhcTc, thing) -> TcM (HsLocalBinds GhcTc, thing)
forall a. a -> IOEnv (Env TcGblEnv TcLclEnv) a
forall (m :: * -> *) a. Monad m => a -> m a
return (XEmptyLocalBinds GhcTc GhcTc -> HsLocalBinds GhcTc
forall idL idR. XEmptyLocalBinds idL idR -> HsLocalBindsLR idL idR
EmptyLocalBinds XEmptyLocalBinds GhcRn GhcRn
XEmptyLocalBinds GhcTc GhcTc
x, thing
thing) }
tcLocalBinds (HsValBinds XHsValBinds GhcRn GhcRn
x (XValBindsLR (NValBinds [(RecFlag, LHsBinds GhcRn)]
binds [LSig GhcRn]
sigs))) TcM thing
thing_inside
= do { ([(RecFlag, Bag (GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc)))]
binds', thing
thing) <- TopLevelFlag
-> [(RecFlag, LHsBinds GhcRn)]
-> [LSig GhcRn]
-> TcM thing
-> TcM ([(RecFlag, LHsBinds GhcTc)], thing)
forall thing.
TopLevelFlag
-> [(RecFlag, LHsBinds GhcRn)]
-> [LSig GhcRn]
-> TcM thing
-> TcM ([(RecFlag, LHsBinds GhcTc)], thing)
tcValBinds TopLevelFlag
NotTopLevel [(RecFlag, LHsBinds GhcRn)]
binds [LSig GhcRn]
sigs TcM thing
thing_inside
; (HsLocalBinds GhcTc, thing) -> TcM (HsLocalBinds GhcTc, thing)
forall a. a -> IOEnv (Env TcGblEnv TcLclEnv) a
forall (m :: * -> *) a. Monad m => a -> m a
return (XHsValBinds GhcTc GhcTc
-> HsValBindsLR GhcTc GhcTc -> HsLocalBinds GhcTc
forall idL idR.
XHsValBinds idL idR
-> HsValBindsLR idL idR -> HsLocalBindsLR idL idR
HsValBinds XHsValBinds GhcRn GhcRn
XHsValBinds GhcTc GhcTc
x (XXValBindsLR GhcTc GhcTc -> HsValBindsLR GhcTc GhcTc
forall idL idR. XXValBindsLR idL idR -> HsValBindsLR idL idR
XValBindsLR ([(RecFlag, LHsBinds GhcTc)] -> [LSig GhcRn] -> NHsValBindsLR GhcTc
forall idL.
[(RecFlag, LHsBinds idL)] -> [LSig GhcRn] -> NHsValBindsLR idL
NValBinds [(RecFlag, LHsBinds GhcTc)]
[(RecFlag, Bag (GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc)))]
binds' [LSig GhcRn]
sigs)), thing
thing) }
tcLocalBinds (HsValBinds XHsValBinds GhcRn GhcRn
_ (ValBinds {})) TcM thing
_ = String -> TcM (HsLocalBinds GhcTc, thing)
forall a. HasCallStack => String -> a
panic String
"tcLocalBinds"
tcLocalBinds (HsIPBinds XHsIPBinds GhcRn GhcRn
x (IPBinds XIPBinds GhcRn
_ [LIPBind GhcRn]
ip_binds)) TcM thing
thing_inside
= do { Class
ipClass <- Name -> TcM Class
tcLookupClass Name
ipClassName
; ([TcId]
given_ips, [GenLocated SrcSpanAnnA (IPBind GhcTc)]
ip_binds') <-
(GenLocated SrcSpanAnnA (IPBind GhcRn)
-> IOEnv
(Env TcGblEnv TcLclEnv)
(TcId, GenLocated SrcSpanAnnA (IPBind GhcTc)))
-> [GenLocated SrcSpanAnnA (IPBind GhcRn)]
-> IOEnv
(Env TcGblEnv TcLclEnv)
([TcId], [GenLocated SrcSpanAnnA (IPBind GhcTc)])
forall (m :: * -> *) a b c.
Applicative m =>
(a -> m (b, c)) -> [a] -> m ([b], [c])
mapAndUnzipM ((IPBind GhcRn -> TcM (TcId, IPBind GhcTc))
-> GenLocated SrcSpanAnnA (IPBind GhcRn)
-> IOEnv
(Env TcGblEnv TcLclEnv)
(TcId, GenLocated SrcSpanAnnA (IPBind GhcTc))
forall a b c ann.
(a -> TcM (b, c))
-> GenLocated (SrcSpanAnn' ann) a
-> TcM (b, GenLocated (SrcSpanAnn' ann) c)
wrapLocSndMA (Class -> IPBind GhcRn -> TcM (TcId, IPBind GhcTc)
tc_ip_bind Class
ipClass)) [LIPBind GhcRn]
[GenLocated SrcSpanAnnA (IPBind GhcRn)]
ip_binds
; (TcEvBinds
ev_binds, thing
result) <- SkolemInfoAnon
-> [TcId] -> [TcId] -> TcM thing -> TcM (TcEvBinds, thing)
forall result.
SkolemInfoAnon
-> [TcId] -> [TcId] -> TcM result -> TcM (TcEvBinds, result)
checkConstraints ([HsIPName] -> SkolemInfoAnon
IPSkol [HsIPName]
ips)
[] [TcId]
given_ips TcM thing
thing_inside
; (HsLocalBinds GhcTc, thing) -> TcM (HsLocalBinds GhcTc, thing)
forall a. a -> IOEnv (Env TcGblEnv TcLclEnv) a
forall (m :: * -> *) a. Monad m => a -> m a
return (XHsIPBinds GhcTc GhcTc -> HsIPBinds GhcTc -> HsLocalBinds GhcTc
forall idL idR.
XHsIPBinds idL idR -> HsIPBinds idR -> HsLocalBindsLR idL idR
HsIPBinds XHsIPBinds GhcRn GhcRn
XHsIPBinds GhcTc GhcTc
x (XIPBinds GhcTc -> [LIPBind GhcTc] -> HsIPBinds GhcTc
forall id. XIPBinds id -> [LIPBind id] -> HsIPBinds id
IPBinds XIPBinds GhcTc
TcEvBinds
ev_binds [LIPBind GhcTc]
[GenLocated SrcSpanAnnA (IPBind GhcTc)]
ip_binds') , thing
result) }
where
ips :: [HsIPName]
ips = [HsIPName
ip | (L SrcSpanAnnA
_ (IPBind XCIPBind GhcRn
_ (L SrcAnn NoEpAnns
_ HsIPName
ip) LHsExpr GhcRn
_)) <- [LIPBind GhcRn]
[GenLocated SrcSpanAnnA (IPBind GhcRn)]
ip_binds]
tc_ip_bind :: Class -> IPBind GhcRn -> TcM (DictId, IPBind GhcTc)
tc_ip_bind :: Class -> IPBind GhcRn -> TcM (TcId, IPBind GhcTc)
tc_ip_bind Class
ipClass (IPBind XCIPBind GhcRn
_ l_name :: XRec GhcRn HsIPName
l_name@(L SrcAnn NoEpAnns
_ HsIPName
ip) LHsExpr GhcRn
expr)
= do { Kind
ty <- TcM Kind
newOpenFlexiTyVarTy
; let p :: Kind
p = FastString -> Kind
mkStrLitTy (FastString -> Kind) -> FastString -> Kind
forall a b. (a -> b) -> a -> b
$ HsIPName -> FastString
hsIPNameFS HsIPName
ip
; TcId
ip_id <- Class -> TcThetaType -> IOEnv (Env TcGblEnv TcLclEnv) TcId
newDict Class
ipClass [ Kind
p, Kind
ty ]
; GenLocated SrcSpanAnnA (HsExpr GhcTc)
expr' <- LHsExpr GhcRn -> Kind -> TcM (LHsExpr GhcTc)
tcCheckMonoExpr LHsExpr GhcRn
expr Kind
ty
; let d :: GenLocated SrcSpanAnnA (HsExpr GhcTc)
d = (HsExpr GhcTc -> HsExpr GhcTc)
-> GenLocated SrcSpanAnnA (HsExpr GhcTc)
-> GenLocated SrcSpanAnnA (HsExpr GhcTc)
forall a b.
(a -> b) -> GenLocated SrcSpanAnnA a -> GenLocated SrcSpanAnnA b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (Class -> Kind -> Kind -> HsExpr GhcTc -> HsExpr GhcTc
toDict Class
ipClass Kind
p Kind
ty) GenLocated SrcSpanAnnA (HsExpr GhcTc)
expr'
; (TcId, IPBind GhcTc) -> TcM (TcId, IPBind GhcTc)
forall a. a -> IOEnv (Env TcGblEnv TcLclEnv) a
forall (m :: * -> *) a. Monad m => a -> m a
return (TcId
ip_id, (XCIPBind GhcTc
-> XRec GhcTc HsIPName -> LHsExpr GhcTc -> IPBind GhcTc
forall id.
XCIPBind id -> XRec id HsIPName -> LHsExpr id -> IPBind id
IPBind XCIPBind GhcTc
TcId
ip_id XRec GhcRn HsIPName
XRec GhcTc HsIPName
l_name LHsExpr GhcTc
GenLocated SrcSpanAnnA (HsExpr GhcTc)
d)) }
toDict :: Class
-> Type
-> Type
-> HsExpr GhcTc
-> HsExpr GhcTc
toDict :: Class -> Kind -> Kind -> HsExpr GhcTc -> HsExpr GhcTc
toDict Class
ipClass Kind
x Kind
ty = HsWrapper -> HsExpr GhcTc -> HsExpr GhcTc
mkHsWrap (HsWrapper -> HsExpr GhcTc -> HsExpr GhcTc)
-> HsWrapper -> HsExpr GhcTc -> HsExpr GhcTc
forall a b. (a -> b) -> a -> b
$ TcCoercionR -> HsWrapper
mkWpCastR (TcCoercionR -> HsWrapper) -> TcCoercionR -> HsWrapper
forall a b. (a -> b) -> a -> b
$
Kind -> TcCoercionR
wrapIP (Kind -> TcCoercionR) -> Kind -> TcCoercionR
forall a b. (a -> b) -> a -> b
$ Class -> TcThetaType -> Kind
mkClassPred Class
ipClass [Kind
x,Kind
ty]
tcValBinds :: TopLevelFlag
-> [(RecFlag, LHsBinds GhcRn)] -> [LSig GhcRn]
-> TcM thing
-> TcM ([(RecFlag, LHsBinds GhcTc)], thing)
tcValBinds :: forall thing.
TopLevelFlag
-> [(RecFlag, LHsBinds GhcRn)]
-> [LSig GhcRn]
-> TcM thing
-> TcM ([(RecFlag, LHsBinds GhcTc)], thing)
tcValBinds TopLevelFlag
top_lvl [(RecFlag, LHsBinds GhcRn)]
binds [LSig GhcRn]
sigs TcM thing
thing_inside
= do {
([TcId]
poly_ids, TcSigFun
sig_fn) <- [PatSynBind GhcRn GhcRn]
-> TcM ([TcId], TcSigFun) -> TcM ([TcId], TcSigFun)
forall a. [PatSynBind GhcRn GhcRn] -> TcM a -> TcM a
tcAddPatSynPlaceholders [PatSynBind GhcRn GhcRn]
patsyns (TcM ([TcId], TcSigFun) -> TcM ([TcId], TcSigFun))
-> TcM ([TcId], TcSigFun) -> TcM ([TcId], TcSigFun)
forall a b. (a -> b) -> a -> b
$
[LSig GhcRn] -> TcM ([TcId], TcSigFun)
tcTySigs [LSig GhcRn]
sigs
; TopLevelFlag
-> [TcId]
-> TcM
([(RecFlag, Bag (GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc)))],
thing)
-> TcM
([(RecFlag, Bag (GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc)))],
thing)
forall a. TopLevelFlag -> [TcId] -> TcM a -> TcM a
tcExtendSigIds TopLevelFlag
top_lvl [TcId]
poly_ids (TcM
([(RecFlag, Bag (GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc)))],
thing)
-> TcM
([(RecFlag, Bag (GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc)))],
thing))
-> TcM
([(RecFlag, Bag (GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc)))],
thing)
-> TcM
([(RecFlag, Bag (GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc)))],
thing)
forall a b. (a -> b) -> a -> b
$
do { ([(RecFlag, Bag (GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc)))]
binds', ([(RecFlag, Bag (GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc)))]
extra_binds', thing
thing))
<- TopLevelFlag
-> TcSigFun
-> TcPragEnv
-> [(RecFlag, LHsBinds GhcRn)]
-> TcM
([(RecFlag, Bag (GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc)))],
thing)
-> TcM
([(RecFlag, LHsBinds GhcTc)],
([(RecFlag, Bag (GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc)))],
thing))
forall thing.
TopLevelFlag
-> TcSigFun
-> TcPragEnv
-> [(RecFlag, LHsBinds GhcRn)]
-> TcM thing
-> TcM ([(RecFlag, LHsBinds GhcTc)], thing)
tcBindGroups TopLevelFlag
top_lvl TcSigFun
sig_fn TcPragEnv
prag_fn [(RecFlag, LHsBinds GhcRn)]
binds (TcM
([(RecFlag, Bag (GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc)))],
thing)
-> TcM
([(RecFlag, LHsBinds GhcTc)],
([(RecFlag, Bag (GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc)))],
thing)))
-> TcM
([(RecFlag, Bag (GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc)))],
thing)
-> TcM
([(RecFlag, LHsBinds GhcTc)],
([(RecFlag, Bag (GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc)))],
thing))
forall a b. (a -> b) -> a -> b
$
do { thing
thing <- TcM thing
thing_inside
; [Bag (GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc))]
patsyn_builders <- (PatSynBind GhcRn GhcRn
-> IOEnv
(Env TcGblEnv TcLclEnv)
(Bag (GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc))))
-> [PatSynBind GhcRn GhcRn]
-> IOEnv
(Env TcGblEnv TcLclEnv)
[Bag (GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc))]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> [a] -> m [b]
mapM (TcPragEnv -> PatSynBind GhcRn GhcRn -> TcM (LHsBinds GhcTc)
tcPatSynBuilderBind TcPragEnv
prag_fn) [PatSynBind GhcRn GhcRn]
patsyns
; let extra_binds :: [(RecFlag, Bag (GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc)))]
extra_binds = [ (RecFlag
NonRecursive, Bag (GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc))
builder)
| Bag (GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc))
builder <- [Bag (GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc))]
patsyn_builders ]
; ([(RecFlag, Bag (GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc)))],
thing)
-> TcM
([(RecFlag, Bag (GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc)))],
thing)
forall a. a -> IOEnv (Env TcGblEnv TcLclEnv) a
forall (m :: * -> *) a. Monad m => a -> m a
return ([(RecFlag, Bag (GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc)))]
extra_binds, thing
thing) }
; ([(RecFlag, Bag (GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc)))],
thing)
-> TcM
([(RecFlag, Bag (GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc)))],
thing)
forall a. a -> IOEnv (Env TcGblEnv TcLclEnv) a
forall (m :: * -> *) a. Monad m => a -> m a
return ([(RecFlag, Bag (GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc)))]
binds' [(RecFlag, Bag (GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc)))]
-> [(RecFlag, Bag (GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc)))]
-> [(RecFlag, Bag (GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc)))]
forall a. [a] -> [a] -> [a]
++ [(RecFlag, Bag (GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc)))]
extra_binds', thing
thing) }}
where
patsyns :: [PatSynBind GhcRn GhcRn]
patsyns = [(RecFlag, LHsBinds GhcRn)] -> [PatSynBind GhcRn GhcRn]
forall id.
UnXRec id =>
[(RecFlag, LHsBinds id)] -> [PatSynBind id id]
getPatSynBinds [(RecFlag, LHsBinds GhcRn)]
binds
prag_fn :: TcPragEnv
prag_fn = [LSig GhcRn] -> LHsBinds GhcRn -> TcPragEnv
mkPragEnv [LSig GhcRn]
sigs (((RecFlag, Bag (GenLocated SrcSpanAnnA (HsBind GhcRn)))
-> Bag (GenLocated SrcSpanAnnA (HsBind GhcRn))
-> Bag (GenLocated SrcSpanAnnA (HsBind GhcRn)))
-> Bag (GenLocated SrcSpanAnnA (HsBind GhcRn))
-> [(RecFlag, Bag (GenLocated SrcSpanAnnA (HsBind GhcRn)))]
-> Bag (GenLocated SrcSpanAnnA (HsBind GhcRn))
forall a b. (a -> b -> b) -> b -> [a] -> b
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr (Bag (GenLocated SrcSpanAnnA (HsBind GhcRn))
-> Bag (GenLocated SrcSpanAnnA (HsBind GhcRn))
-> Bag (GenLocated SrcSpanAnnA (HsBind GhcRn))
forall a. Bag a -> Bag a -> Bag a
unionBags (Bag (GenLocated SrcSpanAnnA (HsBind GhcRn))
-> Bag (GenLocated SrcSpanAnnA (HsBind GhcRn))
-> Bag (GenLocated SrcSpanAnnA (HsBind GhcRn)))
-> ((RecFlag, Bag (GenLocated SrcSpanAnnA (HsBind GhcRn)))
-> Bag (GenLocated SrcSpanAnnA (HsBind GhcRn)))
-> (RecFlag, Bag (GenLocated SrcSpanAnnA (HsBind GhcRn)))
-> Bag (GenLocated SrcSpanAnnA (HsBind GhcRn))
-> Bag (GenLocated SrcSpanAnnA (HsBind GhcRn))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (RecFlag, Bag (GenLocated SrcSpanAnnA (HsBind GhcRn)))
-> Bag (GenLocated SrcSpanAnnA (HsBind GhcRn))
forall a b. (a, b) -> b
snd) Bag (GenLocated SrcSpanAnnA (HsBind GhcRn))
forall a. Bag a
emptyBag [(RecFlag, LHsBinds GhcRn)]
[(RecFlag, Bag (GenLocated SrcSpanAnnA (HsBind GhcRn)))]
binds)
tcBindGroups :: TopLevelFlag -> TcSigFun -> TcPragEnv
-> [(RecFlag, LHsBinds GhcRn)] -> TcM thing
-> TcM ([(RecFlag, LHsBinds GhcTc)], thing)
tcBindGroups :: forall thing.
TopLevelFlag
-> TcSigFun
-> TcPragEnv
-> [(RecFlag, LHsBinds GhcRn)]
-> TcM thing
-> TcM ([(RecFlag, LHsBinds GhcTc)], thing)
tcBindGroups TopLevelFlag
_ TcSigFun
_ TcPragEnv
_ [] TcM thing
thing_inside
= do { thing
thing <- TcM thing
thing_inside
; ([(RecFlag, Bag (GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc)))],
thing)
-> IOEnv
(Env TcGblEnv TcLclEnv)
([(RecFlag, Bag (GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc)))],
thing)
forall a. a -> IOEnv (Env TcGblEnv TcLclEnv) a
forall (m :: * -> *) a. Monad m => a -> m a
return ([], thing
thing) }
tcBindGroups TopLevelFlag
top_lvl TcSigFun
sig_fn TcPragEnv
prag_fn ((RecFlag, LHsBinds GhcRn)
group : [(RecFlag, LHsBinds GhcRn)]
groups) TcM thing
thing_inside
= do {
TcTypeEnv
type_env <- TcM TcTypeEnv
getLclTypeEnv
; let closed :: IsGroupClosed
closed = TcTypeEnv -> LHsBinds GhcRn -> IsGroupClosed
isClosedBndrGroup TcTypeEnv
type_env ((RecFlag, Bag (GenLocated SrcSpanAnnA (HsBind GhcRn)))
-> Bag (GenLocated SrcSpanAnnA (HsBind GhcRn))
forall a b. (a, b) -> b
snd (RecFlag, LHsBinds GhcRn)
(RecFlag, Bag (GenLocated SrcSpanAnnA (HsBind GhcRn)))
group)
; ([(RecFlag, Bag (GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc)))]
group', ([(RecFlag, Bag (GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc)))]
groups', thing
thing))
<- TopLevelFlag
-> TcSigFun
-> TcPragEnv
-> (RecFlag, LHsBinds GhcRn)
-> IsGroupClosed
-> IOEnv
(Env TcGblEnv TcLclEnv)
([(RecFlag, Bag (GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc)))],
thing)
-> TcM
([(RecFlag, LHsBinds GhcTc)],
([(RecFlag, Bag (GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc)))],
thing))
forall thing.
TopLevelFlag
-> TcSigFun
-> TcPragEnv
-> (RecFlag, LHsBinds GhcRn)
-> IsGroupClosed
-> TcM thing
-> TcM ([(RecFlag, LHsBinds GhcTc)], thing)
tc_group TopLevelFlag
top_lvl TcSigFun
sig_fn TcPragEnv
prag_fn (RecFlag, LHsBinds GhcRn)
group IsGroupClosed
closed (IOEnv
(Env TcGblEnv TcLclEnv)
([(RecFlag, Bag (GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc)))],
thing)
-> TcM
([(RecFlag, LHsBinds GhcTc)],
([(RecFlag, Bag (GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc)))],
thing)))
-> IOEnv
(Env TcGblEnv TcLclEnv)
([(RecFlag, Bag (GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc)))],
thing)
-> TcM
([(RecFlag, LHsBinds GhcTc)],
([(RecFlag, Bag (GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc)))],
thing))
forall a b. (a -> b) -> a -> b
$
TopLevelFlag
-> TcSigFun
-> TcPragEnv
-> [(RecFlag, LHsBinds GhcRn)]
-> TcM thing
-> TcM ([(RecFlag, LHsBinds GhcTc)], thing)
forall thing.
TopLevelFlag
-> TcSigFun
-> TcPragEnv
-> [(RecFlag, LHsBinds GhcRn)]
-> TcM thing
-> TcM ([(RecFlag, LHsBinds GhcTc)], thing)
tcBindGroups TopLevelFlag
top_lvl TcSigFun
sig_fn TcPragEnv
prag_fn [(RecFlag, LHsBinds GhcRn)]
groups TcM thing
thing_inside
; ([(RecFlag, Bag (GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc)))],
thing)
-> IOEnv
(Env TcGblEnv TcLclEnv)
([(RecFlag, Bag (GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc)))],
thing)
forall a. a -> IOEnv (Env TcGblEnv TcLclEnv) a
forall (m :: * -> *) a. Monad m => a -> m a
return ([(RecFlag, Bag (GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc)))]
group' [(RecFlag, Bag (GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc)))]
-> [(RecFlag, Bag (GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc)))]
-> [(RecFlag, Bag (GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc)))]
forall a. [a] -> [a] -> [a]
++ [(RecFlag, Bag (GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc)))]
groups', thing
thing) }
tc_group :: forall thing.
TopLevelFlag -> TcSigFun -> TcPragEnv
-> (RecFlag, LHsBinds GhcRn) -> IsGroupClosed -> TcM thing
-> TcM ([(RecFlag, LHsBinds GhcTc)], thing)
tc_group :: forall thing.
TopLevelFlag
-> TcSigFun
-> TcPragEnv
-> (RecFlag, LHsBinds GhcRn)
-> IsGroupClosed
-> TcM thing
-> TcM ([(RecFlag, LHsBinds GhcTc)], thing)
tc_group TopLevelFlag
top_lvl TcSigFun
sig_fn TcPragEnv
prag_fn (RecFlag
NonRecursive, LHsBinds GhcRn
binds) IsGroupClosed
closed TcM thing
thing_inside
= do { let bind :: GenLocated SrcSpanAnnA (HsBind GhcRn)
bind = case Bag (GenLocated SrcSpanAnnA (HsBind GhcRn))
-> [GenLocated SrcSpanAnnA (HsBind GhcRn)]
forall a. Bag a -> [a]
bagToList LHsBinds GhcRn
Bag (GenLocated SrcSpanAnnA (HsBind GhcRn))
binds of
[GenLocated SrcSpanAnnA (HsBind GhcRn)
bind] -> GenLocated SrcSpanAnnA (HsBind GhcRn)
bind
[] -> String -> GenLocated SrcSpanAnnA (HsBind GhcRn)
forall a. HasCallStack => String -> a
panic String
"tc_group: empty list of binds"
[GenLocated SrcSpanAnnA (HsBind GhcRn)]
_ -> String -> GenLocated SrcSpanAnnA (HsBind GhcRn)
forall a. HasCallStack => String -> a
panic String
"tc_group: NonRecursive binds is not a singleton bag"
; (Bag (GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc))
bind', thing
thing) <- TopLevelFlag
-> TcSigFun
-> TcPragEnv
-> LHsBindLR GhcRn GhcRn
-> IsGroupClosed
-> TcM thing
-> TcM (LHsBinds GhcTc, thing)
forall thing.
TopLevelFlag
-> TcSigFun
-> TcPragEnv
-> LHsBindLR GhcRn GhcRn
-> IsGroupClosed
-> TcM thing
-> TcM (LHsBinds GhcTc, thing)
tc_single TopLevelFlag
top_lvl TcSigFun
sig_fn TcPragEnv
prag_fn LHsBindLR GhcRn GhcRn
GenLocated SrcSpanAnnA (HsBind GhcRn)
bind IsGroupClosed
closed
TcM thing
thing_inside
; ([(RecFlag, Bag (GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc)))],
thing)
-> IOEnv
(Env TcGblEnv TcLclEnv)
([(RecFlag, Bag (GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc)))],
thing)
forall a. a -> IOEnv (Env TcGblEnv TcLclEnv) a
forall (m :: * -> *) a. Monad m => a -> m a
return ( [(RecFlag
NonRecursive, Bag (GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc))
bind')], thing
thing) }
tc_group TopLevelFlag
top_lvl TcSigFun
sig_fn TcPragEnv
prag_fn (RecFlag
Recursive, LHsBinds GhcRn
binds) IsGroupClosed
closed TcM thing
thing_inside
=
do { String -> SDoc -> TcRn ()
traceTc String
"tc_group rec" (LHsBinds GhcRn -> SDoc
forall (idL :: Pass) (idR :: Pass).
(OutputableBndrId idL, OutputableBndrId idR) =>
LHsBindsLR (GhcPass idL) (GhcPass idR) -> SDoc
pprLHsBinds LHsBinds GhcRn
binds)
; Maybe (GenLocated SrcSpanAnnA (HsBind GhcRn))
-> (GenLocated SrcSpanAnnA (HsBind GhcRn) -> TcRn ()) -> TcRn ()
forall (m :: * -> *) a. Monad m => Maybe a -> (a -> m ()) -> m ()
whenIsJust Maybe (GenLocated SrcSpanAnnA (HsBind GhcRn))
mbFirstPatSyn ((GenLocated SrcSpanAnnA (HsBind GhcRn) -> TcRn ()) -> TcRn ())
-> (GenLocated SrcSpanAnnA (HsBind GhcRn) -> TcRn ()) -> TcRn ()
forall a b. (a -> b) -> a -> b
$ \GenLocated SrcSpanAnnA (HsBind GhcRn)
lpat_syn ->
SrcSpan -> LHsBinds GhcRn -> TcRn ()
forall a. SrcSpan -> LHsBinds GhcRn -> TcM a
recursivePatSynErr (SrcSpanAnnA -> SrcSpan
forall a. SrcSpanAnn' a -> SrcSpan
locA (SrcSpanAnnA -> SrcSpan) -> SrcSpanAnnA -> SrcSpan
forall a b. (a -> b) -> a -> b
$ GenLocated SrcSpanAnnA (HsBind GhcRn) -> SrcSpanAnnA
forall l e. GenLocated l e -> l
getLoc GenLocated SrcSpanAnnA (HsBind GhcRn)
lpat_syn) LHsBinds GhcRn
binds
; (Bag (GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc))
binds1, thing
thing) <- [SCC (LHsBindLR GhcRn GhcRn)] -> TcM (LHsBinds GhcTc, thing)
go [SCC (LHsBindLR GhcRn GhcRn)]
sccs
; ([(RecFlag, Bag (GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc)))],
thing)
-> IOEnv
(Env TcGblEnv TcLclEnv)
([(RecFlag, Bag (GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc)))],
thing)
forall a. a -> IOEnv (Env TcGblEnv TcLclEnv) a
forall (m :: * -> *) a. Monad m => a -> m a
return ([(RecFlag
Recursive, Bag (GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc))
binds1)], thing
thing) }
where
mbFirstPatSyn :: Maybe (GenLocated SrcSpanAnnA (HsBind GhcRn))
mbFirstPatSyn = (GenLocated SrcSpanAnnA (HsBind GhcRn) -> Bool)
-> Bag (GenLocated SrcSpanAnnA (HsBind GhcRn))
-> Maybe (GenLocated SrcSpanAnnA (HsBind GhcRn))
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Maybe a
find (HsBind GhcRn -> Bool
forall {idL} {idR}. HsBindLR idL idR -> Bool
isPatSyn (HsBind GhcRn -> Bool)
-> (GenLocated SrcSpanAnnA (HsBind GhcRn) -> HsBind GhcRn)
-> GenLocated SrcSpanAnnA (HsBind GhcRn)
-> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. GenLocated SrcSpanAnnA (HsBind GhcRn) -> HsBind GhcRn
forall l e. GenLocated l e -> e
unLoc) LHsBinds GhcRn
Bag (GenLocated SrcSpanAnnA (HsBind GhcRn))
binds
isPatSyn :: HsBindLR idL idR -> Bool
isPatSyn PatSynBind{} = Bool
True
isPatSyn HsBindLR idL idR
_ = Bool
False
sccs :: [SCC (LHsBind GhcRn)]
sccs :: [SCC (LHsBindLR GhcRn GhcRn)]
sccs = [Node BKey (GenLocated SrcSpanAnnA (HsBind GhcRn))]
-> [SCC (GenLocated SrcSpanAnnA (HsBind GhcRn))]
forall key payload.
Uniquable key =>
[Node key payload] -> [SCC payload]
stronglyConnCompFromEdgedVerticesUniq (TcSigFun -> LHsBinds GhcRn -> [Node BKey (LHsBindLR GhcRn GhcRn)]
mkEdges TcSigFun
sig_fn LHsBinds GhcRn
binds)
go :: [SCC (LHsBind GhcRn)] -> TcM (LHsBinds GhcTc, thing)
go :: [SCC (LHsBindLR GhcRn GhcRn)] -> TcM (LHsBinds GhcTc, thing)
go (SCC (LHsBindLR GhcRn GhcRn)
scc:[SCC (LHsBindLR GhcRn GhcRn)]
sccs) = do { (Bag (GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc))
binds1, [TcId]
ids1) <- SCC (GenLocated SrcSpanAnnA (HsBind GhcRn))
-> TcM (LHsBinds GhcTc, [TcId])
tc_scc SCC (LHsBindLR GhcRn GhcRn)
SCC (GenLocated SrcSpanAnnA (HsBind GhcRn))
scc
; (Bag (GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc))
binds2, thing
thing) <- TopLevelFlag
-> TcSigFun
-> IsGroupClosed
-> [TcId]
-> IOEnv
(Env TcGblEnv TcLclEnv)
(Bag (GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc)), thing)
-> IOEnv
(Env TcGblEnv TcLclEnv)
(Bag (GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc)), thing)
forall a.
TopLevelFlag
-> TcSigFun -> IsGroupClosed -> [TcId] -> TcM a -> TcM a
tcExtendLetEnv TopLevelFlag
top_lvl TcSigFun
sig_fn IsGroupClosed
closed [TcId]
ids1
([SCC (LHsBindLR GhcRn GhcRn)] -> TcM (LHsBinds GhcTc, thing)
go [SCC (LHsBindLR GhcRn GhcRn)]
sccs)
; (Bag (GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc)), thing)
-> IOEnv
(Env TcGblEnv TcLclEnv)
(Bag (GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc)), thing)
forall a. a -> IOEnv (Env TcGblEnv TcLclEnv) a
forall (m :: * -> *) a. Monad m => a -> m a
return (Bag (GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc))
binds1 Bag (GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc))
-> Bag (GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc))
-> Bag (GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc))
forall a. Bag a -> Bag a -> Bag a
`unionBags` Bag (GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc))
binds2, thing
thing) }
go [] = do { thing
thing <- TcM thing
thing_inside; (Bag (GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc)), thing)
-> IOEnv
(Env TcGblEnv TcLclEnv)
(Bag (GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc)), thing)
forall a. a -> IOEnv (Env TcGblEnv TcLclEnv) a
forall (m :: * -> *) a. Monad m => a -> m a
return (Bag (GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc))
forall a. Bag a
emptyBag, thing
thing) }
tc_scc :: SCC (GenLocated SrcSpanAnnA (HsBind GhcRn))
-> TcM (LHsBinds GhcTc, [TcId])
tc_scc (AcyclicSCC GenLocated SrcSpanAnnA (HsBind GhcRn)
bind) = RecFlag
-> [GenLocated SrcSpanAnnA (HsBind GhcRn)]
-> TcM (LHsBinds GhcTc, [TcId])
tc_sub_group RecFlag
NonRecursive [GenLocated SrcSpanAnnA (HsBind GhcRn)
bind]
tc_scc (CyclicSCC [GenLocated SrcSpanAnnA (HsBind GhcRn)]
binds) = RecFlag
-> [GenLocated SrcSpanAnnA (HsBind GhcRn)]
-> TcM (LHsBinds GhcTc, [TcId])
tc_sub_group RecFlag
Recursive [GenLocated SrcSpanAnnA (HsBind GhcRn)]
binds
tc_sub_group :: RecFlag
-> [GenLocated SrcSpanAnnA (HsBind GhcRn)]
-> TcM (LHsBinds GhcTc, [TcId])
tc_sub_group RecFlag
rec_tc [GenLocated SrcSpanAnnA (HsBind GhcRn)]
binds = TopLevelFlag
-> TcSigFun
-> TcPragEnv
-> RecFlag
-> RecFlag
-> IsGroupClosed
-> [LHsBindLR GhcRn GhcRn]
-> TcM (LHsBinds GhcTc, [TcId])
tcPolyBinds TopLevelFlag
top_lvl TcSigFun
sig_fn TcPragEnv
prag_fn
RecFlag
Recursive RecFlag
rec_tc IsGroupClosed
closed [LHsBindLR GhcRn GhcRn]
[GenLocated SrcSpanAnnA (HsBind GhcRn)]
binds
recursivePatSynErr
:: SrcSpan
-> LHsBinds GhcRn
-> TcM a
recursivePatSynErr :: forall a. SrcSpan -> LHsBinds GhcRn -> TcM a
recursivePatSynErr SrcSpan
loc LHsBinds GhcRn
binds
= SrcSpan -> TcRnMessage -> TcRn a
forall a. SrcSpan -> TcRnMessage -> TcRn a
failAt SrcSpan
loc (TcRnMessage -> TcRn a) -> TcRnMessage -> TcRn a
forall a b. (a -> b) -> a -> b
$ LHsBinds GhcRn -> TcRnMessage
TcRnRecursivePatternSynonym LHsBinds GhcRn
binds
tc_single :: forall thing.
TopLevelFlag -> TcSigFun -> TcPragEnv
-> LHsBind GhcRn -> IsGroupClosed -> TcM thing
-> TcM (LHsBinds GhcTc, thing)
tc_single :: forall thing.
TopLevelFlag
-> TcSigFun
-> TcPragEnv
-> LHsBindLR GhcRn GhcRn
-> IsGroupClosed
-> TcM thing
-> TcM (LHsBinds GhcTc, thing)
tc_single TopLevelFlag
_top_lvl TcSigFun
sig_fn TcPragEnv
prag_fn
(L SrcSpanAnnA
loc (PatSynBind XPatSynBind GhcRn GhcRn
_ PatSynBind GhcRn GhcRn
psb))
IsGroupClosed
_ TcM thing
thing_inside
= do { (Bag (GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc))
aux_binds, TcGblEnv
tcg_env) <- LocatedA (PatSynBind GhcRn GhcRn)
-> TcSigFun -> TcPragEnv -> TcM (LHsBinds GhcTc, TcGblEnv)
tcPatSynDecl (SrcSpanAnnA
-> PatSynBind GhcRn GhcRn -> LocatedA (PatSynBind GhcRn GhcRn)
forall l e. l -> e -> GenLocated l e
L SrcSpanAnnA
loc PatSynBind GhcRn GhcRn
psb) TcSigFun
sig_fn TcPragEnv
prag_fn
; thing
thing <- TcGblEnv -> TcM thing -> TcM thing
forall gbl' lcl a gbl.
gbl' -> TcRnIf gbl' lcl a -> TcRnIf gbl lcl a
setGblEnv TcGblEnv
tcg_env TcM thing
thing_inside
; (Bag (GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc)), thing)
-> IOEnv
(Env TcGblEnv TcLclEnv)
(Bag (GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc)), thing)
forall a. a -> IOEnv (Env TcGblEnv TcLclEnv) a
forall (m :: * -> *) a. Monad m => a -> m a
return (Bag (GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc))
aux_binds, thing
thing)
}
tc_single TopLevelFlag
top_lvl TcSigFun
sig_fn TcPragEnv
prag_fn LHsBindLR GhcRn GhcRn
lbind IsGroupClosed
closed TcM thing
thing_inside
= do { (Bag (GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc))
binds1, [TcId]
ids) <- TopLevelFlag
-> TcSigFun
-> TcPragEnv
-> RecFlag
-> RecFlag
-> IsGroupClosed
-> [LHsBindLR GhcRn GhcRn]
-> TcM (LHsBinds GhcTc, [TcId])
tcPolyBinds TopLevelFlag
top_lvl TcSigFun
sig_fn TcPragEnv
prag_fn
RecFlag
NonRecursive RecFlag
NonRecursive
IsGroupClosed
closed
[LHsBindLR GhcRn GhcRn
lbind]
; thing
thing <- TopLevelFlag
-> TcSigFun -> IsGroupClosed -> [TcId] -> TcM thing -> TcM thing
forall a.
TopLevelFlag
-> TcSigFun -> IsGroupClosed -> [TcId] -> TcM a -> TcM a
tcExtendLetEnv TopLevelFlag
top_lvl TcSigFun
sig_fn IsGroupClosed
closed [TcId]
ids TcM thing
thing_inside
; (Bag (GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc)), thing)
-> IOEnv
(Env TcGblEnv TcLclEnv)
(Bag (GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc)), thing)
forall a. a -> IOEnv (Env TcGblEnv TcLclEnv) a
forall (m :: * -> *) a. Monad m => a -> m a
return (Bag (GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc))
binds1, thing
thing) }
type BKey = Int
mkEdges :: TcSigFun -> LHsBinds GhcRn -> [Node BKey (LHsBind GhcRn)]
mkEdges :: TcSigFun -> LHsBinds GhcRn -> [Node BKey (LHsBindLR GhcRn GhcRn)]
mkEdges TcSigFun
sig_fn LHsBinds GhcRn
binds
= [ GenLocated SrcSpanAnnA (HsBind GhcRn)
-> BKey
-> [BKey]
-> Node BKey (GenLocated SrcSpanAnnA (HsBind GhcRn))
forall key payload. payload -> key -> [key] -> Node key payload
DigraphNode GenLocated SrcSpanAnnA (HsBind GhcRn)
bind BKey
key [BKey
key | Name
n <- NameSet -> [Name]
forall elt. UniqSet elt -> [elt]
nonDetEltsUniqSet (HsBind GhcRn -> XFunBind GhcRn GhcRn
forall {idL} {idR}.
(XFunBind idL idR ~ NameSet, XPatBind idL idR ~ NameSet) =>
HsBindLR idL idR -> XFunBind idL idR
bind_fvs (GenLocated SrcSpanAnnA (HsBind GhcRn) -> HsBind GhcRn
forall l e. GenLocated l e -> e
unLoc GenLocated SrcSpanAnnA (HsBind GhcRn)
bind)),
Just BKey
key <- [NameEnv BKey -> Name -> Maybe BKey
forall a. NameEnv a -> Name -> Maybe a
lookupNameEnv NameEnv BKey
key_map Name
n], Name -> Bool
no_sig Name
n ]
| (GenLocated SrcSpanAnnA (HsBind GhcRn)
bind, BKey
key) <- [(GenLocated SrcSpanAnnA (HsBind GhcRn), BKey)]
keyd_binds
]
where
bind_fvs :: HsBindLR idL idR -> XFunBind idL idR
bind_fvs (FunBind { fun_ext :: forall idL idR. HsBindLR idL idR -> XFunBind idL idR
fun_ext = XFunBind idL idR
fvs }) = XFunBind idL idR
fvs
bind_fvs (PatBind { pat_ext :: forall idL idR. HsBindLR idL idR -> XPatBind idL idR
pat_ext = XPatBind idL idR
fvs }) = XPatBind idL idR
XFunBind idL idR
fvs
bind_fvs HsBindLR idL idR
_ = XFunBind idL idR
NameSet
emptyNameSet
no_sig :: Name -> Bool
no_sig :: Name -> Bool
no_sig Name
n = Bool -> Bool
not (TcSigFun -> Name -> Bool
hasCompleteSig TcSigFun
sig_fn Name
n)
keyd_binds :: [(GenLocated SrcSpanAnnA (HsBind GhcRn), BKey)]
keyd_binds = Bag (GenLocated SrcSpanAnnA (HsBind GhcRn))
-> [GenLocated SrcSpanAnnA (HsBind GhcRn)]
forall a. Bag a -> [a]
bagToList LHsBinds GhcRn
Bag (GenLocated SrcSpanAnnA (HsBind GhcRn))
binds [GenLocated SrcSpanAnnA (HsBind GhcRn)]
-> [BKey] -> [(GenLocated SrcSpanAnnA (HsBind GhcRn), BKey)]
forall a b. [a] -> [b] -> [(a, b)]
`zip` [BKey
0::BKey ..]
key_map :: NameEnv BKey
key_map :: NameEnv BKey
key_map = [(Name, BKey)] -> NameEnv BKey
forall a. [(Name, a)] -> NameEnv a
mkNameEnv [(Name
bndr, BKey
key) | (L SrcSpanAnnA
_ HsBind GhcRn
bind, BKey
key) <- [(GenLocated SrcSpanAnnA (HsBind GhcRn), BKey)]
keyd_binds
, Name
bndr <- CollectFlag GhcRn -> HsBind GhcRn -> [IdP GhcRn]
forall p idR.
CollectPass p =>
CollectFlag p -> HsBindLR p idR -> [IdP p]
collectHsBindBinders CollectFlag GhcRn
forall p. CollectFlag p
CollNoDictBinders HsBind GhcRn
bind ]
tcPolyBinds :: TopLevelFlag -> TcSigFun -> TcPragEnv
-> RecFlag
-> RecFlag
-> IsGroupClosed
-> [LHsBind GhcRn]
-> TcM (LHsBinds GhcTc, [TcId])
tcPolyBinds :: TopLevelFlag
-> TcSigFun
-> TcPragEnv
-> RecFlag
-> RecFlag
-> IsGroupClosed
-> [LHsBindLR GhcRn GhcRn]
-> TcM (LHsBinds GhcTc, [TcId])
tcPolyBinds TopLevelFlag
top_lvl TcSigFun
sig_fn TcPragEnv
prag_fn RecFlag
rec_group RecFlag
rec_tc IsGroupClosed
closed [LHsBindLR GhcRn GhcRn]
bind_list
= SrcSpan
-> TcM (LHsBinds GhcTc, [TcId]) -> TcM (LHsBinds GhcTc, [TcId])
forall a. SrcSpan -> TcRn a -> TcRn a
setSrcSpan SrcSpan
loc (TcM (LHsBinds GhcTc, [TcId]) -> TcM (LHsBinds GhcTc, [TcId]))
-> TcM (LHsBinds GhcTc, [TcId]) -> TcM (LHsBinds GhcTc, [TcId])
forall a b. (a -> b) -> a -> b
$
TcM (LHsBinds GhcTc, [TcId])
-> TcM (LHsBinds GhcTc, [TcId]) -> TcM (LHsBinds GhcTc, [TcId])
forall r. TcRn r -> TcRn r -> TcRn r
recoverM ([Name] -> TcSigFun -> TcM (LHsBinds GhcTc, [TcId])
recoveryCode [IdP GhcRn]
[Name]
binder_names TcSigFun
sig_fn) (TcM (LHsBinds GhcTc, [TcId]) -> TcM (LHsBinds GhcTc, [TcId]))
-> TcM (LHsBinds GhcTc, [TcId]) -> TcM (LHsBinds GhcTc, [TcId])
forall a b. (a -> b) -> a -> b
$ do
{ String -> SDoc -> TcRn ()
traceTc String
"------------------------------------------------" SDoc
forall doc. IsOutput doc => doc
Outputable.empty
; String -> SDoc -> TcRn ()
traceTc String
"Bindings for {" ([Name] -> SDoc
forall a. Outputable a => a -> SDoc
ppr [IdP GhcRn]
[Name]
binder_names)
; DynFlags
dflags <- IOEnv (Env TcGblEnv TcLclEnv) DynFlags
forall (m :: * -> *). HasDynFlags m => m DynFlags
getDynFlags
; let plan :: GeneralisationPlan
plan = DynFlags
-> TopLevelFlag
-> IsGroupClosed
-> TcSigFun
-> [LHsBindLR GhcRn GhcRn]
-> GeneralisationPlan
decideGeneralisationPlan DynFlags
dflags TopLevelFlag
top_lvl IsGroupClosed
closed TcSigFun
sig_fn [LHsBindLR GhcRn GhcRn]
bind_list
; String -> SDoc -> TcRn ()
traceTc String
"Generalisation plan" (GeneralisationPlan -> SDoc
forall a. Outputable a => a -> SDoc
ppr GeneralisationPlan
plan)
; result :: (Bag (GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc)), [TcId])
result@(Bag (GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc))
_, [TcId]
poly_ids) <- case GeneralisationPlan
plan of
GeneralisationPlan
NoGen -> RecFlag
-> TcPragEnv
-> TcSigFun
-> [LHsBindLR GhcRn GhcRn]
-> TcM (LHsBinds GhcTc, [TcId])
tcPolyNoGen RecFlag
rec_tc TcPragEnv
prag_fn TcSigFun
sig_fn [LHsBindLR GhcRn GhcRn]
bind_list
GeneralisationPlan
InferGen -> RecFlag
-> TcPragEnv
-> TcSigFun
-> [LHsBindLR GhcRn GhcRn]
-> TcM (LHsBinds GhcTc, [TcId])
tcPolyInfer RecFlag
rec_tc TcPragEnv
prag_fn TcSigFun
sig_fn [LHsBindLR GhcRn GhcRn]
bind_list
CheckGen LHsBindLR GhcRn GhcRn
lbind TcIdSigInfo
sig -> TcPragEnv
-> TcIdSigInfo
-> LHsBindLR GhcRn GhcRn
-> TcM (LHsBinds GhcTc, [TcId])
tcPolyCheck TcPragEnv
prag_fn TcIdSigInfo
sig LHsBindLR GhcRn GhcRn
lbind
; (TcId -> TcRn ()) -> [TcId] -> TcRn ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ (\ TcId
poly_id ->
HasDebugCallStack => FixedRuntimeRepContext -> Kind -> TcRn ()
FixedRuntimeRepContext -> Kind -> TcRn ()
hasFixedRuntimeRep_syntactic (Name -> FixedRuntimeRepContext
FRRBinder (Name -> FixedRuntimeRepContext) -> Name -> FixedRuntimeRepContext
forall a b. (a -> b) -> a -> b
$ TcId -> Name
idName TcId
poly_id) (TcId -> Kind
idType TcId
poly_id))
[TcId]
poly_ids
; String -> SDoc -> TcRn ()
traceTc String
"} End of bindings for" ([SDoc] -> SDoc
forall doc. IsDoc doc => [doc] -> doc
vcat [ [Name] -> SDoc
forall a. Outputable a => a -> SDoc
ppr [IdP GhcRn]
[Name]
binder_names, RecFlag -> SDoc
forall a. Outputable a => a -> SDoc
ppr RecFlag
rec_group
, [SDoc] -> SDoc
forall doc. IsDoc doc => [doc] -> doc
vcat [TcId -> SDoc
forall a. Outputable a => a -> SDoc
ppr TcId
id SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> Kind -> SDoc
forall a. Outputable a => a -> SDoc
ppr (TcId -> Kind
idType TcId
id) | TcId
id <- [TcId]
poly_ids]
])
; (Bag (GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc)), [TcId])
-> IOEnv
(Env TcGblEnv TcLclEnv)
(Bag (GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc)), [TcId])
forall a. a -> IOEnv (Env TcGblEnv TcLclEnv) a
forall (m :: * -> *) a. Monad m => a -> m a
return (Bag (GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc)), [TcId])
result }
where
binder_names :: [IdP GhcRn]
binder_names = CollectFlag GhcRn -> [LHsBindLR GhcRn GhcRn] -> [IdP GhcRn]
forall p idR.
CollectPass p =>
CollectFlag p -> [LHsBindLR p idR] -> [IdP p]
collectHsBindListBinders CollectFlag GhcRn
forall p. CollectFlag p
CollNoDictBinders [LHsBindLR GhcRn GhcRn]
bind_list
loc :: SrcSpan
loc = (SrcSpan -> SrcSpan -> SrcSpan) -> [SrcSpan] -> SrcSpan
forall a. (a -> a -> a) -> [a] -> a
forall (t :: * -> *) a. Foldable t => (a -> a -> a) -> t a -> a
foldr1 SrcSpan -> SrcSpan -> SrcSpan
combineSrcSpans ((GenLocated SrcSpanAnnA (HsBind GhcRn) -> SrcSpan)
-> [GenLocated SrcSpanAnnA (HsBind GhcRn)] -> [SrcSpan]
forall a b. (a -> b) -> [a] -> [b]
map (SrcSpanAnnA -> SrcSpan
forall a. SrcSpanAnn' a -> SrcSpan
locA (SrcSpanAnnA -> SrcSpan)
-> (GenLocated SrcSpanAnnA (HsBind GhcRn) -> SrcSpanAnnA)
-> GenLocated SrcSpanAnnA (HsBind GhcRn)
-> SrcSpan
forall b c a. (b -> c) -> (a -> b) -> a -> c
. GenLocated SrcSpanAnnA (HsBind GhcRn) -> SrcSpanAnnA
forall l e. GenLocated l e -> l
getLoc) [LHsBindLR GhcRn GhcRn]
[GenLocated SrcSpanAnnA (HsBind GhcRn)]
bind_list)
recoveryCode :: [Name] -> TcSigFun -> TcM (LHsBinds GhcTc, [Id])
recoveryCode :: [Name] -> TcSigFun -> TcM (LHsBinds GhcTc, [TcId])
recoveryCode [Name]
binder_names TcSigFun
sig_fn
= do { String -> SDoc -> TcRn ()
traceTc String
"tcBindsWithSigs: error recovery" ([Name] -> SDoc
forall a. Outputable a => a -> SDoc
ppr [Name]
binder_names)
; let poly_ids :: [TcId]
poly_ids = (Name -> TcId) -> [Name] -> [TcId]
forall a b. (a -> b) -> [a] -> [b]
map Name -> TcId
mk_dummy [Name]
binder_names
; (Bag (GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc)), [TcId])
-> IOEnv
(Env TcGblEnv TcLclEnv)
(Bag (GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc)), [TcId])
forall a. a -> IOEnv (Env TcGblEnv TcLclEnv) a
forall (m :: * -> *) a. Monad m => a -> m a
return (Bag (GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc))
forall a. Bag a
emptyBag, [TcId]
poly_ids) }
where
mk_dummy :: Name -> TcId
mk_dummy Name
name
| Just TcSigInfo
sig <- TcSigFun
sig_fn Name
name
, Just TcId
poly_id <- TcSigInfo -> Maybe TcId
completeSigPolyId_maybe TcSigInfo
sig
= TcId
poly_id
| Bool
otherwise
= HasDebugCallStack => Name -> Kind -> Kind -> TcId
Name -> Kind -> Kind -> TcId
mkLocalId Name
name Kind
ManyTy Kind
forall_a_a
forall_a_a :: TcType
forall_a_a :: Kind
forall_a_a = [TcId] -> Kind -> Kind
mkSpecForAllTys [TcId
alphaTyVar] Kind
alphaTy
tcPolyNoGen
:: RecFlag
-> TcPragEnv -> TcSigFun
-> [LHsBind GhcRn]
-> TcM (LHsBinds GhcTc, [TcId])
tcPolyNoGen :: RecFlag
-> TcPragEnv
-> TcSigFun
-> [LHsBindLR GhcRn GhcRn]
-> TcM (LHsBinds GhcTc, [TcId])
tcPolyNoGen RecFlag
rec_tc TcPragEnv
prag_fn TcSigFun
tc_sig_fn [LHsBindLR GhcRn GhcRn]
bind_list
= do { (Bag (GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc))
binds', [MonoBindInfo]
mono_infos) <- RecFlag
-> TcSigFun
-> LetBndrSpec
-> [LHsBindLR GhcRn GhcRn]
-> TcM (LHsBinds GhcTc, [MonoBindInfo])
tcMonoBinds RecFlag
rec_tc TcSigFun
tc_sig_fn
(TcPragEnv -> LetBndrSpec
LetGblBndr TcPragEnv
prag_fn)
[LHsBindLR GhcRn GhcRn]
bind_list
; [TcId]
mono_ids' <- (MonoBindInfo -> IOEnv (Env TcGblEnv TcLclEnv) TcId)
-> [MonoBindInfo] -> TcM [TcId]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> [a] -> m [b]
mapM MonoBindInfo -> IOEnv (Env TcGblEnv TcLclEnv) TcId
tc_mono_info [MonoBindInfo]
mono_infos
; (Bag (GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc)), [TcId])
-> IOEnv
(Env TcGblEnv TcLclEnv)
(Bag (GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc)), [TcId])
forall a. a -> IOEnv (Env TcGblEnv TcLclEnv) a
forall (m :: * -> *) a. Monad m => a -> m a
return (Bag (GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc))
binds', [TcId]
mono_ids') }
where
tc_mono_info :: MonoBindInfo -> IOEnv (Env TcGblEnv TcLclEnv) TcId
tc_mono_info (MBI { mbi_poly_name :: MonoBindInfo -> Name
mbi_poly_name = Name
name, mbi_mono_id :: MonoBindInfo -> TcId
mbi_mono_id = TcId
mono_id })
= do { [LTcSpecPrag]
_specs <- TcId -> [LSig GhcRn] -> TcM [LTcSpecPrag]
tcSpecPrags TcId
mono_id (TcPragEnv -> Name -> [LSig GhcRn]
lookupPragEnv TcPragEnv
prag_fn Name
name)
; TcId -> IOEnv (Env TcGblEnv TcLclEnv) TcId
forall a. a -> IOEnv (Env TcGblEnv TcLclEnv) a
forall (m :: * -> *) a. Monad m => a -> m a
return TcId
mono_id }
tcPolyCheck :: TcPragEnv
-> TcIdSigInfo
-> LHsBind GhcRn
-> TcM (LHsBinds GhcTc, [TcId])
tcPolyCheck :: TcPragEnv
-> TcIdSigInfo
-> LHsBindLR GhcRn GhcRn
-> TcM (LHsBinds GhcTc, [TcId])
tcPolyCheck TcPragEnv
prag_fn
(CompleteSig { sig_bndr :: TcIdSigInfo -> TcId
sig_bndr = TcId
poly_id
, sig_ctxt :: TcIdSigInfo -> UserTypeCtxt
sig_ctxt = UserTypeCtxt
ctxt
, sig_loc :: TcIdSigInfo -> SrcSpan
sig_loc = SrcSpan
sig_loc })
(L SrcSpanAnnA
bind_loc (FunBind { fun_id :: forall idL idR. HsBindLR idL idR -> LIdP idL
fun_id = L SrcSpanAnnN
nm_loc Name
name
, fun_matches :: forall idL idR. HsBindLR idL idR -> MatchGroup idR (LHsExpr idR)
fun_matches = MatchGroup GhcRn (LHsExpr GhcRn)
matches }))
= do { String -> SDoc -> TcRn ()
traceTc String
"tcPolyCheck" (TcId -> SDoc
forall a. Outputable a => a -> SDoc
ppr TcId
poly_id SDoc -> SDoc -> SDoc
forall doc. IsDoc doc => doc -> doc -> doc
$$ SrcSpan -> SDoc
forall a. Outputable a => a -> SDoc
ppr SrcSpan
sig_loc)
; Name
mono_name <- OccName -> SrcSpan -> TcM Name
newNameAt (Name -> OccName
nameOccName Name
name) (SrcSpanAnnN -> SrcSpan
forall a. SrcSpanAnn' a -> SrcSpan
locA SrcSpanAnnN
nm_loc)
; (HsWrapper
wrap_gen, (HsWrapper
wrap_res, MatchGroup GhcTc (GenLocated SrcSpanAnnA (HsExpr GhcTc))
matches'))
<- SrcSpan
-> TcRn
(HsWrapper,
(HsWrapper,
MatchGroup GhcTc (GenLocated SrcSpanAnnA (HsExpr GhcTc))))
-> TcRn
(HsWrapper,
(HsWrapper,
MatchGroup GhcTc (GenLocated SrcSpanAnnA (HsExpr GhcTc))))
forall a. SrcSpan -> TcRn a -> TcRn a
setSrcSpan SrcSpan
sig_loc (TcRn
(HsWrapper,
(HsWrapper,
MatchGroup GhcTc (GenLocated SrcSpanAnnA (HsExpr GhcTc))))
-> TcRn
(HsWrapper,
(HsWrapper,
MatchGroup GhcTc (GenLocated SrcSpanAnnA (HsExpr GhcTc)))))
-> TcRn
(HsWrapper,
(HsWrapper,
MatchGroup GhcTc (GenLocated SrcSpanAnnA (HsExpr GhcTc))))
-> TcRn
(HsWrapper,
(HsWrapper,
MatchGroup GhcTc (GenLocated SrcSpanAnnA (HsExpr GhcTc))))
forall a b. (a -> b) -> a -> b
$
UserTypeCtxt
-> Kind
-> (Kind
-> TcM
(HsWrapper,
MatchGroup GhcTc (GenLocated SrcSpanAnnA (HsExpr GhcTc))))
-> TcRn
(HsWrapper,
(HsWrapper,
MatchGroup GhcTc (GenLocated SrcSpanAnnA (HsExpr GhcTc))))
forall result.
UserTypeCtxt
-> Kind -> (Kind -> TcM result) -> TcM (HsWrapper, result)
tcSkolemiseScoped UserTypeCtxt
ctxt (TcId -> Kind
idType TcId
poly_id) ((Kind
-> TcM
(HsWrapper,
MatchGroup GhcTc (GenLocated SrcSpanAnnA (HsExpr GhcTc))))
-> TcRn
(HsWrapper,
(HsWrapper,
MatchGroup GhcTc (GenLocated SrcSpanAnnA (HsExpr GhcTc)))))
-> (Kind
-> TcM
(HsWrapper,
MatchGroup GhcTc (GenLocated SrcSpanAnnA (HsExpr GhcTc))))
-> TcRn
(HsWrapper,
(HsWrapper,
MatchGroup GhcTc (GenLocated SrcSpanAnnA (HsExpr GhcTc))))
forall a b. (a -> b) -> a -> b
$ \Kind
rho_ty ->
let mono_id :: TcId
mono_id = HasDebugCallStack => Name -> Kind -> Kind -> TcId
Name -> Kind -> Kind -> TcId
mkLocalId Name
mono_name (TcId -> Kind
varMult TcId
poly_id) Kind
rho_ty in
[TcBinder]
-> TcM
(HsWrapper,
MatchGroup GhcTc (GenLocated SrcSpanAnnA (HsExpr GhcTc)))
-> TcM
(HsWrapper,
MatchGroup GhcTc (GenLocated SrcSpanAnnA (HsExpr GhcTc)))
forall a. [TcBinder] -> TcM a -> TcM a
tcExtendBinderStack [TcId -> TopLevelFlag -> TcBinder
TcIdBndr TcId
mono_id TopLevelFlag
NotTopLevel] (TcM
(HsWrapper,
MatchGroup GhcTc (GenLocated SrcSpanAnnA (HsExpr GhcTc)))
-> TcM
(HsWrapper,
MatchGroup GhcTc (GenLocated SrcSpanAnnA (HsExpr GhcTc))))
-> TcM
(HsWrapper,
MatchGroup GhcTc (GenLocated SrcSpanAnnA (HsExpr GhcTc)))
-> TcM
(HsWrapper,
MatchGroup GhcTc (GenLocated SrcSpanAnnA (HsExpr GhcTc)))
forall a b. (a -> b) -> a -> b
$
SrcSpanAnnA
-> TcRn (HsWrapper, MatchGroup GhcTc (LHsExpr GhcTc))
-> TcRn (HsWrapper, MatchGroup GhcTc (LHsExpr GhcTc))
forall ann a. SrcSpanAnn' ann -> TcRn a -> TcRn a
setSrcSpanA SrcSpanAnnA
bind_loc (TcRn (HsWrapper, MatchGroup GhcTc (LHsExpr GhcTc))
-> TcRn (HsWrapper, MatchGroup GhcTc (LHsExpr GhcTc)))
-> TcRn (HsWrapper, MatchGroup GhcTc (LHsExpr GhcTc))
-> TcRn (HsWrapper, MatchGroup GhcTc (LHsExpr GhcTc))
forall a b. (a -> b) -> a -> b
$
GenLocated SrcSpanAnnN Name
-> MatchGroup GhcRn (LHsExpr GhcRn)
-> ExpSigmaType
-> TcRn (HsWrapper, MatchGroup GhcTc (LHsExpr GhcTc))
tcMatchesFun (SrcSpanAnnN -> Name -> GenLocated SrcSpanAnnN Name
forall l e. l -> e -> GenLocated l e
L SrcSpanAnnN
nm_loc (TcId -> Name
idName TcId
mono_id)) MatchGroup GhcRn (LHsExpr GhcRn)
matches
(Kind -> ExpSigmaType
mkCheckExpType Kind
rho_ty)
; let prag_sigs :: [LSig GhcRn]
prag_sigs = TcPragEnv -> Name -> [LSig GhcRn]
lookupPragEnv TcPragEnv
prag_fn Name
name
poly_id2 :: TcId
poly_id2 = HasDebugCallStack => Name -> Kind -> Kind -> TcId
Name -> Kind -> Kind -> TcId
mkLocalId Name
mono_name (TcId -> Kind
idMult TcId
poly_id) (TcId -> Kind
idType TcId
poly_id)
; [LTcSpecPrag]
spec_prags <- TcId -> [LSig GhcRn] -> TcM [LTcSpecPrag]
tcSpecPrags TcId
poly_id [LSig GhcRn]
prag_sigs
; TcId
poly_id <- TcId -> [LSig GhcRn] -> IOEnv (Env TcGblEnv TcLclEnv) TcId
addInlinePrags TcId
poly_id [LSig GhcRn]
prag_sigs
; Module
mod <- IOEnv (Env TcGblEnv TcLclEnv) Module
forall (m :: * -> *). HasModule m => m Module
getModule
; [CoreTickish]
tick <- SrcSpan -> TcId -> Module -> [LSig GhcRn] -> TcM [CoreTickish]
funBindTicks (SrcSpanAnnN -> SrcSpan
forall a. SrcSpanAnn' a -> SrcSpan
locA SrcSpanAnnN
nm_loc) TcId
poly_id Module
mod [LSig GhcRn]
prag_sigs
; let bind' :: HsBindLR GhcTc GhcTc
bind' = FunBind { fun_id :: LIdP GhcTc
fun_id = SrcSpanAnnN -> TcId -> GenLocated SrcSpanAnnN TcId
forall l e. l -> e -> GenLocated l e
L SrcSpanAnnN
nm_loc TcId
poly_id2
, fun_matches :: MatchGroup GhcTc (LHsExpr GhcTc)
fun_matches = MatchGroup GhcTc (LHsExpr GhcTc)
MatchGroup GhcTc (GenLocated SrcSpanAnnA (HsExpr GhcTc))
matches'
, fun_ext :: XFunBind GhcTc GhcTc
fun_ext = (HsWrapper
wrap_gen HsWrapper -> HsWrapper -> HsWrapper
<.> HsWrapper
wrap_res, [CoreTickish]
tick)
}
export :: ABExport
export = ABE { abe_wrap :: HsWrapper
abe_wrap = HsWrapper
idHsWrapper
, abe_poly :: TcId
abe_poly = TcId
poly_id
, abe_mono :: TcId
abe_mono = TcId
poly_id2
, abe_prags :: TcSpecPrags
abe_prags = [LTcSpecPrag] -> TcSpecPrags
SpecPrags [LTcSpecPrag]
spec_prags }
abs_bind :: GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc)
abs_bind = SrcSpanAnnA
-> HsBindLR GhcTc GhcTc
-> GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc)
forall l e. l -> e -> GenLocated l e
L SrcSpanAnnA
bind_loc (HsBindLR GhcTc GhcTc
-> GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc))
-> HsBindLR GhcTc GhcTc
-> GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc)
forall a b. (a -> b) -> a -> b
$ XXHsBindsLR GhcTc GhcTc -> HsBindLR GhcTc GhcTc
forall idL idR. XXHsBindsLR idL idR -> HsBindLR idL idR
XHsBindsLR (XXHsBindsLR GhcTc GhcTc -> HsBindLR GhcTc GhcTc)
-> XXHsBindsLR GhcTc GhcTc -> HsBindLR GhcTc GhcTc
forall a b. (a -> b) -> a -> b
$
AbsBinds { abs_tvs :: [TcId]
abs_tvs = []
, abs_ev_vars :: [TcId]
abs_ev_vars = []
, abs_ev_binds :: [TcEvBinds]
abs_ev_binds = []
, abs_exports :: [ABExport]
abs_exports = [ABExport
export]
, abs_binds :: LHsBinds GhcTc
abs_binds = GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc)
-> Bag (GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc))
forall a. a -> Bag a
unitBag (SrcSpanAnnA
-> HsBindLR GhcTc GhcTc
-> GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc)
forall l e. l -> e -> GenLocated l e
L SrcSpanAnnA
bind_loc HsBindLR GhcTc GhcTc
bind')
, abs_sig :: Bool
abs_sig = Bool
True }
; (Bag (GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc)), [TcId])
-> IOEnv
(Env TcGblEnv TcLclEnv)
(Bag (GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc)), [TcId])
forall a. a -> IOEnv (Env TcGblEnv TcLclEnv) a
forall (m :: * -> *) a. Monad m => a -> m a
return (GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc)
-> Bag (GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc))
forall a. a -> Bag a
unitBag GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc)
abs_bind, [TcId
poly_id]) }
tcPolyCheck TcPragEnv
_prag_fn TcIdSigInfo
sig LHsBindLR GhcRn GhcRn
bind
= String
-> SDoc
-> IOEnv
(Env TcGblEnv TcLclEnv)
(Bag (GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc)), [TcId])
forall a. HasCallStack => String -> SDoc -> a
pprPanic String
"tcPolyCheck" (TcIdSigInfo -> SDoc
forall a. Outputable a => a -> SDoc
ppr TcIdSigInfo
sig SDoc -> SDoc -> SDoc
forall doc. IsDoc doc => doc -> doc -> doc
$$ GenLocated SrcSpanAnnA (HsBind GhcRn) -> SDoc
forall a. Outputable a => a -> SDoc
ppr LHsBindLR GhcRn GhcRn
GenLocated SrcSpanAnnA (HsBind GhcRn)
bind)
funBindTicks :: SrcSpan -> TcId -> Module -> [LSig GhcRn]
-> TcM [CoreTickish]
funBindTicks :: SrcSpan -> TcId -> Module -> [LSig GhcRn] -> TcM [CoreTickish]
funBindTicks SrcSpan
loc TcId
fun_id Module
mod [LSig GhcRn]
sigs
| (Maybe (GenLocated (SrcAnn NoEpAnns) StringLiteral)
mb_cc_str : [Maybe (GenLocated (SrcAnn NoEpAnns) StringLiteral)]
_) <- [ Maybe (XRec GhcRn StringLiteral)
Maybe (GenLocated (SrcAnn NoEpAnns) StringLiteral)
cc_name | L SrcSpanAnnA
_ (SCCFunSig XSCCFunSig GhcRn
_ LIdP GhcRn
_ Maybe (XRec GhcRn StringLiteral)
cc_name) <- [LSig GhcRn]
[GenLocated SrcSpanAnnA (Sig GhcRn)]
sigs ]
, let cc_str :: FastString
cc_str
| Just GenLocated (SrcAnn NoEpAnns) StringLiteral
cc_str <- Maybe (GenLocated (SrcAnn NoEpAnns) StringLiteral)
mb_cc_str
= StringLiteral -> FastString
sl_fs (StringLiteral -> FastString) -> StringLiteral -> FastString
forall a b. (a -> b) -> a -> b
$ GenLocated (SrcAnn NoEpAnns) StringLiteral -> StringLiteral
forall l e. GenLocated l e -> e
unLoc GenLocated (SrcAnn NoEpAnns) StringLiteral
cc_str
| Bool
otherwise
= Name -> FastString
forall a. NamedThing a => a -> FastString
getOccFS (TcId -> Name
Var.varName TcId
fun_id)
cc_name :: FastString
cc_name = [FastString] -> FastString
concatFS [ModuleName -> FastString
moduleNameFS (Module -> ModuleName
forall unit. GenModule unit -> ModuleName
moduleName Module
mod), String -> FastString
fsLit String
".", FastString
cc_str]
= do
CCFlavour
flavour <- CostCentreIndex -> CCFlavour
mkDeclCCFlavour (CostCentreIndex -> CCFlavour)
-> IOEnv (Env TcGblEnv TcLclEnv) CostCentreIndex
-> IOEnv (Env TcGblEnv TcLclEnv) CCFlavour
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> FastString -> IOEnv (Env TcGblEnv TcLclEnv) CostCentreIndex
getCCIndexTcM FastString
cc_name
let cc :: CostCentre
cc = FastString -> Module -> SrcSpan -> CCFlavour -> CostCentre
mkUserCC FastString
cc_name Module
mod SrcSpan
loc CCFlavour
flavour
[CoreTickish] -> TcM [CoreTickish]
forall a. a -> IOEnv (Env TcGblEnv TcLclEnv) a
forall (m :: * -> *) a. Monad m => a -> m a
return [CostCentre -> Bool -> Bool -> CoreTickish
forall (pass :: TickishPass).
CostCentre -> Bool -> Bool -> GenTickish pass
ProfNote CostCentre
cc Bool
True Bool
True]
| Bool
otherwise
= [CoreTickish] -> TcM [CoreTickish]
forall a. a -> IOEnv (Env TcGblEnv TcLclEnv) a
forall (m :: * -> *) a. Monad m => a -> m a
return []
tcPolyInfer
:: RecFlag
-> TcPragEnv -> TcSigFun
-> [LHsBind GhcRn]
-> TcM (LHsBinds GhcTc, [TcId])
tcPolyInfer :: RecFlag
-> TcPragEnv
-> TcSigFun
-> [LHsBindLR GhcRn GhcRn]
-> TcM (LHsBinds GhcTc, [TcId])
tcPolyInfer RecFlag
rec_tc TcPragEnv
prag_fn TcSigFun
tc_sig_fn [LHsBindLR GhcRn GhcRn]
bind_list
= do { (TcLevel
tclvl, WantedConstraints
wanted, (Bag (GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc))
binds', [MonoBindInfo]
mono_infos))
<- TcM (LHsBinds GhcTc, [MonoBindInfo])
-> TcM
(TcLevel, WantedConstraints, (LHsBinds GhcTc, [MonoBindInfo]))
forall a. TcM a -> TcM (TcLevel, WantedConstraints, a)
pushLevelAndCaptureConstraints (TcM (LHsBinds GhcTc, [MonoBindInfo])
-> TcM
(TcLevel, WantedConstraints, (LHsBinds GhcTc, [MonoBindInfo])))
-> TcM (LHsBinds GhcTc, [MonoBindInfo])
-> TcM
(TcLevel, WantedConstraints, (LHsBinds GhcTc, [MonoBindInfo]))
forall a b. (a -> b) -> a -> b
$
RecFlag
-> TcSigFun
-> LetBndrSpec
-> [LHsBindLR GhcRn GhcRn]
-> TcM (LHsBinds GhcTc, [MonoBindInfo])
tcMonoBinds RecFlag
rec_tc TcSigFun
tc_sig_fn LetBndrSpec
LetLclBndr [LHsBindLR GhcRn GhcRn]
bind_list
; Bool
apply_mr <- [MonoBindInfo] -> [LHsBindLR GhcRn GhcRn] -> TcM Bool
checkMonomorphismRestriction [MonoBindInfo]
mono_infos [LHsBindLR GhcRn GhcRn]
bind_list
; String -> SDoc -> TcRn ()
traceTc String
"tcPolyInfer" (Bool -> SDoc
forall a. Outputable a => a -> SDoc
ppr Bool
apply_mr SDoc -> SDoc -> SDoc
forall doc. IsDoc doc => doc -> doc -> doc
$$ [Maybe TcIdSigInst] -> SDoc
forall a. Outputable a => a -> SDoc
ppr ((MonoBindInfo -> Maybe TcIdSigInst)
-> [MonoBindInfo] -> [Maybe TcIdSigInst]
forall a b. (a -> b) -> [a] -> [b]
map MonoBindInfo -> Maybe TcIdSigInst
mbi_sig [MonoBindInfo]
mono_infos))
; let name_taus :: [(Name, Kind)]
name_taus = [ (MonoBindInfo -> Name
mbi_poly_name MonoBindInfo
info, TcId -> Kind
idType (MonoBindInfo -> TcId
mbi_mono_id MonoBindInfo
info))
| MonoBindInfo
info <- [MonoBindInfo]
mono_infos ]
sigs :: [TcIdSigInst]
sigs = [ TcIdSigInst
sig | MBI { mbi_sig :: MonoBindInfo -> Maybe TcIdSigInst
mbi_sig = Just TcIdSigInst
sig } <- [MonoBindInfo]
mono_infos ]
infer_mode :: InferMode
infer_mode = if Bool
apply_mr then InferMode
ApplyMR else InferMode
NoRestrictions
; String -> SDoc -> TcRn ()
traceTc String
"simplifyInfer call" (TcLevel -> SDoc
forall a. Outputable a => a -> SDoc
ppr TcLevel
tclvl SDoc -> SDoc -> SDoc
forall doc. IsDoc doc => doc -> doc -> doc
$$ [(Name, Kind)] -> SDoc
forall a. Outputable a => a -> SDoc
ppr [(Name, Kind)]
name_taus SDoc -> SDoc -> SDoc
forall doc. IsDoc doc => doc -> doc -> doc
$$ WantedConstraints -> SDoc
forall a. Outputable a => a -> SDoc
ppr WantedConstraints
wanted)
; (([TcId]
qtvs, [TcId]
givens, TcEvBinds
ev_binds, Bool
insoluble), WantedConstraints
residual)
<- TcM ([TcId], [TcId], TcEvBinds, Bool)
-> TcM (([TcId], [TcId], TcEvBinds, Bool), WantedConstraints)
forall a. TcM a -> TcM (a, WantedConstraints)
captureConstraints (TcM ([TcId], [TcId], TcEvBinds, Bool)
-> TcM (([TcId], [TcId], TcEvBinds, Bool), WantedConstraints))
-> TcM ([TcId], [TcId], TcEvBinds, Bool)
-> TcM (([TcId], [TcId], TcEvBinds, Bool), WantedConstraints)
forall a b. (a -> b) -> a -> b
$ TcLevel
-> InferMode
-> [TcIdSigInst]
-> [(Name, Kind)]
-> WantedConstraints
-> TcM ([TcId], [TcId], TcEvBinds, Bool)
simplifyInfer TcLevel
tclvl InferMode
infer_mode [TcIdSigInst]
sigs [(Name, Kind)]
name_taus WantedConstraints
wanted
; let inferred_theta :: TcThetaType
inferred_theta = (TcId -> Kind) -> [TcId] -> TcThetaType
forall a b. (a -> b) -> [a] -> [b]
map TcId -> Kind
evVarPred [TcId]
givens
; [ABExport]
exports <- TcM [ABExport] -> TcM [ABExport]
forall r. TcM r -> TcM r
checkNoErrs (TcM [ABExport] -> TcM [ABExport])
-> TcM [ABExport] -> TcM [ABExport]
forall a b. (a -> b) -> a -> b
$
(MonoBindInfo -> IOEnv (Env TcGblEnv TcLclEnv) ABExport)
-> [MonoBindInfo] -> TcM [ABExport]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> [a] -> m [b]
mapM (TcPragEnv
-> WantedConstraints
-> Bool
-> [TcId]
-> TcThetaType
-> MonoBindInfo
-> IOEnv (Env TcGblEnv TcLclEnv) ABExport
mkExport TcPragEnv
prag_fn WantedConstraints
residual Bool
insoluble [TcId]
qtvs TcThetaType
inferred_theta) [MonoBindInfo]
mono_infos
; WantedConstraints -> TcRn ()
emitConstraints WantedConstraints
residual
; SrcSpan
loc <- TcRn SrcSpan
getSrcSpanM
; let poly_ids :: [TcId]
poly_ids = (ABExport -> TcId) -> [ABExport] -> [TcId]
forall a b. (a -> b) -> [a] -> [b]
map ABExport -> TcId
abe_poly [ABExport]
exports
abs_bind :: GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc)
abs_bind = SrcSpanAnnA
-> HsBindLR GhcTc GhcTc
-> GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc)
forall l e. l -> e -> GenLocated l e
L (SrcSpan -> SrcSpanAnnA
forall ann. SrcSpan -> SrcAnn ann
noAnnSrcSpan SrcSpan
loc) (HsBindLR GhcTc GhcTc
-> GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc))
-> HsBindLR GhcTc GhcTc
-> GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc)
forall a b. (a -> b) -> a -> b
$ XXHsBindsLR GhcTc GhcTc -> HsBindLR GhcTc GhcTc
forall idL idR. XXHsBindsLR idL idR -> HsBindLR idL idR
XHsBindsLR (XXHsBindsLR GhcTc GhcTc -> HsBindLR GhcTc GhcTc)
-> XXHsBindsLR GhcTc GhcTc -> HsBindLR GhcTc GhcTc
forall a b. (a -> b) -> a -> b
$
AbsBinds { abs_tvs :: [TcId]
abs_tvs = [TcId]
qtvs
, abs_ev_vars :: [TcId]
abs_ev_vars = [TcId]
givens, abs_ev_binds :: [TcEvBinds]
abs_ev_binds = [TcEvBinds
ev_binds]
, abs_exports :: [ABExport]
abs_exports = [ABExport]
exports, abs_binds :: LHsBinds GhcTc
abs_binds = LHsBinds GhcTc
Bag (GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc))
binds'
, abs_sig :: Bool
abs_sig = Bool
False }
; String -> SDoc -> TcRn ()
traceTc String
"Binding:" ([(TcId, Kind)] -> SDoc
forall a. Outputable a => a -> SDoc
ppr ([TcId]
poly_ids [TcId] -> TcThetaType -> [(TcId, Kind)]
forall a b. [a] -> [b] -> [(a, b)]
`zip` (TcId -> Kind) -> [TcId] -> TcThetaType
forall a b. (a -> b) -> [a] -> [b]
map TcId -> Kind
idType [TcId]
poly_ids))
; (Bag (GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc)), [TcId])
-> IOEnv
(Env TcGblEnv TcLclEnv)
(Bag (GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc)), [TcId])
forall a. a -> IOEnv (Env TcGblEnv TcLclEnv) a
forall (m :: * -> *) a. Monad m => a -> m a
return (GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc)
-> Bag (GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc))
forall a. a -> Bag a
unitBag GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc)
abs_bind, [TcId]
poly_ids) }
checkMonomorphismRestriction :: [MonoBindInfo] -> [LHsBind GhcRn] -> TcM Bool
checkMonomorphismRestriction :: [MonoBindInfo] -> [LHsBindLR GhcRn GhcRn] -> TcM Bool
checkMonomorphismRestriction [MonoBindInfo]
mbis [LHsBindLR GhcRn GhcRn]
lbinds
= do { Bool
mr_on <- Extension -> TcM Bool
forall gbl lcl. Extension -> TcRnIf gbl lcl Bool
xoptM Extension
LangExt.MonomorphismRestriction
; let mr_applies :: Bool
mr_applies = Bool
mr_on Bool -> Bool -> Bool
&& (GenLocated SrcSpanAnnA (HsBind GhcRn) -> Bool)
-> [GenLocated SrcSpanAnnA (HsBind GhcRn)] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any (HsBind GhcRn -> Bool
restricted (HsBind GhcRn -> Bool)
-> (GenLocated SrcSpanAnnA (HsBind GhcRn) -> HsBind GhcRn)
-> GenLocated SrcSpanAnnA (HsBind GhcRn)
-> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. GenLocated SrcSpanAnnA (HsBind GhcRn) -> HsBind GhcRn
forall l e. GenLocated l e -> e
unLoc) [LHsBindLR GhcRn GhcRn]
[GenLocated SrcSpanAnnA (HsBind GhcRn)]
lbinds
; Bool -> TcRn () -> TcRn ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when Bool
mr_applies (TcRn () -> TcRn ()) -> TcRn () -> TcRn ()
forall a b. (a -> b) -> a -> b
$ (MonoBindInfo -> TcRn ()) -> [MonoBindInfo] -> TcRn ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ MonoBindInfo -> TcRn ()
checkOverloadedSig [MonoBindInfo]
mbis
; Bool -> TcM Bool
forall a. a -> IOEnv (Env TcGblEnv TcLclEnv) a
forall (m :: * -> *) a. Monad m => a -> m a
return Bool
mr_applies }
where
no_mr_bndrs :: NameSet
no_mr_bndrs :: NameSet
no_mr_bndrs = [Name] -> NameSet
mkNameSet ((MonoBindInfo -> Maybe Name) -> [MonoBindInfo] -> [Name]
forall a b. (a -> Maybe b) -> [a] -> [b]
mapMaybe MonoBindInfo -> Maybe Name
no_mr_name [MonoBindInfo]
mbis)
no_mr_name :: MonoBindInfo -> Maybe Name
no_mr_name :: MonoBindInfo -> Maybe Name
no_mr_name (MBI { mbi_sig :: MonoBindInfo -> Maybe TcIdSigInst
mbi_sig = Just TcIdSigInst
sig })
| TISI { sig_inst_sig :: TcIdSigInst -> TcIdSigInfo
sig_inst_sig = TcIdSigInfo
info, sig_inst_theta :: TcIdSigInst -> TcThetaType
sig_inst_theta = TcThetaType
theta, sig_inst_wcx :: TcIdSigInst -> Maybe Kind
sig_inst_wcx = Maybe Kind
wcx } <- TcIdSigInst
sig
= case TcIdSigInfo
info of
CompleteSig { sig_bndr :: TcIdSigInfo -> TcId
sig_bndr = TcId
bndr } -> Name -> Maybe Name
forall a. a -> Maybe a
Just (TcId -> Name
idName TcId
bndr)
PartialSig { psig_name :: TcIdSigInfo -> Name
psig_name = Name
nm }
| TcThetaType -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null TcThetaType
theta, Maybe Kind -> Bool
forall a. Maybe a -> Bool
isNothing Maybe Kind
wcx -> Maybe Name
forall a. Maybe a
Nothing
| Bool
otherwise -> Name -> Maybe Name
forall a. a -> Maybe a
Just Name
nm
no_mr_name MonoBindInfo
_ = Maybe Name
forall a. Maybe a
Nothing
restricted :: HsBindLR GhcRn GhcRn -> Bool
restricted :: HsBind GhcRn -> Bool
restricted (PatBind {}) = Bool
True
restricted (FunBind { fun_id :: forall idL idR. HsBindLR idL idR -> LIdP idL
fun_id = LIdP GhcRn
v, fun_matches :: forall idL idR. HsBindLR idL idR -> MatchGroup idR (LHsExpr idR)
fun_matches = MatchGroup GhcRn (LHsExpr GhcRn)
m }) = MatchGroup GhcRn (GenLocated SrcSpanAnnA (HsExpr GhcRn)) -> Bool
forall {id :: Pass} {body}. MatchGroup (GhcPass id) body -> Bool
restricted_match MatchGroup GhcRn (LHsExpr GhcRn)
MatchGroup GhcRn (GenLocated SrcSpanAnnA (HsExpr GhcRn))
m
Bool -> Bool -> Bool
&& Name -> Bool
mr_needed_for (GenLocated SrcSpanAnnN Name -> Name
forall l e. GenLocated l e -> e
unLoc LIdP GhcRn
GenLocated SrcSpanAnnN Name
v)
restricted (VarBind { var_ext :: forall idL idR. HsBindLR idL idR -> XVarBind idL idR
var_ext = XVarBind GhcRn GhcRn
x }) = DataConCantHappen -> Bool
forall a. DataConCantHappen -> a
dataConCantHappen XVarBind GhcRn GhcRn
DataConCantHappen
x
restricted b :: HsBind GhcRn
b@(PatSynBind {}) = String -> SDoc -> Bool
forall a. HasCallStack => String -> SDoc -> a
pprPanic String
"isRestrictedGroup/unrestricted" (HsBind GhcRn -> SDoc
forall a. Outputable a => a -> SDoc
ppr HsBind GhcRn
b)
restricted_match :: MatchGroup (GhcPass id) body -> Bool
restricted_match MatchGroup (GhcPass id) body
mg = MatchGroup (GhcPass id) body -> BKey
forall (id :: Pass) body. MatchGroup (GhcPass id) body -> BKey
matchGroupArity MatchGroup (GhcPass id) body
mg BKey -> BKey -> Bool
forall a. Eq a => a -> a -> Bool
== BKey
0
mr_needed_for :: Name -> Bool
mr_needed_for Name
nm = Bool -> Bool
not (Name
nm Name -> NameSet -> Bool
`elemNameSet` NameSet
no_mr_bndrs)
checkOverloadedSig :: MonoBindInfo -> TcM ()
checkOverloadedSig :: MonoBindInfo -> TcRn ()
checkOverloadedSig (MBI { mbi_sig :: MonoBindInfo -> Maybe TcIdSigInst
mbi_sig = Maybe TcIdSigInst
mb_sig })
| Just (TISI { sig_inst_sig :: TcIdSigInst -> TcIdSigInfo
sig_inst_sig = TcIdSigInfo
orig_sig, sig_inst_theta :: TcIdSigInst -> TcThetaType
sig_inst_theta = TcThetaType
theta, sig_inst_wcx :: TcIdSigInst -> Maybe Kind
sig_inst_wcx = Maybe Kind
wcx }) <- Maybe TcIdSigInst
mb_sig
, Bool -> Bool
not (TcThetaType -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null TcThetaType
theta Bool -> Bool -> Bool
&& Maybe Kind -> Bool
forall a. Maybe a -> Bool
isNothing Maybe Kind
wcx)
= SrcSpan -> TcRn () -> TcRn ()
forall a. SrcSpan -> TcRn a -> TcRn a
setSrcSpan (TcIdSigInfo -> SrcSpan
sig_loc TcIdSigInfo
orig_sig) (TcRn () -> TcRn ()) -> TcRn () -> TcRn ()
forall a b. (a -> b) -> a -> b
$
TcRnMessage -> TcRn ()
forall a. TcRnMessage -> TcRn a
failWith (TcRnMessage -> TcRn ()) -> TcRnMessage -> TcRn ()
forall a b. (a -> b) -> a -> b
$ TcIdSigInfo -> TcRnMessage
TcRnOverloadedSig TcIdSigInfo
orig_sig
| Bool
otherwise
= () -> TcRn ()
forall a. a -> IOEnv (Env TcGblEnv TcLclEnv) a
forall (m :: * -> *) a. Monad m => a -> m a
return ()
mkExport :: TcPragEnv
-> WantedConstraints
-> Bool
-> [TyVar] -> TcThetaType
-> MonoBindInfo
-> TcM ABExport
mkExport :: TcPragEnv
-> WantedConstraints
-> Bool
-> [TcId]
-> TcThetaType
-> MonoBindInfo
-> IOEnv (Env TcGblEnv TcLclEnv) ABExport
mkExport TcPragEnv
prag_fn WantedConstraints
residual Bool
insoluble [TcId]
qtvs TcThetaType
theta
(MBI { mbi_poly_name :: MonoBindInfo -> Name
mbi_poly_name = Name
poly_name
, mbi_sig :: MonoBindInfo -> Maybe TcIdSigInst
mbi_sig = Maybe TcIdSigInst
mb_sig
, mbi_mono_id :: MonoBindInfo -> TcId
mbi_mono_id = TcId
mono_id })
= do { Kind
mono_ty <- ZonkM Kind -> TcM Kind
forall a. ZonkM a -> TcM a
liftZonkM (ZonkM Kind -> TcM Kind) -> ZonkM Kind -> TcM Kind
forall a b. (a -> b) -> a -> b
$ Kind -> ZonkM Kind
zonkTcType (TcId -> Kind
idType TcId
mono_id)
; TcId
poly_id <- WantedConstraints
-> Bool
-> [TcId]
-> TcThetaType
-> Name
-> Maybe TcIdSigInst
-> Kind
-> IOEnv (Env TcGblEnv TcLclEnv) TcId
mkInferredPolyId WantedConstraints
residual Bool
insoluble [TcId]
qtvs TcThetaType
theta Name
poly_name Maybe TcIdSigInst
mb_sig Kind
mono_ty
; TcId
poly_id <- TcId -> [LSig GhcRn] -> IOEnv (Env TcGblEnv TcLclEnv) TcId
addInlinePrags TcId
poly_id [LSig GhcRn]
prag_sigs
; [LTcSpecPrag]
spec_prags <- TcId -> [LSig GhcRn] -> TcM [LTcSpecPrag]
tcSpecPrags TcId
poly_id [LSig GhcRn]
prag_sigs
; let poly_ty :: Kind
poly_ty = TcId -> Kind
idType TcId
poly_id
sel_poly_ty :: Kind
sel_poly_ty = [TcId] -> TcThetaType -> Kind -> Kind
HasDebugCallStack => [TcId] -> TcThetaType -> Kind -> Kind
mkInfSigmaTy [TcId]
qtvs TcThetaType
theta Kind
mono_ty
; String -> SDoc -> TcRn ()
traceTc String
"mkExport" ([SDoc] -> SDoc
forall doc. IsDoc doc => [doc] -> doc
vcat [ TcId -> SDoc
forall a. Outputable a => a -> SDoc
ppr TcId
poly_id SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> SDoc
dcolon SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> Kind -> SDoc
forall a. Outputable a => a -> SDoc
ppr Kind
poly_ty
, Kind -> SDoc
forall a. Outputable a => a -> SDoc
ppr Kind
sel_poly_ty ])
; HsWrapper
wrap <- if Kind
sel_poly_ty Kind -> Kind -> Bool
`eqType` Kind
poly_ty
then HsWrapper -> IOEnv (Env TcGblEnv TcLclEnv) HsWrapper
forall a. a -> IOEnv (Env TcGblEnv TcLclEnv) a
forall (m :: * -> *) a. Monad m => a -> m a
return HsWrapper
idHsWrapper
else CtOrigin
-> UserTypeCtxt
-> Kind
-> Kind
-> IOEnv (Env TcGblEnv TcLclEnv) HsWrapper
tcSubTypeSigma (TcId -> CtOrigin
ImpedanceMatching TcId
poly_id)
UserTypeCtxt
sig_ctxt Kind
sel_poly_ty Kind
poly_ty
; TcId -> Maybe TcIdSigInst -> TcRn ()
localSigWarn TcId
poly_id Maybe TcIdSigInst
mb_sig
; ABExport -> IOEnv (Env TcGblEnv TcLclEnv) ABExport
forall a. a -> IOEnv (Env TcGblEnv TcLclEnv) a
forall (m :: * -> *) a. Monad m => a -> m a
return (ABE { abe_wrap :: HsWrapper
abe_wrap = HsWrapper
wrap
, abe_poly :: TcId
abe_poly = TcId
poly_id
, abe_mono :: TcId
abe_mono = TcId
mono_id
, abe_prags :: TcSpecPrags
abe_prags = [LTcSpecPrag] -> TcSpecPrags
SpecPrags [LTcSpecPrag]
spec_prags }) }
where
prag_sigs :: [LSig GhcRn]
prag_sigs = TcPragEnv -> Name -> [LSig GhcRn]
lookupPragEnv TcPragEnv
prag_fn Name
poly_name
sig_ctxt :: UserTypeCtxt
sig_ctxt = Name -> UserTypeCtxt
InfSigCtxt Name
poly_name
mkInferredPolyId :: WantedConstraints
-> Bool
-> [TyVar] -> TcThetaType
-> Name -> Maybe TcIdSigInst -> TcType
-> TcM TcId
mkInferredPolyId :: WantedConstraints
-> Bool
-> [TcId]
-> TcThetaType
-> Name
-> Maybe TcIdSigInst
-> Kind
-> IOEnv (Env TcGblEnv TcLclEnv) TcId
mkInferredPolyId WantedConstraints
residual Bool
insoluble [TcId]
qtvs TcThetaType
inferred_theta Name
poly_name Maybe TcIdSigInst
mb_sig_inst Kind
mono_ty
| Just (TISI { sig_inst_sig :: TcIdSigInst -> TcIdSigInfo
sig_inst_sig = TcIdSigInfo
sig }) <- Maybe TcIdSigInst
mb_sig_inst
, CompleteSig { sig_bndr :: TcIdSigInfo -> TcId
sig_bndr = TcId
poly_id } <- TcIdSigInfo
sig
= TcId -> IOEnv (Env TcGblEnv TcLclEnv) TcId
forall a. a -> IOEnv (Env TcGblEnv TcLclEnv) a
forall (m :: * -> *) a. Monad m => a -> m a
return TcId
poly_id
| Bool
otherwise
= IOEnv (Env TcGblEnv TcLclEnv) TcId
-> IOEnv (Env TcGblEnv TcLclEnv) TcId
forall r. TcM r -> TcM r
checkNoErrs (IOEnv (Env TcGblEnv TcLclEnv) TcId
-> IOEnv (Env TcGblEnv TcLclEnv) TcId)
-> IOEnv (Env TcGblEnv TcLclEnv) TcId
-> IOEnv (Env TcGblEnv TcLclEnv) TcId
forall a b. (a -> b) -> a -> b
$
do { FamInstEnvs
fam_envs <- TcM FamInstEnvs
tcGetFamInstEnvs
; let mono_ty' :: Kind
mono_ty' = Reduction -> Kind
reductionReducedType (Reduction -> Kind) -> Reduction -> Kind
forall a b. (a -> b) -> a -> b
$ FamInstEnvs -> Role -> Kind -> Reduction
normaliseType FamInstEnvs
fam_envs Role
Nominal Kind
mono_ty
; ([VarBndr TcId Specificity]
binders, TcThetaType
theta') <- WantedConstraints
-> TcThetaType
-> VarSet
-> [TcId]
-> Maybe TcIdSigInst
-> TcM ([VarBndr TcId Specificity], TcThetaType)
chooseInferredQuantifiers WantedConstraints
residual TcThetaType
inferred_theta
(Kind -> VarSet
tyCoVarsOfType Kind
mono_ty') [TcId]
qtvs Maybe TcIdSigInst
mb_sig_inst
; let inferred_poly_ty :: Kind
inferred_poly_ty = [VarBndr TcId Specificity] -> Kind -> Kind
mkInvisForAllTys [VarBndr TcId Specificity]
binders (TcThetaType -> Kind -> Kind
HasDebugCallStack => TcThetaType -> Kind -> Kind
mkPhiTy TcThetaType
theta' Kind
mono_ty')
; String -> SDoc -> TcRn ()
traceTc String
"mkInferredPolyId" ([SDoc] -> SDoc
forall doc. IsDoc doc => [doc] -> doc
vcat [Name -> SDoc
forall a. Outputable a => a -> SDoc
ppr Name
poly_name, [TcId] -> SDoc
forall a. Outputable a => a -> SDoc
ppr [TcId]
qtvs, TcThetaType -> SDoc
forall a. Outputable a => a -> SDoc
ppr TcThetaType
theta'
, Kind -> SDoc
forall a. Outputable a => a -> SDoc
ppr Kind
inferred_poly_ty
, String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"insoluble" SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> Bool -> SDoc
forall a. Outputable a => a -> SDoc
ppr Bool
insoluble ])
; Bool -> TcRn () -> TcRn ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
unless Bool
insoluble (TcRn () -> TcRn ()) -> TcRn () -> TcRn ()
forall a b. (a -> b) -> a -> b
$
(TidyEnv -> ZonkM (TidyEnv, SDoc)) -> TcRn () -> TcRn ()
forall a. (TidyEnv -> ZonkM (TidyEnv, SDoc)) -> TcM a -> TcM a
addErrCtxtM (Name -> Kind -> TidyEnv -> ZonkM (TidyEnv, SDoc)
mk_inf_msg Name
poly_name Kind
inferred_poly_ty) (TcRn () -> TcRn ()) -> TcRn () -> TcRn ()
forall a b. (a -> b) -> a -> b
$
do { Kind -> TcRn ()
checkEscapingKind Kind
inferred_poly_ty
; UserTypeCtxt -> Kind -> TcRn ()
checkValidType (Name -> UserTypeCtxt
InfSigCtxt Name
poly_name) Kind
inferred_poly_ty }
; TcId -> IOEnv (Env TcGblEnv TcLclEnv) TcId
forall a. a -> IOEnv (Env TcGblEnv TcLclEnv) a
forall (m :: * -> *) a. Monad m => a -> m a
return (HasDebugCallStack => Name -> Kind -> Kind -> TcId
Name -> Kind -> Kind -> TcId
mkLocalId Name
poly_name Kind
ManyTy Kind
inferred_poly_ty) }
chooseInferredQuantifiers :: WantedConstraints
-> TcThetaType
-> TcTyVarSet
-> [TcTyVar]
-> Maybe TcIdSigInst
-> TcM ([InvisTVBinder], TcThetaType)
chooseInferredQuantifiers :: WantedConstraints
-> TcThetaType
-> VarSet
-> [TcId]
-> Maybe TcIdSigInst
-> TcM ([VarBndr TcId Specificity], TcThetaType)
chooseInferredQuantifiers WantedConstraints
_residual TcThetaType
inferred_theta VarSet
tau_tvs [TcId]
qtvs Maybe TcIdSigInst
Nothing
=
do { let free_tvs :: VarSet
free_tvs = VarSet -> VarSet
closeOverKinds (TcThetaType -> VarSet -> VarSet
growThetaTyVars TcThetaType
inferred_theta VarSet
tau_tvs)
my_theta :: TcThetaType
my_theta = VarSet -> TcThetaType -> TcThetaType
pickCapturedPreds VarSet
free_tvs TcThetaType
inferred_theta
binders :: [VarBndr TcId Specificity]
binders = [ Specificity -> TcId -> VarBndr TcId Specificity
forall vis. vis -> TcId -> VarBndr TcId vis
mkTyVarBinder Specificity
InferredSpec TcId
tv
| TcId
tv <- [TcId]
qtvs
, TcId
tv TcId -> VarSet -> Bool
`elemVarSet` VarSet
free_tvs ]
; ([VarBndr TcId Specificity], TcThetaType)
-> TcM ([VarBndr TcId Specificity], TcThetaType)
forall a. a -> IOEnv (Env TcGblEnv TcLclEnv) a
forall (m :: * -> *) a. Monad m => a -> m a
return ([VarBndr TcId Specificity]
binders, TcThetaType
my_theta) }
chooseInferredQuantifiers WantedConstraints
residual TcThetaType
inferred_theta VarSet
tau_tvs [TcId]
qtvs
(Just (TISI { sig_inst_sig :: TcIdSigInst -> TcIdSigInfo
sig_inst_sig = sig :: TcIdSigInfo
sig@(PartialSig { psig_name :: TcIdSigInfo -> Name
psig_name = Name
fn_name, psig_hs_ty :: TcIdSigInfo -> LHsSigWcType GhcRn
psig_hs_ty = LHsSigWcType GhcRn
hs_ty })
, sig_inst_wcx :: TcIdSigInst -> Maybe Kind
sig_inst_wcx = Maybe Kind
wcx
, sig_inst_theta :: TcIdSigInst -> TcThetaType
sig_inst_theta = TcThetaType
annotated_theta
, sig_inst_skols :: TcIdSigInst -> [(Name, VarBndr TcId Specificity)]
sig_inst_skols = [(Name, VarBndr TcId Specificity)]
annotated_tvs }))
=
do { let ([Name]
psig_qtv_nms, [VarBndr TcId Specificity]
psig_qtv_bndrs) = [(Name, VarBndr TcId Specificity)]
-> ([Name], [VarBndr TcId Specificity])
forall a b. [(a, b)] -> ([a], [b])
unzip [(Name, VarBndr TcId Specificity)]
annotated_tvs
; [VarBndr TcId Specificity]
psig_qtv_bndrs <- ZonkM [VarBndr TcId Specificity] -> TcM [VarBndr TcId Specificity]
forall a. ZonkM a -> TcM a
liftZonkM (ZonkM [VarBndr TcId Specificity]
-> TcM [VarBndr TcId Specificity])
-> ZonkM [VarBndr TcId Specificity]
-> TcM [VarBndr TcId Specificity]
forall a b. (a -> b) -> a -> b
$ (VarBndr TcId Specificity -> ZonkM (VarBndr TcId Specificity))
-> [VarBndr TcId Specificity] -> ZonkM [VarBndr TcId Specificity]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> [a] -> m [b]
mapM VarBndr TcId Specificity -> ZonkM (VarBndr TcId Specificity)
forall spec. VarBndr TcId spec -> ZonkM (VarBndr TcId spec)
zonkInvisTVBinder [VarBndr TcId Specificity]
psig_qtv_bndrs
; let psig_qtvs :: [TcId]
psig_qtvs = (VarBndr TcId Specificity -> TcId)
-> [VarBndr TcId Specificity] -> [TcId]
forall a b. (a -> b) -> [a] -> [b]
map VarBndr TcId Specificity -> TcId
forall tv argf. VarBndr tv argf -> tv
binderVar [VarBndr TcId Specificity]
psig_qtv_bndrs
psig_qtv_set :: VarSet
psig_qtv_set = [TcId] -> VarSet
mkVarSet [TcId]
psig_qtvs
psig_qtv_prs :: [(Name, TcId)]
psig_qtv_prs = [Name]
psig_qtv_nms [Name] -> [TcId] -> [(Name, TcId)]
forall a b. [a] -> [b] -> [(a, b)]
`zip` [TcId]
psig_qtvs
psig_bndr_map :: TyVarEnv InvisTVBinder
psig_bndr_map :: TyVarEnv (VarBndr TcId Specificity)
psig_bndr_map = [(TcId, VarBndr TcId Specificity)]
-> TyVarEnv (VarBndr TcId Specificity)
forall a. [(TcId, a)] -> VarEnv a
mkVarEnv [ (VarBndr TcId Specificity -> TcId
forall tv argf. VarBndr tv argf -> tv
binderVar VarBndr TcId Specificity
tvb, VarBndr TcId Specificity
tvb) | VarBndr TcId Specificity
tvb <- [VarBndr TcId Specificity]
psig_qtv_bndrs ]
; ((Name, Name) -> TcRn ()) -> [(Name, Name)] -> TcRn ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ (Name, Name) -> TcRn ()
report_dup_tyvar_tv_err ([(Name, TcId)] -> [(Name, Name)]
findDupTyVarTvs [(Name, TcId)]
psig_qtv_prs)
; ((Name, TcId) -> TcRn ()) -> [(Name, TcId)] -> TcRn ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ (Name, TcId) -> TcRn ()
report_mono_sig_tv_err [ (Name, TcId)
pr | pr :: (Name, TcId)
pr@(Name
_,TcId
tv) <- [(Name, TcId)]
psig_qtv_prs
, Bool -> Bool
not (TcId
tv TcId -> [TcId] -> Bool
forall a. Eq a => a -> [a] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [TcId]
qtvs) ]
; TcThetaType
annotated_theta <- ZonkM TcThetaType -> TcM TcThetaType
forall a. ZonkM a -> TcM a
liftZonkM (ZonkM TcThetaType -> TcM TcThetaType)
-> ZonkM TcThetaType -> TcM TcThetaType
forall a b. (a -> b) -> a -> b
$ TcThetaType -> ZonkM TcThetaType
zonkTcTypes TcThetaType
annotated_theta
; (VarSet
free_tvs, TcThetaType
my_theta) <- VarSet -> TcThetaType -> Maybe Kind -> TcM (VarSet, TcThetaType)
choose_psig_context VarSet
psig_qtv_set TcThetaType
annotated_theta Maybe Kind
wcx
; let (VarSet
_,[VarBndr TcId Specificity]
final_qtvs) = (TcId
-> (VarSet, [VarBndr TcId Specificity])
-> (VarSet, [VarBndr TcId Specificity]))
-> (VarSet, [VarBndr TcId Specificity])
-> [TcId]
-> (VarSet, [VarBndr TcId Specificity])
forall a b. (a -> b -> b) -> b -> [a] -> b
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr (TyVarEnv (VarBndr TcId Specificity)
-> TcId
-> (VarSet, [VarBndr TcId Specificity])
-> (VarSet, [VarBndr TcId Specificity])
choose_qtv TyVarEnv (VarBndr TcId Specificity)
psig_bndr_map) (VarSet
free_tvs, []) [TcId]
qtvs
; String -> SDoc -> TcRn ()
traceTc String
"chooseInferredQuantifiers" (SDoc -> TcRn ()) -> SDoc -> TcRn ()
forall a b. (a -> b) -> a -> b
$
[SDoc] -> SDoc
forall doc. IsDoc doc => [doc] -> doc
vcat [ String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"qtvs" SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> [TcId] -> SDoc
pprTyVars [TcId]
qtvs
, String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"psig_qtv_bndrs" SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> [VarBndr TcId Specificity] -> SDoc
forall a. Outputable a => a -> SDoc
ppr [VarBndr TcId Specificity]
psig_qtv_bndrs
, String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"free_tvs" SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> VarSet -> SDoc
forall a. Outputable a => a -> SDoc
ppr VarSet
free_tvs
, String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"final_tvs" SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> [VarBndr TcId Specificity] -> SDoc
forall a. Outputable a => a -> SDoc
ppr [VarBndr TcId Specificity]
final_qtvs ]
; ([VarBndr TcId Specificity], TcThetaType)
-> TcM ([VarBndr TcId Specificity], TcThetaType)
forall a. a -> IOEnv (Env TcGblEnv TcLclEnv) a
forall (m :: * -> *) a. Monad m => a -> m a
return ([VarBndr TcId Specificity]
final_qtvs, TcThetaType
my_theta) }
where
choose_qtv :: TyVarEnv InvisTVBinder -> TcTyVar
-> (TcTyVarSet, [InvisTVBinder]) -> (TcTyVarSet, [InvisTVBinder])
choose_qtv :: TyVarEnv (VarBndr TcId Specificity)
-> TcId
-> (VarSet, [VarBndr TcId Specificity])
-> (VarSet, [VarBndr TcId Specificity])
choose_qtv TyVarEnv (VarBndr TcId Specificity)
psig_bndr_map TcId
tv (VarSet
free_tvs, [VarBndr TcId Specificity]
qtvs)
| Just VarBndr TcId Specificity
psig_bndr <- TyVarEnv (VarBndr TcId Specificity)
-> TcId -> Maybe (VarBndr TcId Specificity)
forall a. VarEnv a -> TcId -> Maybe a
lookupVarEnv TyVarEnv (VarBndr TcId Specificity)
psig_bndr_map TcId
tv
= (VarSet
free_tvs', VarBndr TcId Specificity
psig_bndr VarBndr TcId Specificity
-> [VarBndr TcId Specificity] -> [VarBndr TcId Specificity]
forall a. a -> [a] -> [a]
: [VarBndr TcId Specificity]
qtvs)
| TcId
tv TcId -> VarSet -> Bool
`elemVarSet` VarSet
free_tvs
= (VarSet
free_tvs', Specificity -> TcId -> VarBndr TcId Specificity
forall vis. vis -> TcId -> VarBndr TcId vis
mkTyVarBinder Specificity
InferredSpec TcId
tv VarBndr TcId Specificity
-> [VarBndr TcId Specificity] -> [VarBndr TcId Specificity]
forall a. a -> [a] -> [a]
: [VarBndr TcId Specificity]
qtvs)
| Bool
otherwise
= (VarSet
free_tvs, [VarBndr TcId Specificity]
qtvs)
where
free_tvs' :: VarSet
free_tvs' = VarSet
free_tvs VarSet -> VarSet -> VarSet
`unionVarSet` Kind -> VarSet
tyCoVarsOfType (TcId -> Kind
tyVarKind TcId
tv)
choose_psig_context :: VarSet -> TcThetaType -> Maybe TcType
-> TcM (VarSet, TcThetaType)
choose_psig_context :: VarSet -> TcThetaType -> Maybe Kind -> TcM (VarSet, TcThetaType)
choose_psig_context VarSet
_ TcThetaType
annotated_theta Maybe Kind
Nothing
= do { let free_tvs :: VarSet
free_tvs = VarSet -> VarSet
closeOverKinds (TcThetaType -> VarSet
tyCoVarsOfTypes TcThetaType
annotated_theta
VarSet -> VarSet -> VarSet
`unionVarSet` VarSet
tau_tvs)
; (VarSet, TcThetaType) -> TcM (VarSet, TcThetaType)
forall a. a -> IOEnv (Env TcGblEnv TcLclEnv) a
forall (m :: * -> *) a. Monad m => a -> m a
return (VarSet
free_tvs, TcThetaType
annotated_theta) }
choose_psig_context VarSet
psig_qtvs TcThetaType
annotated_theta (Just Kind
wc_var_ty)
= do { let free_tvs :: VarSet
free_tvs = VarSet -> VarSet
closeOverKinds (TcThetaType -> VarSet -> VarSet
growThetaTyVars TcThetaType
inferred_theta VarSet
seed_tvs)
seed_tvs :: VarSet
seed_tvs = TcThetaType -> VarSet
tyCoVarsOfTypes TcThetaType
annotated_theta
VarSet -> VarSet -> VarSet
`unionVarSet` VarSet
tau_tvs
; let keep_me :: VarSet
keep_me = VarSet
psig_qtvs VarSet -> VarSet -> VarSet
`unionVarSet` VarSet
free_tvs
my_theta :: TcThetaType
my_theta = VarSet -> TcThetaType -> TcThetaType
pickCapturedPreds VarSet
keep_me TcThetaType
inferred_theta
; TcThetaType
diff_theta <- TcThetaType -> TcThetaType -> TcM TcThetaType
findInferredDiff TcThetaType
annotated_theta TcThetaType
my_theta
; case Kind -> Maybe (TcId, TcCoercionR)
getCastedTyVar_maybe Kind
wc_var_ty of
Just (TcId
wc_var, TcCoercionR
wc_co) -> ZonkM () -> TcRn ()
forall a. ZonkM a -> TcM a
liftZonkM (ZonkM () -> TcRn ()) -> ZonkM () -> TcRn ()
forall a b. (a -> b) -> a -> b
$
HasDebugCallStack => TcId -> Kind -> ZonkM ()
TcId -> Kind -> ZonkM ()
writeMetaTyVar TcId
wc_var (TcThetaType -> Kind
mkConstraintTupleTy TcThetaType
diff_theta
Kind -> TcCoercionR -> Kind
`mkCastTy` TcCoercionR -> TcCoercionR
mkSymCo TcCoercionR
wc_co)
Maybe (TcId, TcCoercionR)
Nothing -> String -> SDoc -> TcRn ()
forall a. HasCallStack => String -> SDoc -> a
pprPanic String
"chooseInferredQuantifiers 1" (Kind -> SDoc
forall a. Outputable a => a -> SDoc
ppr Kind
wc_var_ty)
; String -> SDoc -> TcRn ()
traceTc String
"completeTheta" (SDoc -> TcRn ()) -> SDoc -> TcRn ()
forall a b. (a -> b) -> a -> b
$
[SDoc] -> SDoc
forall doc. IsDoc doc => [doc] -> doc
vcat [ TcIdSigInfo -> SDoc
forall a. Outputable a => a -> SDoc
ppr TcIdSigInfo
sig
, String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"annotated_theta:" SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> TcThetaType -> SDoc
forall a. Outputable a => a -> SDoc
ppr TcThetaType
annotated_theta
, String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"inferred_theta:" SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> TcThetaType -> SDoc
forall a. Outputable a => a -> SDoc
ppr TcThetaType
inferred_theta
, String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"my_theta:" SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> TcThetaType -> SDoc
forall a. Outputable a => a -> SDoc
ppr TcThetaType
my_theta
, String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"diff_theta:" SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> TcThetaType -> SDoc
forall a. Outputable a => a -> SDoc
ppr TcThetaType
diff_theta ]
; (VarSet, TcThetaType) -> TcM (VarSet, TcThetaType)
forall a. a -> IOEnv (Env TcGblEnv TcLclEnv) a
forall (m :: * -> *) a. Monad m => a -> m a
return (VarSet
free_tvs, TcThetaType
annotated_theta TcThetaType -> TcThetaType -> TcThetaType
forall a. [a] -> [a] -> [a]
++ TcThetaType
diff_theta) }
report_dup_tyvar_tv_err :: (Name, Name) -> TcRn ()
report_dup_tyvar_tv_err (Name
n1,Name
n2)
= TcRnMessage -> TcRn ()
addErrTc (Name -> Name -> Name -> LHsSigWcType GhcRn -> TcRnMessage
TcRnPartialTypeSigTyVarMismatch Name
n1 Name
n2 Name
fn_name LHsSigWcType GhcRn
hs_ty)
report_mono_sig_tv_err :: (Name, TcId) -> TcRn ()
report_mono_sig_tv_err (Name
n,TcId
tv)
= TcRnMessage -> TcRn ()
addErrTc (Name -> Name -> Maybe Kind -> LHsSigWcType GhcRn -> TcRnMessage
TcRnPartialTypeSigBadQuantifier Name
n Name
fn_name Maybe Kind
m_unif_ty LHsSigWcType GhcRn
hs_ty)
where
m_unif_ty :: Maybe Kind
m_unif_ty = TcThetaType -> Maybe Kind
forall a. [a] -> Maybe a
listToMaybe
[ Kind
rhs
| Implication
residual_implic <- Bag Implication -> [Implication]
forall a. Bag a -> [a]
bagToList (Bag Implication -> [Implication])
-> Bag Implication -> [Implication]
forall a b. (a -> b) -> a -> b
$ WantedConstraints -> Bag Implication
wc_impl WantedConstraints
residual
, Ct
residual_ct <- Bag Ct -> [Ct]
forall a. Bag a -> [a]
bagToList (Bag Ct -> [Ct]) -> Bag Ct -> [Ct]
forall a b. (a -> b) -> a -> b
$ WantedConstraints -> Bag Ct
wc_simple (Implication -> WantedConstraints
ic_wanted Implication
residual_implic)
, let residual_pred :: Kind
residual_pred = Ct -> Kind
ctPred Ct
residual_ct
, Just (Role
Nominal, Kind
lhs, Kind
rhs) <- [ Kind -> Maybe (Role, Kind, Kind)
getEqPredTys_maybe Kind
residual_pred ]
, Just TcId
lhs_tv <- [ Kind -> Maybe TcId
getTyVar_maybe Kind
lhs ]
, TcId
lhs_tv TcId -> TcId -> Bool
forall a. Eq a => a -> a -> Bool
== TcId
tv ]
chooseInferredQuantifiers WantedConstraints
_ TcThetaType
_ VarSet
_ [TcId]
_ (Just (TISI { sig_inst_sig :: TcIdSigInst -> TcIdSigInfo
sig_inst_sig = sig :: TcIdSigInfo
sig@(CompleteSig {}) }))
= String -> SDoc -> TcM ([VarBndr TcId Specificity], TcThetaType)
forall a. HasCallStack => String -> SDoc -> a
pprPanic String
"chooseInferredQuantifiers" (TcIdSigInfo -> SDoc
forall a. Outputable a => a -> SDoc
ppr TcIdSigInfo
sig)
mk_inf_msg :: Name -> TcType -> TidyEnv -> ZonkM (TidyEnv, SDoc)
mk_inf_msg :: Name -> Kind -> TidyEnv -> ZonkM (TidyEnv, SDoc)
mk_inf_msg Name
poly_name Kind
poly_ty TidyEnv
tidy_env
= do { (TidyEnv
tidy_env1, Kind
poly_ty) <- TidyEnv -> Kind -> ZonkM (TidyEnv, Kind)
zonkTidyTcType TidyEnv
tidy_env Kind
poly_ty
; let msg :: SDoc
msg = [SDoc] -> SDoc
forall doc. IsDoc doc => [doc] -> doc
vcat [ String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"When checking the inferred type"
, BKey -> SDoc -> SDoc
nest BKey
2 (SDoc -> SDoc) -> SDoc -> SDoc
forall a b. (a -> b) -> a -> b
$ Name -> SDoc
forall a. Outputable a => a -> SDoc
ppr Name
poly_name SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> SDoc
dcolon SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> Kind -> SDoc
forall a. Outputable a => a -> SDoc
ppr Kind
poly_ty ]
; (TidyEnv, SDoc) -> ZonkM (TidyEnv, SDoc)
forall a. a -> ZonkM a
forall (m :: * -> *) a. Monad m => a -> m a
return (TidyEnv
tidy_env1, SDoc
msg) }
localSigWarn :: Id -> Maybe TcIdSigInst -> TcM ()
localSigWarn :: TcId -> Maybe TcIdSigInst -> TcRn ()
localSigWarn TcId
id Maybe TcIdSigInst
mb_sig
| Just TcIdSigInst
_ <- Maybe TcIdSigInst
mb_sig = () -> TcRn ()
forall a. a -> IOEnv (Env TcGblEnv TcLclEnv) a
forall (m :: * -> *) a. Monad m => a -> m a
return ()
| Bool -> Bool
not (Kind -> Bool
isSigmaTy (TcId -> Kind
idType TcId
id)) = () -> TcRn ()
forall a. a -> IOEnv (Env TcGblEnv TcLclEnv) a
forall (m :: * -> *) a. Monad m => a -> m a
return ()
| Bool
otherwise = TcId -> TcRn ()
warnMissingSignatures TcId
id
warnMissingSignatures :: Id -> TcM ()
warnMissingSignatures :: TcId -> TcRn ()
warnMissingSignatures TcId
id
= do { TidyEnv
env0 <- ZonkM TidyEnv -> TcM TidyEnv
forall a. ZonkM a -> TcM a
liftZonkM (ZonkM TidyEnv -> TcM TidyEnv) -> ZonkM TidyEnv -> TcM TidyEnv
forall a b. (a -> b) -> a -> b
$ ZonkM TidyEnv
tcInitTidyEnv
; let (TidyEnv
env1, Kind
tidy_ty) = TidyEnv -> Kind -> (TidyEnv, Kind)
tidyOpenType TidyEnv
env0 (TcId -> Kind
idType TcId
id)
; let dia :: TcRnMessage
dia = Name -> Kind -> TcRnMessage
TcRnPolymorphicBinderMissingSig (TcId -> Name
idName TcId
id) Kind
tidy_ty
; (TidyEnv, TcRnMessage) -> TcRn ()
addDiagnosticTcM (TidyEnv
env1, TcRnMessage
dia) }
data MonoBindInfo = MBI { MonoBindInfo -> Name
mbi_poly_name :: Name
, MonoBindInfo -> Maybe TcIdSigInst
mbi_sig :: Maybe TcIdSigInst
, MonoBindInfo -> TcId
mbi_mono_id :: TcId }
tcMonoBinds :: RecFlag
-> TcSigFun -> LetBndrSpec
-> [LHsBind GhcRn]
-> TcM (LHsBinds GhcTc, [MonoBindInfo])
tcMonoBinds :: RecFlag
-> TcSigFun
-> LetBndrSpec
-> [LHsBindLR GhcRn GhcRn]
-> TcM (LHsBinds GhcTc, [MonoBindInfo])
tcMonoBinds RecFlag
is_rec TcSigFun
sig_fn LetBndrSpec
no_gen
[ L SrcSpanAnnA
b_loc (FunBind { fun_id :: forall idL idR. HsBindLR idL idR -> LIdP idL
fun_id = L SrcSpanAnnN
nm_loc Name
name
, fun_matches :: forall idL idR. HsBindLR idL idR -> MatchGroup idR (LHsExpr idR)
fun_matches = MatchGroup GhcRn (LHsExpr GhcRn)
matches })]
| RecFlag
NonRecursive <- RecFlag
is_rec
, Maybe TcSigInfo
Nothing <- TcSigFun
sig_fn Name
name
= SrcSpanAnnA
-> TcM (LHsBinds GhcTc, [MonoBindInfo])
-> TcM (LHsBinds GhcTc, [MonoBindInfo])
forall ann a. SrcSpanAnn' ann -> TcRn a -> TcRn a
setSrcSpanA SrcSpanAnnA
b_loc (TcM (LHsBinds GhcTc, [MonoBindInfo])
-> TcM (LHsBinds GhcTc, [MonoBindInfo]))
-> TcM (LHsBinds GhcTc, [MonoBindInfo])
-> TcM (LHsBinds GhcTc, [MonoBindInfo])
forall a b. (a -> b) -> a -> b
$
do { ((HsWrapper
co_fn, MatchGroup GhcTc (GenLocated SrcSpanAnnA (HsExpr GhcTc))
matches'), Kind
rhs_ty')
<- FixedRuntimeRepContext
-> (ExpSigmaType
-> TcM
(HsWrapper,
MatchGroup GhcTc (GenLocated SrcSpanAnnA (HsExpr GhcTc))))
-> TcM
((HsWrapper,
MatchGroup GhcTc (GenLocated SrcSpanAnnA (HsExpr GhcTc))),
Kind)
forall a.
FixedRuntimeRepContext -> (ExpSigmaType -> TcM a) -> TcM (a, Kind)
tcInferFRR (Name -> FixedRuntimeRepContext
FRRBinder Name
name) ((ExpSigmaType
-> TcM
(HsWrapper,
MatchGroup GhcTc (GenLocated SrcSpanAnnA (HsExpr GhcTc))))
-> TcM
((HsWrapper,
MatchGroup GhcTc (GenLocated SrcSpanAnnA (HsExpr GhcTc))),
Kind))
-> (ExpSigmaType
-> TcM
(HsWrapper,
MatchGroup GhcTc (GenLocated SrcSpanAnnA (HsExpr GhcTc))))
-> TcM
((HsWrapper,
MatchGroup GhcTc (GenLocated SrcSpanAnnA (HsExpr GhcTc))),
Kind)
forall a b. (a -> b) -> a -> b
$ \ ExpSigmaType
exp_ty ->
[TcBinder]
-> TcRn (HsWrapper, MatchGroup GhcTc (LHsExpr GhcTc))
-> TcRn (HsWrapper, MatchGroup GhcTc (LHsExpr GhcTc))
forall a. [TcBinder] -> TcM a -> TcM a
tcExtendBinderStack [Name -> ExpSigmaType -> TopLevelFlag -> TcBinder
TcIdBndr_ExpType Name
name ExpSigmaType
exp_ty TopLevelFlag
NotTopLevel] (TcRn (HsWrapper, MatchGroup GhcTc (LHsExpr GhcTc))
-> TcRn (HsWrapper, MatchGroup GhcTc (LHsExpr GhcTc)))
-> TcRn (HsWrapper, MatchGroup GhcTc (LHsExpr GhcTc))
-> TcRn (HsWrapper, MatchGroup GhcTc (LHsExpr GhcTc))
forall a b. (a -> b) -> a -> b
$
GenLocated SrcSpanAnnN Name
-> MatchGroup GhcRn (LHsExpr GhcRn)
-> ExpSigmaType
-> TcRn (HsWrapper, MatchGroup GhcTc (LHsExpr GhcTc))
tcMatchesFun (SrcSpanAnnN -> Name -> GenLocated SrcSpanAnnN Name
forall l e. l -> e -> GenLocated l e
L SrcSpanAnnN
nm_loc Name
name) MatchGroup GhcRn (LHsExpr GhcRn)
matches ExpSigmaType
exp_ty
; TcId
mono_id <- LetBndrSpec
-> Name -> Kind -> Kind -> IOEnv (Env TcGblEnv TcLclEnv) TcId
newLetBndr LetBndrSpec
no_gen Name
name Kind
ManyTy Kind
rhs_ty'
; (Bag (GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc)),
[MonoBindInfo])
-> IOEnv
(Env TcGblEnv TcLclEnv)
(Bag (GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc)),
[MonoBindInfo])
forall a. a -> IOEnv (Env TcGblEnv TcLclEnv) a
forall (m :: * -> *) a. Monad m => a -> m a
return (GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc)
-> Bag (GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc))
forall a. a -> Bag a
unitBag (GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc)
-> Bag (GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc)))
-> GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc)
-> Bag (GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc))
forall a b. (a -> b) -> a -> b
$ SrcSpanAnnA
-> HsBindLR GhcTc GhcTc
-> GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc)
forall l e. l -> e -> GenLocated l e
L SrcSpanAnnA
b_loc (HsBindLR GhcTc GhcTc
-> GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc))
-> HsBindLR GhcTc GhcTc
-> GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc)
forall a b. (a -> b) -> a -> b
$
FunBind { fun_id :: LIdP GhcTc
fun_id = SrcSpanAnnN -> TcId -> GenLocated SrcSpanAnnN TcId
forall l e. l -> e -> GenLocated l e
L SrcSpanAnnN
nm_loc TcId
mono_id,
fun_matches :: MatchGroup GhcTc (LHsExpr GhcTc)
fun_matches = MatchGroup GhcTc (LHsExpr GhcTc)
MatchGroup GhcTc (GenLocated SrcSpanAnnA (HsExpr GhcTc))
matches',
fun_ext :: XFunBind GhcTc GhcTc
fun_ext = (HsWrapper
co_fn, []) },
[MBI { mbi_poly_name :: Name
mbi_poly_name = Name
name
, mbi_sig :: Maybe TcIdSigInst
mbi_sig = Maybe TcIdSigInst
forall a. Maybe a
Nothing
, mbi_mono_id :: TcId
mbi_mono_id = TcId
mono_id }]) }
tcMonoBinds RecFlag
is_rec TcSigFun
sig_fn LetBndrSpec
no_gen
[L SrcSpanAnnA
b_loc (PatBind { pat_lhs :: forall idL idR. HsBindLR idL idR -> LPat idL
pat_lhs = LPat GhcRn
pat, pat_rhs :: forall idL idR. HsBindLR idL idR -> GRHSs idR (LHsExpr idR)
pat_rhs = GRHSs GhcRn (LHsExpr GhcRn)
grhss })]
| RecFlag
NonRecursive <- RecFlag
is_rec
, (Name -> Bool) -> [Name] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all (Maybe TcSigInfo -> Bool
forall a. Maybe a -> Bool
isNothing (Maybe TcSigInfo -> Bool) -> TcSigFun -> Name -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. TcSigFun
sig_fn) [IdP GhcRn]
[Name]
bndrs
= SDoc
-> TcM (LHsBinds GhcTc, [MonoBindInfo])
-> TcM (LHsBinds GhcTc, [MonoBindInfo])
forall a. SDoc -> TcM a -> TcM a
addErrCtxt (LPat GhcRn -> GRHSs GhcRn (LHsExpr GhcRn) -> SDoc
forall (p :: Pass).
OutputableBndrId p =>
LPat (GhcPass p) -> GRHSs GhcRn (LHsExpr GhcRn) -> SDoc
patMonoBindsCtxt LPat GhcRn
pat GRHSs GhcRn (LHsExpr GhcRn)
grhss) (TcM (LHsBinds GhcTc, [MonoBindInfo])
-> TcM (LHsBinds GhcTc, [MonoBindInfo]))
-> TcM (LHsBinds GhcTc, [MonoBindInfo])
-> TcM (LHsBinds GhcTc, [MonoBindInfo])
forall a b. (a -> b) -> a -> b
$
do { (GRHSs GhcTc (GenLocated SrcSpanAnnA (HsExpr GhcTc))
grhss', Kind
pat_ty) <- FixedRuntimeRepContext
-> (ExpSigmaType
-> TcM (GRHSs GhcTc (GenLocated SrcSpanAnnA (HsExpr GhcTc))))
-> TcM (GRHSs GhcTc (GenLocated SrcSpanAnnA (HsExpr GhcTc)), Kind)
forall a.
FixedRuntimeRepContext -> (ExpSigmaType -> TcM a) -> TcM (a, Kind)
tcInferFRR FixedRuntimeRepContext
FRRPatBind ((ExpSigmaType
-> TcM (GRHSs GhcTc (GenLocated SrcSpanAnnA (HsExpr GhcTc))))
-> TcM (GRHSs GhcTc (GenLocated SrcSpanAnnA (HsExpr GhcTc)), Kind))
-> (ExpSigmaType
-> TcM (GRHSs GhcTc (GenLocated SrcSpanAnnA (HsExpr GhcTc))))
-> TcM (GRHSs GhcTc (GenLocated SrcSpanAnnA (HsExpr GhcTc)), Kind)
forall a b. (a -> b) -> a -> b
$ \ ExpSigmaType
exp_ty ->
GRHSs GhcRn (LHsExpr GhcRn)
-> ExpSigmaType -> TcM (GRHSs GhcTc (LHsExpr GhcTc))
tcGRHSsPat GRHSs GhcRn (LHsExpr GhcRn)
grhss ExpSigmaType
exp_ty
; let exp_pat_ty :: Scaled ExpSigmaTypeFRR
exp_pat_ty :: Scaled ExpSigmaType
exp_pat_ty = ExpSigmaType -> Scaled ExpSigmaType
forall a. a -> Scaled a
unrestricted (Kind -> ExpSigmaType
mkCheckExpType Kind
pat_ty)
; (GenLocated SrcSpanAnnA (Pat GhcTc)
pat', [MonoBindInfo]
mbis) <- (Name -> Maybe TcId)
-> LetBndrSpec
-> LPat GhcRn
-> Scaled ExpSigmaType
-> TcM [MonoBindInfo]
-> TcM (LPat GhcTc, [MonoBindInfo])
forall a.
(Name -> Maybe TcId)
-> LetBndrSpec
-> LPat GhcRn
-> Scaled ExpSigmaType
-> TcM a
-> TcM (LPat GhcTc, a)
tcLetPat (Maybe TcId -> Name -> Maybe TcId
forall a b. a -> b -> a
const Maybe TcId
forall a. Maybe a
Nothing) LetBndrSpec
no_gen LPat GhcRn
pat Scaled ExpSigmaType
exp_pat_ty (TcM [MonoBindInfo] -> TcM (LPat GhcTc, [MonoBindInfo]))
-> TcM [MonoBindInfo] -> TcM (LPat GhcTc, [MonoBindInfo])
forall a b. (a -> b) -> a -> b
$
(Name -> IOEnv (Env TcGblEnv TcLclEnv) MonoBindInfo)
-> [Name] -> TcM [MonoBindInfo]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> [a] -> m [b]
mapM Name -> IOEnv (Env TcGblEnv TcLclEnv) MonoBindInfo
lookupMBI [IdP GhcRn]
[Name]
bndrs
; (Bag (GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc)),
[MonoBindInfo])
-> IOEnv
(Env TcGblEnv TcLclEnv)
(Bag (GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc)),
[MonoBindInfo])
forall a. a -> IOEnv (Env TcGblEnv TcLclEnv) a
forall (m :: * -> *) a. Monad m => a -> m a
return ( GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc)
-> Bag (GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc))
forall a. a -> Bag a
unitBag (GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc)
-> Bag (GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc)))
-> GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc)
-> Bag (GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc))
forall a b. (a -> b) -> a -> b
$ SrcSpanAnnA
-> HsBindLR GhcTc GhcTc
-> GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc)
forall l e. l -> e -> GenLocated l e
L SrcSpanAnnA
b_loc (HsBindLR GhcTc GhcTc
-> GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc))
-> HsBindLR GhcTc GhcTc
-> GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc)
forall a b. (a -> b) -> a -> b
$
PatBind { pat_lhs :: LPat GhcTc
pat_lhs = LPat GhcTc
GenLocated SrcSpanAnnA (Pat GhcTc)
pat', pat_rhs :: GRHSs GhcTc (LHsExpr GhcTc)
pat_rhs = GRHSs GhcTc (LHsExpr GhcTc)
GRHSs GhcTc (GenLocated SrcSpanAnnA (HsExpr GhcTc))
grhss'
, pat_ext :: XPatBind GhcTc GhcTc
pat_ext = (Kind
pat_ty, ([],[])) }
, [MonoBindInfo]
mbis ) }
where
bndrs :: [IdP GhcRn]
bndrs = CollectFlag GhcRn -> LPat GhcRn -> [IdP GhcRn]
forall p. CollectPass p => CollectFlag p -> LPat p -> [IdP p]
collectPatBinders CollectFlag GhcRn
forall p. CollectFlag p
CollNoDictBinders LPat GhcRn
pat
tcMonoBinds RecFlag
_ TcSigFun
sig_fn LetBndrSpec
no_gen [LHsBindLR GhcRn GhcRn]
binds
= do { [GenLocated SrcSpanAnnA TcMonoBind]
tc_binds <- (GenLocated SrcSpanAnnA (HsBind GhcRn)
-> IOEnv
(Env TcGblEnv TcLclEnv) (GenLocated SrcSpanAnnA TcMonoBind))
-> [GenLocated SrcSpanAnnA (HsBind GhcRn)]
-> IOEnv
(Env TcGblEnv TcLclEnv) [GenLocated SrcSpanAnnA TcMonoBind]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> [a] -> m [b]
mapM ((HsBind GhcRn -> TcM TcMonoBind)
-> GenLocated SrcSpanAnnA (HsBind GhcRn)
-> IOEnv
(Env TcGblEnv TcLclEnv) (GenLocated SrcSpanAnnA TcMonoBind)
forall a b ann.
(a -> TcM b)
-> GenLocated (SrcSpanAnn' ann) a
-> TcRn (GenLocated (SrcSpanAnn' ann) b)
wrapLocMA (TcSigFun -> LetBndrSpec -> HsBind GhcRn -> TcM TcMonoBind
tcLhs TcSigFun
sig_fn LetBndrSpec
no_gen)) [LHsBindLR GhcRn GhcRn]
[GenLocated SrcSpanAnnA (HsBind GhcRn)]
binds
; let mono_infos :: [MonoBindInfo]
mono_infos = [GenLocated SrcSpanAnnA TcMonoBind] -> [MonoBindInfo]
getMonoBindInfo [GenLocated SrcSpanAnnA TcMonoBind]
tc_binds
rhs_id_env :: [(Name, TcId)]
rhs_id_env = [ (Name
name, TcId
mono_id)
| MBI { mbi_poly_name :: MonoBindInfo -> Name
mbi_poly_name = Name
name
, mbi_sig :: MonoBindInfo -> Maybe TcIdSigInst
mbi_sig = Maybe TcIdSigInst
mb_sig
, mbi_mono_id :: MonoBindInfo -> TcId
mbi_mono_id = TcId
mono_id } <- [MonoBindInfo]
mono_infos
, case Maybe TcIdSigInst
mb_sig of
Just TcIdSigInst
sig -> TcIdSigInst -> Bool
isPartialSig TcIdSigInst
sig
Maybe TcIdSigInst
Nothing -> Bool
True ]
; String -> SDoc -> TcRn ()
traceTc String
"tcMonoBinds" (SDoc -> TcRn ()) -> SDoc -> TcRn ()
forall a b. (a -> b) -> a -> b
$ [SDoc] -> SDoc
forall doc. IsDoc doc => [doc] -> doc
vcat [ Name -> SDoc
forall a. Outputable a => a -> SDoc
ppr Name
n SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> TcId -> SDoc
forall a. Outputable a => a -> SDoc
ppr TcId
id SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> Kind -> SDoc
forall a. Outputable a => a -> SDoc
ppr (TcId -> Kind
idType TcId
id)
| (Name
n,TcId
id) <- [(Name, TcId)]
rhs_id_env]
; [GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc)]
binds' <- [(Name, TcId)]
-> TcM [GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc)]
-> TcM [GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc)]
forall a. [(Name, TcId)] -> TcM a -> TcM a
tcExtendRecIds [(Name, TcId)]
rhs_id_env (TcM [GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc)]
-> TcM [GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc)])
-> TcM [GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc)]
-> TcM [GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc)]
forall a b. (a -> b) -> a -> b
$
(GenLocated SrcSpanAnnA TcMonoBind
-> IOEnv
(Env TcGblEnv TcLclEnv)
(GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc)))
-> [GenLocated SrcSpanAnnA TcMonoBind]
-> TcM [GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc)]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> [a] -> m [b]
mapM ((TcMonoBind -> TcM (HsBindLR GhcTc GhcTc))
-> GenLocated SrcSpanAnnA TcMonoBind
-> IOEnv
(Env TcGblEnv TcLclEnv)
(GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc))
forall a b ann.
(a -> TcM b)
-> GenLocated (SrcSpanAnn' ann) a
-> TcRn (GenLocated (SrcSpanAnn' ann) b)
wrapLocMA TcMonoBind -> TcM (HsBindLR GhcTc GhcTc)
tcRhs) [GenLocated SrcSpanAnnA TcMonoBind]
tc_binds
; (Bag (GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc)),
[MonoBindInfo])
-> IOEnv
(Env TcGblEnv TcLclEnv)
(Bag (GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc)),
[MonoBindInfo])
forall a. a -> IOEnv (Env TcGblEnv TcLclEnv) a
forall (m :: * -> *) a. Monad m => a -> m a
return ([GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc)]
-> Bag (GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc))
forall a. [a] -> Bag a
listToBag [GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc)]
binds', [MonoBindInfo]
mono_infos) }
data TcMonoBind
= TcFunBind MonoBindInfo SrcSpan (MatchGroup GhcRn (LHsExpr GhcRn))
| TcPatBind [MonoBindInfo] (LPat GhcTc) (GRHSs GhcRn (LHsExpr GhcRn))
TcSigmaTypeFRR
tcLhs :: TcSigFun -> LetBndrSpec -> HsBind GhcRn -> TcM TcMonoBind
tcLhs :: TcSigFun -> LetBndrSpec -> HsBind GhcRn -> TcM TcMonoBind
tcLhs TcSigFun
sig_fn LetBndrSpec
no_gen (FunBind { fun_id :: forall idL idR. HsBindLR idL idR -> LIdP idL
fun_id = L SrcSpanAnnN
nm_loc Name
name
, fun_matches :: forall idL idR. HsBindLR idL idR -> MatchGroup idR (LHsExpr idR)
fun_matches = MatchGroup GhcRn (LHsExpr GhcRn)
matches })
| Just (TcIdSig TcIdSigInfo
sig) <- TcSigFun
sig_fn Name
name
=
do { MonoBindInfo
mono_info <- LetBndrSpec
-> (Name, TcIdSigInfo)
-> IOEnv (Env TcGblEnv TcLclEnv) MonoBindInfo
tcLhsSigId LetBndrSpec
no_gen (Name
name, TcIdSigInfo
sig)
; TcMonoBind -> TcM TcMonoBind
forall a. a -> IOEnv (Env TcGblEnv TcLclEnv) a
forall (m :: * -> *) a. Monad m => a -> m a
return (MonoBindInfo
-> SrcSpan -> MatchGroup GhcRn (LHsExpr GhcRn) -> TcMonoBind
TcFunBind MonoBindInfo
mono_info (SrcSpanAnnN -> SrcSpan
forall a. SrcSpanAnn' a -> SrcSpan
locA SrcSpanAnnN
nm_loc) MatchGroup GhcRn (LHsExpr GhcRn)
matches) }
| Bool
otherwise
= do { Kind
mono_ty <- TcM Kind
newOpenFlexiTyVarTy
; TcId
mono_id <- LetBndrSpec
-> Name -> Kind -> Kind -> IOEnv (Env TcGblEnv TcLclEnv) TcId
newLetBndr LetBndrSpec
no_gen Name
name Kind
ManyTy Kind
mono_ty
; let mono_info :: MonoBindInfo
mono_info = MBI { mbi_poly_name :: Name
mbi_poly_name = Name
name
, mbi_sig :: Maybe TcIdSigInst
mbi_sig = Maybe TcIdSigInst
forall a. Maybe a
Nothing
, mbi_mono_id :: TcId
mbi_mono_id = TcId
mono_id }
; TcMonoBind -> TcM TcMonoBind
forall a. a -> IOEnv (Env TcGblEnv TcLclEnv) a
forall (m :: * -> *) a. Monad m => a -> m a
return (MonoBindInfo
-> SrcSpan -> MatchGroup GhcRn (LHsExpr GhcRn) -> TcMonoBind
TcFunBind MonoBindInfo
mono_info (SrcSpanAnnN -> SrcSpan
forall a. SrcSpanAnn' a -> SrcSpan
locA SrcSpanAnnN
nm_loc) MatchGroup GhcRn (LHsExpr GhcRn)
matches) }
tcLhs TcSigFun
sig_fn LetBndrSpec
no_gen (PatBind { pat_lhs :: forall idL idR. HsBindLR idL idR -> LPat idL
pat_lhs = LPat GhcRn
pat, pat_rhs :: forall idL idR. HsBindLR idL idR -> GRHSs idR (LHsExpr idR)
pat_rhs = GRHSs GhcRn (LHsExpr GhcRn)
grhss })
=
do { [MonoBindInfo]
sig_mbis <- ((Name, TcIdSigInfo) -> IOEnv (Env TcGblEnv TcLclEnv) MonoBindInfo)
-> [(Name, TcIdSigInfo)] -> TcM [MonoBindInfo]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> [a] -> m [b]
mapM (LetBndrSpec
-> (Name, TcIdSigInfo)
-> IOEnv (Env TcGblEnv TcLclEnv) MonoBindInfo
tcLhsSigId LetBndrSpec
no_gen) [(Name, TcIdSigInfo)]
sig_names
; let inst_sig_fun :: Name -> Maybe TcId
inst_sig_fun = NameEnv TcId -> Name -> Maybe TcId
forall a. NameEnv a -> Name -> Maybe a
lookupNameEnv (NameEnv TcId -> Name -> Maybe TcId)
-> NameEnv TcId -> Name -> Maybe TcId
forall a b. (a -> b) -> a -> b
$ [(Name, TcId)] -> NameEnv TcId
forall a. [(Name, a)] -> NameEnv a
mkNameEnv ([(Name, TcId)] -> NameEnv TcId) -> [(Name, TcId)] -> NameEnv TcId
forall a b. (a -> b) -> a -> b
$
[ (MonoBindInfo -> Name
mbi_poly_name MonoBindInfo
mbi, MonoBindInfo -> TcId
mbi_mono_id MonoBindInfo
mbi)
| MonoBindInfo
mbi <- [MonoBindInfo]
sig_mbis ]
; ((GenLocated SrcSpanAnnA (Pat GhcTc)
pat', [MonoBindInfo]
nosig_mbis), Kind
pat_ty)
<- SDoc
-> TcM ((GenLocated SrcSpanAnnA (Pat GhcTc), [MonoBindInfo]), Kind)
-> TcM ((GenLocated SrcSpanAnnA (Pat GhcTc), [MonoBindInfo]), Kind)
forall a. SDoc -> TcM a -> TcM a
addErrCtxt (LPat GhcRn -> GRHSs GhcRn (LHsExpr GhcRn) -> SDoc
forall (p :: Pass).
OutputableBndrId p =>
LPat (GhcPass p) -> GRHSs GhcRn (LHsExpr GhcRn) -> SDoc
patMonoBindsCtxt LPat GhcRn
pat GRHSs GhcRn (LHsExpr GhcRn)
grhss) (TcM ((GenLocated SrcSpanAnnA (Pat GhcTc), [MonoBindInfo]), Kind)
-> TcM
((GenLocated SrcSpanAnnA (Pat GhcTc), [MonoBindInfo]), Kind))
-> TcM ((GenLocated SrcSpanAnnA (Pat GhcTc), [MonoBindInfo]), Kind)
-> TcM ((GenLocated SrcSpanAnnA (Pat GhcTc), [MonoBindInfo]), Kind)
forall a b. (a -> b) -> a -> b
$
FixedRuntimeRepContext
-> (ExpSigmaType
-> IOEnv
(Env TcGblEnv TcLclEnv)
(GenLocated SrcSpanAnnA (Pat GhcTc), [MonoBindInfo]))
-> TcM ((GenLocated SrcSpanAnnA (Pat GhcTc), [MonoBindInfo]), Kind)
forall a.
FixedRuntimeRepContext -> (ExpSigmaType -> TcM a) -> TcM (a, Kind)
tcInferFRR FixedRuntimeRepContext
FRRPatBind ((ExpSigmaType
-> IOEnv
(Env TcGblEnv TcLclEnv)
(GenLocated SrcSpanAnnA (Pat GhcTc), [MonoBindInfo]))
-> TcM
((GenLocated SrcSpanAnnA (Pat GhcTc), [MonoBindInfo]), Kind))
-> (ExpSigmaType
-> IOEnv
(Env TcGblEnv TcLclEnv)
(GenLocated SrcSpanAnnA (Pat GhcTc), [MonoBindInfo]))
-> TcM ((GenLocated SrcSpanAnnA (Pat GhcTc), [MonoBindInfo]), Kind)
forall a b. (a -> b) -> a -> b
$ \ ExpSigmaType
exp_ty ->
(Name -> Maybe TcId)
-> LetBndrSpec
-> LPat GhcRn
-> Scaled ExpSigmaType
-> TcM [MonoBindInfo]
-> TcM (LPat GhcTc, [MonoBindInfo])
forall a.
(Name -> Maybe TcId)
-> LetBndrSpec
-> LPat GhcRn
-> Scaled ExpSigmaType
-> TcM a
-> TcM (LPat GhcTc, a)
tcLetPat Name -> Maybe TcId
inst_sig_fun LetBndrSpec
no_gen LPat GhcRn
pat (ExpSigmaType -> Scaled ExpSigmaType
forall a. a -> Scaled a
unrestricted ExpSigmaType
exp_ty) (TcM [MonoBindInfo] -> TcM (LPat GhcTc, [MonoBindInfo]))
-> TcM [MonoBindInfo] -> TcM (LPat GhcTc, [MonoBindInfo])
forall a b. (a -> b) -> a -> b
$
(Name -> IOEnv (Env TcGblEnv TcLclEnv) MonoBindInfo)
-> [Name] -> TcM [MonoBindInfo]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> [a] -> m [b]
mapM Name -> IOEnv (Env TcGblEnv TcLclEnv) MonoBindInfo
lookupMBI [Name]
nosig_names
; let mbis :: [MonoBindInfo]
mbis = [MonoBindInfo]
sig_mbis [MonoBindInfo] -> [MonoBindInfo] -> [MonoBindInfo]
forall a. [a] -> [a] -> [a]
++ [MonoBindInfo]
nosig_mbis
; String -> SDoc -> TcRn ()
traceTc String
"tcLhs" ([SDoc] -> SDoc
forall doc. IsDoc doc => [doc] -> doc
vcat [ TcId -> SDoc
forall a. Outputable a => a -> SDoc
ppr TcId
id SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> SDoc
dcolon SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> Kind -> SDoc
forall a. Outputable a => a -> SDoc
ppr (TcId -> Kind
idType TcId
id)
| MonoBindInfo
mbi <- [MonoBindInfo]
mbis, let id :: TcId
id = MonoBindInfo -> TcId
mbi_mono_id MonoBindInfo
mbi ]
SDoc -> SDoc -> SDoc
forall doc. IsDoc doc => doc -> doc -> doc
$$ LetBndrSpec -> SDoc
forall a. Outputable a => a -> SDoc
ppr LetBndrSpec
no_gen)
; TcMonoBind -> TcM TcMonoBind
forall a. a -> IOEnv (Env TcGblEnv TcLclEnv) a
forall (m :: * -> *) a. Monad m => a -> m a
return ([MonoBindInfo]
-> LPat GhcTc -> GRHSs GhcRn (LHsExpr GhcRn) -> Kind -> TcMonoBind
TcPatBind [MonoBindInfo]
mbis LPat GhcTc
GenLocated SrcSpanAnnA (Pat GhcTc)
pat' GRHSs GhcRn (LHsExpr GhcRn)
grhss Kind
pat_ty) }
where
bndr_names :: [IdP GhcRn]
bndr_names = CollectFlag GhcRn -> LPat GhcRn -> [IdP GhcRn]
forall p. CollectPass p => CollectFlag p -> LPat p -> [IdP p]
collectPatBinders CollectFlag GhcRn
forall p. CollectFlag p
CollNoDictBinders LPat GhcRn
pat
([Name]
nosig_names, [(Name, TcIdSigInfo)]
sig_names) = (Name -> Either Name (Name, TcIdSigInfo))
-> [Name] -> ([Name], [(Name, TcIdSigInfo)])
forall a b c. (a -> Either b c) -> [a] -> ([b], [c])
partitionWith Name -> Either Name (Name, TcIdSigInfo)
find_sig [IdP GhcRn]
[Name]
bndr_names
find_sig :: Name -> Either Name (Name, TcIdSigInfo)
find_sig :: Name -> Either Name (Name, TcIdSigInfo)
find_sig Name
name = case TcSigFun
sig_fn Name
name of
Just (TcIdSig TcIdSigInfo
sig) -> (Name, TcIdSigInfo) -> Either Name (Name, TcIdSigInfo)
forall a b. b -> Either a b
Right (Name
name, TcIdSigInfo
sig)
Maybe TcSigInfo
_ -> Name -> Either Name (Name, TcIdSigInfo)
forall a b. a -> Either a b
Left Name
name
tcLhs TcSigFun
_ LetBndrSpec
_ b :: HsBind GhcRn
b@(PatSynBind {}) = String -> SDoc -> TcM TcMonoBind
forall a. HasCallStack => String -> SDoc -> a
pprPanic String
"tcLhs: PatSynBind" (HsBind GhcRn -> SDoc
forall a. Outputable a => a -> SDoc
ppr HsBind GhcRn
b)
tcLhs TcSigFun
_ LetBndrSpec
_ (VarBind { var_ext :: forall idL idR. HsBindLR idL idR -> XVarBind idL idR
var_ext = XVarBind GhcRn GhcRn
x }) = DataConCantHappen -> TcM TcMonoBind
forall a. DataConCantHappen -> a
dataConCantHappen XVarBind GhcRn GhcRn
DataConCantHappen
x
lookupMBI :: Name -> TcM MonoBindInfo
lookupMBI :: Name -> IOEnv (Env TcGblEnv TcLclEnv) MonoBindInfo
lookupMBI Name
name
= do { TcId
mono_id <- Name -> IOEnv (Env TcGblEnv TcLclEnv) TcId
tcLookupId Name
name
; MonoBindInfo -> IOEnv (Env TcGblEnv TcLclEnv) MonoBindInfo
forall a. a -> IOEnv (Env TcGblEnv TcLclEnv) a
forall (m :: * -> *) a. Monad m => a -> m a
return (MBI { mbi_poly_name :: Name
mbi_poly_name = Name
name
, mbi_sig :: Maybe TcIdSigInst
mbi_sig = Maybe TcIdSigInst
forall a. Maybe a
Nothing
, mbi_mono_id :: TcId
mbi_mono_id = TcId
mono_id }) }
tcLhsSigId :: LetBndrSpec -> (Name, TcIdSigInfo) -> TcM MonoBindInfo
tcLhsSigId :: LetBndrSpec
-> (Name, TcIdSigInfo)
-> IOEnv (Env TcGblEnv TcLclEnv) MonoBindInfo
tcLhsSigId LetBndrSpec
no_gen (Name
name, TcIdSigInfo
sig)
= do { TcIdSigInst
inst_sig <- TcIdSigInfo -> TcM TcIdSigInst
tcInstSig TcIdSigInfo
sig
; TcId
mono_id <- LetBndrSpec
-> Name -> TcIdSigInst -> IOEnv (Env TcGblEnv TcLclEnv) TcId
newSigLetBndr LetBndrSpec
no_gen Name
name TcIdSigInst
inst_sig
; MonoBindInfo -> IOEnv (Env TcGblEnv TcLclEnv) MonoBindInfo
forall a. a -> IOEnv (Env TcGblEnv TcLclEnv) a
forall (m :: * -> *) a. Monad m => a -> m a
return (MBI { mbi_poly_name :: Name
mbi_poly_name = Name
name
, mbi_sig :: Maybe TcIdSigInst
mbi_sig = TcIdSigInst -> Maybe TcIdSigInst
forall a. a -> Maybe a
Just TcIdSigInst
inst_sig
, mbi_mono_id :: TcId
mbi_mono_id = TcId
mono_id }) }
newSigLetBndr :: LetBndrSpec -> Name -> TcIdSigInst -> TcM TcId
newSigLetBndr :: LetBndrSpec
-> Name -> TcIdSigInst -> IOEnv (Env TcGblEnv TcLclEnv) TcId
newSigLetBndr (LetGblBndr TcPragEnv
prags) Name
name (TISI { sig_inst_sig :: TcIdSigInst -> TcIdSigInfo
sig_inst_sig = TcIdSigInfo
id_sig })
| CompleteSig { sig_bndr :: TcIdSigInfo -> TcId
sig_bndr = TcId
poly_id } <- TcIdSigInfo
id_sig
= TcId -> [LSig GhcRn] -> IOEnv (Env TcGblEnv TcLclEnv) TcId
addInlinePrags TcId
poly_id (TcPragEnv -> Name -> [LSig GhcRn]
lookupPragEnv TcPragEnv
prags Name
name)
newSigLetBndr LetBndrSpec
no_gen Name
name (TISI { sig_inst_tau :: TcIdSigInst -> Kind
sig_inst_tau = Kind
tau })
= LetBndrSpec
-> Name -> Kind -> Kind -> IOEnv (Env TcGblEnv TcLclEnv) TcId
newLetBndr LetBndrSpec
no_gen Name
name Kind
ManyTy Kind
tau
tcRhs :: TcMonoBind -> TcM (HsBind GhcTc)
tcRhs :: TcMonoBind -> TcM (HsBindLR GhcTc GhcTc)
tcRhs (TcFunBind info :: MonoBindInfo
info@(MBI { mbi_sig :: MonoBindInfo -> Maybe TcIdSigInst
mbi_sig = Maybe TcIdSigInst
mb_sig, mbi_mono_id :: MonoBindInfo -> TcId
mbi_mono_id = TcId
mono_id })
SrcSpan
loc MatchGroup GhcRn (LHsExpr GhcRn)
matches)
= [MonoBindInfo]
-> TcM (HsBindLR GhcTc GhcTc) -> TcM (HsBindLR GhcTc GhcTc)
forall a. [MonoBindInfo] -> TcM a -> TcM a
tcExtendIdBinderStackForRhs [MonoBindInfo
info] (TcM (HsBindLR GhcTc GhcTc) -> TcM (HsBindLR GhcTc GhcTc))
-> TcM (HsBindLR GhcTc GhcTc) -> TcM (HsBindLR GhcTc GhcTc)
forall a b. (a -> b) -> a -> b
$
Maybe TcIdSigInst
-> TcM (HsBindLR GhcTc GhcTc) -> TcM (HsBindLR GhcTc GhcTc)
forall a. Maybe TcIdSigInst -> TcM a -> TcM a
tcExtendTyVarEnvForRhs Maybe TcIdSigInst
mb_sig (TcM (HsBindLR GhcTc GhcTc) -> TcM (HsBindLR GhcTc GhcTc))
-> TcM (HsBindLR GhcTc GhcTc) -> TcM (HsBindLR GhcTc GhcTc)
forall a b. (a -> b) -> a -> b
$
do { String -> SDoc -> TcRn ()
traceTc String
"tcRhs: fun bind" (TcId -> SDoc
forall a. Outputable a => a -> SDoc
ppr TcId
mono_id SDoc -> SDoc -> SDoc
forall doc. IsDoc doc => doc -> doc -> doc
$$ Kind -> SDoc
forall a. Outputable a => a -> SDoc
ppr (TcId -> Kind
idType TcId
mono_id))
; (HsWrapper
co_fn, MatchGroup GhcTc (GenLocated SrcSpanAnnA (HsExpr GhcTc))
matches') <- GenLocated SrcSpanAnnN Name
-> MatchGroup GhcRn (LHsExpr GhcRn)
-> ExpSigmaType
-> TcRn (HsWrapper, MatchGroup GhcTc (LHsExpr GhcTc))
tcMatchesFun (SrcSpanAnnN -> Name -> GenLocated SrcSpanAnnN Name
forall l e. l -> e -> GenLocated l e
L (SrcSpan -> SrcSpanAnnN
forall ann. SrcSpan -> SrcAnn ann
noAnnSrcSpan SrcSpan
loc) (TcId -> Name
idName TcId
mono_id))
MatchGroup GhcRn (LHsExpr GhcRn)
matches (Kind -> ExpSigmaType
mkCheckExpType (Kind -> ExpSigmaType) -> Kind -> ExpSigmaType
forall a b. (a -> b) -> a -> b
$ TcId -> Kind
idType TcId
mono_id)
; HsBindLR GhcTc GhcTc -> TcM (HsBindLR GhcTc GhcTc)
forall a. a -> IOEnv (Env TcGblEnv TcLclEnv) a
forall (m :: * -> *) a. Monad m => a -> m a
return ( FunBind { fun_id :: LIdP GhcTc
fun_id = SrcSpanAnnN -> TcId -> GenLocated SrcSpanAnnN TcId
forall l e. l -> e -> GenLocated l e
L (SrcSpan -> SrcSpanAnnN
forall ann. SrcSpan -> SrcAnn ann
noAnnSrcSpan SrcSpan
loc) TcId
mono_id
, fun_matches :: MatchGroup GhcTc (LHsExpr GhcTc)
fun_matches = MatchGroup GhcTc (LHsExpr GhcTc)
MatchGroup GhcTc (GenLocated SrcSpanAnnA (HsExpr GhcTc))
matches'
, fun_ext :: XFunBind GhcTc GhcTc
fun_ext = (HsWrapper
co_fn, [])
} ) }
tcRhs (TcPatBind [MonoBindInfo]
infos LPat GhcTc
pat' GRHSs GhcRn (LHsExpr GhcRn)
grhss Kind
pat_ty)
=
[MonoBindInfo]
-> TcM (HsBindLR GhcTc GhcTc) -> TcM (HsBindLR GhcTc GhcTc)
forall a. [MonoBindInfo] -> TcM a -> TcM a
tcExtendIdBinderStackForRhs [MonoBindInfo]
infos (TcM (HsBindLR GhcTc GhcTc) -> TcM (HsBindLR GhcTc GhcTc))
-> TcM (HsBindLR GhcTc GhcTc) -> TcM (HsBindLR GhcTc GhcTc)
forall a b. (a -> b) -> a -> b
$
do { String -> SDoc -> TcRn ()
traceTc String
"tcRhs: pat bind" (GenLocated SrcSpanAnnA (Pat GhcTc) -> SDoc
forall a. Outputable a => a -> SDoc
ppr LPat GhcTc
GenLocated SrcSpanAnnA (Pat GhcTc)
pat' SDoc -> SDoc -> SDoc
forall doc. IsDoc doc => doc -> doc -> doc
$$ Kind -> SDoc
forall a. Outputable a => a -> SDoc
ppr Kind
pat_ty)
; GRHSs GhcTc (GenLocated SrcSpanAnnA (HsExpr GhcTc))
grhss' <- SDoc
-> TcM (GRHSs GhcTc (LHsExpr GhcTc))
-> TcM (GRHSs GhcTc (LHsExpr GhcTc))
forall a. SDoc -> TcM a -> TcM a
addErrCtxt (LPat GhcTc -> GRHSs GhcRn (LHsExpr GhcRn) -> SDoc
forall (p :: Pass).
OutputableBndrId p =>
LPat (GhcPass p) -> GRHSs GhcRn (LHsExpr GhcRn) -> SDoc
patMonoBindsCtxt LPat GhcTc
pat' GRHSs GhcRn (LHsExpr GhcRn)
grhss) (TcM (GRHSs GhcTc (LHsExpr GhcTc))
-> TcM (GRHSs GhcTc (LHsExpr GhcTc)))
-> TcM (GRHSs GhcTc (LHsExpr GhcTc))
-> TcM (GRHSs GhcTc (LHsExpr GhcTc))
forall a b. (a -> b) -> a -> b
$
GRHSs GhcRn (LHsExpr GhcRn)
-> ExpSigmaType -> TcM (GRHSs GhcTc (LHsExpr GhcTc))
tcGRHSsPat GRHSs GhcRn (LHsExpr GhcRn)
grhss (Kind -> ExpSigmaType
mkCheckExpType Kind
pat_ty)
; HsBindLR GhcTc GhcTc -> TcM (HsBindLR GhcTc GhcTc)
forall a. a -> IOEnv (Env TcGblEnv TcLclEnv) a
forall (m :: * -> *) a. Monad m => a -> m a
return ( PatBind { pat_lhs :: LPat GhcTc
pat_lhs = LPat GhcTc
pat', pat_rhs :: GRHSs GhcTc (LHsExpr GhcTc)
pat_rhs = GRHSs GhcTc (LHsExpr GhcTc)
GRHSs GhcTc (GenLocated SrcSpanAnnA (HsExpr GhcTc))
grhss'
, pat_ext :: XPatBind GhcTc GhcTc
pat_ext = (Kind
pat_ty, ([],[])) } )}
tcExtendTyVarEnvForRhs :: Maybe TcIdSigInst -> TcM a -> TcM a
tcExtendTyVarEnvForRhs :: forall a. Maybe TcIdSigInst -> TcM a -> TcM a
tcExtendTyVarEnvForRhs Maybe TcIdSigInst
Nothing TcM a
thing_inside
= TcM a
thing_inside
tcExtendTyVarEnvForRhs (Just TcIdSigInst
sig) TcM a
thing_inside
= TcIdSigInst -> TcM a -> TcM a
forall a. TcIdSigInst -> TcM a -> TcM a
tcExtendTyVarEnvFromSig TcIdSigInst
sig TcM a
thing_inside
tcExtendTyVarEnvFromSig :: TcIdSigInst -> TcM a -> TcM a
tcExtendTyVarEnvFromSig :: forall a. TcIdSigInst -> TcM a -> TcM a
tcExtendTyVarEnvFromSig TcIdSigInst
sig_inst TcM a
thing_inside
| TISI { sig_inst_skols :: TcIdSigInst -> [(Name, VarBndr TcId Specificity)]
sig_inst_skols = [(Name, VarBndr TcId Specificity)]
skol_prs, sig_inst_wcs :: TcIdSigInst -> [(Name, TcId)]
sig_inst_wcs = [(Name, TcId)]
wcs } <- TcIdSigInst
sig_inst
= [(Name, TcId)] -> TcM a -> TcM a
forall a. [(Name, TcId)] -> TcM a -> TcM a
tcExtendNameTyVarEnv [(Name, TcId)]
wcs (TcM a -> TcM a) -> TcM a -> TcM a
forall a b. (a -> b) -> a -> b
$
[(Name, TcId)] -> TcM a -> TcM a
forall a. [(Name, TcId)] -> TcM a -> TcM a
tcExtendNameTyVarEnv ((VarBndr TcId Specificity -> TcId)
-> [(Name, VarBndr TcId Specificity)] -> [(Name, TcId)]
forall (f :: * -> *) b c a.
Functor f =>
(b -> c) -> f (a, b) -> f (a, c)
mapSnd VarBndr TcId Specificity -> TcId
forall tv argf. VarBndr tv argf -> tv
binderVar [(Name, VarBndr TcId Specificity)]
skol_prs) (TcM a -> TcM a) -> TcM a -> TcM a
forall a b. (a -> b) -> a -> b
$
TcM a
thing_inside
tcExtendIdBinderStackForRhs :: [MonoBindInfo] -> TcM a -> TcM a
tcExtendIdBinderStackForRhs :: forall a. [MonoBindInfo] -> TcM a -> TcM a
tcExtendIdBinderStackForRhs [MonoBindInfo]
infos TcM a
thing_inside
= [TcBinder] -> TcM a -> TcM a
forall a. [TcBinder] -> TcM a -> TcM a
tcExtendBinderStack [ TcId -> TopLevelFlag -> TcBinder
TcIdBndr TcId
mono_id TopLevelFlag
NotTopLevel
| MBI { mbi_mono_id :: MonoBindInfo -> TcId
mbi_mono_id = TcId
mono_id } <- [MonoBindInfo]
infos ]
TcM a
thing_inside
getMonoBindInfo :: [LocatedA TcMonoBind] -> [MonoBindInfo]
getMonoBindInfo :: [GenLocated SrcSpanAnnA TcMonoBind] -> [MonoBindInfo]
getMonoBindInfo [GenLocated SrcSpanAnnA TcMonoBind]
tc_binds
= (GenLocated SrcSpanAnnA TcMonoBind
-> [MonoBindInfo] -> [MonoBindInfo])
-> [MonoBindInfo]
-> [GenLocated SrcSpanAnnA TcMonoBind]
-> [MonoBindInfo]
forall a b. (a -> b -> b) -> b -> [a] -> b
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr (TcMonoBind -> [MonoBindInfo] -> [MonoBindInfo]
get_info (TcMonoBind -> [MonoBindInfo] -> [MonoBindInfo])
-> (GenLocated SrcSpanAnnA TcMonoBind -> TcMonoBind)
-> GenLocated SrcSpanAnnA TcMonoBind
-> [MonoBindInfo]
-> [MonoBindInfo]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. GenLocated SrcSpanAnnA TcMonoBind -> TcMonoBind
forall l e. GenLocated l e -> e
unLoc) [] [GenLocated SrcSpanAnnA TcMonoBind]
tc_binds
where
get_info :: TcMonoBind -> [MonoBindInfo] -> [MonoBindInfo]
get_info (TcFunBind MonoBindInfo
info SrcSpan
_ MatchGroup GhcRn (LHsExpr GhcRn)
_) [MonoBindInfo]
rest = MonoBindInfo
info MonoBindInfo -> [MonoBindInfo] -> [MonoBindInfo]
forall a. a -> [a] -> [a]
: [MonoBindInfo]
rest
get_info (TcPatBind [MonoBindInfo]
infos LPat GhcTc
_ GRHSs GhcRn (LHsExpr GhcRn)
_ Kind
_) [MonoBindInfo]
rest = [MonoBindInfo]
infos [MonoBindInfo] -> [MonoBindInfo] -> [MonoBindInfo]
forall a. [a] -> [a] -> [a]
++ [MonoBindInfo]
rest
data GeneralisationPlan
= NoGen
| InferGen
| CheckGen
(LHsBind GhcRn)
TcIdSigInfo
instance Outputable GeneralisationPlan where
ppr :: GeneralisationPlan -> SDoc
ppr GeneralisationPlan
NoGen = String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"NoGen"
ppr GeneralisationPlan
InferGen = String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"InferGen"
ppr (CheckGen LHsBindLR GhcRn GhcRn
_ TcIdSigInfo
s) = String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"CheckGen" SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> TcIdSigInfo -> SDoc
forall a. Outputable a => a -> SDoc
ppr TcIdSigInfo
s
decideGeneralisationPlan
:: DynFlags -> TopLevelFlag -> IsGroupClosed -> TcSigFun
-> [LHsBind GhcRn] -> GeneralisationPlan
decideGeneralisationPlan :: DynFlags
-> TopLevelFlag
-> IsGroupClosed
-> TcSigFun
-> [LHsBindLR GhcRn GhcRn]
-> GeneralisationPlan
decideGeneralisationPlan DynFlags
dflags TopLevelFlag
top_lvl IsGroupClosed
closed TcSigFun
sig_fn [LHsBindLR GhcRn GhcRn]
lbinds
| Just (GenLocated SrcSpanAnnA (HsBind GhcRn)
bind, TcIdSigInfo
sig) <- Maybe (GenLocated SrcSpanAnnA (HsBind GhcRn), TcIdSigInfo)
one_funbind_with_sig = LHsBindLR GhcRn GhcRn -> TcIdSigInfo -> GeneralisationPlan
CheckGen LHsBindLR GhcRn GhcRn
GenLocated SrcSpanAnnA (HsBind GhcRn)
bind TcIdSigInfo
sig
| Bool
generalise_binds = GeneralisationPlan
InferGen
| Bool
otherwise = GeneralisationPlan
NoGen
where
generalise_binds :: Bool
generalise_binds
| TopLevelFlag -> Bool
isTopLevel TopLevelFlag
top_lvl = Bool
True
| IsGroupClosed NameEnv NameSet
_ Bool
True <- IsGroupClosed
closed = Bool
True
| Bool
has_partial_sigs = Bool
True
| Bool
otherwise = Bool -> Bool
not (Extension -> DynFlags -> Bool
xopt Extension
LangExt.MonoLocalBinds DynFlags
dflags)
one_funbind_with_sig :: Maybe (GenLocated SrcSpanAnnA (HsBind GhcRn), TcIdSigInfo)
one_funbind_with_sig
| [lbind :: LHsBindLR GhcRn GhcRn
lbind@(L SrcSpanAnnA
_ (FunBind { fun_id :: forall idL idR. HsBindLR idL idR -> LIdP idL
fun_id = LIdP GhcRn
v }))] <- [LHsBindLR GhcRn GhcRn]
lbinds
, Just (TcIdSig sig :: TcIdSigInfo
sig@(CompleteSig {})) <- TcSigFun
sig_fn (GenLocated SrcSpanAnnN Name -> Name
forall l e. GenLocated l e -> e
unLoc LIdP GhcRn
GenLocated SrcSpanAnnN Name
v)
= (GenLocated SrcSpanAnnA (HsBind GhcRn), TcIdSigInfo)
-> Maybe (GenLocated SrcSpanAnnA (HsBind GhcRn), TcIdSigInfo)
forall a. a -> Maybe a
Just (LHsBindLR GhcRn GhcRn
GenLocated SrcSpanAnnA (HsBind GhcRn)
lbind, TcIdSigInfo
sig)
| Bool
otherwise
= Maybe (GenLocated SrcSpanAnnA (HsBind GhcRn), TcIdSigInfo)
forall a. Maybe a
Nothing
binders :: [IdP GhcRn]
binders = CollectFlag GhcRn -> [LHsBindLR GhcRn GhcRn] -> [IdP GhcRn]
forall p idR.
CollectPass p =>
CollectFlag p -> [LHsBindLR p idR] -> [IdP p]
collectHsBindListBinders CollectFlag GhcRn
forall p. CollectFlag p
CollNoDictBinders [LHsBindLR GhcRn GhcRn]
lbinds
has_partial_sigs :: Bool
has_partial_sigs = (Name -> Bool) -> [Name] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any Name -> Bool
has_partial_sig [IdP GhcRn]
[Name]
binders
has_partial_sig :: Name -> Bool
has_partial_sig Name
nm = case TcSigFun
sig_fn Name
nm of
Just (TcIdSig (PartialSig {})) -> Bool
True
Maybe TcSigInfo
_ -> Bool
False
isClosedBndrGroup :: TcTypeEnv -> Bag (LHsBind GhcRn) -> IsGroupClosed
isClosedBndrGroup :: TcTypeEnv -> LHsBinds GhcRn -> IsGroupClosed
isClosedBndrGroup TcTypeEnv
type_env LHsBinds GhcRn
binds
= NameEnv NameSet -> Bool -> IsGroupClosed
IsGroupClosed NameEnv NameSet
fv_env Bool
type_closed
where
type_closed :: Bool
type_closed = (NameSet -> Bool) -> NameEnv NameSet -> Bool
forall elt key. (elt -> Bool) -> UniqFM key elt -> Bool
allUFM ((Name -> Bool) -> NameSet -> Bool
nameSetAll Name -> Bool
is_closed_type_id) NameEnv NameSet
fv_env
fv_env :: NameEnv NameSet
fv_env :: NameEnv NameSet
fv_env = [(Name, NameSet)] -> NameEnv NameSet
forall a. [(Name, a)] -> NameEnv a
mkNameEnv ([(Name, NameSet)] -> NameEnv NameSet)
-> [(Name, NameSet)] -> NameEnv NameSet
forall a b. (a -> b) -> a -> b
$ (GenLocated SrcSpanAnnA (HsBind GhcRn) -> [(Name, NameSet)])
-> Bag (GenLocated SrcSpanAnnA (HsBind GhcRn)) -> [(Name, NameSet)]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap (HsBind GhcRn -> [(Name, NameSet)]
bindFvs (HsBind GhcRn -> [(Name, NameSet)])
-> (GenLocated SrcSpanAnnA (HsBind GhcRn) -> HsBind GhcRn)
-> GenLocated SrcSpanAnnA (HsBind GhcRn)
-> [(Name, NameSet)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. GenLocated SrcSpanAnnA (HsBind GhcRn) -> HsBind GhcRn
forall l e. GenLocated l e -> e
unLoc) LHsBinds GhcRn
Bag (GenLocated SrcSpanAnnA (HsBind GhcRn))
binds
bindFvs :: HsBindLR GhcRn GhcRn -> [(Name, NameSet)]
bindFvs :: HsBind GhcRn -> [(Name, NameSet)]
bindFvs (FunBind { fun_id :: forall idL idR. HsBindLR idL idR -> LIdP idL
fun_id = L SrcSpanAnnN
_ Name
f
, fun_ext :: forall idL idR. HsBindLR idL idR -> XFunBind idL idR
fun_ext = XFunBind GhcRn GhcRn
fvs })
= let open_fvs :: NameSet
open_fvs = NameSet -> NameSet
get_open_fvs XFunBind GhcRn GhcRn
NameSet
fvs
in [(Name
f, NameSet
open_fvs)]
bindFvs (PatBind { pat_lhs :: forall idL idR. HsBindLR idL idR -> LPat idL
pat_lhs = LPat GhcRn
pat, pat_ext :: forall idL idR. HsBindLR idL idR -> XPatBind idL idR
pat_ext = XPatBind GhcRn GhcRn
fvs })
= let open_fvs :: NameSet
open_fvs = NameSet -> NameSet
get_open_fvs XPatBind GhcRn GhcRn
NameSet
fvs
in [(Name
b, NameSet
open_fvs) | Name
b <- CollectFlag GhcRn -> LPat GhcRn -> [IdP GhcRn]
forall p. CollectPass p => CollectFlag p -> LPat p -> [IdP p]
collectPatBinders CollectFlag GhcRn
forall p. CollectFlag p
CollNoDictBinders LPat GhcRn
pat]
bindFvs HsBind GhcRn
_
= []
get_open_fvs :: NameSet -> NameSet
get_open_fvs NameSet
fvs = (Name -> Bool) -> NameSet -> NameSet
filterNameSet (Bool -> Bool
not (Bool -> Bool) -> (Name -> Bool) -> Name -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Name -> Bool
is_closed) NameSet
fvs
is_closed :: Name -> ClosedTypeId
is_closed :: Name -> Bool
is_closed Name
name
| Just TcTyThing
thing <- TcTypeEnv -> Name -> Maybe TcTyThing
forall a. NameEnv a -> Name -> Maybe a
lookupNameEnv TcTypeEnv
type_env Name
name
= case TcTyThing
thing of
AGlobal {} -> Bool
True
ATcId { tct_info :: TcTyThing -> IdBindingInfo
tct_info = IdBindingInfo
ClosedLet } -> Bool
True
TcTyThing
_ -> Bool
False
| Bool
otherwise
= Bool
True
is_closed_type_id :: Name -> Bool
is_closed_type_id :: Name -> Bool
is_closed_type_id Name
name
| Just TcTyThing
thing <- TcTypeEnv -> Name -> Maybe TcTyThing
forall a. NameEnv a -> Name -> Maybe a
lookupNameEnv TcTypeEnv
type_env Name
name
= case TcTyThing
thing of
ATcId { tct_info :: TcTyThing -> IdBindingInfo
tct_info = NonClosedLet NameSet
_ Bool
cl } -> Bool
cl
ATcId { tct_info :: TcTyThing -> IdBindingInfo
tct_info = IdBindingInfo
NotLetBound } -> Bool
False
ATyVar {} -> Bool
False
TcTyThing
_ -> String -> SDoc -> Bool
forall a. HasCallStack => String -> SDoc -> a
pprPanic String
"is_closed_id" (Name -> SDoc
forall a. Outputable a => a -> SDoc
ppr Name
name)
| Bool
otherwise
= Bool
True
patMonoBindsCtxt :: (OutputableBndrId p)
=> LPat (GhcPass p) -> GRHSs GhcRn (LHsExpr GhcRn) -> SDoc
patMonoBindsCtxt :: forall (p :: Pass).
OutputableBndrId p =>
LPat (GhcPass p) -> GRHSs GhcRn (LHsExpr GhcRn) -> SDoc
patMonoBindsCtxt LPat (GhcPass p)
pat GRHSs GhcRn (LHsExpr GhcRn)
grhss
= SDoc -> BKey -> SDoc -> SDoc
hang (String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"In a pattern binding:") BKey
2 (LPat (GhcPass p) -> GRHSs GhcRn (LHsExpr GhcRn) -> SDoc
forall (bndr :: Pass) (p :: Pass).
(OutputableBndrId bndr, OutputableBndrId p) =>
LPat (GhcPass bndr)
-> GRHSs (GhcPass p) (LHsExpr (GhcPass p)) -> SDoc
pprPatBind LPat (GhcPass p)
pat GRHSs GhcRn (LHsExpr GhcRn)
grhss)