{-# LANGUAGE CPP, TupleSections, MultiWayIf, RankNTypes #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE ViewPatterns #-}
{-# OPTIONS_GHC -Wno-incomplete-uni-patterns #-}
module GHC.Tc.Gen.HsType (
kcClassSigType, tcClassSigType,
tcHsSigType, tcHsSigWcType,
tcHsPartialSigType,
tcStandaloneKindSig,
funsSigCtxt, addSigCtxt, pprSigCtxt,
tcHsClsInstType,
tcHsDeriv, tcDerivStrategy,
tcHsTypeApp,
UserTypeCtxt(..),
bindImplicitTKBndrs_Tv, bindImplicitTKBndrs_Skol,
bindImplicitTKBndrs_Q_Tv, bindImplicitTKBndrs_Q_Skol,
bindExplicitTKBndrs_Tv, bindExplicitTKBndrs_Skol,
bindExplicitTKBndrs_Q_Tv, bindExplicitTKBndrs_Q_Skol,
ContextKind(..),
bindTyClTyVars, tcFamTyPats,
etaExpandAlgTyCon, tcbVisibilities,
zonkAndScopedSort,
InitialKindStrategy(..),
SAKS_or_CUSK(..),
kcDeclHeader,
tcNamedWildCardBinders,
tcHsLiftedType, tcHsOpenType,
tcHsLiftedTypeNC, tcHsOpenTypeNC,
tcInferLHsTypeKind, tcInferLHsType, tcInferLHsTypeUnsaturated,
tcCheckLHsType,
tcHsMbContext, tcHsContext, tcLHsPredType,
failIfEmitsConstraints,
solveEqualities,
kindGeneralizeAll, kindGeneralizeSome, kindGeneralizeNone,
tcLHsKindSig, checkDataKindSig, DataSort(..),
checkClassKindSig,
tcMult,
tcHsPatSigType,
funAppCtxt, addTyConFlavCtxt
) where
#include "HsVersions.h"
import GHC.Prelude
import GHC.Hs
import GHC.Tc.Utils.Monad
import GHC.Tc.Types.Origin
import GHC.Core.Predicate
import GHC.Tc.Types.Constraint
import GHC.Tc.Utils.Env
import GHC.Tc.Utils.Instantiate( tcInstInvisibleTyBinders )
import GHC.Tc.Utils.TcMType
import GHC.Tc.Validity
import GHC.Tc.Utils.Unify
import GHC.IfaceToCore
import GHC.Tc.Solver
import GHC.Tc.Utils.Zonk
import GHC.Core.TyCo.Rep
import GHC.Core.TyCo.Ppr
import GHC.Tc.Errors ( reportAllUnsolved )
import GHC.Tc.Utils.TcType
import GHC.Tc.Utils.Instantiate ( tcInstInvisibleTyBindersN, tcInstInvisibleTyBinder )
import GHC.Core.Type
import GHC.Builtin.Types.Prim
import GHC.Types.Name.Env
import GHC.Types.Name.Reader( lookupLocalRdrOcc )
import GHC.Types.Var
import GHC.Types.Var.Set
import GHC.Core.TyCon
import GHC.Core.ConLike
import GHC.Core.DataCon
import GHC.Core.Class
import GHC.Types.Name
import GHC.Types.Var.Env
import GHC.Builtin.Types
import GHC.Types.Basic
import GHC.Types.SrcLoc
import GHC.Settings.Constants ( mAX_CTUPLE_SIZE )
import GHC.Utils.Error( MsgDoc )
import GHC.Types.Unique
import GHC.Types.Unique.FM
import GHC.Types.Unique.Set
import GHC.Utils.Misc
import GHC.Types.Unique.Supply
import GHC.Utils.Outputable
import GHC.Data.FastString
import GHC.Builtin.Names hiding ( wildCardName )
import GHC.Driver.Session
import qualified GHC.LanguageExtensions as LangExt
import GHC.Parser.Annotation
import GHC.Data.Maybe
import GHC.Data.Bag( unitBag )
import Data.List ( find )
import Control.Monad
funsSigCtxt :: [Located Name] -> UserTypeCtxt
funsSigCtxt :: [Located Name] -> UserTypeCtxt
funsSigCtxt (L SrcSpan
_ Name
name1 : [Located Name]
_) = Name -> Bool -> UserTypeCtxt
FunSigCtxt Name
name1 Bool
False
funsSigCtxt [] = String -> UserTypeCtxt
forall a. String -> a
panic String
"funSigCtxt"
addSigCtxt :: UserTypeCtxt -> LHsType GhcRn -> TcM a -> TcM a
addSigCtxt :: forall a. UserTypeCtxt -> LHsKind GhcRn -> TcM a -> TcM a
addSigCtxt UserTypeCtxt
ctxt LHsKind GhcRn
hs_ty TcM a
thing_inside
= SrcSpan -> TcM a -> TcM a
forall a. SrcSpan -> TcRn a -> TcRn a
setSrcSpan (LHsKind GhcRn -> SrcSpan
forall l e. GenLocated l e -> l
getLoc LHsKind GhcRn
hs_ty) (TcM a -> TcM a) -> TcM a -> TcM a
forall a b. (a -> b) -> a -> b
$
MsgDoc -> TcM a -> TcM a
forall a. MsgDoc -> TcM a -> TcM a
addErrCtxt (UserTypeCtxt -> LHsKind GhcRn -> MsgDoc
pprSigCtxt UserTypeCtxt
ctxt LHsKind GhcRn
hs_ty) (TcM a -> TcM a) -> TcM a -> TcM a
forall a b. (a -> b) -> a -> b
$
TcM a
thing_inside
pprSigCtxt :: UserTypeCtxt -> LHsType GhcRn -> SDoc
pprSigCtxt :: UserTypeCtxt -> LHsKind GhcRn -> MsgDoc
pprSigCtxt UserTypeCtxt
ctxt LHsKind GhcRn
hs_ty
| Just Name
n <- UserTypeCtxt -> Maybe Name
isSigMaybe UserTypeCtxt
ctxt
= MsgDoc -> Arity -> MsgDoc -> MsgDoc
hang (String -> MsgDoc
text String
"In the type signature:")
Arity
2 (Name -> MsgDoc
forall a. OutputableBndr a => a -> MsgDoc
pprPrefixOcc Name
n MsgDoc -> MsgDoc -> MsgDoc
<+> MsgDoc
dcolon MsgDoc -> MsgDoc -> MsgDoc
<+> LHsKind GhcRn -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr LHsKind GhcRn
hs_ty)
| Bool
otherwise
= MsgDoc -> Arity -> MsgDoc -> MsgDoc
hang (String -> MsgDoc
text String
"In" MsgDoc -> MsgDoc -> MsgDoc
<+> UserTypeCtxt -> MsgDoc
pprUserTypeCtxt UserTypeCtxt
ctxt MsgDoc -> MsgDoc -> MsgDoc
<> MsgDoc
colon)
Arity
2 (LHsKind GhcRn -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr LHsKind GhcRn
hs_ty)
tcHsSigWcType :: UserTypeCtxt -> LHsSigWcType GhcRn -> TcM Type
tcHsSigWcType :: UserTypeCtxt -> LHsSigWcType GhcRn -> TcM Type
tcHsSigWcType UserTypeCtxt
ctxt LHsSigWcType GhcRn
sig_ty = UserTypeCtxt -> LHsSigType GhcRn -> TcM Type
tcHsSigType UserTypeCtxt
ctxt (LHsSigWcType GhcRn -> LHsSigType GhcRn
forall pass. LHsSigWcType pass -> LHsSigType pass
dropWildCards LHsSigWcType GhcRn
sig_ty)
kcClassSigType :: SkolemInfo -> [Located Name] -> LHsSigType GhcRn -> TcM ()
kcClassSigType :: SkolemInfo -> [Located Name] -> LHsSigType GhcRn -> TcM ()
kcClassSigType SkolemInfo
skol_info [Located Name]
names (HsIB { hsib_ext :: forall pass thing. HsImplicitBndrs pass thing -> XHsIB pass thing
hsib_ext = XHsIB GhcRn (LHsKind GhcRn)
sig_vars
, hsib_body :: forall pass thing. HsImplicitBndrs pass thing -> thing
hsib_body = LHsKind GhcRn
hs_ty })
= UserTypeCtxt -> LHsKind GhcRn -> TcM () -> TcM ()
forall a. UserTypeCtxt -> LHsKind GhcRn -> TcM a -> TcM a
addSigCtxt ([Located Name] -> UserTypeCtxt
funsSigCtxt [Located Name]
names) LHsKind GhcRn
hs_ty (TcM () -> TcM ()) -> TcM () -> TcM ()
forall a b. (a -> b) -> a -> b
$
do { (TcLevel
tc_lvl, (WantedConstraints
wanted, ([TyVar]
spec_tkvs, Type
_)))
<- TcM (WantedConstraints, ([TyVar], Type))
-> TcM (TcLevel, (WantedConstraints, ([TyVar], Type)))
forall a. TcM a -> TcM (TcLevel, a)
pushTcLevelM (TcM (WantedConstraints, ([TyVar], Type))
-> TcM (TcLevel, (WantedConstraints, ([TyVar], Type))))
-> TcM (WantedConstraints, ([TyVar], Type))
-> TcM (TcLevel, (WantedConstraints, ([TyVar], Type)))
forall a b. (a -> b) -> a -> b
$
String
-> TcM ([TyVar], Type) -> TcM (WantedConstraints, ([TyVar], Type))
forall a. String -> TcM a -> TcM (WantedConstraints, a)
solveLocalEqualitiesX String
"kcClassSigType" (TcM ([TyVar], Type) -> TcM (WantedConstraints, ([TyVar], Type)))
-> TcM ([TyVar], Type) -> TcM (WantedConstraints, ([TyVar], Type))
forall a b. (a -> b) -> a -> b
$
HsQTvsRn -> TcM Type -> TcM ([TyVar], Type)
forall a. HsQTvsRn -> TcM a -> TcM ([TyVar], a)
bindImplicitTKBndrs_Skol HsQTvsRn
XHsIB GhcRn (LHsKind GhcRn)
sig_vars (TcM Type -> TcM ([TyVar], Type))
-> TcM Type -> TcM ([TyVar], Type)
forall a b. (a -> b) -> a -> b
$
LHsKind GhcRn -> Type -> TcM Type
tcLHsType LHsKind GhcRn
hs_ty Type
liftedTypeKind
; SkolemInfo -> [TyVar] -> TcLevel -> WantedConstraints -> TcM ()
emitResidualTvConstraint SkolemInfo
skol_info [TyVar]
spec_tkvs TcLevel
tc_lvl WantedConstraints
wanted }
tcClassSigType :: SkolemInfo -> [Located Name] -> LHsSigType GhcRn -> TcM Type
tcClassSigType :: SkolemInfo -> [Located Name] -> LHsSigType GhcRn -> TcM Type
tcClassSigType SkolemInfo
skol_info [Located Name]
names LHsSigType GhcRn
sig_ty
= UserTypeCtxt -> LHsKind GhcRn -> TcM Type -> TcM Type
forall a. UserTypeCtxt -> LHsKind GhcRn -> TcM a -> TcM a
addSigCtxt ([Located Name] -> UserTypeCtxt
funsSigCtxt [Located Name]
names) (LHsSigType GhcRn -> LHsKind GhcRn
forall (p :: Pass). LHsSigType (GhcPass p) -> LHsType (GhcPass p)
hsSigType LHsSigType GhcRn
sig_ty) (TcM Type -> TcM Type) -> TcM Type -> TcM Type
forall a b. (a -> b) -> a -> b
$
do { (Implication
implic, Type
ty) <- SkolemInfo
-> LHsSigType GhcRn -> ContextKind -> TcM (Implication, Type)
tc_hs_sig_type SkolemInfo
skol_info LHsSigType GhcRn
sig_ty (Type -> ContextKind
TheKind Type
liftedTypeKind)
; Implication -> TcM ()
emitImplication Implication
implic
; Type -> TcM Type
forall (m :: * -> *) a. Monad m => a -> m a
return Type
ty }
tcHsSigType :: UserTypeCtxt -> LHsSigType GhcRn -> TcM Type
tcHsSigType :: UserTypeCtxt -> LHsSigType GhcRn -> TcM Type
tcHsSigType UserTypeCtxt
ctxt LHsSigType GhcRn
sig_ty
= UserTypeCtxt -> LHsKind GhcRn -> TcM Type -> TcM Type
forall a. UserTypeCtxt -> LHsKind GhcRn -> TcM a -> TcM a
addSigCtxt UserTypeCtxt
ctxt (LHsSigType GhcRn -> LHsKind GhcRn
forall (p :: Pass). LHsSigType (GhcPass p) -> LHsType (GhcPass p)
hsSigType LHsSigType GhcRn
sig_ty) (TcM Type -> TcM Type) -> TcM Type -> TcM Type
forall a b. (a -> b) -> a -> b
$
do { String -> MsgDoc -> TcM ()
traceTc String
"tcHsSigType {" (LHsSigType GhcRn -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr LHsSigType GhcRn
sig_ty)
; (Implication
implic, Type
ty) <- SkolemInfo
-> LHsSigType GhcRn -> ContextKind -> TcM (Implication, Type)
tc_hs_sig_type SkolemInfo
skol_info LHsSigType GhcRn
sig_ty (UserTypeCtxt -> ContextKind
expectedKindInCtxt UserTypeCtxt
ctxt)
; WantedConstraints -> TcM ()
emitFlatConstraints (Bag Implication -> WantedConstraints
mkImplicWC (Implication -> Bag Implication
forall a. a -> Bag a
unitBag Implication
implic))
; Type
ty <- Type -> TcM Type
zonkTcType Type
ty
; UserTypeCtxt -> Type -> TcM ()
checkValidType UserTypeCtxt
ctxt Type
ty
; String -> MsgDoc -> TcM ()
traceTc String
"end tcHsSigType }" (Type -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr Type
ty)
; Type -> TcM Type
forall (m :: * -> *) a. Monad m => a -> m a
return Type
ty }
where
skol_info :: SkolemInfo
skol_info = UserTypeCtxt -> SkolemInfo
SigTypeSkol UserTypeCtxt
ctxt
tc_hs_sig_type :: SkolemInfo -> LHsSigType GhcRn
-> ContextKind -> TcM (Implication, TcType)
tc_hs_sig_type :: SkolemInfo
-> LHsSigType GhcRn -> ContextKind -> TcM (Implication, Type)
tc_hs_sig_type SkolemInfo
skol_info LHsSigType GhcRn
hs_sig_type ContextKind
ctxt_kind
| HsIB { hsib_ext :: forall pass thing. HsImplicitBndrs pass thing -> XHsIB pass thing
hsib_ext = XHsIB GhcRn (LHsKind GhcRn)
sig_vars, hsib_body :: forall pass thing. HsImplicitBndrs pass thing -> thing
hsib_body = LHsKind GhcRn
hs_ty } <- LHsSigType GhcRn
hs_sig_type
= do { (TcLevel
tc_lvl, (WantedConstraints
wanted, ([TyVar]
spec_tkvs, Type
ty)))
<- TcM (WantedConstraints, ([TyVar], Type))
-> TcM (TcLevel, (WantedConstraints, ([TyVar], Type)))
forall a. TcM a -> TcM (TcLevel, a)
pushTcLevelM (TcM (WantedConstraints, ([TyVar], Type))
-> TcM (TcLevel, (WantedConstraints, ([TyVar], Type))))
-> TcM (WantedConstraints, ([TyVar], Type))
-> TcM (TcLevel, (WantedConstraints, ([TyVar], Type)))
forall a b. (a -> b) -> a -> b
$
String
-> TcM ([TyVar], Type) -> TcM (WantedConstraints, ([TyVar], Type))
forall a. String -> TcM a -> TcM (WantedConstraints, a)
solveLocalEqualitiesX String
"tc_hs_sig_type" (TcM ([TyVar], Type) -> TcM (WantedConstraints, ([TyVar], Type)))
-> TcM ([TyVar], Type) -> TcM (WantedConstraints, ([TyVar], Type))
forall a b. (a -> b) -> a -> b
$
HsQTvsRn -> TcM Type -> TcM ([TyVar], Type)
forall a. HsQTvsRn -> TcM a -> TcM ([TyVar], a)
bindImplicitTKBndrs_Skol HsQTvsRn
XHsIB GhcRn (LHsKind GhcRn)
sig_vars (TcM Type -> TcM ([TyVar], Type))
-> TcM Type -> TcM ([TyVar], Type)
forall a b. (a -> b) -> a -> b
$
do { Type
kind <- ContextKind -> TcM Type
newExpectedKind ContextKind
ctxt_kind
; LHsKind GhcRn -> Type -> TcM Type
tcLHsType LHsKind GhcRn
hs_ty Type
kind }
; [TyVar]
spec_tkvs <- [TyVar] -> TcM [TyVar]
zonkAndScopedSort [TyVar]
spec_tkvs
; let ty1 :: Type
ty1 = [TyVar] -> Type -> Type
mkSpecForAllTys [TyVar]
spec_tkvs Type
ty
; TyVarSet
constrained <- TyVarSet -> TcM TyVarSet
zonkTyCoVarsAndFV (WantedConstraints -> TyVarSet
tyCoVarsOfWC WantedConstraints
wanted)
; let should_gen :: TyVar -> Bool
should_gen = Bool -> Bool
not (Bool -> Bool) -> (TyVar -> Bool) -> TyVar -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (TyVar -> TyVarSet -> Bool
`elemVarSet` TyVarSet
constrained)
; [TyVar]
kvs <- (TyVar -> Bool) -> Type -> TcM [TyVar]
kindGeneralizeSome TyVar -> Bool
should_gen Type
ty1
; Implication
implic <- SkolemInfo
-> [TyVar] -> TcLevel -> WantedConstraints -> TcM Implication
buildTvImplication SkolemInfo
skol_info ([TyVar]
kvs [TyVar] -> [TyVar] -> [TyVar]
forall a. [a] -> [a] -> [a]
++ [TyVar]
spec_tkvs) TcLevel
tc_lvl WantedConstraints
wanted
; (Implication, Type) -> TcM (Implication, Type)
forall (m :: * -> *) a. Monad m => a -> m a
return (Implication
implic, [TyVar] -> Type -> Type
mkInfForAllTys [TyVar]
kvs Type
ty1) }
tcStandaloneKindSig :: LStandaloneKindSig GhcRn -> TcM (Name, Kind)
tcStandaloneKindSig :: LStandaloneKindSig GhcRn -> TcM (Name, Type)
tcStandaloneKindSig (L SrcSpan
_ StandaloneKindSig GhcRn
kisig) = case StandaloneKindSig GhcRn
kisig of
StandaloneKindSig XStandaloneKindSig GhcRn
_ (L SrcSpan
_ IdP GhcRn
name) LHsSigType GhcRn
ksig ->
let ctxt :: UserTypeCtxt
ctxt = Name -> UserTypeCtxt
StandaloneKindSigCtxt Name
IdP GhcRn
name in
UserTypeCtxt
-> LHsKind GhcRn -> TcM (Name, Type) -> TcM (Name, Type)
forall a. UserTypeCtxt -> LHsKind GhcRn -> TcM a -> TcM a
addSigCtxt UserTypeCtxt
ctxt (LHsSigType GhcRn -> LHsKind GhcRn
forall (p :: Pass). LHsSigType (GhcPass p) -> LHsType (GhcPass p)
hsSigType LHsSigType GhcRn
ksig) (TcM (Name, Type) -> TcM (Name, Type))
-> TcM (Name, Type) -> TcM (Name, Type)
forall a b. (a -> b) -> a -> b
$
do { let mode :: TcTyMode
mode = TypeOrKind -> TcTyMode
mkMode TypeOrKind
KindLevel
; Type
kind <- TcTyMode -> LHsSigType GhcRn -> ContextKind -> TcM Type
tc_top_lhs_type TcTyMode
mode LHsSigType GhcRn
ksig (UserTypeCtxt -> ContextKind
expectedKindInCtxt UserTypeCtxt
ctxt)
; UserTypeCtxt -> Type -> TcM ()
checkValidType UserTypeCtxt
ctxt Type
kind
; (Name, Type) -> TcM (Name, Type)
forall (m :: * -> *) a. Monad m => a -> m a
return (Name
IdP GhcRn
name, Type
kind) }
tcTopLHsType :: LHsSigType GhcRn -> ContextKind -> TcM Type
tcTopLHsType :: LHsSigType GhcRn -> ContextKind -> TcM Type
tcTopLHsType LHsSigType GhcRn
hs_ty ContextKind
ctxt_kind
= TcTyMode -> LHsSigType GhcRn -> ContextKind -> TcM Type
tc_top_lhs_type (TypeOrKind -> TcTyMode
mkMode TypeOrKind
TypeLevel) LHsSigType GhcRn
hs_ty ContextKind
ctxt_kind
tc_top_lhs_type :: TcTyMode -> LHsSigType GhcRn -> ContextKind -> TcM Type
tc_top_lhs_type :: TcTyMode -> LHsSigType GhcRn -> ContextKind -> TcM Type
tc_top_lhs_type TcTyMode
mode LHsSigType GhcRn
hs_sig_type ContextKind
ctxt_kind
| HsIB { hsib_ext :: forall pass thing. HsImplicitBndrs pass thing -> XHsIB pass thing
hsib_ext = XHsIB GhcRn (LHsKind GhcRn)
sig_vars, hsib_body :: forall pass thing. HsImplicitBndrs pass thing -> thing
hsib_body = LHsKind GhcRn
hs_ty } <- LHsSigType GhcRn
hs_sig_type
= do { String -> MsgDoc -> TcM ()
traceTc String
"tcTopLHsType {" (LHsKind GhcRn -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr LHsKind GhcRn
hs_ty)
; ([TyVar]
spec_tkvs, Type
ty)
<- TcM ([TyVar], Type) -> TcM ([TyVar], Type)
forall a. TcM a -> TcM a
pushTcLevelM_ (TcM ([TyVar], Type) -> TcM ([TyVar], Type))
-> TcM ([TyVar], Type) -> TcM ([TyVar], Type)
forall a b. (a -> b) -> a -> b
$
TcM ([TyVar], Type) -> TcM ([TyVar], Type)
forall a. TcM a -> TcM a
solveEqualities (TcM ([TyVar], Type) -> TcM ([TyVar], Type))
-> TcM ([TyVar], Type) -> TcM ([TyVar], Type)
forall a b. (a -> b) -> a -> b
$
HsQTvsRn -> TcM Type -> TcM ([TyVar], Type)
forall a. HsQTvsRn -> TcM a -> TcM ([TyVar], a)
bindImplicitTKBndrs_Skol HsQTvsRn
XHsIB GhcRn (LHsKind GhcRn)
sig_vars (TcM Type -> TcM ([TyVar], Type))
-> TcM Type -> TcM ([TyVar], Type)
forall a b. (a -> b) -> a -> b
$
do { Type
kind <- ContextKind -> TcM Type
newExpectedKind ContextKind
ctxt_kind
; TcTyMode -> LHsKind GhcRn -> Type -> TcM Type
tc_lhs_type TcTyMode
mode LHsKind GhcRn
hs_ty Type
kind }
; [TyVar]
spec_tkvs <- [TyVar] -> TcM [TyVar]
zonkAndScopedSort [TyVar]
spec_tkvs
; let ty1 :: Type
ty1 = [TyVar] -> Type -> Type
mkSpecForAllTys [TyVar]
spec_tkvs Type
ty
; [TyVar]
kvs <- Type -> TcM [TyVar]
kindGeneralizeAll Type
ty1
; Type
final_ty <- Type -> TcM Type
zonkTcTypeToType ([TyVar] -> Type -> Type
mkInfForAllTys [TyVar]
kvs Type
ty1)
; String -> MsgDoc -> TcM ()
traceTc String
"End tcTopLHsType }" ([MsgDoc] -> MsgDoc
vcat [LHsKind GhcRn -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr LHsKind GhcRn
hs_ty, Type -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr Type
final_ty])
; Type -> TcM Type
forall (m :: * -> *) a. Monad m => a -> m a
return Type
final_ty}
tcHsDeriv :: LHsSigType GhcRn -> TcM ([TyVar], Class, [Type], [Kind])
tcHsDeriv :: LHsSigType GhcRn -> TcM ([TyVar], Class, [Type], [Type])
tcHsDeriv LHsSigType GhcRn
hs_ty
= do { Type
ty <- TcM Type -> TcM Type
forall a. TcM a -> TcM a
checkNoErrs (TcM Type -> TcM Type) -> TcM Type -> TcM Type
forall a b. (a -> b) -> a -> b
$
LHsSigType GhcRn -> ContextKind -> TcM Type
tcTopLHsType LHsSigType GhcRn
hs_ty ContextKind
AnyKind
; let ([TyVar]
tvs, Type
pred) = Type -> ([TyVar], Type)
splitForAllTys Type
ty
([Scaled Type]
kind_args, Type
_) = Type -> ([Scaled Type], Type)
splitFunTys (HasDebugCallStack => Type -> Type
Type -> Type
tcTypeKind Type
pred)
; case Type -> Maybe (Class, [Type])
getClassPredTys_maybe Type
pred of
Just (Class
cls, [Type]
tys) -> ([TyVar], Class, [Type], [Type])
-> TcM ([TyVar], Class, [Type], [Type])
forall (m :: * -> *) a. Monad m => a -> m a
return ([TyVar]
tvs, Class
cls, [Type]
tys, (Scaled Type -> Type) -> [Scaled Type] -> [Type]
forall a b. (a -> b) -> [a] -> [b]
map Scaled Type -> Type
forall a. Scaled a -> a
scaledThing [Scaled Type]
kind_args)
Maybe (Class, [Type])
Nothing -> MsgDoc -> TcM ([TyVar], Class, [Type], [Type])
forall a. MsgDoc -> TcM a
failWithTc (String -> MsgDoc
text String
"Illegal deriving item" MsgDoc -> MsgDoc -> MsgDoc
<+> MsgDoc -> MsgDoc
quotes (LHsSigType GhcRn -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr LHsSigType GhcRn
hs_ty)) }
tcDerivStrategy ::
Maybe (LDerivStrategy GhcRn)
-> TcM (Maybe (LDerivStrategy GhcTc), [TyVar])
tcDerivStrategy :: Maybe (LDerivStrategy GhcRn)
-> TcM (Maybe (LDerivStrategy GhcTc), [TyVar])
tcDerivStrategy Maybe (LDerivStrategy GhcRn)
mb_lds
= case Maybe (LDerivStrategy GhcRn)
mb_lds of
Maybe (LDerivStrategy GhcRn)
Nothing -> Maybe (LDerivStrategy GhcTc)
-> TcM (Maybe (LDerivStrategy GhcTc), [TyVar])
forall ds. ds -> TcM (ds, [TyVar])
boring_case Maybe (LDerivStrategy GhcTc)
forall a. Maybe a
Nothing
Just (L SrcSpan
loc DerivStrategy GhcRn
ds) ->
SrcSpan
-> TcM (Maybe (LDerivStrategy GhcTc), [TyVar])
-> TcM (Maybe (LDerivStrategy GhcTc), [TyVar])
forall a. SrcSpan -> TcRn a -> TcRn a
setSrcSpan SrcSpan
loc (TcM (Maybe (LDerivStrategy GhcTc), [TyVar])
-> TcM (Maybe (LDerivStrategy GhcTc), [TyVar]))
-> TcM (Maybe (LDerivStrategy GhcTc), [TyVar])
-> TcM (Maybe (LDerivStrategy GhcTc), [TyVar])
forall a b. (a -> b) -> a -> b
$ do
(DerivStrategy GhcTc
ds', [TyVar]
tvs) <- DerivStrategy GhcRn -> TcM (DerivStrategy GhcTc, [TyVar])
tc_deriv_strategy DerivStrategy GhcRn
ds
(Maybe (LDerivStrategy GhcTc), [TyVar])
-> TcM (Maybe (LDerivStrategy GhcTc), [TyVar])
forall (f :: * -> *) a. Applicative f => a -> f a
pure (LDerivStrategy GhcTc -> Maybe (LDerivStrategy GhcTc)
forall a. a -> Maybe a
Just (SrcSpan -> DerivStrategy GhcTc -> LDerivStrategy GhcTc
forall l e. l -> e -> GenLocated l e
L SrcSpan
loc DerivStrategy GhcTc
ds'), [TyVar]
tvs)
where
tc_deriv_strategy :: DerivStrategy GhcRn
-> TcM (DerivStrategy GhcTc, [TyVar])
tc_deriv_strategy :: DerivStrategy GhcRn -> TcM (DerivStrategy GhcTc, [TyVar])
tc_deriv_strategy DerivStrategy GhcRn
StockStrategy = DerivStrategy GhcTc -> TcM (DerivStrategy GhcTc, [TyVar])
forall ds. ds -> TcM (ds, [TyVar])
boring_case DerivStrategy GhcTc
forall pass. DerivStrategy pass
StockStrategy
tc_deriv_strategy DerivStrategy GhcRn
AnyclassStrategy = DerivStrategy GhcTc -> TcM (DerivStrategy GhcTc, [TyVar])
forall ds. ds -> TcM (ds, [TyVar])
boring_case DerivStrategy GhcTc
forall pass. DerivStrategy pass
AnyclassStrategy
tc_deriv_strategy DerivStrategy GhcRn
NewtypeStrategy = DerivStrategy GhcTc -> TcM (DerivStrategy GhcTc, [TyVar])
forall ds. ds -> TcM (ds, [TyVar])
boring_case DerivStrategy GhcTc
forall pass. DerivStrategy pass
NewtypeStrategy
tc_deriv_strategy (ViaStrategy XViaStrategy GhcRn
ty) = do
Type
ty' <- TcM Type -> TcM Type
forall a. TcM a -> TcM a
checkNoErrs (TcM Type -> TcM Type) -> TcM Type -> TcM Type
forall a b. (a -> b) -> a -> b
$ LHsSigType GhcRn -> ContextKind -> TcM Type
tcTopLHsType XViaStrategy GhcRn
LHsSigType GhcRn
ty ContextKind
AnyKind
let ([TyVar]
via_tvs, Type
via_pred) = Type -> ([TyVar], Type)
splitForAllTys Type
ty'
(DerivStrategy GhcTc, [TyVar])
-> TcM (DerivStrategy GhcTc, [TyVar])
forall (f :: * -> *) a. Applicative f => a -> f a
pure (XViaStrategy GhcTc -> DerivStrategy GhcTc
forall pass. XViaStrategy pass -> DerivStrategy pass
ViaStrategy Type
XViaStrategy GhcTc
via_pred, [TyVar]
via_tvs)
boring_case :: ds -> TcM (ds, [TyVar])
boring_case :: forall ds. ds -> TcM (ds, [TyVar])
boring_case ds
ds = (ds, [TyVar]) -> IOEnv (Env TcGblEnv TcLclEnv) (ds, [TyVar])
forall (f :: * -> *) a. Applicative f => a -> f a
pure (ds
ds, [])
tcHsClsInstType :: UserTypeCtxt
-> LHsSigType GhcRn
-> TcM Type
tcHsClsInstType :: UserTypeCtxt -> LHsSigType GhcRn -> TcM Type
tcHsClsInstType UserTypeCtxt
user_ctxt LHsSigType GhcRn
hs_inst_ty
= SrcSpan -> TcM Type -> TcM Type
forall a. SrcSpan -> TcRn a -> TcRn a
setSrcSpan (LHsKind GhcRn -> SrcSpan
forall l e. GenLocated l e -> l
getLoc (LHsSigType GhcRn -> LHsKind GhcRn
forall (p :: Pass). LHsSigType (GhcPass p) -> LHsType (GhcPass p)
hsSigType LHsSigType GhcRn
hs_inst_ty)) (TcM Type -> TcM Type) -> TcM Type -> TcM Type
forall a b. (a -> b) -> a -> b
$
do {
Type
inst_ty <- TcM Type -> TcM Type
forall a. TcM a -> TcM a
checkNoErrs (TcM Type -> TcM Type) -> TcM Type -> TcM Type
forall a b. (a -> b) -> a -> b
$
LHsSigType GhcRn -> ContextKind -> TcM Type
tcTopLHsType LHsSigType GhcRn
hs_inst_ty (Type -> ContextKind
TheKind Type
constraintKind)
; UserTypeCtxt -> LHsSigType GhcRn -> Type -> TcM ()
checkValidInstance UserTypeCtxt
user_ctxt LHsSigType GhcRn
hs_inst_ty Type
inst_ty
; Type -> TcM Type
forall (m :: * -> *) a. Monad m => a -> m a
return Type
inst_ty }
tcHsTypeApp :: LHsWcType GhcRn -> Kind -> TcM Type
tcHsTypeApp :: LHsWcType GhcRn -> Type -> TcM Type
tcHsTypeApp LHsWcType GhcRn
wc_ty Type
kind
| HsWC { hswc_ext :: forall pass thing. HsWildCardBndrs pass thing -> XHsWC pass thing
hswc_ext = XHsWC GhcRn (LHsKind GhcRn)
sig_wcs, hswc_body :: forall pass thing. HsWildCardBndrs pass thing -> thing
hswc_body = LHsKind GhcRn
hs_ty } <- LHsWcType GhcRn
wc_ty
= do { TcTyMode
mode <- TypeOrKind -> HoleMode -> TcM TcTyMode
mkHoleMode TypeOrKind
TypeLevel HoleMode
HM_VTA
; Type
ty <- LHsKind GhcRn -> TcM Type -> TcM Type
forall a. LHsKind GhcRn -> TcM a -> TcM a
addTypeCtxt LHsKind GhcRn
hs_ty (TcM Type -> TcM Type) -> TcM Type -> TcM Type
forall a b. (a -> b) -> a -> b
$
String -> TcM Type -> TcM Type
forall a. String -> TcM a -> TcM a
solveLocalEqualities String
"tcHsTypeApp" (TcM Type -> TcM Type) -> TcM Type -> TcM Type
forall a b. (a -> b) -> a -> b
$
HsQTvsRn -> ([(Name, TyVar)] -> TcM Type) -> TcM Type
forall a. HsQTvsRn -> ([(Name, TyVar)] -> TcM a) -> TcM a
tcNamedWildCardBinders HsQTvsRn
XHsWC GhcRn (LHsKind GhcRn)
sig_wcs (([(Name, TyVar)] -> TcM Type) -> TcM Type)
-> ([(Name, TyVar)] -> TcM Type) -> TcM Type
forall a b. (a -> b) -> a -> b
$ \ [(Name, TyVar)]
_ ->
TcTyMode -> LHsKind GhcRn -> Type -> TcM Type
tc_lhs_type TcTyMode
mode LHsKind GhcRn
hs_ty Type
kind
; Type -> TcM ()
kindGeneralizeNone Type
ty
; Type
ty <- Type -> TcM Type
zonkTcType Type
ty
; UserTypeCtxt -> Type -> TcM ()
checkValidType UserTypeCtxt
TypeAppCtxt Type
ty
; Type -> TcM Type
forall (m :: * -> *) a. Monad m => a -> m a
return Type
ty }
tcFamTyPats :: TyCon
-> HsTyPats GhcRn
-> TcM (TcType, TcKind)
tcFamTyPats :: TyCon -> [LHsTypeArg GhcRn] -> TcM (Type, Type)
tcFamTyPats TyCon
fam_tc [LHsTypeArg GhcRn]
hs_pats
= do { String -> MsgDoc -> TcM ()
traceTc String
"tcFamTyPats {" (MsgDoc -> TcM ()) -> MsgDoc -> TcM ()
forall a b. (a -> b) -> a -> b
$
[MsgDoc] -> MsgDoc
vcat [ TyCon -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr TyCon
fam_tc, String -> MsgDoc
text String
"arity:" MsgDoc -> MsgDoc -> MsgDoc
<+> Arity -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr Arity
fam_arity ]
; TcTyMode
mode <- TypeOrKind -> HoleMode -> TcM TcTyMode
mkHoleMode TypeOrKind
TypeLevel HoleMode
HM_FamPat
; let fun_ty :: Type
fun_ty = TyCon -> [Type] -> Type
mkTyConApp TyCon
fam_tc []
; (Type
fam_app, Type
res_kind) <- TcTyMode
-> LHsKind GhcRn -> Type -> [LHsTypeArg GhcRn] -> TcM (Type, Type)
tcInferTyApps TcTyMode
mode LHsKind GhcRn
lhs_fun Type
fun_ty [LHsTypeArg GhcRn]
hs_pats
; Type
res_kind <- Type -> TcM Type
zonkTcType Type
res_kind
; String -> MsgDoc -> TcM ()
traceTc String
"End tcFamTyPats }" (MsgDoc -> TcM ()) -> MsgDoc -> TcM ()
forall a b. (a -> b) -> a -> b
$
[MsgDoc] -> MsgDoc
vcat [ TyCon -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr TyCon
fam_tc, String -> MsgDoc
text String
"res_kind:" MsgDoc -> MsgDoc -> MsgDoc
<+> Type -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr Type
res_kind ]
; (Type, Type) -> TcM (Type, Type)
forall (m :: * -> *) a. Monad m => a -> m a
return (Type
fam_app, Type
res_kind) }
where
fam_name :: Name
fam_name = TyCon -> Name
tyConName TyCon
fam_tc
fam_arity :: Arity
fam_arity = TyCon -> Arity
tyConArity TyCon
fam_tc
lhs_fun :: LHsKind GhcRn
lhs_fun = HsType GhcRn -> LHsKind GhcRn
forall e. e -> Located e
noLoc (XTyVar GhcRn
-> PromotionFlag -> GenLocated SrcSpan (IdP GhcRn) -> HsType GhcRn
forall pass.
XTyVar pass -> PromotionFlag -> Located (IdP pass) -> HsType pass
HsTyVar NoExtField
XTyVar GhcRn
noExtField PromotionFlag
NotPromoted (Name -> Located Name
forall e. e -> Located e
noLoc Name
fam_name))
tcHsOpenType, tcHsLiftedType,
tcHsOpenTypeNC, tcHsLiftedTypeNC :: LHsType GhcRn -> TcM TcType
tcHsOpenType :: LHsKind GhcRn -> TcM Type
tcHsOpenType LHsKind GhcRn
hs_ty = LHsKind GhcRn -> TcM Type -> TcM Type
forall a. LHsKind GhcRn -> TcM a -> TcM a
addTypeCtxt LHsKind GhcRn
hs_ty (TcM Type -> TcM Type) -> TcM Type -> TcM Type
forall a b. (a -> b) -> a -> b
$ LHsKind GhcRn -> TcM Type
tcHsOpenTypeNC LHsKind GhcRn
hs_ty
tcHsLiftedType :: LHsKind GhcRn -> TcM Type
tcHsLiftedType LHsKind GhcRn
hs_ty = LHsKind GhcRn -> TcM Type -> TcM Type
forall a. LHsKind GhcRn -> TcM a -> TcM a
addTypeCtxt LHsKind GhcRn
hs_ty (TcM Type -> TcM Type) -> TcM Type -> TcM Type
forall a b. (a -> b) -> a -> b
$ LHsKind GhcRn -> TcM Type
tcHsLiftedTypeNC LHsKind GhcRn
hs_ty
tcHsOpenTypeNC :: LHsKind GhcRn -> TcM Type
tcHsOpenTypeNC LHsKind GhcRn
hs_ty = do { Type
ek <- TcM Type
newOpenTypeKind; LHsKind GhcRn -> Type -> TcM Type
tcLHsType LHsKind GhcRn
hs_ty Type
ek }
tcHsLiftedTypeNC :: LHsKind GhcRn -> TcM Type
tcHsLiftedTypeNC LHsKind GhcRn
hs_ty = LHsKind GhcRn -> Type -> TcM Type
tcLHsType LHsKind GhcRn
hs_ty Type
liftedTypeKind
tcCheckLHsType :: LHsType GhcRn -> ContextKind -> TcM TcType
tcCheckLHsType :: LHsKind GhcRn -> ContextKind -> TcM Type
tcCheckLHsType LHsKind GhcRn
hs_ty ContextKind
exp_kind
= LHsKind GhcRn -> TcM Type -> TcM Type
forall a. LHsKind GhcRn -> TcM a -> TcM a
addTypeCtxt LHsKind GhcRn
hs_ty (TcM Type -> TcM Type) -> TcM Type -> TcM Type
forall a b. (a -> b) -> a -> b
$
do { Type
ek <- ContextKind -> TcM Type
newExpectedKind ContextKind
exp_kind
; LHsKind GhcRn -> Type -> TcM Type
tcLHsType LHsKind GhcRn
hs_ty Type
ek }
tcInferLHsType :: LHsType GhcRn -> TcM TcType
tcInferLHsType :: LHsKind GhcRn -> TcM Type
tcInferLHsType LHsKind GhcRn
hs_ty
= do { (Type
ty,Type
_kind) <- LHsKind GhcRn -> TcM (Type, Type)
tcInferLHsTypeKind LHsKind GhcRn
hs_ty
; Type -> TcM Type
forall (m :: * -> *) a. Monad m => a -> m a
return Type
ty }
tcInferLHsTypeKind :: LHsType GhcRn -> TcM (TcType, TcKind)
tcInferLHsTypeKind :: LHsKind GhcRn -> TcM (Type, Type)
tcInferLHsTypeKind lhs_ty :: LHsKind GhcRn
lhs_ty@(L SrcSpan
loc HsType GhcRn
hs_ty)
= LHsKind GhcRn -> TcM (Type, Type) -> TcM (Type, Type)
forall a. LHsKind GhcRn -> TcM a -> TcM a
addTypeCtxt LHsKind GhcRn
lhs_ty (TcM (Type, Type) -> TcM (Type, Type))
-> TcM (Type, Type) -> TcM (Type, Type)
forall a b. (a -> b) -> a -> b
$
SrcSpan -> TcM (Type, Type) -> TcM (Type, Type)
forall a. SrcSpan -> TcRn a -> TcRn a
setSrcSpan SrcSpan
loc (TcM (Type, Type) -> TcM (Type, Type))
-> TcM (Type, Type) -> TcM (Type, Type)
forall a b. (a -> b) -> a -> b
$
do { (Type
res_ty, Type
res_kind) <- TcTyMode -> HsType GhcRn -> TcM (Type, Type)
tc_infer_hs_type (TypeOrKind -> TcTyMode
mkMode TypeOrKind
TypeLevel) HsType GhcRn
hs_ty
; Type -> Type -> TcM (Type, Type)
tcInstInvisibleTyBinders Type
res_ty Type
res_kind }
tcInferLHsTypeUnsaturated :: LHsType GhcRn -> TcM (TcType, TcKind)
tcInferLHsTypeUnsaturated :: LHsKind GhcRn -> TcM (Type, Type)
tcInferLHsTypeUnsaturated LHsKind GhcRn
hs_ty
= LHsKind GhcRn -> TcM (Type, Type) -> TcM (Type, Type)
forall a. LHsKind GhcRn -> TcM a -> TcM a
addTypeCtxt LHsKind GhcRn
hs_ty (TcM (Type, Type) -> TcM (Type, Type))
-> TcM (Type, Type) -> TcM (Type, Type)
forall a b. (a -> b) -> a -> b
$
do { TcTyMode
mode <- TypeOrKind -> HoleMode -> TcM TcTyMode
mkHoleMode TypeOrKind
TypeLevel HoleMode
HM_Sig
; case HsType GhcRn -> Maybe (LHsKind GhcRn, [LHsTypeArg GhcRn])
splitHsAppTys (LHsKind GhcRn -> HsType GhcRn
forall l e. GenLocated l e -> e
unLoc LHsKind GhcRn
hs_ty) of
Just (LHsKind GhcRn
hs_fun_ty, [LHsTypeArg GhcRn]
hs_args)
-> do { (Type
fun_ty, Type
_ki) <- TcTyMode -> LHsKind GhcRn -> TcM (Type, Type)
tcInferTyAppHead TcTyMode
mode LHsKind GhcRn
hs_fun_ty
; TcTyMode
-> LHsKind GhcRn -> Type -> [LHsTypeArg GhcRn] -> TcM (Type, Type)
tcInferTyApps_nosat TcTyMode
mode LHsKind GhcRn
hs_fun_ty Type
fun_ty [LHsTypeArg GhcRn]
hs_args }
Maybe (LHsKind GhcRn, [LHsTypeArg GhcRn])
Nothing -> TcTyMode -> LHsKind GhcRn -> TcM (Type, Type)
tc_infer_lhs_type TcTyMode
mode LHsKind GhcRn
hs_ty }
tcMult :: HsArrow GhcRn -> TcM Mult
tcMult :: HsArrow GhcRn -> TcM Type
tcMult HsArrow GhcRn
hc = TcTyMode -> HsArrow GhcRn -> TcM Type
tc_mult (TypeOrKind -> TcTyMode
mkMode TypeOrKind
TypeLevel) HsArrow GhcRn
hc
data TcTyMode
= TcTyMode { TcTyMode -> TypeOrKind
mode_tyki :: TypeOrKind
, TcTyMode -> Maybe (TcLevel, HoleMode)
mode_holes :: Maybe (TcLevel, HoleMode)
}
data HoleMode = HM_Sig
| HM_FamPat
| HM_VTA
mkMode :: TypeOrKind -> TcTyMode
mkMode :: TypeOrKind -> TcTyMode
mkMode TypeOrKind
tyki = TcTyMode :: TypeOrKind -> Maybe (TcLevel, HoleMode) -> TcTyMode
TcTyMode { mode_tyki :: TypeOrKind
mode_tyki = TypeOrKind
tyki, mode_holes :: Maybe (TcLevel, HoleMode)
mode_holes = Maybe (TcLevel, HoleMode)
forall a. Maybe a
Nothing }
mkHoleMode :: TypeOrKind -> HoleMode -> TcM TcTyMode
mkHoleMode :: TypeOrKind -> HoleMode -> TcM TcTyMode
mkHoleMode TypeOrKind
tyki HoleMode
hm
= do { TcLevel
lvl <- TcM TcLevel
getTcLevel
; TcTyMode -> TcM TcTyMode
forall (m :: * -> *) a. Monad m => a -> m a
return (TcTyMode :: TypeOrKind -> Maybe (TcLevel, HoleMode) -> TcTyMode
TcTyMode { mode_tyki :: TypeOrKind
mode_tyki = TypeOrKind
tyki
, mode_holes :: Maybe (TcLevel, HoleMode)
mode_holes = (TcLevel, HoleMode) -> Maybe (TcLevel, HoleMode)
forall a. a -> Maybe a
Just (TcLevel
lvl,HoleMode
hm) }) }
kindLevel :: TcTyMode -> TcTyMode
kindLevel :: TcTyMode -> TcTyMode
kindLevel TcTyMode
mode = TcTyMode
mode { mode_tyki :: TypeOrKind
mode_tyki = TypeOrKind
KindLevel }
instance Outputable HoleMode where
ppr :: HoleMode -> MsgDoc
ppr HoleMode
HM_Sig = String -> MsgDoc
text String
"HM_Sig"
ppr HoleMode
HM_FamPat = String -> MsgDoc
text String
"HM_FamPat"
ppr HoleMode
HM_VTA = String -> MsgDoc
text String
"HM_VTA"
instance Outputable TcTyMode where
ppr :: TcTyMode -> MsgDoc
ppr (TcTyMode { mode_tyki :: TcTyMode -> TypeOrKind
mode_tyki = TypeOrKind
tyki, mode_holes :: TcTyMode -> Maybe (TcLevel, HoleMode)
mode_holes = Maybe (TcLevel, HoleMode)
hm })
= String -> MsgDoc
text String
"TcTyMode" MsgDoc -> MsgDoc -> MsgDoc
<+> MsgDoc -> MsgDoc
braces ([MsgDoc] -> MsgDoc
sep [ TypeOrKind -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr TypeOrKind
tyki MsgDoc -> MsgDoc -> MsgDoc
<> MsgDoc
comma
, Maybe (TcLevel, HoleMode) -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr Maybe (TcLevel, HoleMode)
hm ])
tc_infer_lhs_type :: TcTyMode -> LHsType GhcRn -> TcM (TcType, TcKind)
tc_infer_lhs_type :: TcTyMode -> LHsKind GhcRn -> TcM (Type, Type)
tc_infer_lhs_type TcTyMode
mode (L SrcSpan
span HsType GhcRn
ty)
= SrcSpan -> TcM (Type, Type) -> TcM (Type, Type)
forall a. SrcSpan -> TcRn a -> TcRn a
setSrcSpan SrcSpan
span (TcM (Type, Type) -> TcM (Type, Type))
-> TcM (Type, Type) -> TcM (Type, Type)
forall a b. (a -> b) -> a -> b
$
TcTyMode -> HsType GhcRn -> TcM (Type, Type)
tc_infer_hs_type TcTyMode
mode HsType GhcRn
ty
tc_infer_hs_type_ek :: HasDebugCallStack => TcTyMode -> HsType GhcRn -> TcKind -> TcM TcType
tc_infer_hs_type_ek :: HasDebugCallStack => TcTyMode -> HsType GhcRn -> Type -> TcM Type
tc_infer_hs_type_ek TcTyMode
mode HsType GhcRn
hs_ty Type
ek
= do { (Type
ty, Type
k) <- TcTyMode -> HsType GhcRn -> TcM (Type, Type)
tc_infer_hs_type TcTyMode
mode HsType GhcRn
hs_ty
; HasDebugCallStack =>
HsType GhcRn -> Type -> Type -> Type -> TcM Type
HsType GhcRn -> Type -> Type -> Type -> TcM Type
checkExpectedKind HsType GhcRn
hs_ty Type
ty Type
k Type
ek }
tc_infer_hs_type :: TcTyMode -> HsType GhcRn -> TcM (TcType, TcKind)
tc_infer_hs_type :: TcTyMode -> HsType GhcRn -> TcM (Type, Type)
tc_infer_hs_type TcTyMode
mode (HsParTy XParTy GhcRn
_ LHsKind GhcRn
t)
= TcTyMode -> LHsKind GhcRn -> TcM (Type, Type)
tc_infer_lhs_type TcTyMode
mode LHsKind GhcRn
t
tc_infer_hs_type TcTyMode
mode HsType GhcRn
ty
| Just (LHsKind GhcRn
hs_fun_ty, [LHsTypeArg GhcRn]
hs_args) <- HsType GhcRn -> Maybe (LHsKind GhcRn, [LHsTypeArg GhcRn])
splitHsAppTys HsType GhcRn
ty
= do { (Type
fun_ty, Type
_ki) <- TcTyMode -> LHsKind GhcRn -> TcM (Type, Type)
tcInferTyAppHead TcTyMode
mode LHsKind GhcRn
hs_fun_ty
; TcTyMode
-> LHsKind GhcRn -> Type -> [LHsTypeArg GhcRn] -> TcM (Type, Type)
tcInferTyApps TcTyMode
mode LHsKind GhcRn
hs_fun_ty Type
fun_ty [LHsTypeArg GhcRn]
hs_args }
tc_infer_hs_type TcTyMode
mode (HsKindSig XKindSig GhcRn
_ LHsKind GhcRn
ty LHsKind GhcRn
sig)
= do { let mode' :: TcTyMode
mode' = TcTyMode
mode { mode_tyki :: TypeOrKind
mode_tyki = TypeOrKind
KindLevel }
; Type
sig' <- TcTyMode -> UserTypeCtxt -> LHsKind GhcRn -> TcM Type
tc_lhs_kind_sig TcTyMode
mode' UserTypeCtxt
KindSigCtxt LHsKind GhcRn
sig
; String -> MsgDoc -> TcM ()
traceTc String
"tc_infer_hs_type:sig" (LHsKind GhcRn -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr LHsKind GhcRn
ty MsgDoc -> MsgDoc -> MsgDoc
$$ Type -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr Type
sig')
; Type
ty' <- TcTyMode -> LHsKind GhcRn -> Type -> TcM Type
tc_lhs_type TcTyMode
mode LHsKind GhcRn
ty Type
sig'
; (Type, Type) -> TcM (Type, Type)
forall (m :: * -> *) a. Monad m => a -> m a
return (Type
ty', Type
sig') }
tc_infer_hs_type TcTyMode
mode (HsSpliceTy XSpliceTy GhcRn
_ (HsSpliced XSpliced GhcRn
_ ThModFinalizers
_ (HsSplicedTy HsType GhcRn
ty)))
= TcTyMode -> HsType GhcRn -> TcM (Type, Type)
tc_infer_hs_type TcTyMode
mode HsType GhcRn
ty
tc_infer_hs_type TcTyMode
mode (HsDocTy XDocTy GhcRn
_ LHsKind GhcRn
ty LHsDocString
_) = TcTyMode -> LHsKind GhcRn -> TcM (Type, Type)
tc_infer_lhs_type TcTyMode
mode LHsKind GhcRn
ty
tc_infer_hs_type TcTyMode
_ (XHsType (NHsCoreTy Type
ty))
= do TcLclEnv
env <- TcRnIf TcGblEnv TcLclEnv TcLclEnv
forall gbl lcl. TcRnIf gbl lcl lcl
getLclEnv
let subst_prs :: [(Unique, TcTyVar)]
subst_prs :: [(Unique, TyVar)]
subst_prs = [ (Name -> Unique
forall a. Uniquable a => a -> Unique
getUnique Name
nm, TyVar
tv)
| ATyVar Name
nm TyVar
tv <- NameEnv TcTyThing -> [TcTyThing]
forall a. NameEnv a -> [a]
nameEnvElts (TcLclEnv -> NameEnv TcTyThing
tcl_env TcLclEnv
env) ]
subst :: TCvSubst
subst = InScopeSet -> TvSubstEnv -> TCvSubst
mkTvSubst
(TyVarSet -> InScopeSet
mkInScopeSet (TyVarSet -> InScopeSet) -> TyVarSet -> InScopeSet
forall a b. (a -> b) -> a -> b
$ [TyVar] -> TyVarSet
mkVarSet ([TyVar] -> TyVarSet) -> [TyVar] -> TyVarSet
forall a b. (a -> b) -> a -> b
$ ((Unique, TyVar) -> TyVar) -> [(Unique, TyVar)] -> [TyVar]
forall a b. (a -> b) -> [a] -> [b]
map (Unique, TyVar) -> TyVar
forall a b. (a, b) -> b
snd [(Unique, TyVar)]
subst_prs)
([(Unique, Type)] -> TvSubstEnv
forall elt key. [(Unique, elt)] -> UniqFM key elt
listToUFM_Directly ([(Unique, Type)] -> TvSubstEnv) -> [(Unique, Type)] -> TvSubstEnv
forall a b. (a -> b) -> a -> b
$ ((Unique, TyVar) -> (Unique, Type))
-> [(Unique, TyVar)] -> [(Unique, Type)]
forall a b. (a -> b) -> [a] -> [b]
map ((TyVar -> Type) -> (Unique, TyVar) -> (Unique, Type)
forall a b c. (a -> b) -> (c, a) -> (c, b)
liftSnd TyVar -> Type
mkTyVarTy) [(Unique, TyVar)]
subst_prs)
ty' :: Type
ty' = HasCallStack => TCvSubst -> Type -> Type
TCvSubst -> Type -> Type
substTy TCvSubst
subst Type
ty
(Type, Type) -> TcM (Type, Type)
forall (m :: * -> *) a. Monad m => a -> m a
return (Type
ty', HasDebugCallStack => Type -> Type
Type -> Type
tcTypeKind Type
ty')
tc_infer_hs_type TcTyMode
_ (HsExplicitListTy XExplicitListTy GhcRn
_ PromotionFlag
_ [LHsKind GhcRn]
tys)
| [LHsKind GhcRn] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [LHsKind GhcRn]
tys
= (Type, Type) -> TcM (Type, Type)
forall (m :: * -> *) a. Monad m => a -> m a
return (TyCon -> Type
mkTyConTy TyCon
promotedNilDataCon,
[TyVar] -> Type -> Type
mkSpecForAllTys [TyVar
alphaTyVar] (Type -> Type) -> Type -> Type
forall a b. (a -> b) -> a -> b
$ Type -> Type
mkListTy Type
alphaTy)
tc_infer_hs_type TcTyMode
mode HsType GhcRn
other_ty
= do { Type
kv <- TcM Type
newMetaKindVar
; Type
ty' <- TcTyMode -> HsType GhcRn -> Type -> TcM Type
tc_hs_type TcTyMode
mode HsType GhcRn
other_ty Type
kv
; (Type, Type) -> TcM (Type, Type)
forall (m :: * -> *) a. Monad m => a -> m a
return (Type
ty', Type
kv) }
tcLHsType :: LHsType GhcRn -> TcKind -> TcM TcType
tcLHsType :: LHsKind GhcRn -> Type -> TcM Type
tcLHsType LHsKind GhcRn
hs_ty Type
exp_kind
= TcTyMode -> LHsKind GhcRn -> Type -> TcM Type
tc_lhs_type (TypeOrKind -> TcTyMode
mkMode TypeOrKind
TypeLevel) LHsKind GhcRn
hs_ty Type
exp_kind
tc_lhs_type :: TcTyMode -> LHsType GhcRn -> TcKind -> TcM TcType
tc_lhs_type :: TcTyMode -> LHsKind GhcRn -> Type -> TcM Type
tc_lhs_type TcTyMode
mode (L SrcSpan
span HsType GhcRn
ty) Type
exp_kind
= SrcSpan -> TcM Type -> TcM Type
forall a. SrcSpan -> TcRn a -> TcRn a
setSrcSpan SrcSpan
span (TcM Type -> TcM Type) -> TcM Type -> TcM Type
forall a b. (a -> b) -> a -> b
$
TcTyMode -> HsType GhcRn -> Type -> TcM Type
tc_hs_type TcTyMode
mode HsType GhcRn
ty Type
exp_kind
tc_hs_type :: TcTyMode -> HsType GhcRn -> TcKind -> TcM TcType
tc_hs_type :: TcTyMode -> HsType GhcRn -> Type -> TcM Type
tc_hs_type TcTyMode
mode (HsParTy XParTy GhcRn
_ LHsKind GhcRn
ty) Type
exp_kind = TcTyMode -> LHsKind GhcRn -> Type -> TcM Type
tc_lhs_type TcTyMode
mode LHsKind GhcRn
ty Type
exp_kind
tc_hs_type TcTyMode
mode (HsDocTy XDocTy GhcRn
_ LHsKind GhcRn
ty LHsDocString
_) Type
exp_kind = TcTyMode -> LHsKind GhcRn -> Type -> TcM Type
tc_lhs_type TcTyMode
mode LHsKind GhcRn
ty Type
exp_kind
tc_hs_type TcTyMode
_ ty :: HsType GhcRn
ty@(HsBangTy XBangTy GhcRn
_ HsSrcBang
bang LHsKind GhcRn
_) Type
_
= do { let bangError :: String -> TcM Type
bangError String
err = MsgDoc -> TcM Type
forall a. MsgDoc -> TcM a
failWith (MsgDoc -> TcM Type) -> MsgDoc -> TcM Type
forall a b. (a -> b) -> a -> b
$
String -> MsgDoc
text String
"Unexpected" MsgDoc -> MsgDoc -> MsgDoc
<+> String -> MsgDoc
text String
err MsgDoc -> MsgDoc -> MsgDoc
<+> String -> MsgDoc
text String
"annotation:" MsgDoc -> MsgDoc -> MsgDoc
<+> HsType GhcRn -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr HsType GhcRn
ty MsgDoc -> MsgDoc -> MsgDoc
$$
String -> MsgDoc
text String
err MsgDoc -> MsgDoc -> MsgDoc
<+> String -> MsgDoc
text String
"annotation cannot appear nested inside a type"
; case HsSrcBang
bang of
HsSrcBang SourceText
_ SrcUnpackedness
SrcUnpack SrcStrictness
_ -> String -> TcM Type
bangError String
"UNPACK"
HsSrcBang SourceText
_ SrcUnpackedness
SrcNoUnpack SrcStrictness
_ -> String -> TcM Type
bangError String
"NOUNPACK"
HsSrcBang SourceText
_ SrcUnpackedness
NoSrcUnpack SrcStrictness
SrcLazy -> String -> TcM Type
bangError String
"laziness"
HsSrcBang SourceText
_ SrcUnpackedness
_ SrcStrictness
_ -> String -> TcM Type
bangError String
"strictness" }
tc_hs_type TcTyMode
_ ty :: HsType GhcRn
ty@(HsRecTy {}) Type
_
= MsgDoc -> TcM Type
forall a. MsgDoc -> TcM a
failWithTc (String -> MsgDoc
text String
"Record syntax is illegal here:" MsgDoc -> MsgDoc -> MsgDoc
<+> HsType GhcRn -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr HsType GhcRn
ty)
tc_hs_type TcTyMode
mode (HsSpliceTy XSpliceTy GhcRn
_ (HsSpliced XSpliced GhcRn
_ ThModFinalizers
mod_finalizers (HsSplicedTy HsType GhcRn
ty)))
Type
exp_kind
= do ThModFinalizers -> TcM ()
addModFinalizersWithLclEnv ThModFinalizers
mod_finalizers
TcTyMode -> HsType GhcRn -> Type -> TcM Type
tc_hs_type TcTyMode
mode HsType GhcRn
ty Type
exp_kind
tc_hs_type TcTyMode
_ ty :: HsType GhcRn
ty@(HsSpliceTy {}) Type
_exp_kind
= MsgDoc -> TcM Type
forall a. MsgDoc -> TcM a
failWithTc (String -> MsgDoc
text String
"Unexpected type splice:" MsgDoc -> MsgDoc -> MsgDoc
<+> HsType GhcRn -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr HsType GhcRn
ty)
tc_hs_type TcTyMode
mode ty :: HsType GhcRn
ty@(HsFunTy XFunTy GhcRn
_ HsArrow GhcRn
mult LHsKind GhcRn
ty1 LHsKind GhcRn
ty2) Type
exp_kind
| TcTyMode -> TypeOrKind
mode_tyki TcTyMode
mode TypeOrKind -> TypeOrKind -> Bool
forall a. Eq a => a -> a -> Bool
== TypeOrKind
KindLevel Bool -> Bool -> Bool
&& Bool -> Bool
not (HsArrow GhcRn -> Bool
isUnrestricted HsArrow GhcRn
mult)
= MsgDoc -> TcM Type
forall a. MsgDoc -> TcM a
failWithTc (String -> MsgDoc
text String
"Linear arrows disallowed in kinds:" MsgDoc -> MsgDoc -> MsgDoc
<+> HsType GhcRn -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr HsType GhcRn
ty)
| Bool
otherwise
= TcTyMode
-> HsArrow GhcRn
-> LHsKind GhcRn
-> LHsKind GhcRn
-> Type
-> TcM Type
tc_fun_type TcTyMode
mode HsArrow GhcRn
mult LHsKind GhcRn
ty1 LHsKind GhcRn
ty2 Type
exp_kind
tc_hs_type TcTyMode
mode (HsOpTy XOpTy GhcRn
_ LHsKind GhcRn
ty1 (L SrcSpan
_ IdP GhcRn
op) LHsKind GhcRn
ty2) Type
exp_kind
| Name
IdP GhcRn
op Name -> Unique -> Bool
forall a. Uniquable a => a -> Unique -> Bool
`hasKey` Unique
funTyConKey
= TcTyMode
-> HsArrow GhcRn
-> LHsKind GhcRn
-> LHsKind GhcRn
-> Type
-> TcM Type
tc_fun_type TcTyMode
mode (IsUnicodeSyntax -> HsArrow GhcRn
forall pass. IsUnicodeSyntax -> HsArrow pass
HsUnrestrictedArrow IsUnicodeSyntax
NormalSyntax) LHsKind GhcRn
ty1 LHsKind GhcRn
ty2 Type
exp_kind
tc_hs_type TcTyMode
mode forall :: HsType GhcRn
forall@(HsForAllTy { hst_tele :: forall pass. HsType pass -> HsForAllTelescope pass
hst_tele = HsForAllTelescope GhcRn
tele, hst_body :: forall pass. HsType pass -> LHsType pass
hst_body = LHsKind GhcRn
ty }) Type
exp_kind
= do { (TcLevel
tclvl, WantedConstraints
wanted, (Either [TcReqTVBinder] [VarBndr TyVar Specificity]
tv_bndrs, Type
ty'))
<- TcM (Either [TcReqTVBinder] [VarBndr TyVar Specificity], Type)
-> TcM
(TcLevel, WantedConstraints,
(Either [TcReqTVBinder] [VarBndr TyVar Specificity], Type))
forall a. TcM a -> TcM (TcLevel, WantedConstraints, a)
pushLevelAndCaptureConstraints (TcM (Either [TcReqTVBinder] [VarBndr TyVar Specificity], Type)
-> TcM
(TcLevel, WantedConstraints,
(Either [TcReqTVBinder] [VarBndr TyVar Specificity], Type)))
-> TcM (Either [TcReqTVBinder] [VarBndr TyVar Specificity], Type)
-> TcM
(TcLevel, WantedConstraints,
(Either [TcReqTVBinder] [VarBndr TyVar Specificity], Type))
forall a b. (a -> b) -> a -> b
$
TcTyMode
-> HsForAllTelescope GhcRn
-> TcM Type
-> TcM (Either [TcReqTVBinder] [VarBndr TyVar Specificity], Type)
forall a.
TcTyMode
-> HsForAllTelescope GhcRn
-> TcM a
-> TcM (Either [TcReqTVBinder] [VarBndr TyVar Specificity], a)
bindExplicitTKTele_Skol_M TcTyMode
mode HsForAllTelescope GhcRn
tele (TcM Type
-> TcM (Either [TcReqTVBinder] [VarBndr TyVar Specificity], Type))
-> TcM Type
-> TcM (Either [TcReqTVBinder] [VarBndr TyVar Specificity], Type)
forall a b. (a -> b) -> a -> b
$
TcTyMode -> LHsKind GhcRn -> Type -> TcM Type
tc_lhs_type TcTyMode
mode LHsKind GhcRn
ty Type
exp_kind
; let skol_info :: SkolemInfo
skol_info = MsgDoc -> MsgDoc -> SkolemInfo
ForAllSkol (HsType GhcRn -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr HsType GhcRn
forall) (MsgDoc -> SkolemInfo) -> MsgDoc -> SkolemInfo
forall a b. (a -> b) -> a -> b
$ [MsgDoc] -> MsgDoc
sep ([MsgDoc] -> MsgDoc) -> [MsgDoc] -> MsgDoc
forall a b. (a -> b) -> a -> b
$ case HsForAllTelescope GhcRn
tele of
HsForAllVis { hsf_vis_bndrs :: forall pass. HsForAllTelescope pass -> [LHsTyVarBndr () pass]
hsf_vis_bndrs = [LHsTyVarBndr () GhcRn]
hs_tvs } ->
(LHsTyVarBndr () GhcRn -> MsgDoc)
-> [LHsTyVarBndr () GhcRn] -> [MsgDoc]
forall a b. (a -> b) -> [a] -> [b]
map LHsTyVarBndr () GhcRn -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr [LHsTyVarBndr () GhcRn]
hs_tvs
HsForAllInvis { hsf_invis_bndrs :: forall pass.
HsForAllTelescope pass -> [LHsTyVarBndr Specificity pass]
hsf_invis_bndrs = [LHsTyVarBndr Specificity GhcRn]
hs_tvs } ->
(LHsTyVarBndr Specificity GhcRn -> MsgDoc)
-> [LHsTyVarBndr Specificity GhcRn] -> [MsgDoc]
forall a b. (a -> b) -> [a] -> [b]
map LHsTyVarBndr Specificity GhcRn -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr [LHsTyVarBndr Specificity GhcRn]
hs_tvs
tv_bndrs' :: [TcTyVarBinder]
tv_bndrs' = Either [TcReqTVBinder] [VarBndr TyVar Specificity]
-> [TcTyVarBinder]
construct_bndrs Either [TcReqTVBinder] [VarBndr TyVar Specificity]
tv_bndrs
skol_tvs :: [TyVar]
skol_tvs = [TcTyVarBinder] -> [TyVar]
forall tv argf. [VarBndr tv argf] -> [tv]
binderVars [TcTyVarBinder]
tv_bndrs'
; Implication
implic <- SkolemInfo
-> [TyVar] -> TcLevel -> WantedConstraints -> TcM Implication
buildTvImplication SkolemInfo
skol_info [TyVar]
skol_tvs TcLevel
tclvl WantedConstraints
wanted
; Implication -> TcM ()
emitImplication Implication
implic
; Type -> TcM Type
forall (m :: * -> *) a. Monad m => a -> m a
return ([TcTyVarBinder] -> Type -> Type
mkForAllTys [TcTyVarBinder]
tv_bndrs' Type
ty') }
where
construct_bndrs :: Either [TcReqTVBinder] [TcInvisTVBinder]
-> [TcTyVarBinder]
construct_bndrs :: Either [TcReqTVBinder] [VarBndr TyVar Specificity]
-> [TcTyVarBinder]
construct_bndrs (Left [TcReqTVBinder]
req_tv_bndrs) =
(TcReqTVBinder -> TcTyVarBinder)
-> [TcReqTVBinder] -> [TcTyVarBinder]
forall a b. (a -> b) -> [a] -> [b]
map (ArgFlag -> TyVar -> TcTyVarBinder
forall vis. vis -> TyVar -> VarBndr TyVar vis
mkTyVarBinder ArgFlag
Required (TyVar -> TcTyVarBinder)
-> (TcReqTVBinder -> TyVar) -> TcReqTVBinder -> TcTyVarBinder
forall b c a. (b -> c) -> (a -> b) -> a -> c
. TcReqTVBinder -> TyVar
forall tv argf. VarBndr tv argf -> tv
binderVar) [TcReqTVBinder]
req_tv_bndrs
construct_bndrs (Right [VarBndr TyVar Specificity]
inv_tv_bndrs) =
(VarBndr TyVar Specificity -> TcTyVarBinder)
-> [VarBndr TyVar Specificity] -> [TcTyVarBinder]
forall a b. (a -> b) -> [a] -> [b]
map VarBndr TyVar Specificity -> TcTyVarBinder
forall a. VarBndr a Specificity -> VarBndr a ArgFlag
tyVarSpecToBinder [VarBndr TyVar Specificity]
inv_tv_bndrs
tc_hs_type TcTyMode
mode (HsQualTy { hst_ctxt :: forall pass. HsType pass -> LHsContext pass
hst_ctxt = LHsContext GhcRn
ctxt, hst_body :: forall pass. HsType pass -> LHsType pass
hst_body = LHsKind GhcRn
rn_ty }) Type
exp_kind
| [LHsKind GhcRn] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null (LHsContext GhcRn -> [LHsKind GhcRn]
forall l e. GenLocated l e -> e
unLoc LHsContext GhcRn
ctxt)
= TcTyMode -> LHsKind GhcRn -> Type -> TcM Type
tc_lhs_type TcTyMode
mode LHsKind GhcRn
rn_ty Type
exp_kind
| Type -> Bool
tcIsConstraintKind Type
exp_kind
= do { [Type]
ctxt' <- TcTyMode -> LHsContext GhcRn -> TcM [Type]
tc_hs_context TcTyMode
mode LHsContext GhcRn
ctxt
; Type
ty' <- TcTyMode -> LHsKind GhcRn -> Type -> TcM Type
tc_lhs_type TcTyMode
mode LHsKind GhcRn
rn_ty Type
constraintKind
; Type -> TcM Type
forall (m :: * -> *) a. Monad m => a -> m a
return ([Type] -> Type -> Type
mkPhiTy [Type]
ctxt' Type
ty') }
| Bool
otherwise
= do { [Type]
ctxt' <- TcTyMode -> LHsContext GhcRn -> TcM [Type]
tc_hs_context TcTyMode
mode LHsContext GhcRn
ctxt
; Type
ek <- TcM Type
newOpenTypeKind
; Type
ty' <- TcTyMode -> LHsKind GhcRn -> Type -> TcM Type
tc_lhs_type TcTyMode
mode LHsKind GhcRn
rn_ty Type
ek
; HasDebugCallStack =>
HsType GhcRn -> Type -> Type -> Type -> TcM Type
HsType GhcRn -> Type -> Type -> Type -> TcM Type
checkExpectedKind (LHsKind GhcRn -> HsType GhcRn
forall l e. GenLocated l e -> e
unLoc LHsKind GhcRn
rn_ty) ([Type] -> Type -> Type
mkPhiTy [Type]
ctxt' Type
ty')
Type
liftedTypeKind Type
exp_kind }
tc_hs_type TcTyMode
mode rn_ty :: HsType GhcRn
rn_ty@(HsListTy XListTy GhcRn
_ LHsKind GhcRn
elt_ty) Type
exp_kind
= do { Type
tau_ty <- TcTyMode -> LHsKind GhcRn -> Type -> TcM Type
tc_lhs_type TcTyMode
mode LHsKind GhcRn
elt_ty Type
liftedTypeKind
; TyCon -> TcM ()
checkWiredInTyCon TyCon
listTyCon
; HasDebugCallStack =>
HsType GhcRn -> Type -> Type -> Type -> TcM Type
HsType GhcRn -> Type -> Type -> Type -> TcM Type
checkExpectedKind HsType GhcRn
rn_ty (Type -> Type
mkListTy Type
tau_ty) Type
liftedTypeKind Type
exp_kind }
tc_hs_type TcTyMode
mode rn_ty :: HsType GhcRn
rn_ty@(HsTupleTy XTupleTy GhcRn
_ HsTupleSort
HsBoxedOrConstraintTuple [LHsKind GhcRn]
hs_tys) Type
exp_kind
| Just TupleSort
tup_sort <- Type -> Maybe TupleSort
tupKindSort_maybe Type
exp_kind
= String -> MsgDoc -> TcM ()
traceTc String
"tc_hs_type tuple" ([LHsKind GhcRn] -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr [LHsKind GhcRn]
hs_tys) TcM () -> TcM Type -> TcM Type
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>>
HsType GhcRn
-> TcTyMode -> TupleSort -> [LHsKind GhcRn] -> Type -> TcM Type
tc_tuple HsType GhcRn
rn_ty TcTyMode
mode TupleSort
tup_sort [LHsKind GhcRn]
hs_tys Type
exp_kind
| Bool
otherwise
= do { String -> MsgDoc -> TcM ()
traceTc String
"tc_hs_type tuple 2" ([LHsKind GhcRn] -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr [LHsKind GhcRn]
hs_tys)
; ([Type]
tys, [Type]
kinds) <- (LHsKind GhcRn -> TcM (Type, Type))
-> [LHsKind GhcRn]
-> IOEnv (Env TcGblEnv TcLclEnv) ([Type], [Type])
forall (m :: * -> *) a b c.
Applicative m =>
(a -> m (b, c)) -> [a] -> m ([b], [c])
mapAndUnzipM (TcTyMode -> LHsKind GhcRn -> TcM (Type, Type)
tc_infer_lhs_type TcTyMode
mode) [LHsKind GhcRn]
hs_tys
; [Type]
kinds <- (Type -> TcM Type) -> [Type] -> TcM [Type]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM Type -> TcM Type
zonkTcType [Type]
kinds
; let (Type
arg_kind, TupleSort
tup_sort)
= case [ (Type
k,TupleSort
s) | Type
k <- [Type]
kinds
, Just TupleSort
s <- [Type -> Maybe TupleSort
tupKindSort_maybe Type
k] ] of
((Type
k,TupleSort
s) : [(Type, TupleSort)]
_) -> (Type
k,TupleSort
s)
[] -> (Type
liftedTypeKind, TupleSort
BoxedTuple)
; [Type]
tys' <- [TcM Type] -> TcM [Type]
forall (t :: * -> *) (m :: * -> *) a.
(Traversable t, Monad m) =>
t (m a) -> m (t a)
sequence [ SrcSpan -> TcM Type -> TcM Type
forall a. SrcSpan -> TcRn a -> TcRn a
setSrcSpan SrcSpan
loc (TcM Type -> TcM Type) -> TcM Type -> TcM Type
forall a b. (a -> b) -> a -> b
$
HasDebugCallStack =>
HsType GhcRn -> Type -> Type -> Type -> TcM Type
HsType GhcRn -> Type -> Type -> Type -> TcM Type
checkExpectedKind HsType GhcRn
hs_ty Type
ty Type
kind Type
arg_kind
| ((L SrcSpan
loc HsType GhcRn
hs_ty),Type
ty,Type
kind) <- [LHsKind GhcRn]
-> [Type] -> [Type] -> [(LHsKind GhcRn, Type, Type)]
forall a b c. [a] -> [b] -> [c] -> [(a, b, c)]
zip3 [LHsKind GhcRn]
hs_tys [Type]
tys [Type]
kinds ]
; HsType GhcRn -> TupleSort -> [Type] -> [Type] -> Type -> TcM Type
finish_tuple HsType GhcRn
rn_ty TupleSort
tup_sort [Type]
tys' ((Type -> Type) -> [Type] -> [Type]
forall a b. (a -> b) -> [a] -> [b]
map (Type -> Type -> Type
forall a b. a -> b -> a
const Type
arg_kind) [Type]
tys') Type
exp_kind }
tc_hs_type TcTyMode
mode rn_ty :: HsType GhcRn
rn_ty@(HsTupleTy XTupleTy GhcRn
_ HsTupleSort
hs_tup_sort [LHsKind GhcRn]
tys) Type
exp_kind
= HsType GhcRn
-> TcTyMode -> TupleSort -> [LHsKind GhcRn] -> Type -> TcM Type
tc_tuple HsType GhcRn
rn_ty TcTyMode
mode TupleSort
tup_sort [LHsKind GhcRn]
tys Type
exp_kind
where
tup_sort :: TupleSort
tup_sort = case HsTupleSort
hs_tup_sort of
HsTupleSort
HsUnboxedTuple -> TupleSort
UnboxedTuple
HsTupleSort
HsBoxedTuple -> TupleSort
BoxedTuple
HsTupleSort
HsConstraintTuple -> TupleSort
ConstraintTuple
HsTupleSort
_ -> String -> TupleSort
forall a. String -> a
panic String
"tc_hs_type HsTupleTy"
tc_hs_type TcTyMode
mode rn_ty :: HsType GhcRn
rn_ty@(HsSumTy XSumTy GhcRn
_ [LHsKind GhcRn]
hs_tys) Type
exp_kind
= do { let arity :: Arity
arity = [LHsKind GhcRn] -> Arity
forall (t :: * -> *) a. Foldable t => t a -> Arity
length [LHsKind GhcRn]
hs_tys
; [Type]
arg_kinds <- (LHsKind GhcRn -> TcM Type) -> [LHsKind GhcRn] -> TcM [Type]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM (\LHsKind GhcRn
_ -> TcM Type
newOpenTypeKind) [LHsKind GhcRn]
hs_tys
; [Type]
tau_tys <- (LHsKind GhcRn -> Type -> TcM Type)
-> [LHsKind GhcRn] -> [Type] -> TcM [Type]
forall (m :: * -> *) a b c.
Applicative m =>
(a -> b -> m c) -> [a] -> [b] -> m [c]
zipWithM (TcTyMode -> LHsKind GhcRn -> Type -> TcM Type
tc_lhs_type TcTyMode
mode) [LHsKind GhcRn]
hs_tys [Type]
arg_kinds
; let arg_reps :: [Type]
arg_reps = (Type -> Type) -> [Type] -> [Type]
forall a b. (a -> b) -> [a] -> [b]
map HasDebugCallStack => Type -> Type
Type -> Type
kindRep [Type]
arg_kinds
arg_tys :: [Type]
arg_tys = [Type]
arg_reps [Type] -> [Type] -> [Type]
forall a. [a] -> [a] -> [a]
++ [Type]
tau_tys
sum_ty :: Type
sum_ty = TyCon -> [Type] -> Type
mkTyConApp (Arity -> TyCon
sumTyCon Arity
arity) [Type]
arg_tys
sum_kind :: Type
sum_kind = [Type] -> Type
unboxedSumKind [Type]
arg_reps
; HasDebugCallStack =>
HsType GhcRn -> Type -> Type -> Type -> TcM Type
HsType GhcRn -> Type -> Type -> Type -> TcM Type
checkExpectedKind HsType GhcRn
rn_ty Type
sum_ty Type
sum_kind Type
exp_kind
}
tc_hs_type TcTyMode
mode rn_ty :: HsType GhcRn
rn_ty@(HsExplicitListTy XExplicitListTy GhcRn
_ PromotionFlag
_ [LHsKind GhcRn]
tys) Type
exp_kind
= do { [(Type, Type)]
tks <- (LHsKind GhcRn -> TcM (Type, Type))
-> [LHsKind GhcRn] -> IOEnv (Env TcGblEnv TcLclEnv) [(Type, Type)]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM (TcTyMode -> LHsKind GhcRn -> TcM (Type, Type)
tc_infer_lhs_type TcTyMode
mode) [LHsKind GhcRn]
tys
; ([Type]
taus', Type
kind) <- [LHsKind GhcRn] -> [(Type, Type)] -> TcM ([Type], Type)
unifyKinds [LHsKind GhcRn]
tys [(Type, Type)]
tks
; let ty :: Type
ty = ((Type -> Type -> Type) -> Type -> [Type] -> Type
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr (Type -> Type -> Type -> Type
mk_cons Type
kind) (Type -> Type
mk_nil Type
kind) [Type]
taus')
; HasDebugCallStack =>
HsType GhcRn -> Type -> Type -> Type -> TcM Type
HsType GhcRn -> Type -> Type -> Type -> TcM Type
checkExpectedKind HsType GhcRn
rn_ty Type
ty (Type -> Type
mkListTy Type
kind) Type
exp_kind }
where
mk_cons :: Type -> Type -> Type -> Type
mk_cons Type
k Type
a Type
b = TyCon -> [Type] -> Type
mkTyConApp (DataCon -> TyCon
promoteDataCon DataCon
consDataCon) [Type
k, Type
a, Type
b]
mk_nil :: Type -> Type
mk_nil Type
k = TyCon -> [Type] -> Type
mkTyConApp (DataCon -> TyCon
promoteDataCon DataCon
nilDataCon) [Type
k]
tc_hs_type TcTyMode
mode rn_ty :: HsType GhcRn
rn_ty@(HsExplicitTupleTy XExplicitTupleTy GhcRn
_ [LHsKind GhcRn]
tys) Type
exp_kind
= do { [Type]
ks <- Arity -> TcM Type -> TcM [Type]
forall (m :: * -> *) a. Applicative m => Arity -> m a -> m [a]
replicateM Arity
arity TcM Type
newMetaKindVar
; [Type]
taus <- (LHsKind GhcRn -> Type -> TcM Type)
-> [LHsKind GhcRn] -> [Type] -> TcM [Type]
forall (m :: * -> *) a b c.
Applicative m =>
(a -> b -> m c) -> [a] -> [b] -> m [c]
zipWithM (TcTyMode -> LHsKind GhcRn -> Type -> TcM Type
tc_lhs_type TcTyMode
mode) [LHsKind GhcRn]
tys [Type]
ks
; let kind_con :: TyCon
kind_con = Boxity -> Arity -> TyCon
tupleTyCon Boxity
Boxed Arity
arity
ty_con :: TyCon
ty_con = Boxity -> Arity -> TyCon
promotedTupleDataCon Boxity
Boxed Arity
arity
tup_k :: Type
tup_k = TyCon -> [Type] -> Type
mkTyConApp TyCon
kind_con [Type]
ks
; HasDebugCallStack =>
HsType GhcRn -> Type -> Type -> Type -> TcM Type
HsType GhcRn -> Type -> Type -> Type -> TcM Type
checkExpectedKind HsType GhcRn
rn_ty (TyCon -> [Type] -> Type
mkTyConApp TyCon
ty_con ([Type]
ks [Type] -> [Type] -> [Type]
forall a. [a] -> [a] -> [a]
++ [Type]
taus)) Type
tup_k Type
exp_kind }
where
arity :: Arity
arity = [LHsKind GhcRn] -> Arity
forall (t :: * -> *) a. Foldable t => t a -> Arity
length [LHsKind GhcRn]
tys
tc_hs_type TcTyMode
mode rn_ty :: HsType GhcRn
rn_ty@(HsIParamTy XIParamTy GhcRn
_ (L SrcSpan
_ HsIPName
n) LHsKind GhcRn
ty) Type
exp_kind
= do { MASSERT( isTypeLevel (mode_tyki mode) )
; Type
ty' <- TcTyMode -> LHsKind GhcRn -> Type -> TcM Type
tc_lhs_type TcTyMode
mode LHsKind GhcRn
ty Type
liftedTypeKind
; let n' :: Type
n' = FastString -> Type
mkStrLitTy (FastString -> Type) -> FastString -> Type
forall a b. (a -> b) -> a -> b
$ HsIPName -> FastString
hsIPNameFS HsIPName
n
; Class
ipClass <- Name -> TcM Class
tcLookupClass Name
ipClassName
; HasDebugCallStack =>
HsType GhcRn -> Type -> Type -> Type -> TcM Type
HsType GhcRn -> Type -> Type -> Type -> TcM Type
checkExpectedKind HsType GhcRn
rn_ty (Class -> [Type] -> Type
mkClassPred Class
ipClass [Type
n',Type
ty'])
Type
constraintKind Type
exp_kind }
tc_hs_type TcTyMode
_ rn_ty :: HsType GhcRn
rn_ty@(HsStarTy XStarTy GhcRn
_ Bool
_) Type
exp_kind
= HasDebugCallStack =>
HsType GhcRn -> Type -> Type -> Type -> TcM Type
HsType GhcRn -> Type -> Type -> Type -> TcM Type
checkExpectedKind HsType GhcRn
rn_ty Type
liftedTypeKind Type
liftedTypeKind Type
exp_kind
tc_hs_type TcTyMode
_ rn_ty :: HsType GhcRn
rn_ty@(HsTyLit XTyLit GhcRn
_ (HsNumTy SourceText
_ Integer
n)) Type
exp_kind
= do { TyCon -> TcM ()
checkWiredInTyCon TyCon
typeNatKindCon
; HasDebugCallStack =>
HsType GhcRn -> Type -> Type -> Type -> TcM Type
HsType GhcRn -> Type -> Type -> Type -> TcM Type
checkExpectedKind HsType GhcRn
rn_ty (Integer -> Type
mkNumLitTy Integer
n) Type
typeNatKind Type
exp_kind }
tc_hs_type TcTyMode
_ rn_ty :: HsType GhcRn
rn_ty@(HsTyLit XTyLit GhcRn
_ (HsStrTy SourceText
_ FastString
s)) Type
exp_kind
= do { TyCon -> TcM ()
checkWiredInTyCon TyCon
typeSymbolKindCon
; HasDebugCallStack =>
HsType GhcRn -> Type -> Type -> Type -> TcM Type
HsType GhcRn -> Type -> Type -> Type -> TcM Type
checkExpectedKind HsType GhcRn
rn_ty (FastString -> Type
mkStrLitTy FastString
s) Type
typeSymbolKind Type
exp_kind }
tc_hs_type TcTyMode
mode ty :: HsType GhcRn
ty@(HsTyVar {}) Type
ek = HasDebugCallStack => TcTyMode -> HsType GhcRn -> Type -> TcM Type
TcTyMode -> HsType GhcRn -> Type -> TcM Type
tc_infer_hs_type_ek TcTyMode
mode HsType GhcRn
ty Type
ek
tc_hs_type TcTyMode
mode ty :: HsType GhcRn
ty@(HsAppTy {}) Type
ek = HasDebugCallStack => TcTyMode -> HsType GhcRn -> Type -> TcM Type
TcTyMode -> HsType GhcRn -> Type -> TcM Type
tc_infer_hs_type_ek TcTyMode
mode HsType GhcRn
ty Type
ek
tc_hs_type TcTyMode
mode ty :: HsType GhcRn
ty@(HsAppKindTy{}) Type
ek = HasDebugCallStack => TcTyMode -> HsType GhcRn -> Type -> TcM Type
TcTyMode -> HsType GhcRn -> Type -> TcM Type
tc_infer_hs_type_ek TcTyMode
mode HsType GhcRn
ty Type
ek
tc_hs_type TcTyMode
mode ty :: HsType GhcRn
ty@(HsOpTy {}) Type
ek = HasDebugCallStack => TcTyMode -> HsType GhcRn -> Type -> TcM Type
TcTyMode -> HsType GhcRn -> Type -> TcM Type
tc_infer_hs_type_ek TcTyMode
mode HsType GhcRn
ty Type
ek
tc_hs_type TcTyMode
mode ty :: HsType GhcRn
ty@(HsKindSig {}) Type
ek = HasDebugCallStack => TcTyMode -> HsType GhcRn -> Type -> TcM Type
TcTyMode -> HsType GhcRn -> Type -> TcM Type
tc_infer_hs_type_ek TcTyMode
mode HsType GhcRn
ty Type
ek
tc_hs_type TcTyMode
mode ty :: HsType GhcRn
ty@(XHsType (NHsCoreTy{})) Type
ek = HasDebugCallStack => TcTyMode -> HsType GhcRn -> Type -> TcM Type
TcTyMode -> HsType GhcRn -> Type -> TcM Type
tc_infer_hs_type_ek TcTyMode
mode HsType GhcRn
ty Type
ek
tc_hs_type TcTyMode
mode ty :: HsType GhcRn
ty@(HsWildCardTy XWildCardTy GhcRn
_) Type
ek = TcTyMode -> HsType GhcRn -> Type -> TcM Type
tcAnonWildCardOcc TcTyMode
mode HsType GhcRn
ty Type
ek
tc_mult :: TcTyMode -> HsArrow GhcRn -> TcM Mult
tc_mult :: TcTyMode -> HsArrow GhcRn -> TcM Type
tc_mult TcTyMode
mode HsArrow GhcRn
ty = TcTyMode -> LHsKind GhcRn -> Type -> TcM Type
tc_lhs_type TcTyMode
mode (HsArrow GhcRn -> LHsKind GhcRn
arrowToHsType HsArrow GhcRn
ty) Type
multiplicityTy
tc_fun_type :: TcTyMode -> HsArrow GhcRn -> LHsType GhcRn -> LHsType GhcRn -> TcKind
-> TcM TcType
tc_fun_type :: TcTyMode
-> HsArrow GhcRn
-> LHsKind GhcRn
-> LHsKind GhcRn
-> Type
-> TcM Type
tc_fun_type TcTyMode
mode HsArrow GhcRn
mult LHsKind GhcRn
ty1 LHsKind GhcRn
ty2 Type
exp_kind = case TcTyMode -> TypeOrKind
mode_tyki TcTyMode
mode of
TypeOrKind
TypeLevel ->
do { Type
arg_k <- TcM Type
newOpenTypeKind
; Type
res_k <- TcM Type
newOpenTypeKind
; Type
ty1' <- TcTyMode -> LHsKind GhcRn -> Type -> TcM Type
tc_lhs_type TcTyMode
mode LHsKind GhcRn
ty1 Type
arg_k
; Type
ty2' <- TcTyMode -> LHsKind GhcRn -> Type -> TcM Type
tc_lhs_type TcTyMode
mode LHsKind GhcRn
ty2 Type
res_k
; Type
mult' <- TcTyMode -> HsArrow GhcRn -> TcM Type
tc_mult TcTyMode
mode HsArrow GhcRn
mult
; HasDebugCallStack =>
HsType GhcRn -> Type -> Type -> Type -> TcM Type
HsType GhcRn -> Type -> Type -> Type -> TcM Type
checkExpectedKind (XFunTy GhcRn
-> HsArrow GhcRn -> LHsKind GhcRn -> LHsKind GhcRn -> HsType GhcRn
forall pass.
XFunTy pass
-> HsArrow pass -> LHsType pass -> LHsType pass -> HsType pass
HsFunTy NoExtField
XFunTy GhcRn
noExtField HsArrow GhcRn
mult LHsKind GhcRn
ty1 LHsKind GhcRn
ty2) (Type -> Type -> Type -> Type
mkVisFunTy Type
mult' Type
ty1' Type
ty2')
Type
liftedTypeKind Type
exp_kind }
TypeOrKind
KindLevel ->
do { Type
ty1' <- TcTyMode -> LHsKind GhcRn -> Type -> TcM Type
tc_lhs_type TcTyMode
mode LHsKind GhcRn
ty1 Type
liftedTypeKind
; Type
ty2' <- TcTyMode -> LHsKind GhcRn -> Type -> TcM Type
tc_lhs_type TcTyMode
mode LHsKind GhcRn
ty2 Type
liftedTypeKind
; Type
mult' <- TcTyMode -> HsArrow GhcRn -> TcM Type
tc_mult TcTyMode
mode HsArrow GhcRn
mult
; HasDebugCallStack =>
HsType GhcRn -> Type -> Type -> Type -> TcM Type
HsType GhcRn -> Type -> Type -> Type -> TcM Type
checkExpectedKind (XFunTy GhcRn
-> HsArrow GhcRn -> LHsKind GhcRn -> LHsKind GhcRn -> HsType GhcRn
forall pass.
XFunTy pass
-> HsArrow pass -> LHsType pass -> LHsType pass -> HsType pass
HsFunTy NoExtField
XFunTy GhcRn
noExtField HsArrow GhcRn
mult LHsKind GhcRn
ty1 LHsKind GhcRn
ty2) (Type -> Type -> Type -> Type
mkVisFunTy Type
mult' Type
ty1' Type
ty2')
Type
liftedTypeKind Type
exp_kind }
tupKindSort_maybe :: TcKind -> Maybe TupleSort
tupKindSort_maybe :: Type -> Maybe TupleSort
tupKindSort_maybe Type
k
| Just (Type
k', Coercion
_) <- Type -> Maybe (Type, Coercion)
splitCastTy_maybe Type
k = Type -> Maybe TupleSort
tupKindSort_maybe Type
k'
| Just Type
k' <- Type -> Maybe Type
tcView Type
k = Type -> Maybe TupleSort
tupKindSort_maybe Type
k'
| Type -> Bool
tcIsConstraintKind Type
k = TupleSort -> Maybe TupleSort
forall a. a -> Maybe a
Just TupleSort
ConstraintTuple
| Type -> Bool
tcIsLiftedTypeKind Type
k = TupleSort -> Maybe TupleSort
forall a. a -> Maybe a
Just TupleSort
BoxedTuple
| Bool
otherwise = Maybe TupleSort
forall a. Maybe a
Nothing
tc_tuple :: HsType GhcRn -> TcTyMode -> TupleSort -> [LHsType GhcRn] -> TcKind -> TcM TcType
tc_tuple :: HsType GhcRn
-> TcTyMode -> TupleSort -> [LHsKind GhcRn] -> Type -> TcM Type
tc_tuple HsType GhcRn
rn_ty TcTyMode
mode TupleSort
tup_sort [LHsKind GhcRn]
tys Type
exp_kind
= do { [Type]
arg_kinds <- case TupleSort
tup_sort of
TupleSort
BoxedTuple -> [Type] -> TcM [Type]
forall (m :: * -> *) a. Monad m => a -> m a
return (Arity -> Type -> [Type]
forall a. Arity -> a -> [a]
replicate Arity
arity Type
liftedTypeKind)
TupleSort
UnboxedTuple -> Arity -> TcM Type -> TcM [Type]
forall (m :: * -> *) a. Applicative m => Arity -> m a -> m [a]
replicateM Arity
arity TcM Type
newOpenTypeKind
TupleSort
ConstraintTuple -> [Type] -> TcM [Type]
forall (m :: * -> *) a. Monad m => a -> m a
return (Arity -> Type -> [Type]
forall a. Arity -> a -> [a]
replicate Arity
arity Type
constraintKind)
; [Type]
tau_tys <- (LHsKind GhcRn -> Type -> TcM Type)
-> [LHsKind GhcRn] -> [Type] -> TcM [Type]
forall (m :: * -> *) a b c.
Applicative m =>
(a -> b -> m c) -> [a] -> [b] -> m [c]
zipWithM (TcTyMode -> LHsKind GhcRn -> Type -> TcM Type
tc_lhs_type TcTyMode
mode) [LHsKind GhcRn]
tys [Type]
arg_kinds
; HsType GhcRn -> TupleSort -> [Type] -> [Type] -> Type -> TcM Type
finish_tuple HsType GhcRn
rn_ty TupleSort
tup_sort [Type]
tau_tys [Type]
arg_kinds Type
exp_kind }
where
arity :: Arity
arity = [LHsKind GhcRn] -> Arity
forall (t :: * -> *) a. Foldable t => t a -> Arity
length [LHsKind GhcRn]
tys
finish_tuple :: HsType GhcRn
-> TupleSort
-> [TcType]
-> [TcKind]
-> TcKind
-> TcM TcType
finish_tuple :: HsType GhcRn -> TupleSort -> [Type] -> [Type] -> Type -> TcM Type
finish_tuple HsType GhcRn
rn_ty TupleSort
tup_sort [Type]
tau_tys [Type]
tau_kinds Type
exp_kind = do
String -> MsgDoc -> TcM ()
traceTc String
"finish_tuple" (TupleSort -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr TupleSort
tup_sort MsgDoc -> MsgDoc -> MsgDoc
$$ [Type] -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr [Type]
tau_kinds MsgDoc -> MsgDoc -> MsgDoc
$$ Type -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr Type
exp_kind)
case TupleSort
tup_sort of
TupleSort
ConstraintTuple
| [Type
tau_ty] <- [Type]
tau_tys
-> Type -> Type -> TcM Type
check_expected_kind Type
tau_ty Type
constraintKind
| Arity
arity Arity -> Arity -> Bool
forall a. Ord a => a -> a -> Bool
> Arity
mAX_CTUPLE_SIZE
-> MsgDoc -> TcM Type
forall a. MsgDoc -> TcM a
failWith (Arity -> MsgDoc
bigConstraintTuple Arity
arity)
| Bool
otherwise
-> do TyCon
tycon <- Name -> TcM TyCon
tcLookupTyCon (Arity -> Name
cTupleTyConName Arity
arity)
Type -> Type -> TcM Type
check_expected_kind (TyCon -> [Type] -> Type
mkTyConApp TyCon
tycon [Type]
tau_tys) Type
constraintKind
TupleSort
BoxedTuple -> do
let tycon :: TyCon
tycon = Boxity -> Arity -> TyCon
tupleTyCon Boxity
Boxed Arity
arity
TyCon -> TcM ()
checkWiredInTyCon TyCon
tycon
Type -> Type -> TcM Type
check_expected_kind (TyCon -> [Type] -> Type
mkTyConApp TyCon
tycon [Type]
tau_tys) Type
liftedTypeKind
TupleSort
UnboxedTuple ->
let tycon :: TyCon
tycon = Boxity -> Arity -> TyCon
tupleTyCon Boxity
Unboxed Arity
arity
tau_reps :: [Type]
tau_reps = (Type -> Type) -> [Type] -> [Type]
forall a b. (a -> b) -> [a] -> [b]
map HasDebugCallStack => Type -> Type
Type -> Type
kindRep [Type]
tau_kinds
arg_tys :: [Type]
arg_tys = [Type]
tau_reps [Type] -> [Type] -> [Type]
forall a. [a] -> [a] -> [a]
++ [Type]
tau_tys
res_kind :: Type
res_kind = [Type] -> Type
unboxedTupleKind [Type]
tau_reps in
Type -> Type -> TcM Type
check_expected_kind (TyCon -> [Type] -> Type
mkTyConApp TyCon
tycon [Type]
arg_tys) Type
res_kind
where
arity :: Arity
arity = [Type] -> Arity
forall (t :: * -> *) a. Foldable t => t a -> Arity
length [Type]
tau_tys
check_expected_kind :: Type -> Type -> TcM Type
check_expected_kind Type
ty Type
act_kind =
HasDebugCallStack =>
HsType GhcRn -> Type -> Type -> Type -> TcM Type
HsType GhcRn -> Type -> Type -> Type -> TcM Type
checkExpectedKind HsType GhcRn
rn_ty Type
ty Type
act_kind Type
exp_kind
bigConstraintTuple :: Arity -> MsgDoc
bigConstraintTuple :: Arity -> MsgDoc
bigConstraintTuple Arity
arity
= MsgDoc -> Arity -> MsgDoc -> MsgDoc
hang (String -> MsgDoc
text String
"Constraint tuple arity too large:" MsgDoc -> MsgDoc -> MsgDoc
<+> Arity -> MsgDoc
int Arity
arity
MsgDoc -> MsgDoc -> MsgDoc
<+> MsgDoc -> MsgDoc
parens (String -> MsgDoc
text String
"max arity =" MsgDoc -> MsgDoc -> MsgDoc
<+> Arity -> MsgDoc
int Arity
mAX_CTUPLE_SIZE))
Arity
2 (String -> MsgDoc
text String
"Instead, use a nested tuple")
splitHsAppTys :: HsType GhcRn -> Maybe (LHsType GhcRn, [LHsTypeArg GhcRn])
splitHsAppTys :: HsType GhcRn -> Maybe (LHsKind GhcRn, [LHsTypeArg GhcRn])
splitHsAppTys HsType GhcRn
hs_ty
| HsType GhcRn -> Bool
is_app HsType GhcRn
hs_ty = (LHsKind GhcRn, [LHsTypeArg GhcRn])
-> Maybe (LHsKind GhcRn, [LHsTypeArg GhcRn])
forall a. a -> Maybe a
Just (LHsKind GhcRn
-> [LHsTypeArg GhcRn] -> (LHsKind GhcRn, [LHsTypeArg GhcRn])
forall {pass}.
(XTyVar pass ~ NoExtField, XAppKindTy pass ~ SrcSpan) =>
LHsType pass
-> [HsArg (LHsType pass) (LHsType pass)]
-> (LHsType pass, [HsArg (LHsType pass) (LHsType pass)])
go (HsType GhcRn -> LHsKind GhcRn
forall e. e -> Located e
noLoc HsType GhcRn
hs_ty) [])
| Bool
otherwise = Maybe (LHsKind GhcRn, [LHsTypeArg GhcRn])
forall a. Maybe a
Nothing
where
is_app :: HsType GhcRn -> Bool
is_app :: HsType GhcRn -> Bool
is_app (HsAppKindTy {}) = Bool
True
is_app (HsAppTy {}) = Bool
True
is_app (HsOpTy XOpTy GhcRn
_ LHsKind GhcRn
_ (L SrcSpan
_ IdP GhcRn
op) LHsKind GhcRn
_) = Bool -> Bool
not (Name
IdP GhcRn
op Name -> Unique -> Bool
forall a. Uniquable a => a -> Unique -> Bool
`hasKey` Unique
funTyConKey)
is_app (HsTyVar {}) = Bool
True
is_app (HsParTy XParTy GhcRn
_ (L SrcSpan
_ HsType GhcRn
ty)) = HsType GhcRn -> Bool
is_app HsType GhcRn
ty
is_app HsType GhcRn
_ = Bool
False
go :: LHsType pass
-> [HsArg (LHsType pass) (LHsType pass)]
-> (LHsType pass, [HsArg (LHsType pass) (LHsType pass)])
go (L SrcSpan
_ (HsAppTy XAppTy pass
_ LHsType pass
f LHsType pass
a)) [HsArg (LHsType pass) (LHsType pass)]
as = LHsType pass
-> [HsArg (LHsType pass) (LHsType pass)]
-> (LHsType pass, [HsArg (LHsType pass) (LHsType pass)])
go LHsType pass
f (LHsType pass -> HsArg (LHsType pass) (LHsType pass)
forall tm ty. tm -> HsArg tm ty
HsValArg LHsType pass
a HsArg (LHsType pass) (LHsType pass)
-> [HsArg (LHsType pass) (LHsType pass)]
-> [HsArg (LHsType pass) (LHsType pass)]
forall a. a -> [a] -> [a]
: [HsArg (LHsType pass) (LHsType pass)]
as)
go (L SrcSpan
_ (HsAppKindTy XAppKindTy pass
l LHsType pass
ty LHsType pass
k)) [HsArg (LHsType pass) (LHsType pass)]
as = LHsType pass
-> [HsArg (LHsType pass) (LHsType pass)]
-> (LHsType pass, [HsArg (LHsType pass) (LHsType pass)])
go LHsType pass
ty (SrcSpan -> LHsType pass -> HsArg (LHsType pass) (LHsType pass)
forall tm ty. SrcSpan -> ty -> HsArg tm ty
HsTypeArg SrcSpan
XAppKindTy pass
l LHsType pass
k HsArg (LHsType pass) (LHsType pass)
-> [HsArg (LHsType pass) (LHsType pass)]
-> [HsArg (LHsType pass) (LHsType pass)]
forall a. a -> [a] -> [a]
: [HsArg (LHsType pass) (LHsType pass)]
as)
go (L SrcSpan
sp (HsParTy XParTy pass
_ LHsType pass
f)) [HsArg (LHsType pass) (LHsType pass)]
as = LHsType pass
-> [HsArg (LHsType pass) (LHsType pass)]
-> (LHsType pass, [HsArg (LHsType pass) (LHsType pass)])
go LHsType pass
f (SrcSpan -> HsArg (LHsType pass) (LHsType pass)
forall tm ty. SrcSpan -> HsArg tm ty
HsArgPar SrcSpan
sp HsArg (LHsType pass) (LHsType pass)
-> [HsArg (LHsType pass) (LHsType pass)]
-> [HsArg (LHsType pass) (LHsType pass)]
forall a. a -> [a] -> [a]
: [HsArg (LHsType pass) (LHsType pass)]
as)
go (L SrcSpan
_ (HsOpTy XOpTy pass
_ LHsType pass
l op :: Located (IdP pass)
op@(L SrcSpan
sp IdP pass
_) LHsType pass
r)) [HsArg (LHsType pass) (LHsType pass)]
as
= ( SrcSpan -> HsType pass -> LHsType pass
forall l e. l -> e -> GenLocated l e
L SrcSpan
sp (XTyVar pass -> PromotionFlag -> Located (IdP pass) -> HsType pass
forall pass.
XTyVar pass -> PromotionFlag -> Located (IdP pass) -> HsType pass
HsTyVar NoExtField
XTyVar pass
noExtField PromotionFlag
NotPromoted Located (IdP pass)
op)
, LHsType pass -> HsArg (LHsType pass) (LHsType pass)
forall tm ty. tm -> HsArg tm ty
HsValArg LHsType pass
l HsArg (LHsType pass) (LHsType pass)
-> [HsArg (LHsType pass) (LHsType pass)]
-> [HsArg (LHsType pass) (LHsType pass)]
forall a. a -> [a] -> [a]
: LHsType pass -> HsArg (LHsType pass) (LHsType pass)
forall tm ty. tm -> HsArg tm ty
HsValArg LHsType pass
r HsArg (LHsType pass) (LHsType pass)
-> [HsArg (LHsType pass) (LHsType pass)]
-> [HsArg (LHsType pass) (LHsType pass)]
forall a. a -> [a] -> [a]
: [HsArg (LHsType pass) (LHsType pass)]
as )
go LHsType pass
f [HsArg (LHsType pass) (LHsType pass)]
as = (LHsType pass
f, [HsArg (LHsType pass) (LHsType pass)]
as)
tcInferTyAppHead :: TcTyMode -> LHsType GhcRn -> TcM (TcType, TcKind)
tcInferTyAppHead :: TcTyMode -> LHsKind GhcRn -> TcM (Type, Type)
tcInferTyAppHead TcTyMode
mode (L SrcSpan
_ (HsTyVar XTyVar GhcRn
_ PromotionFlag
_ (L SrcSpan
_ IdP GhcRn
tv)))
= TcTyMode -> Name -> TcM (Type, Type)
tcTyVar TcTyMode
mode Name
IdP GhcRn
tv
tcInferTyAppHead TcTyMode
mode LHsKind GhcRn
ty
= TcTyMode -> LHsKind GhcRn -> TcM (Type, Type)
tc_infer_lhs_type TcTyMode
mode LHsKind GhcRn
ty
tcInferTyApps, tcInferTyApps_nosat
:: TcTyMode
-> LHsType GhcRn
-> TcType
-> [LHsTypeArg GhcRn]
-> TcM (TcType, TcKind)
tcInferTyApps :: TcTyMode
-> LHsKind GhcRn -> Type -> [LHsTypeArg GhcRn] -> TcM (Type, Type)
tcInferTyApps TcTyMode
mode LHsKind GhcRn
hs_ty Type
fun [LHsTypeArg GhcRn]
hs_args
= do { (Type
f_args, Type
res_k) <- TcTyMode
-> LHsKind GhcRn -> Type -> [LHsTypeArg GhcRn] -> TcM (Type, Type)
tcInferTyApps_nosat TcTyMode
mode LHsKind GhcRn
hs_ty Type
fun [LHsTypeArg GhcRn]
hs_args
; Type -> Type -> TcM (Type, Type)
saturateFamApp Type
f_args Type
res_k }
tcInferTyApps_nosat :: TcTyMode
-> LHsKind GhcRn -> Type -> [LHsTypeArg GhcRn] -> TcM (Type, Type)
tcInferTyApps_nosat TcTyMode
mode LHsKind GhcRn
orig_hs_ty Type
fun [LHsTypeArg GhcRn]
orig_hs_args
= do { String -> MsgDoc -> TcM ()
traceTc String
"tcInferTyApps {" (LHsKind GhcRn -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr LHsKind GhcRn
orig_hs_ty MsgDoc -> MsgDoc -> MsgDoc
$$ [LHsTypeArg GhcRn] -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr [LHsTypeArg GhcRn]
orig_hs_args)
; (Type
f_args, Type
res_k) <- Arity -> Type -> [LHsTypeArg GhcRn] -> TcM (Type, Type)
go_init Arity
1 Type
fun [LHsTypeArg GhcRn]
orig_hs_args
; String -> MsgDoc -> TcM ()
traceTc String
"tcInferTyApps }" (Type -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr Type
f_args MsgDoc -> MsgDoc -> MsgDoc
<+> MsgDoc
dcolon MsgDoc -> MsgDoc -> MsgDoc
<+> Type -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr Type
res_k)
; (Type, Type) -> TcM (Type, Type)
forall (m :: * -> *) a. Monad m => a -> m a
return (Type
f_args, Type
res_k) }
where
go_init :: Arity -> Type -> [LHsTypeArg GhcRn] -> TcM (Type, Type)
go_init Arity
n Type
fun [LHsTypeArg GhcRn]
all_args
= Arity
-> Type
-> TCvSubst
-> Type
-> [LHsTypeArg GhcRn]
-> TcM (Type, Type)
go Arity
n Type
fun TCvSubst
empty_subst Type
fun_ki [LHsTypeArg GhcRn]
all_args
where
fun_ki :: Type
fun_ki = HasDebugCallStack => Type -> Type
Type -> Type
tcTypeKind Type
fun
empty_subst :: TCvSubst
empty_subst = InScopeSet -> TCvSubst
mkEmptyTCvSubst (InScopeSet -> TCvSubst) -> InScopeSet -> TCvSubst
forall a b. (a -> b) -> a -> b
$ TyVarSet -> InScopeSet
mkInScopeSet (TyVarSet -> InScopeSet) -> TyVarSet -> InScopeSet
forall a b. (a -> b) -> a -> b
$
Type -> TyVarSet
tyCoVarsOfType Type
fun_ki
go :: Int
-> TcType
-> TCvSubst
-> TcKind
-> [LHsTypeArg GhcRn]
-> TcM (TcType, TcKind)
go :: Arity
-> Type
-> TCvSubst
-> Type
-> [LHsTypeArg GhcRn]
-> TcM (Type, Type)
go Arity
n Type
fun TCvSubst
subst Type
fun_ki [LHsTypeArg GhcRn]
all_args = case ([LHsTypeArg GhcRn]
all_args, Type -> Maybe (TyBinder, Type)
tcSplitPiTy_maybe Type
fun_ki) of
([], Maybe (TyBinder, Type)
_) -> (Type, Type) -> TcM (Type, Type)
forall (m :: * -> *) a. Monad m => a -> m a
return (Type
fun, HasCallStack => TCvSubst -> Type -> Type
TCvSubst -> Type -> Type
substTy TCvSubst
subst Type
fun_ki)
(HsArgPar SrcSpan
_ : [LHsTypeArg GhcRn]
args, Maybe (TyBinder, Type)
_) -> Arity
-> Type
-> TCvSubst
-> Type
-> [LHsTypeArg GhcRn]
-> TcM (Type, Type)
go Arity
n Type
fun TCvSubst
subst Type
fun_ki [LHsTypeArg GhcRn]
args
(HsTypeArg SrcSpan
_ LHsKind GhcRn
hs_ki_arg : [LHsTypeArg GhcRn]
hs_args, Just (TyBinder
ki_binder, Type
inner_ki)) ->
case TyBinder
ki_binder of
Named (Bndr TyVar
_ ArgFlag
Inferred) -> TyBinder -> Type -> TcM (Type, Type)
instantiate TyBinder
ki_binder Type
inner_ki
Anon AnonArgFlag
InvisArg Scaled Type
_ -> TyBinder -> Type -> TcM (Type, Type)
instantiate TyBinder
ki_binder Type
inner_ki
Named (Bndr TyVar
_ ArgFlag
Specified) ->
do { String -> MsgDoc -> TcM ()
traceTc String
"tcInferTyApps (vis kind app)"
([MsgDoc] -> MsgDoc
vcat [ TyBinder -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr TyBinder
ki_binder, LHsKind GhcRn -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr LHsKind GhcRn
hs_ki_arg
, Type -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr (TyBinder -> Type
tyBinderType TyBinder
ki_binder)
, TCvSubst -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr TCvSubst
subst ])
; let exp_kind :: Type
exp_kind = HasCallStack => TCvSubst -> Type -> Type
TCvSubst -> Type -> Type
substTy TCvSubst
subst (Type -> Type) -> Type -> Type
forall a b. (a -> b) -> a -> b
$ TyBinder -> Type
tyBinderType TyBinder
ki_binder
; TcTyMode
arg_mode <- TypeOrKind -> HoleMode -> TcM TcTyMode
mkHoleMode TypeOrKind
KindLevel HoleMode
HM_VTA
; Type
ki_arg <- MsgDoc -> TcM Type -> TcM Type
forall a. MsgDoc -> TcM a -> TcM a
addErrCtxt (LHsKind GhcRn -> LHsKind GhcRn -> Arity -> MsgDoc
forall fun arg.
(Outputable fun, Outputable arg) =>
fun -> arg -> Arity -> MsgDoc
funAppCtxt LHsKind GhcRn
orig_hs_ty LHsKind GhcRn
hs_ki_arg Arity
n) (TcM Type -> TcM Type) -> TcM Type -> TcM Type
forall a b. (a -> b) -> a -> b
$
TcTyMode -> LHsKind GhcRn -> Type -> TcM Type
tc_lhs_type TcTyMode
arg_mode LHsKind GhcRn
hs_ki_arg Type
exp_kind
; String -> MsgDoc -> TcM ()
traceTc String
"tcInferTyApps (vis kind app)" (Type -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr Type
exp_kind)
; (TCvSubst
subst', Type
fun') <- TCvSubst -> Type -> TyBinder -> Type -> TcM (TCvSubst, Type)
mkAppTyM TCvSubst
subst Type
fun TyBinder
ki_binder Type
ki_arg
; Arity
-> Type
-> TCvSubst
-> Type
-> [LHsTypeArg GhcRn]
-> TcM (Type, Type)
go (Arity
nArity -> Arity -> Arity
forall a. Num a => a -> a -> a
+Arity
1) Type
fun' TCvSubst
subst' Type
inner_ki [LHsTypeArg GhcRn]
hs_args }
TyBinder
_ -> LHsKind GhcRn -> Type -> TcM (Type, Type)
forall {a} {a} {a}.
(Outputable a, Outputable a) =>
a -> a -> TcRn a
ty_app_err LHsKind GhcRn
hs_ki_arg (Type -> TcM (Type, Type)) -> Type -> TcM (Type, Type)
forall a b. (a -> b) -> a -> b
$ HasCallStack => TCvSubst -> Type -> Type
TCvSubst -> Type -> Type
substTy TCvSubst
subst Type
fun_ki
(HsTypeArg SrcSpan
_ LHsKind GhcRn
ki_arg : [LHsTypeArg GhcRn]
_, Maybe (TyBinder, Type)
Nothing) -> TcM (Type, Type) -> TcM (Type, Type)
try_again_after_substing_or (TcM (Type, Type) -> TcM (Type, Type))
-> TcM (Type, Type) -> TcM (Type, Type)
forall a b. (a -> b) -> a -> b
$
LHsKind GhcRn -> Type -> TcM (Type, Type)
forall {a} {a} {a}.
(Outputable a, Outputable a) =>
a -> a -> TcRn a
ty_app_err LHsKind GhcRn
ki_arg Type
substed_fun_ki
(HsValArg LHsKind GhcRn
arg : [LHsTypeArg GhcRn]
args, Just (TyBinder
ki_binder, Type
inner_ki))
| TyBinder -> Bool
isInvisibleBinder TyBinder
ki_binder
-> TyBinder -> Type -> TcM (Type, Type)
instantiate TyBinder
ki_binder Type
inner_ki
| Bool
otherwise
-> do { String -> MsgDoc -> TcM ()
traceTc String
"tcInferTyApps (vis normal app)"
([MsgDoc] -> MsgDoc
vcat [ TyBinder -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr TyBinder
ki_binder
, LHsKind GhcRn -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr LHsKind GhcRn
arg
, Type -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr (TyBinder -> Type
tyBinderType TyBinder
ki_binder)
, TCvSubst -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr TCvSubst
subst ])
; let exp_kind :: Type
exp_kind = HasCallStack => TCvSubst -> Type -> Type
TCvSubst -> Type -> Type
substTy TCvSubst
subst (Type -> Type) -> Type -> Type
forall a b. (a -> b) -> a -> b
$ TyBinder -> Type
tyBinderType TyBinder
ki_binder
; Type
arg' <- MsgDoc -> TcM Type -> TcM Type
forall a. MsgDoc -> TcM a -> TcM a
addErrCtxt (LHsKind GhcRn -> LHsKind GhcRn -> Arity -> MsgDoc
forall fun arg.
(Outputable fun, Outputable arg) =>
fun -> arg -> Arity -> MsgDoc
funAppCtxt LHsKind GhcRn
orig_hs_ty LHsKind GhcRn
arg Arity
n) (TcM Type -> TcM Type) -> TcM Type -> TcM Type
forall a b. (a -> b) -> a -> b
$
TcTyMode -> LHsKind GhcRn -> Type -> TcM Type
tc_lhs_type TcTyMode
mode LHsKind GhcRn
arg Type
exp_kind
; String -> MsgDoc -> TcM ()
traceTc String
"tcInferTyApps (vis normal app) 2" (Type -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr Type
exp_kind)
; (TCvSubst
subst', Type
fun') <- TCvSubst -> Type -> TyBinder -> Type -> TcM (TCvSubst, Type)
mkAppTyM TCvSubst
subst Type
fun TyBinder
ki_binder Type
arg'
; Arity
-> Type
-> TCvSubst
-> Type
-> [LHsTypeArg GhcRn]
-> TcM (Type, Type)
go (Arity
nArity -> Arity -> Arity
forall a. Num a => a -> a -> a
+Arity
1) Type
fun' TCvSubst
subst' Type
inner_ki [LHsTypeArg GhcRn]
args }
(HsValArg LHsKind GhcRn
_ : [LHsTypeArg GhcRn]
_, Maybe (TyBinder, Type)
Nothing)
-> TcM (Type, Type) -> TcM (Type, Type)
try_again_after_substing_or (TcM (Type, Type) -> TcM (Type, Type))
-> TcM (Type, Type) -> TcM (Type, Type)
forall a b. (a -> b) -> a -> b
$
do { let arrows_needed :: Arity
arrows_needed = [LHsTypeArg GhcRn] -> Arity
forall tm ty. [HsArg tm ty] -> Arity
n_initial_val_args [LHsTypeArg GhcRn]
all_args
; Coercion
co <- LHsKind GhcRn -> Arity -> Type -> TcM Coercion
forall fun. Outputable fun => fun -> Arity -> Type -> TcM Coercion
matchExpectedFunKind LHsKind GhcRn
hs_ty Arity
arrows_needed Type
substed_fun_ki
; Type
fun' <- Type -> TcM Type
zonkTcType (Type
fun Type -> Coercion -> Type
`mkTcCastTy` Coercion
co)
; String -> MsgDoc -> TcM ()
traceTc String
"tcInferTyApps (no binder)" (MsgDoc -> TcM ()) -> MsgDoc -> TcM ()
forall a b. (a -> b) -> a -> b
$
[MsgDoc] -> MsgDoc
vcat [ Type -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr Type
fun MsgDoc -> MsgDoc -> MsgDoc
<+> MsgDoc
dcolon MsgDoc -> MsgDoc -> MsgDoc
<+> Type -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr Type
fun_ki
, Arity -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr Arity
arrows_needed
, Coercion -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr Coercion
co
, Type -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr Type
fun' MsgDoc -> MsgDoc -> MsgDoc
<+> MsgDoc
dcolon MsgDoc -> MsgDoc -> MsgDoc
<+> Type -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr (HasDebugCallStack => Type -> Type
Type -> Type
tcTypeKind Type
fun')]
; Arity -> Type -> [LHsTypeArg GhcRn] -> TcM (Type, Type)
go_init Arity
n Type
fun' [LHsTypeArg GhcRn]
all_args }
where
instantiate :: TyBinder -> Type -> TcM (Type, Type)
instantiate TyBinder
ki_binder Type
inner_ki
= do { String -> MsgDoc -> TcM ()
traceTc String
"tcInferTyApps (need to instantiate)"
([MsgDoc] -> MsgDoc
vcat [ TyBinder -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr TyBinder
ki_binder, TCvSubst -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr TCvSubst
subst])
; (TCvSubst
subst', Type
arg') <- TCvSubst -> TyBinder -> TcM (TCvSubst, Type)
tcInstInvisibleTyBinder TCvSubst
subst TyBinder
ki_binder
; Arity
-> Type
-> TCvSubst
-> Type
-> [LHsTypeArg GhcRn]
-> TcM (Type, Type)
go Arity
n (Type -> Type -> Type
mkAppTy Type
fun Type
arg') TCvSubst
subst' Type
inner_ki [LHsTypeArg GhcRn]
all_args }
try_again_after_substing_or :: TcM (Type, Type) -> TcM (Type, Type)
try_again_after_substing_or TcM (Type, Type)
fallthrough
| Bool -> Bool
not (TCvSubst -> Bool
isEmptyTCvSubst TCvSubst
subst)
= Arity
-> Type
-> TCvSubst
-> Type
-> [LHsTypeArg GhcRn]
-> TcM (Type, Type)
go Arity
n Type
fun TCvSubst
zapped_subst Type
substed_fun_ki [LHsTypeArg GhcRn]
all_args
| Bool
otherwise
= TcM (Type, Type)
fallthrough
zapped_subst :: TCvSubst
zapped_subst = TCvSubst -> TCvSubst
zapTCvSubst TCvSubst
subst
substed_fun_ki :: Type
substed_fun_ki = HasCallStack => TCvSubst -> Type -> Type
TCvSubst -> Type -> Type
substTy TCvSubst
subst Type
fun_ki
hs_ty :: LHsKind GhcRn
hs_ty = LHsKind GhcRn -> [LHsTypeArg GhcRn] -> LHsKind GhcRn
appTypeToArg LHsKind GhcRn
orig_hs_ty (Arity -> [LHsTypeArg GhcRn] -> [LHsTypeArg GhcRn]
forall a. Arity -> [a] -> [a]
take (Arity
nArity -> Arity -> Arity
forall a. Num a => a -> a -> a
-Arity
1) [LHsTypeArg GhcRn]
orig_hs_args)
n_initial_val_args :: [HsArg tm ty] -> Arity
n_initial_val_args :: forall tm ty. [HsArg tm ty] -> Arity
n_initial_val_args (HsValArg {} : [HsArg tm ty]
args) = Arity
1 Arity -> Arity -> Arity
forall a. Num a => a -> a -> a
+ [HsArg tm ty] -> Arity
forall tm ty. [HsArg tm ty] -> Arity
n_initial_val_args [HsArg tm ty]
args
n_initial_val_args (HsArgPar {} : [HsArg tm ty]
args) = [HsArg tm ty] -> Arity
forall tm ty. [HsArg tm ty] -> Arity
n_initial_val_args [HsArg tm ty]
args
n_initial_val_args [HsArg tm ty]
_ = Arity
0
ty_app_err :: a -> a -> TcRn a
ty_app_err a
arg a
ty
= MsgDoc -> TcRn a
forall a. MsgDoc -> TcM a
failWith (MsgDoc -> TcRn a) -> MsgDoc -> TcRn a
forall a b. (a -> b) -> a -> b
$ String -> MsgDoc
text String
"Cannot apply function of kind" MsgDoc -> MsgDoc -> MsgDoc
<+> MsgDoc -> MsgDoc
quotes (a -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr a
ty)
MsgDoc -> MsgDoc -> MsgDoc
$$ String -> MsgDoc
text String
"to visible kind argument" MsgDoc -> MsgDoc -> MsgDoc
<+> MsgDoc -> MsgDoc
quotes (a -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr a
arg)
mkAppTyM :: TCvSubst
-> TcType -> TyCoBinder
-> TcType
-> TcM (TCvSubst, TcType)
mkAppTyM :: TCvSubst -> Type -> TyBinder -> Type -> TcM (TCvSubst, Type)
mkAppTyM TCvSubst
subst Type
fun TyBinder
ki_binder Type
arg
|
TyConApp TyCon
tc [Type]
args <- Type
fun
, TyCon -> Bool
isTypeSynonymTyCon TyCon
tc
, [Type]
args [Type] -> Arity -> Bool
forall a. [a] -> Arity -> Bool
`lengthIs` (TyCon -> Arity
tyConArity TyCon
tc Arity -> Arity -> Arity
forall a. Num a => a -> a -> a
- Arity
1)
, (TyVar -> Bool) -> [TyVar] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any TyVar -> Bool
isTrickyTvBinder (TyCon -> [TyVar]
tyConTyVars TyCon
tc)
= do { Type
arg' <- Type -> TcM Type
zonkTcType Type
arg
; [Type]
args' <- [Type] -> TcM [Type]
zonkTcTypes [Type]
args
; let subst' :: TCvSubst
subst' = case TyBinder
ki_binder of
Anon {} -> TCvSubst
subst
Named (Bndr TyVar
tv ArgFlag
_) -> TCvSubst -> TyVar -> Type -> TCvSubst
extendTvSubstAndInScope TCvSubst
subst TyVar
tv Type
arg'
; (TCvSubst, Type) -> TcM (TCvSubst, Type)
forall (m :: * -> *) a. Monad m => a -> m a
return (TCvSubst
subst', TyCon -> [Type] -> Type
mkTyConApp TyCon
tc ([Type]
args' [Type] -> [Type] -> [Type]
forall a. [a] -> [a] -> [a]
++ [Type
arg'])) }
mkAppTyM TCvSubst
subst Type
fun (Anon {}) Type
arg
= (TCvSubst, Type) -> TcM (TCvSubst, Type)
forall (m :: * -> *) a. Monad m => a -> m a
return (TCvSubst
subst, Type -> Type -> Type
mk_app_ty Type
fun Type
arg)
mkAppTyM TCvSubst
subst Type
fun (Named (Bndr TyVar
tv ArgFlag
_)) Type
arg
= do { Type
arg' <- if TyVar -> Bool
isTrickyTvBinder TyVar
tv
then
Type -> TcM Type
zonkTcType Type
arg
else Type -> TcM Type
forall (m :: * -> *) a. Monad m => a -> m a
return Type
arg
; (TCvSubst, Type) -> TcM (TCvSubst, Type)
forall (m :: * -> *) a. Monad m => a -> m a
return ( TCvSubst -> TyVar -> Type -> TCvSubst
extendTvSubstAndInScope TCvSubst
subst TyVar
tv Type
arg'
, Type -> Type -> Type
mk_app_ty Type
fun Type
arg' ) }
mk_app_ty :: TcType -> TcType -> TcType
mk_app_ty :: Type -> Type -> Type
mk_app_ty Type
fun Type
arg
= ASSERT2( isPiTy fun_kind
, ppr fun <+> dcolon <+> ppr fun_kind $$ ppr arg )
Type -> Type -> Type
mkAppTy Type
fun Type
arg
where
fun_kind :: Type
fun_kind = HasDebugCallStack => Type -> Type
Type -> Type
tcTypeKind Type
fun
isTrickyTvBinder :: TcTyVar -> Bool
isTrickyTvBinder :: TyVar -> Bool
isTrickyTvBinder TyVar
tv = Type -> Bool
isPiTy (TyVar -> Type
tyVarKind TyVar
tv)
saturateFamApp :: TcType -> TcKind -> TcM (TcType, TcKind)
saturateFamApp :: Type -> Type -> TcM (Type, Type)
saturateFamApp Type
ty Type
kind
| Just (TyCon
tc, [Type]
args) <- HasCallStack => Type -> Maybe (TyCon, [Type])
Type -> Maybe (TyCon, [Type])
tcSplitTyConApp_maybe Type
ty
, TyCon -> Bool
mustBeSaturated TyCon
tc
, let n_to_inst :: Arity
n_to_inst = TyCon -> Arity
tyConArity TyCon
tc Arity -> Arity -> Arity
forall a. Num a => a -> a -> a
- [Type] -> Arity
forall (t :: * -> *) a. Foldable t => t a -> Arity
length [Type]
args
= do { ([Type]
extra_args, Type
ki') <- Arity -> Type -> TcM ([Type], Type)
tcInstInvisibleTyBindersN Arity
n_to_inst Type
kind
; (Type, Type) -> TcM (Type, Type)
forall (m :: * -> *) a. Monad m => a -> m a
return (Type
ty Type -> [Type] -> Type
`mkTcAppTys` [Type]
extra_args, Type
ki') }
| Bool
otherwise
= (Type, Type) -> TcM (Type, Type)
forall (m :: * -> *) a. Monad m => a -> m a
return (Type
ty, Type
kind)
appTypeToArg :: LHsType GhcRn -> [LHsTypeArg GhcRn] -> LHsType GhcRn
appTypeToArg :: LHsKind GhcRn -> [LHsTypeArg GhcRn] -> LHsKind GhcRn
appTypeToArg LHsKind GhcRn
f [] = LHsKind GhcRn
f
appTypeToArg LHsKind GhcRn
f (HsValArg LHsKind GhcRn
arg : [LHsTypeArg GhcRn]
args) = LHsKind GhcRn -> [LHsTypeArg GhcRn] -> LHsKind GhcRn
appTypeToArg (LHsKind GhcRn -> LHsKind GhcRn -> LHsKind GhcRn
forall (p :: Pass).
LHsType (GhcPass p) -> LHsType (GhcPass p) -> LHsType (GhcPass p)
mkHsAppTy LHsKind GhcRn
f LHsKind GhcRn
arg) [LHsTypeArg GhcRn]
args
appTypeToArg LHsKind GhcRn
f (HsArgPar SrcSpan
_ : [LHsTypeArg GhcRn]
args) = LHsKind GhcRn -> [LHsTypeArg GhcRn] -> LHsKind GhcRn
appTypeToArg LHsKind GhcRn
f [LHsTypeArg GhcRn]
args
appTypeToArg LHsKind GhcRn
f (HsTypeArg SrcSpan
l LHsKind GhcRn
arg : [LHsTypeArg GhcRn]
args)
= LHsKind GhcRn -> [LHsTypeArg GhcRn] -> LHsKind GhcRn
appTypeToArg (XAppKindTy GhcRn -> LHsKind GhcRn -> LHsKind GhcRn -> LHsKind GhcRn
forall (p :: Pass).
XAppKindTy (GhcPass p)
-> LHsType (GhcPass p)
-> LHsType (GhcPass p)
-> LHsType (GhcPass p)
mkHsAppKindTy SrcSpan
XAppKindTy GhcRn
l LHsKind GhcRn
f LHsKind GhcRn
arg) [LHsTypeArg GhcRn]
args
checkExpectedKind :: HasDebugCallStack
=> HsType GhcRn
-> TcType
-> TcKind
-> TcKind
-> TcM TcType
checkExpectedKind :: HasDebugCallStack =>
HsType GhcRn -> Type -> Type -> Type -> TcM Type
checkExpectedKind HsType GhcRn
hs_ty Type
ty Type
act_kind Type
exp_kind
= do { String -> MsgDoc -> TcM ()
traceTc String
"checkExpectedKind" (Type -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr Type
ty MsgDoc -> MsgDoc -> MsgDoc
$$ Type -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr Type
act_kind)
; ([Type]
new_args, Type
act_kind') <- Arity -> Type -> TcM ([Type], Type)
tcInstInvisibleTyBindersN Arity
n_to_inst Type
act_kind
; let origin :: CtOrigin
origin = TypeEqOrigin :: Type -> Type -> Maybe MsgDoc -> Bool -> CtOrigin
TypeEqOrigin { uo_actual :: Type
uo_actual = Type
act_kind'
, uo_expected :: Type
uo_expected = Type
exp_kind
, uo_thing :: Maybe MsgDoc
uo_thing = MsgDoc -> Maybe MsgDoc
forall a. a -> Maybe a
Just (HsType GhcRn -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr HsType GhcRn
hs_ty)
, uo_visible :: Bool
uo_visible = Bool
True }
; String -> MsgDoc -> TcM ()
traceTc String
"checkExpectedKindX" (MsgDoc -> TcM ()) -> MsgDoc -> TcM ()
forall a b. (a -> b) -> a -> b
$
[MsgDoc] -> MsgDoc
vcat [ HsType GhcRn -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr HsType GhcRn
hs_ty
, String -> MsgDoc
text String
"act_kind':" MsgDoc -> MsgDoc -> MsgDoc
<+> Type -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr Type
act_kind'
, String -> MsgDoc
text String
"exp_kind:" MsgDoc -> MsgDoc -> MsgDoc
<+> Type -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr Type
exp_kind ]
; let res_ty :: Type
res_ty = Type
ty Type -> [Type] -> Type
`mkTcAppTys` [Type]
new_args
; if Type
act_kind' HasDebugCallStack => Type -> Type -> Bool
Type -> Type -> Bool
`tcEqType` Type
exp_kind
then Type -> TcM Type
forall (m :: * -> *) a. Monad m => a -> m a
return Type
res_ty
else do { Coercion
co_k <- TypeOrKind -> CtOrigin -> Type -> Type -> TcM Coercion
uType TypeOrKind
KindLevel CtOrigin
origin Type
act_kind' Type
exp_kind
; String -> MsgDoc -> TcM ()
traceTc String
"checkExpectedKind" ([MsgDoc] -> MsgDoc
vcat [ Type -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr Type
act_kind
, Type -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr Type
exp_kind
, Coercion -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr Coercion
co_k ])
; Type -> TcM Type
forall (m :: * -> *) a. Monad m => a -> m a
return (Type
res_ty Type -> Coercion -> Type
`mkTcCastTy` Coercion
co_k) } }
where
n_exp_invis_bndrs :: Arity
n_exp_invis_bndrs = Type -> Arity
invisibleTyBndrCount Type
exp_kind
n_act_invis_bndrs :: Arity
n_act_invis_bndrs = Type -> Arity
invisibleTyBndrCount Type
act_kind
n_to_inst :: Arity
n_to_inst = Arity
n_act_invis_bndrs Arity -> Arity -> Arity
forall a. Num a => a -> a -> a
- Arity
n_exp_invis_bndrs
tcHsMbContext :: Maybe (LHsContext GhcRn) -> TcM [PredType]
tcHsMbContext :: Maybe (LHsContext GhcRn) -> TcM [Type]
tcHsMbContext Maybe (LHsContext GhcRn)
Nothing = [Type] -> TcM [Type]
forall (m :: * -> *) a. Monad m => a -> m a
return []
tcHsMbContext (Just LHsContext GhcRn
cxt) = LHsContext GhcRn -> TcM [Type]
tcHsContext LHsContext GhcRn
cxt
tcHsContext :: LHsContext GhcRn -> TcM [PredType]
tcHsContext :: LHsContext GhcRn -> TcM [Type]
tcHsContext LHsContext GhcRn
cxt = TcTyMode -> LHsContext GhcRn -> TcM [Type]
tc_hs_context (TypeOrKind -> TcTyMode
mkMode TypeOrKind
TypeLevel) LHsContext GhcRn
cxt
tcLHsPredType :: LHsType GhcRn -> TcM PredType
tcLHsPredType :: LHsKind GhcRn -> TcM Type
tcLHsPredType LHsKind GhcRn
pred = TcTyMode -> LHsKind GhcRn -> TcM Type
tc_lhs_pred (TypeOrKind -> TcTyMode
mkMode TypeOrKind
TypeLevel) LHsKind GhcRn
pred
tc_hs_context :: TcTyMode -> LHsContext GhcRn -> TcM [PredType]
tc_hs_context :: TcTyMode -> LHsContext GhcRn -> TcM [Type]
tc_hs_context TcTyMode
mode LHsContext GhcRn
ctxt = (LHsKind GhcRn -> TcM Type) -> [LHsKind GhcRn] -> TcM [Type]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM (TcTyMode -> LHsKind GhcRn -> TcM Type
tc_lhs_pred TcTyMode
mode) (LHsContext GhcRn -> [LHsKind GhcRn]
forall l e. GenLocated l e -> e
unLoc LHsContext GhcRn
ctxt)
tc_lhs_pred :: TcTyMode -> LHsType GhcRn -> TcM PredType
tc_lhs_pred :: TcTyMode -> LHsKind GhcRn -> TcM Type
tc_lhs_pred TcTyMode
mode LHsKind GhcRn
pred = TcTyMode -> LHsKind GhcRn -> Type -> TcM Type
tc_lhs_type TcTyMode
mode LHsKind GhcRn
pred Type
constraintKind
tcTyVar :: TcTyMode -> Name -> TcM (TcType, TcKind)
tcTyVar :: TcTyMode -> Name -> TcM (Type, Type)
tcTyVar TcTyMode
mode Name
name
= do { String -> MsgDoc -> TcM ()
traceTc String
"lk1" (Name -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr Name
name)
; TcTyThing
thing <- Name -> TcM TcTyThing
tcLookup Name
name
; case TcTyThing
thing of
ATyVar Name
_ TyVar
tv -> (Type, Type) -> TcM (Type, Type)
forall (m :: * -> *) a. Monad m => a -> m a
return (TyVar -> Type
mkTyVarTy TyVar
tv, TyVar -> Type
tyVarKind TyVar
tv)
ATcTyCon TyCon
tc_tc
-> do {
Bool -> TcM () -> TcM ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
unless (TypeOrKind -> Bool
isTypeLevel (TcTyMode -> TypeOrKind
mode_tyki TcTyMode
mode))
(Name -> PromotionErr -> TcM ()
forall a. Name -> PromotionErr -> TcM a
promotionErr Name
name PromotionErr
TyConPE)
; TyCon -> TcM ()
check_tc TyCon
tc_tc
; (Type, Type) -> TcM (Type, Type)
forall (m :: * -> *) a. Monad m => a -> m a
return (TyCon -> Type
mkTyConTy TyCon
tc_tc, TyCon -> Type
tyConKind TyCon
tc_tc) }
AGlobal (ATyCon TyCon
tc)
-> do { TyCon -> TcM ()
check_tc TyCon
tc
; (Type, Type) -> TcM (Type, Type)
forall (m :: * -> *) a. Monad m => a -> m a
return (TyCon -> Type
mkTyConTy TyCon
tc, TyCon -> Type
tyConKind TyCon
tc) }
AGlobal (AConLike (RealDataCon DataCon
dc))
-> do { Bool
data_kinds <- Extension -> TcRnIf TcGblEnv TcLclEnv Bool
forall gbl lcl. Extension -> TcRnIf gbl lcl Bool
xoptM Extension
LangExt.DataKinds
; Bool -> TcM () -> TcM ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
unless (Bool
data_kinds Bool -> Bool -> Bool
|| DataCon -> Bool
specialPromotedDc DataCon
dc) (TcM () -> TcM ()) -> TcM () -> TcM ()
forall a b. (a -> b) -> a -> b
$
Name -> PromotionErr -> TcM ()
forall a. Name -> PromotionErr -> TcM a
promotionErr Name
name PromotionErr
NoDataKindsDC
; Bool -> TcM () -> TcM ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (TyCon -> Bool
isFamInstTyCon (DataCon -> TyCon
dataConTyCon DataCon
dc)) (TcM () -> TcM ()) -> TcM () -> TcM ()
forall a b. (a -> b) -> a -> b
$
Name -> PromotionErr -> TcM ()
forall a. Name -> PromotionErr -> TcM a
promotionErr Name
name PromotionErr
FamDataConPE
; let ([TyVar]
_, [TyVar]
_, [EqSpec]
_, [Type]
theta, [Scaled Type]
_, Type
_) = DataCon
-> ([TyVar], [TyVar], [EqSpec], [Type], [Scaled Type], Type)
dataConFullSig DataCon
dc
; String -> MsgDoc -> TcM ()
traceTc String
"tcTyVar" (DataCon -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr DataCon
dc MsgDoc -> MsgDoc -> MsgDoc
<+> [Type] -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr [Type]
theta MsgDoc -> MsgDoc -> MsgDoc
$$ Maybe Type -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr ([Type] -> Maybe Type
dc_theta_illegal_constraint [Type]
theta))
; case [Type] -> Maybe Type
dc_theta_illegal_constraint [Type]
theta of
Just Type
pred -> Name -> PromotionErr -> TcM ()
forall a. Name -> PromotionErr -> TcM a
promotionErr Name
name (PromotionErr -> TcM ()) -> PromotionErr -> TcM ()
forall a b. (a -> b) -> a -> b
$
Type -> PromotionErr
ConstrainedDataConPE Type
pred
Maybe Type
Nothing -> () -> TcM ()
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()
; let tc :: TyCon
tc = DataCon -> TyCon
promoteDataCon DataCon
dc
; (Type, Type) -> TcM (Type, Type)
forall (m :: * -> *) a. Monad m => a -> m a
return (TyCon -> [Type] -> Type
mkTyConApp TyCon
tc [], TyCon -> Type
tyConKind TyCon
tc) }
APromotionErr PromotionErr
err -> Name -> PromotionErr -> TcM (Type, Type)
forall a. Name -> PromotionErr -> TcM a
promotionErr Name
name PromotionErr
err
TcTyThing
_ -> String -> TcTyThing -> Name -> TcM (Type, Type)
forall a. String -> TcTyThing -> Name -> TcM a
wrongThingErr String
"type" TcTyThing
thing Name
name }
where
check_tc :: TyCon -> TcM ()
check_tc :: TyCon -> TcM ()
check_tc TyCon
tc = do { Bool
data_kinds <- Extension -> TcRnIf TcGblEnv TcLclEnv Bool
forall gbl lcl. Extension -> TcRnIf gbl lcl Bool
xoptM Extension
LangExt.DataKinds
; Bool -> TcM () -> TcM ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
unless (TypeOrKind -> Bool
isTypeLevel (TcTyMode -> TypeOrKind
mode_tyki TcTyMode
mode) Bool -> Bool -> Bool
||
Bool
data_kinds Bool -> Bool -> Bool
||
TyCon -> Bool
isKindTyCon TyCon
tc) (TcM () -> TcM ()) -> TcM () -> TcM ()
forall a b. (a -> b) -> a -> b
$
Name -> PromotionErr -> TcM ()
forall a. Name -> PromotionErr -> TcM a
promotionErr Name
name PromotionErr
NoDataKindsTC }
dc_theta_illegal_constraint :: ThetaType -> Maybe PredType
dc_theta_illegal_constraint :: [Type] -> Maybe Type
dc_theta_illegal_constraint = (Type -> Bool) -> [Type] -> Maybe Type
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Maybe a
find (Bool -> Bool
not (Bool -> Bool) -> (Type -> Bool) -> Type -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Type -> Bool
isEqPred)
addTypeCtxt :: LHsType GhcRn -> TcM a -> TcM a
addTypeCtxt :: forall a. LHsKind GhcRn -> TcM a -> TcM a
addTypeCtxt (L SrcSpan
_ (HsWildCardTy XWildCardTy GhcRn
_)) TcM a
thing = TcM a
thing
addTypeCtxt (L SrcSpan
_ HsType GhcRn
ty) TcM a
thing
= MsgDoc -> TcM a -> TcM a
forall a. MsgDoc -> TcM a -> TcM a
addErrCtxt MsgDoc
doc TcM a
thing
where
doc :: MsgDoc
doc = String -> MsgDoc
text String
"In the type" MsgDoc -> MsgDoc -> MsgDoc
<+> MsgDoc -> MsgDoc
quotes (HsType GhcRn -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr HsType GhcRn
ty)
tcNamedWildCardBinders :: [Name]
-> ([(Name, TcTyVar)] -> TcM a)
-> TcM a
tcNamedWildCardBinders :: forall a. HsQTvsRn -> ([(Name, TyVar)] -> TcM a) -> TcM a
tcNamedWildCardBinders HsQTvsRn
wc_names [(Name, TyVar)] -> TcM a
thing_inside
= do { [TyVar]
wcs <- (Name -> IOEnv (Env TcGblEnv TcLclEnv) TyVar)
-> HsQTvsRn -> TcM [TyVar]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM Name -> IOEnv (Env TcGblEnv TcLclEnv) TyVar
newNamedWildTyVar HsQTvsRn
wc_names
; let wc_prs :: [(Name, TyVar)]
wc_prs = HsQTvsRn
wc_names HsQTvsRn -> [TyVar] -> [(Name, TyVar)]
forall a b. [a] -> [b] -> [(a, b)]
`zip` [TyVar]
wcs
; [(Name, TyVar)] -> TcM a -> TcM a
forall r. [(Name, TyVar)] -> TcM r -> TcM r
tcExtendNameTyVarEnv [(Name, TyVar)]
wc_prs (TcM a -> TcM a) -> TcM a -> TcM a
forall a b. (a -> b) -> a -> b
$
[(Name, TyVar)] -> TcM a
thing_inside [(Name, TyVar)]
wc_prs }
newNamedWildTyVar :: Name -> TcM TcTyVar
newNamedWildTyVar :: Name -> IOEnv (Env TcGblEnv TcLclEnv) TyVar
newNamedWildTyVar Name
_name
= do { Type
kind <- TcM Type
newMetaKindVar
; TcTyVarDetails
details <- MetaInfo -> TcM TcTyVarDetails
newMetaDetails MetaInfo
TauTv
; Name
wc_name <- FastString -> TcM Name
newMetaTyVarName (String -> FastString
fsLit String
"w")
; let tyvar :: TyVar
tyvar = Name -> Type -> TcTyVarDetails -> TyVar
mkTcTyVar Name
wc_name Type
kind TcTyVarDetails
details
; String -> MsgDoc -> TcM ()
traceTc String
"newWildTyVar" (TyVar -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr TyVar
tyvar)
; TyVar -> IOEnv (Env TcGblEnv TcLclEnv) TyVar
forall (m :: * -> *) a. Monad m => a -> m a
return TyVar
tyvar }
tcAnonWildCardOcc :: TcTyMode -> HsType GhcRn -> Kind -> TcM TcType
tcAnonWildCardOcc :: TcTyMode -> HsType GhcRn -> Type -> TcM Type
tcAnonWildCardOcc (TcTyMode { mode_holes :: TcTyMode -> Maybe (TcLevel, HoleMode)
mode_holes = Just (TcLevel
hole_lvl, HoleMode
hole_mode) })
HsType GhcRn
ty Type
exp_kind
= do { TcTyVarDetails
kv_details <- TcLevel -> TcM TcTyVarDetails
newTauTvDetailsAtLevel TcLevel
hole_lvl
; Name
kv_name <- FastString -> TcM Name
newMetaTyVarName (String -> FastString
fsLit String
"k")
; TcTyVarDetails
wc_details <- TcLevel -> TcM TcTyVarDetails
newTauTvDetailsAtLevel TcLevel
hole_lvl
; Name
wc_name <- FastString -> TcM Name
newMetaTyVarName (String -> FastString
fsLit String
wc_nm)
; let kv :: TyVar
kv = Name -> Type -> TcTyVarDetails -> TyVar
mkTcTyVar Name
kv_name Type
liftedTypeKind TcTyVarDetails
kv_details
wc_kind :: Type
wc_kind = TyVar -> Type
mkTyVarTy TyVar
kv
wc_tv :: TyVar
wc_tv = Name -> Type -> TcTyVarDetails -> TyVar
mkTcTyVar Name
wc_name Type
wc_kind TcTyVarDetails
wc_details
; String -> MsgDoc -> TcM ()
traceTc String
"tcAnonWildCardOcc" (TcLevel -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr TcLevel
hole_lvl MsgDoc -> MsgDoc -> MsgDoc
<+> Bool -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr Bool
emit_holes)
; Bool -> TcM () -> TcM ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when Bool
emit_holes (TcM () -> TcM ()) -> TcM () -> TcM ()
forall a b. (a -> b) -> a -> b
$
TyVar -> TcM ()
emitAnonTypeHole TyVar
wc_tv
; HasDebugCallStack =>
HsType GhcRn -> Type -> Type -> Type -> TcM Type
HsType GhcRn -> Type -> Type -> Type -> TcM Type
checkExpectedKind HsType GhcRn
ty (TyVar -> Type
mkTyVarTy TyVar
wc_tv) Type
wc_kind Type
exp_kind }
where
wc_nm :: String
wc_nm = case HoleMode
hole_mode of
HoleMode
HM_Sig -> String
"w"
HoleMode
HM_FamPat -> String
"_"
HoleMode
HM_VTA -> String
"w"
emit_holes :: Bool
emit_holes = case HoleMode
hole_mode of
HoleMode
HM_Sig -> Bool
True
HoleMode
HM_FamPat -> Bool
False
HoleMode
HM_VTA -> Bool
False
tcAnonWildCardOcc TcTyMode
mode HsType GhcRn
ty Type
_
= String -> MsgDoc -> TcM Type
forall a. HasCallStack => String -> MsgDoc -> a
pprPanic String
"tcWildCardOcc" (TcTyMode -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr TcTyMode
mode MsgDoc -> MsgDoc -> MsgDoc
$$ HsType GhcRn -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr HsType GhcRn
ty)
data InitialKindStrategy
= InitialKindCheck SAKS_or_CUSK
| InitialKindInfer
data SAKS_or_CUSK
= SAKS Kind
| CUSK
instance Outputable SAKS_or_CUSK where
ppr :: SAKS_or_CUSK -> MsgDoc
ppr (SAKS Type
k) = String -> MsgDoc
text String
"SAKS" MsgDoc -> MsgDoc -> MsgDoc
<+> Type -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr Type
k
ppr SAKS_or_CUSK
CUSK = String -> MsgDoc
text String
"CUSK"
kcDeclHeader
:: InitialKindStrategy
-> Name
-> TyConFlavour
-> LHsQTyVars GhcRn
-> TcM ContextKind
-> TcM TcTyCon
(InitialKindCheck SAKS_or_CUSK
msig) = SAKS_or_CUSK
-> Name
-> TyConFlavour
-> LHsQTyVars GhcRn
-> TcM ContextKind
-> TcM TyCon
kcCheckDeclHeader SAKS_or_CUSK
msig
kcDeclHeader InitialKindStrategy
InitialKindInfer = Name
-> TyConFlavour -> LHsQTyVars GhcRn -> TcM ContextKind -> TcM TyCon
kcInferDeclHeader
kcCheckDeclHeader
:: SAKS_or_CUSK
-> Name
-> TyConFlavour
-> LHsQTyVars GhcRn
-> TcM ContextKind
-> TcM TcTyCon
(SAKS Type
sig) = Type
-> Name
-> TyConFlavour
-> LHsQTyVars GhcRn
-> TcM ContextKind
-> TcM TyCon
kcCheckDeclHeader_sig Type
sig
kcCheckDeclHeader SAKS_or_CUSK
CUSK = Name
-> TyConFlavour -> LHsQTyVars GhcRn -> TcM ContextKind -> TcM TyCon
kcCheckDeclHeader_cusk
kcCheckDeclHeader_cusk
:: Name
-> TyConFlavour
-> LHsQTyVars GhcRn
-> TcM ContextKind
-> TcM TcTyCon
Name
name TyConFlavour
flav
(HsQTvs { hsq_ext :: forall pass. LHsQTyVars pass -> XHsQTvs pass
hsq_ext = XHsQTvs GhcRn
kv_ns
, hsq_explicit :: forall pass. LHsQTyVars pass -> [LHsTyVarBndr () pass]
hsq_explicit = [LHsTyVarBndr () GhcRn]
hs_tvs }) TcM ContextKind
kc_res_ki
= Name -> TyConFlavour -> TcM TyCon -> TcM TyCon
forall a. Name -> TyConFlavour -> TcM a -> TcM a
addTyConFlavCtxt Name
name TyConFlavour
flav (TcM TyCon -> TcM TyCon) -> TcM TyCon -> TcM TyCon
forall a b. (a -> b) -> a -> b
$
do { ([TyVar]
scoped_kvs, ([TyVar]
tc_tvs, Type
res_kind))
<- TcM ([TyVar], ([TyVar], Type)) -> TcM ([TyVar], ([TyVar], Type))
forall a. TcM a -> TcM a
pushTcLevelM_ (TcM ([TyVar], ([TyVar], Type)) -> TcM ([TyVar], ([TyVar], Type)))
-> TcM ([TyVar], ([TyVar], Type)) -> TcM ([TyVar], ([TyVar], Type))
forall a b. (a -> b) -> a -> b
$
TcM ([TyVar], ([TyVar], Type)) -> TcM ([TyVar], ([TyVar], Type))
forall a. TcM a -> TcM a
solveEqualities (TcM ([TyVar], ([TyVar], Type)) -> TcM ([TyVar], ([TyVar], Type)))
-> TcM ([TyVar], ([TyVar], Type)) -> TcM ([TyVar], ([TyVar], Type))
forall a b. (a -> b) -> a -> b
$
HsQTvsRn -> TcM ([TyVar], Type) -> TcM ([TyVar], ([TyVar], Type))
forall a. HsQTvsRn -> TcM a -> TcM ([TyVar], a)
bindImplicitTKBndrs_Q_Skol HsQTvsRn
XHsQTvs GhcRn
kv_ns (TcM ([TyVar], Type) -> TcM ([TyVar], ([TyVar], Type)))
-> TcM ([TyVar], Type) -> TcM ([TyVar], ([TyVar], Type))
forall a b. (a -> b) -> a -> b
$
ContextKind
-> [LHsTyVarBndr () GhcRn] -> TcM Type -> TcM ([TyVar], Type)
forall a.
ContextKind -> [LHsTyVarBndr () GhcRn] -> TcM a -> TcM ([TyVar], a)
bindExplicitTKBndrs_Q_Skol ContextKind
ctxt_kind [LHsTyVarBndr () GhcRn]
hs_tvs (TcM Type -> TcM ([TyVar], Type))
-> TcM Type -> TcM ([TyVar], Type)
forall a b. (a -> b) -> a -> b
$
ContextKind -> TcM Type
newExpectedKind (ContextKind -> TcM Type) -> TcM ContextKind -> TcM Type
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< TcM ContextKind
kc_res_ki
; let spec_req_tkvs :: [TyVar]
spec_req_tkvs = [TyVar]
scoped_kvs [TyVar] -> [TyVar] -> [TyVar]
forall a. [a] -> [a] -> [a]
++ [TyVar]
tc_tvs
all_kinds :: [Type]
all_kinds = Type
res_kind Type -> [Type] -> [Type]
forall a. a -> [a] -> [a]
: (TyVar -> Type) -> [TyVar] -> [Type]
forall a b. (a -> b) -> [a] -> [b]
map TyVar -> Type
tyVarKind [TyVar]
spec_req_tkvs
; CandidatesQTvs
candidates' <- [Type] -> TcM CandidatesQTvs
candidateQTyVarsOfKinds [Type]
all_kinds
; let non_tc_candidates :: [TyVar]
non_tc_candidates = (TyVar -> Bool) -> [TyVar] -> [TyVar]
forall a. (a -> Bool) -> [a] -> [a]
filter (Bool -> Bool
not (Bool -> Bool) -> (TyVar -> Bool) -> TyVar -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. TyVar -> Bool
isTcTyVar) (TyVarSet -> [TyVar]
forall elt. UniqSet elt -> [elt]
nonDetEltsUniqSet ([Type] -> TyVarSet
tyCoVarsOfTypes [Type]
all_kinds))
candidates :: CandidatesQTvs
candidates = CandidatesQTvs
candidates' { dv_kvs :: DTyVarSet
dv_kvs = CandidatesQTvs -> DTyVarSet
dv_kvs CandidatesQTvs
candidates' DTyVarSet -> [TyVar] -> DTyVarSet
`extendDVarSetList` [TyVar]
non_tc_candidates }
inf_candidates :: CandidatesQTvs
inf_candidates = CandidatesQTvs
candidates CandidatesQTvs -> [TyVar] -> CandidatesQTvs
`delCandidates` [TyVar]
spec_req_tkvs
; [TyVar]
inferred <- CandidatesQTvs -> TcM [TyVar]
quantifyTyVars CandidatesQTvs
inf_candidates
; [TyVar]
scoped_kvs <- (TyVar -> IOEnv (Env TcGblEnv TcLclEnv) TyVar)
-> [TyVar] -> TcM [TyVar]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM TyVar -> IOEnv (Env TcGblEnv TcLclEnv) TyVar
zonkTyCoVarKind [TyVar]
scoped_kvs
; [TyVar]
tc_tvs <- (TyVar -> IOEnv (Env TcGblEnv TcLclEnv) TyVar)
-> [TyVar] -> TcM [TyVar]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM TyVar -> IOEnv (Env TcGblEnv TcLclEnv) TyVar
zonkTyCoVarKind [TyVar]
tc_tvs
; Type
res_kind <- Type -> TcM Type
zonkTcType Type
res_kind
; let mentioned_kv_set :: TyVarSet
mentioned_kv_set = CandidatesQTvs -> TyVarSet
candidateKindVars CandidatesQTvs
candidates
specified :: [TyVar]
specified = [TyVar] -> [TyVar]
scopedSort [TyVar]
scoped_kvs
final_tc_binders :: [TyConBinder]
final_tc_binders = ArgFlag -> [TyVar] -> [TyConBinder]
mkNamedTyConBinders ArgFlag
Inferred [TyVar]
inferred
[TyConBinder] -> [TyConBinder] -> [TyConBinder]
forall a. [a] -> [a] -> [a]
++ ArgFlag -> [TyVar] -> [TyConBinder]
mkNamedTyConBinders ArgFlag
Specified [TyVar]
specified
[TyConBinder] -> [TyConBinder] -> [TyConBinder]
forall a. [a] -> [a] -> [a]
++ (TyVar -> TyConBinder) -> [TyVar] -> [TyConBinder]
forall a b. (a -> b) -> [a] -> [b]
map (TyVarSet -> TyVar -> TyConBinder
mkRequiredTyConBinder TyVarSet
mentioned_kv_set) [TyVar]
tc_tvs
all_tv_prs :: [(Name, TyVar)]
all_tv_prs = [TyVar] -> [(Name, TyVar)]
mkTyVarNamePairs ([TyVar]
scoped_kvs [TyVar] -> [TyVar] -> [TyVar]
forall a. [a] -> [a] -> [a]
++ [TyVar]
tc_tvs)
tycon :: TyCon
tycon = Name
-> [TyConBinder]
-> Type
-> [(Name, TyVar)]
-> Bool
-> TyConFlavour
-> TyCon
mkTcTyCon Name
name [TyConBinder]
final_tc_binders Type
res_kind [(Name, TyVar)]
all_tv_prs
Bool
True
TyConFlavour
flav
; TyCon -> TcM ()
checkTyConTelescope TyCon
tycon
; String -> MsgDoc -> TcM ()
traceTc String
"kcCheckDeclHeader_cusk " (MsgDoc -> TcM ()) -> MsgDoc -> TcM ()
forall a b. (a -> b) -> a -> b
$
[MsgDoc] -> MsgDoc
vcat [ String -> MsgDoc
text String
"name" MsgDoc -> MsgDoc -> MsgDoc
<+> Name -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr Name
name
, String -> MsgDoc
text String
"kv_ns" MsgDoc -> MsgDoc -> MsgDoc
<+> HsQTvsRn -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr HsQTvsRn
XHsQTvs GhcRn
kv_ns
, String -> MsgDoc
text String
"hs_tvs" MsgDoc -> MsgDoc -> MsgDoc
<+> [LHsTyVarBndr () GhcRn] -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr [LHsTyVarBndr () GhcRn]
hs_tvs
, String -> MsgDoc
text String
"scoped_kvs" MsgDoc -> MsgDoc -> MsgDoc
<+> [TyVar] -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr [TyVar]
scoped_kvs
, String -> MsgDoc
text String
"tc_tvs" MsgDoc -> MsgDoc -> MsgDoc
<+> [TyVar] -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr [TyVar]
tc_tvs
, String -> MsgDoc
text String
"res_kind" MsgDoc -> MsgDoc -> MsgDoc
<+> Type -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr Type
res_kind
, String -> MsgDoc
text String
"candidates" MsgDoc -> MsgDoc -> MsgDoc
<+> CandidatesQTvs -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr CandidatesQTvs
candidates
, String -> MsgDoc
text String
"inferred" MsgDoc -> MsgDoc -> MsgDoc
<+> [TyVar] -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr [TyVar]
inferred
, String -> MsgDoc
text String
"specified" MsgDoc -> MsgDoc -> MsgDoc
<+> [TyVar] -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr [TyVar]
specified
, String -> MsgDoc
text String
"final_tc_binders" MsgDoc -> MsgDoc -> MsgDoc
<+> [TyConBinder] -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr [TyConBinder]
final_tc_binders
, String -> MsgDoc
text String
"mkTyConKind final_tc_bndrs res_kind"
MsgDoc -> MsgDoc -> MsgDoc
<+> Type -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr ([TyConBinder] -> Type -> Type
mkTyConKind [TyConBinder]
final_tc_binders Type
res_kind)
, String -> MsgDoc
text String
"all_tv_prs" MsgDoc -> MsgDoc -> MsgDoc
<+> [(Name, TyVar)] -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr [(Name, TyVar)]
all_tv_prs ]
; TyCon -> TcM TyCon
forall (m :: * -> *) a. Monad m => a -> m a
return TyCon
tycon }
where
ctxt_kind :: ContextKind
ctxt_kind | TyConFlavour -> Bool
tcFlavourIsOpen TyConFlavour
flav = Type -> ContextKind
TheKind Type
liftedTypeKind
| Bool
otherwise = ContextKind
AnyKind
kcInferDeclHeader
:: Name
-> TyConFlavour
-> LHsQTyVars GhcRn
-> TcM ContextKind
-> TcM TcTyCon
Name
name TyConFlavour
flav
(HsQTvs { hsq_ext :: forall pass. LHsQTyVars pass -> XHsQTvs pass
hsq_ext = XHsQTvs GhcRn
kv_ns
, hsq_explicit :: forall pass. LHsQTyVars pass -> [LHsTyVarBndr () pass]
hsq_explicit = [LHsTyVarBndr () GhcRn]
hs_tvs }) TcM ContextKind
kc_res_ki
= Name -> TyConFlavour -> TcM TyCon -> TcM TyCon
forall a. Name -> TyConFlavour -> TcM a -> TcM a
addTyConFlavCtxt Name
name TyConFlavour
flav (TcM TyCon -> TcM TyCon) -> TcM TyCon -> TcM TyCon
forall a b. (a -> b) -> a -> b
$
do { ([TyVar]
scoped_kvs, ([TyVar]
tc_tvs, Type
res_kind))
<- HsQTvsRn -> TcM ([TyVar], Type) -> TcM ([TyVar], ([TyVar], Type))
forall a. HsQTvsRn -> TcM a -> TcM ([TyVar], a)
bindImplicitTKBndrs_Q_Tv HsQTvsRn
XHsQTvs GhcRn
kv_ns (TcM ([TyVar], Type) -> TcM ([TyVar], ([TyVar], Type)))
-> TcM ([TyVar], Type) -> TcM ([TyVar], ([TyVar], Type))
forall a b. (a -> b) -> a -> b
$
ContextKind
-> [LHsTyVarBndr () GhcRn] -> TcM Type -> TcM ([TyVar], Type)
forall a.
ContextKind -> [LHsTyVarBndr () GhcRn] -> TcM a -> TcM ([TyVar], a)
bindExplicitTKBndrs_Q_Tv ContextKind
ctxt_kind [LHsTyVarBndr () GhcRn]
hs_tvs (TcM Type -> TcM ([TyVar], Type))
-> TcM Type -> TcM ([TyVar], Type)
forall a b. (a -> b) -> a -> b
$
ContextKind -> TcM Type
newExpectedKind (ContextKind -> TcM Type) -> TcM ContextKind -> TcM Type
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< TcM ContextKind
kc_res_ki
; let
tc_binders :: [TyConBinder]
tc_binders = AnonArgFlag -> [TyVar] -> [TyConBinder]
mkAnonTyConBinders AnonArgFlag
VisArg [TyVar]
tc_tvs
all_tv_prs :: [(Name, TyVar)]
all_tv_prs = [TyVar] -> [(Name, TyVar)]
mkTyVarNamePairs ([TyVar]
scoped_kvs [TyVar] -> [TyVar] -> [TyVar]
forall a. [a] -> [a] -> [a]
++ [TyVar]
tc_tvs)
tycon :: TyCon
tycon = Name
-> [TyConBinder]
-> Type
-> [(Name, TyVar)]
-> Bool
-> TyConFlavour
-> TyCon
mkTcTyCon Name
name [TyConBinder]
tc_binders Type
res_kind [(Name, TyVar)]
all_tv_prs
Bool
False
TyConFlavour
flav
; String -> MsgDoc -> TcM ()
traceTc String
"kcInferDeclHeader: not-cusk" (MsgDoc -> TcM ()) -> MsgDoc -> TcM ()
forall a b. (a -> b) -> a -> b
$
[MsgDoc] -> MsgDoc
vcat [ Name -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr Name
name, HsQTvsRn -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr HsQTvsRn
XHsQTvs GhcRn
kv_ns, [LHsTyVarBndr () GhcRn] -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr [LHsTyVarBndr () GhcRn]
hs_tvs
, [TyVar] -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr [TyVar]
scoped_kvs
, [TyVar] -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr [TyVar]
tc_tvs, Type -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr ([TyConBinder] -> Type -> Type
mkTyConKind [TyConBinder]
tc_binders Type
res_kind) ]
; TyCon -> TcM TyCon
forall (m :: * -> *) a. Monad m => a -> m a
return TyCon
tycon }
where
ctxt_kind :: ContextKind
ctxt_kind | TyConFlavour -> Bool
tcFlavourIsOpen TyConFlavour
flav = Type -> ContextKind
TheKind Type
liftedTypeKind
| Bool
otherwise = ContextKind
AnyKind
kcCheckDeclHeader_sig
:: Kind
-> Name
-> TyConFlavour
-> LHsQTyVars GhcRn
-> TcM ContextKind
-> TcM TcTyCon
Type
kisig Name
name TyConFlavour
flav
(HsQTvs { hsq_ext :: forall pass. LHsQTyVars pass -> XHsQTvs pass
hsq_ext = XHsQTvs GhcRn
implicit_nms
, hsq_explicit :: forall pass. LHsQTyVars pass -> [LHsTyVarBndr () pass]
hsq_explicit = [LHsTyVarBndr () GhcRn]
explicit_nms }) TcM ContextKind
kc_res_ki
= Name -> TyConFlavour -> TcM TyCon -> TcM TyCon
forall a. Name -> TyConFlavour -> TcM a -> TcM a
addTyConFlavCtxt Name
name TyConFlavour
flav (TcM TyCon -> TcM TyCon) -> TcM TyCon -> TcM TyCon
forall a b. (a -> b) -> a -> b
$
do {
let ([ZippedBinder]
zipped_binders, [LHsTyVarBndr () GhcRn]
excess_bndrs, Type
kisig') = Type
-> [LHsTyVarBndr () GhcRn]
-> ([ZippedBinder], [LHsTyVarBndr () GhcRn], Type)
zipBinders Type
kisig [LHsTyVarBndr () GhcRn]
explicit_nms
; Bool -> TcM () -> TcM ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
unless ([LHsTyVarBndr () GhcRn] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [LHsTyVarBndr () GhcRn]
excess_bndrs) (TcM () -> TcM ()) -> TcM () -> TcM ()
forall a b. (a -> b) -> a -> b
$ MsgDoc -> TcM ()
forall a. MsgDoc -> TcM a
failWithTc (Type -> [LHsTyVarBndr () GhcRn] -> MsgDoc
tooManyBindersErr Type
kisig' [LHsTyVarBndr () GhcRn]
excess_bndrs)
; ([TyConBinder]
vis_tcbs, [[(Name, TyVar)]] -> [(Name, TyVar)]
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat -> [(Name, TyVar)]
explicit_tv_prs) <- (ZippedBinder
-> IOEnv (Env TcGblEnv TcLclEnv) (TyConBinder, [(Name, TyVar)]))
-> [ZippedBinder]
-> IOEnv (Env TcGblEnv TcLclEnv) ([TyConBinder], [[(Name, TyVar)]])
forall (m :: * -> *) a b c.
Applicative m =>
(a -> m (b, c)) -> [a] -> m ([b], [c])
mapAndUnzipM ZippedBinder
-> IOEnv (Env TcGblEnv TcLclEnv) (TyConBinder, [(Name, TyVar)])
zipped_to_tcb [ZippedBinder]
zipped_binders
; ([TyVar]
implicit_tvs, ([TyBinder]
invis_binders, Type
r_ki))
<- TcM ([TyVar], ([TyBinder], Type))
-> TcM ([TyVar], ([TyBinder], Type))
forall a. TcM a -> TcM a
pushTcLevelM_ (TcM ([TyVar], ([TyBinder], Type))
-> TcM ([TyVar], ([TyBinder], Type)))
-> TcM ([TyVar], ([TyBinder], Type))
-> TcM ([TyVar], ([TyBinder], Type))
forall a b. (a -> b) -> a -> b
$
TcM ([TyVar], ([TyBinder], Type))
-> TcM ([TyVar], ([TyBinder], Type))
forall a. TcM a -> TcM a
solveEqualities (TcM ([TyVar], ([TyBinder], Type))
-> TcM ([TyVar], ([TyBinder], Type)))
-> TcM ([TyVar], ([TyBinder], Type))
-> TcM ([TyVar], ([TyBinder], Type))
forall a b. (a -> b) -> a -> b
$
HsQTvsRn
-> TcM ([TyBinder], Type) -> TcM ([TyVar], ([TyBinder], Type))
forall a. HsQTvsRn -> TcM a -> TcM ([TyVar], a)
bindImplicitTKBndrs_Tv HsQTvsRn
XHsQTvs GhcRn
implicit_nms (TcM ([TyBinder], Type) -> TcM ([TyVar], ([TyBinder], Type)))
-> TcM ([TyBinder], Type) -> TcM ([TyVar], ([TyBinder], Type))
forall a b. (a -> b) -> a -> b
$
[(Name, TyVar)] -> TcM ([TyBinder], Type) -> TcM ([TyBinder], Type)
forall r. [(Name, TyVar)] -> TcM r -> TcM r
tcExtendNameTyVarEnv [(Name, TyVar)]
explicit_tv_prs (TcM ([TyBinder], Type) -> TcM ([TyBinder], Type))
-> TcM ([TyBinder], Type) -> TcM ([TyBinder], Type)
forall a b. (a -> b) -> a -> b
$
do {
(ZippedBinder -> TcM ()) -> [ZippedBinder] -> TcM ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ ZippedBinder -> TcM ()
check_zipped_binder [ZippedBinder]
zipped_binders
; ContextKind
ctx_k <- TcM ContextKind
kc_res_ki
; Maybe Type
m_res_ki <- case ContextKind
ctx_k of
ContextKind
AnyKind -> Maybe Type -> IOEnv (Env TcGblEnv TcLclEnv) (Maybe Type)
forall (m :: * -> *) a. Monad m => a -> m a
return Maybe Type
forall a. Maybe a
Nothing
ContextKind
_ -> Type -> Maybe Type
forall a. a -> Maybe a
Just (Type -> Maybe Type)
-> TcM Type -> IOEnv (Env TcGblEnv TcLclEnv) (Maybe Type)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ContextKind -> TcM Type
newExpectedKind ContextKind
ctx_k
; let ([TyBinder]
invis_binders, Type
r_ki) = Type -> Maybe Type -> ([TyBinder], Type)
split_invis Type
kisig' Maybe Type
m_res_ki
; Maybe Type -> (Type -> TcM ()) -> TcM ()
forall (m :: * -> *) a. Monad m => Maybe a -> (a -> m ()) -> m ()
whenIsJust Maybe Type
m_res_ki ((Type -> TcM ()) -> TcM ()) -> (Type -> TcM ()) -> TcM ()
forall a b. (a -> b) -> a -> b
$ \Type
res_ki ->
TcM Coercion -> TcM ()
forall a. TcM a -> TcM ()
discardResult (TcM Coercion -> TcM ()) -> TcM Coercion -> TcM ()
forall a b. (a -> b) -> a -> b
$
Maybe (HsType GhcRn) -> Type -> Type -> TcM Coercion
unifyKind Maybe (HsType GhcRn)
forall a. Maybe a
Nothing Type
r_ki Type
res_ki
; ([TyBinder], Type) -> TcM ([TyBinder], Type)
forall (m :: * -> *) a. Monad m => a -> m a
return ([TyBinder]
invis_binders, Type
r_ki) }
; [TyVar]
implicit_tvs <- (TyVar -> IOEnv (Env TcGblEnv TcLclEnv) TyVar)
-> [TyVar] -> TcM [TyVar]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM HasDebugCallStack => TyVar -> IOEnv (Env TcGblEnv TcLclEnv) TyVar
TyVar -> IOEnv (Env TcGblEnv TcLclEnv) TyVar
zonkTcTyVarToTyVar [TyVar]
implicit_tvs
; [TyConBinder]
invis_tcbs <- (TyBinder -> IOEnv (Env TcGblEnv TcLclEnv) TyConBinder)
-> [TyBinder] -> IOEnv (Env TcGblEnv TcLclEnv) [TyConBinder]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM TyBinder -> IOEnv (Env TcGblEnv TcLclEnv) TyConBinder
invis_to_tcb [TyBinder]
invis_binders
; let tcbs :: [TyConBinder]
tcbs = [TyConBinder]
vis_tcbs [TyConBinder] -> [TyConBinder] -> [TyConBinder]
forall a. [a] -> [a] -> [a]
++ [TyConBinder]
invis_tcbs
implicit_tv_prs :: [(Name, TyVar)]
implicit_tv_prs = HsQTvsRn
XHsQTvs GhcRn
implicit_nms HsQTvsRn -> [TyVar] -> [(Name, TyVar)]
forall a b. [a] -> [b] -> [(a, b)]
`zip` [TyVar]
implicit_tvs
all_tv_prs :: [(Name, TyVar)]
all_tv_prs = [(Name, TyVar)]
implicit_tv_prs [(Name, TyVar)] -> [(Name, TyVar)] -> [(Name, TyVar)]
forall a. [a] -> [a] -> [a]
++ [(Name, TyVar)]
explicit_tv_prs
tc :: TyCon
tc = Name
-> [TyConBinder]
-> Type
-> [(Name, TyVar)]
-> Bool
-> TyConFlavour
-> TyCon
mkTcTyCon Name
name [TyConBinder]
tcbs Type
r_ki [(Name, TyVar)]
all_tv_prs Bool
True TyConFlavour
flav
; String -> MsgDoc -> TcM ()
traceTc String
"kcCheckDeclHeader_sig done:" (MsgDoc -> TcM ()) -> MsgDoc -> TcM ()
forall a b. (a -> b) -> a -> b
$ [MsgDoc] -> MsgDoc
vcat
[ String -> MsgDoc
text String
"tyConName = " MsgDoc -> MsgDoc -> MsgDoc
<+> Name -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr (TyCon -> Name
tyConName TyCon
tc)
, String -> MsgDoc
text String
"kisig =" MsgDoc -> MsgDoc -> MsgDoc
<+> Type -> MsgDoc
debugPprType Type
kisig
, String -> MsgDoc
text String
"tyConKind =" MsgDoc -> MsgDoc -> MsgDoc
<+> Type -> MsgDoc
debugPprType (TyCon -> Type
tyConKind TyCon
tc)
, String -> MsgDoc
text String
"tyConBinders = " MsgDoc -> MsgDoc -> MsgDoc
<+> [TyConBinder] -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr (TyCon -> [TyConBinder]
tyConBinders TyCon
tc)
, String -> MsgDoc
text String
"tcTyConScopedTyVars" MsgDoc -> MsgDoc -> MsgDoc
<+> [(Name, TyVar)] -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr (TyCon -> [(Name, TyVar)]
tcTyConScopedTyVars TyCon
tc)
, String -> MsgDoc
text String
"tyConResKind" MsgDoc -> MsgDoc -> MsgDoc
<+> Type -> MsgDoc
debugPprType (TyCon -> Type
tyConResKind TyCon
tc)
]
; TyCon -> TcM TyCon
forall (m :: * -> *) a. Monad m => a -> m a
return TyCon
tc }
where
zipped_to_tcb :: ZippedBinder -> TcM (TyConBinder, [(Name, TcTyVar)])
zipped_to_tcb :: ZippedBinder
-> IOEnv (Env TcGblEnv TcLclEnv) (TyConBinder, [(Name, TyVar)])
zipped_to_tcb ZippedBinder
zb = case ZippedBinder
zb of
ZippedBinder (Named (Bndr TyVar
v ArgFlag
Specified)) Maybe (LHsTyVarBndr () GhcRn)
Nothing ->
(TyConBinder, [(Name, TyVar)])
-> IOEnv (Env TcGblEnv TcLclEnv) (TyConBinder, [(Name, TyVar)])
forall (m :: * -> *) a. Monad m => a -> m a
return (ArgFlag -> TyVar -> TyConBinder
mkNamedTyConBinder ArgFlag
Specified TyVar
v, [])
ZippedBinder (Named (Bndr TyVar
v ArgFlag
Inferred)) Maybe (LHsTyVarBndr () GhcRn)
Nothing ->
(TyConBinder, [(Name, TyVar)])
-> IOEnv (Env TcGblEnv TcLclEnv) (TyConBinder, [(Name, TyVar)])
forall (m :: * -> *) a. Monad m => a -> m a
return (ArgFlag -> TyVar -> TyConBinder
mkNamedTyConBinder ArgFlag
Inferred TyVar
v, [])
ZippedBinder (Anon AnonArgFlag
InvisArg Scaled Type
bndr_ki) Maybe (LHsTyVarBndr () GhcRn)
Nothing -> do
Name
name <- OccName -> TcM Name
forall gbl lcl. OccName -> TcRnIf gbl lcl Name
newSysName (FastString -> OccName
mkTyVarOccFS (String -> FastString
fsLit String
"ev"))
let tv :: TyVar
tv = Name -> Type -> TyVar
mkTyVar Name
name (Scaled Type -> Type
forall a. Scaled a -> a
scaledThing Scaled Type
bndr_ki)
(TyConBinder, [(Name, TyVar)])
-> IOEnv (Env TcGblEnv TcLclEnv) (TyConBinder, [(Name, TyVar)])
forall (m :: * -> *) a. Monad m => a -> m a
return (AnonArgFlag -> TyVar -> TyConBinder
mkAnonTyConBinder AnonArgFlag
InvisArg TyVar
tv, [])
ZippedBinder (Anon AnonArgFlag
VisArg Scaled Type
bndr_ki) (Just LHsTyVarBndr () GhcRn
b) ->
(TyConBinder, [(Name, TyVar)])
-> IOEnv (Env TcGblEnv TcLclEnv) (TyConBinder, [(Name, TyVar)])
forall (m :: * -> *) a. Monad m => a -> m a
return ((TyConBinder, [(Name, TyVar)])
-> IOEnv (Env TcGblEnv TcLclEnv) (TyConBinder, [(Name, TyVar)]))
-> (TyConBinder, [(Name, TyVar)])
-> IOEnv (Env TcGblEnv TcLclEnv) (TyConBinder, [(Name, TyVar)])
forall a b. (a -> b) -> a -> b
$
let v_name :: Name
v_name = LHsTyVarBndr () GhcRn -> Name
forall a. NamedThing a => a -> Name
getName LHsTyVarBndr () GhcRn
b
tv :: TyVar
tv = Name -> Type -> TyVar
mkTyVar Name
v_name (Scaled Type -> Type
forall a. Scaled a -> a
scaledThing Scaled Type
bndr_ki)
tcb :: TyConBinder
tcb = AnonArgFlag -> TyVar -> TyConBinder
mkAnonTyConBinder AnonArgFlag
VisArg TyVar
tv
in (TyConBinder
tcb, [(Name
v_name, TyVar
tv)])
ZippedBinder (Named (Bndr TyVar
v ArgFlag
Required)) (Just LHsTyVarBndr () GhcRn
b) ->
(TyConBinder, [(Name, TyVar)])
-> IOEnv (Env TcGblEnv TcLclEnv) (TyConBinder, [(Name, TyVar)])
forall (m :: * -> *) a. Monad m => a -> m a
return ((TyConBinder, [(Name, TyVar)])
-> IOEnv (Env TcGblEnv TcLclEnv) (TyConBinder, [(Name, TyVar)]))
-> (TyConBinder, [(Name, TyVar)])
-> IOEnv (Env TcGblEnv TcLclEnv) (TyConBinder, [(Name, TyVar)])
forall a b. (a -> b) -> a -> b
$
let v_name :: Name
v_name = LHsTyVarBndr () GhcRn -> Name
forall a. NamedThing a => a -> Name
getName LHsTyVarBndr () GhcRn
b
tcb :: TyConBinder
tcb = ArgFlag -> TyVar -> TyConBinder
mkNamedTyConBinder ArgFlag
Required TyVar
v
in (TyConBinder
tcb, [(Name
v_name, TyVar
v)])
ZippedBinder
_ -> String
-> IOEnv (Env TcGblEnv TcLclEnv) (TyConBinder, [(Name, TyVar)])
forall a. String -> a
panic String
"goVis: invalid ZippedBinder"
invis_to_tcb :: TyCoBinder -> TcM TyConBinder
invis_to_tcb :: TyBinder -> IOEnv (Env TcGblEnv TcLclEnv) TyConBinder
invis_to_tcb TyBinder
tb = do
(TyConBinder
tcb, [(Name, TyVar)]
stv) <- ZippedBinder
-> IOEnv (Env TcGblEnv TcLclEnv) (TyConBinder, [(Name, TyVar)])
zipped_to_tcb (TyBinder -> Maybe (LHsTyVarBndr () GhcRn) -> ZippedBinder
ZippedBinder TyBinder
tb Maybe (LHsTyVarBndr () GhcRn)
forall a. Maybe a
Nothing)
MASSERT(null stv)
TyConBinder -> IOEnv (Env TcGblEnv TcLclEnv) TyConBinder
forall (m :: * -> *) a. Monad m => a -> m a
return TyConBinder
tcb
check_zipped_binder :: ZippedBinder -> TcM ()
check_zipped_binder :: ZippedBinder -> TcM ()
check_zipped_binder (ZippedBinder TyBinder
_ Maybe (LHsTyVarBndr () GhcRn)
Nothing) = () -> TcM ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()
check_zipped_binder (ZippedBinder TyBinder
tb (Just LHsTyVarBndr () GhcRn
b)) =
case LHsTyVarBndr () GhcRn -> HsTyVarBndr () GhcRn
forall l e. GenLocated l e -> e
unLoc LHsTyVarBndr () GhcRn
b of
UserTyVar XUserTyVar GhcRn
_ ()
_ GenLocated SrcSpan (IdP GhcRn)
_ -> () -> TcM ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()
KindedTyVar XKindedTyVar GhcRn
_ ()
_ GenLocated SrcSpan (IdP GhcRn)
v LHsKind GhcRn
v_hs_ki -> do
Type
v_ki <- UserTypeCtxt -> LHsKind GhcRn -> TcM Type
tcLHsKindSig (Name -> UserTypeCtxt
TyVarBndrKindCtxt (Located Name -> Name
forall l e. GenLocated l e -> e
unLoc Located Name
GenLocated SrcSpan (IdP GhcRn)
v)) LHsKind GhcRn
v_hs_ki
TcM Coercion -> TcM ()
forall a. TcM a -> TcM ()
discardResult (TcM Coercion -> TcM ()) -> TcM Coercion -> TcM ()
forall a b. (a -> b) -> a -> b
$
Maybe (HsType GhcRn) -> Type -> Type -> TcM Coercion
unifyKind (HsType GhcRn -> Maybe (HsType GhcRn)
forall a. a -> Maybe a
Just (XTyVar GhcRn
-> PromotionFlag -> GenLocated SrcSpan (IdP GhcRn) -> HsType GhcRn
forall pass.
XTyVar pass -> PromotionFlag -> Located (IdP pass) -> HsType pass
HsTyVar NoExtField
XTyVar GhcRn
noExtField PromotionFlag
NotPromoted GenLocated SrcSpan (IdP GhcRn)
v))
(TyBinder -> Type
tyBinderType TyBinder
tb)
Type
v_ki
split_invis :: Kind -> Maybe Kind -> ([TyCoBinder], Kind)
split_invis :: Type -> Maybe Type -> ([TyBinder], Type)
split_invis Type
sig_ki Maybe Type
Nothing =
Type -> ([TyBinder], Type)
splitPiTysInvisible Type
sig_ki
split_invis Type
sig_ki (Just Type
res_ki) =
let n_res_invis_bndrs :: Arity
n_res_invis_bndrs = Type -> Arity
invisibleTyBndrCount Type
res_ki
n_sig_invis_bndrs :: Arity
n_sig_invis_bndrs = Type -> Arity
invisibleTyBndrCount Type
sig_ki
n_inst :: Arity
n_inst = Arity
n_sig_invis_bndrs Arity -> Arity -> Arity
forall a. Num a => a -> a -> a
- Arity
n_res_invis_bndrs
in Arity -> Type -> ([TyBinder], Type)
splitPiTysInvisibleN Arity
n_inst Type
sig_ki
data ZippedBinder =
ZippedBinder TyBinder (Maybe (LHsTyVarBndr () GhcRn))
zipBinders
:: Kind
-> [LHsTyVarBndr () GhcRn]
-> ([ZippedBinder],
[LHsTyVarBndr () GhcRn],
Kind)
zipBinders :: Type
-> [LHsTyVarBndr () GhcRn]
-> ([ZippedBinder], [LHsTyVarBndr () GhcRn], Type)
zipBinders = [ZippedBinder]
-> Type
-> [LHsTyVarBndr () GhcRn]
-> ([ZippedBinder], [LHsTyVarBndr () GhcRn], Type)
zip_binders []
where
zip_binders :: [ZippedBinder]
-> Type
-> [LHsTyVarBndr () GhcRn]
-> ([ZippedBinder], [LHsTyVarBndr () GhcRn], Type)
zip_binders [ZippedBinder]
acc Type
ki [] = ([ZippedBinder] -> [ZippedBinder]
forall a. [a] -> [a]
reverse [ZippedBinder]
acc, [], Type
ki)
zip_binders [ZippedBinder]
acc Type
ki (LHsTyVarBndr () GhcRn
b:[LHsTyVarBndr () GhcRn]
bs) =
case Type -> Maybe (TyBinder, Type)
tcSplitPiTy_maybe Type
ki of
Maybe (TyBinder, Type)
Nothing -> ([ZippedBinder] -> [ZippedBinder]
forall a. [a] -> [a]
reverse [ZippedBinder]
acc, LHsTyVarBndr () GhcRn
bLHsTyVarBndr () GhcRn
-> [LHsTyVarBndr () GhcRn] -> [LHsTyVarBndr () GhcRn]
forall a. a -> [a] -> [a]
:[LHsTyVarBndr () GhcRn]
bs, Type
ki)
Just (TyBinder
tb, Type
ki') ->
let
(ZippedBinder
zb, [LHsTyVarBndr () GhcRn]
bs') | Bool
zippable = (TyBinder -> Maybe (LHsTyVarBndr () GhcRn) -> ZippedBinder
ZippedBinder TyBinder
tb (LHsTyVarBndr () GhcRn -> Maybe (LHsTyVarBndr () GhcRn)
forall a. a -> Maybe a
Just LHsTyVarBndr () GhcRn
b), [LHsTyVarBndr () GhcRn]
bs)
| Bool
otherwise = (TyBinder -> Maybe (LHsTyVarBndr () GhcRn) -> ZippedBinder
ZippedBinder TyBinder
tb Maybe (LHsTyVarBndr () GhcRn)
forall a. Maybe a
Nothing, LHsTyVarBndr () GhcRn
bLHsTyVarBndr () GhcRn
-> [LHsTyVarBndr () GhcRn] -> [LHsTyVarBndr () GhcRn]
forall a. a -> [a] -> [a]
:[LHsTyVarBndr () GhcRn]
bs)
zippable :: Bool
zippable =
case TyBinder
tb of
Named (Bndr TyVar
_ (Invisible Specificity
_)) -> Bool
False
Named (Bndr TyVar
_ ArgFlag
Required) -> Bool
True
Anon AnonArgFlag
InvisArg Scaled Type
_ -> Bool
False
Anon AnonArgFlag
VisArg Scaled Type
_ -> Bool
True
in
[ZippedBinder]
-> Type
-> [LHsTyVarBndr () GhcRn]
-> ([ZippedBinder], [LHsTyVarBndr () GhcRn], Type)
zip_binders (ZippedBinder
zbZippedBinder -> [ZippedBinder] -> [ZippedBinder]
forall a. a -> [a] -> [a]
:[ZippedBinder]
acc) Type
ki' [LHsTyVarBndr () GhcRn]
bs'
tooManyBindersErr :: Kind -> [LHsTyVarBndr () GhcRn] -> SDoc
tooManyBindersErr :: Type -> [LHsTyVarBndr () GhcRn] -> MsgDoc
tooManyBindersErr Type
ki [LHsTyVarBndr () GhcRn]
bndrs =
MsgDoc -> Arity -> MsgDoc -> MsgDoc
hang (String -> MsgDoc
text String
"Not a function kind:")
Arity
4 (Type -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr Type
ki) MsgDoc -> MsgDoc -> MsgDoc
$$
MsgDoc -> Arity -> MsgDoc -> MsgDoc
hang (String -> MsgDoc
text String
"but extra binders found:")
Arity
4 ([MsgDoc] -> MsgDoc
fsep ((LHsTyVarBndr () GhcRn -> MsgDoc)
-> [LHsTyVarBndr () GhcRn] -> [MsgDoc]
forall a b. (a -> b) -> [a] -> [b]
map LHsTyVarBndr () GhcRn -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr [LHsTyVarBndr () GhcRn]
bndrs))
data ContextKind = TheKind Kind
| AnyKind
| OpenKind
newExpectedKind :: ContextKind -> TcM Kind
newExpectedKind :: ContextKind -> TcM Type
newExpectedKind (TheKind Type
k) = Type -> TcM Type
forall (m :: * -> *) a. Monad m => a -> m a
return Type
k
newExpectedKind ContextKind
AnyKind = TcM Type
newMetaKindVar
newExpectedKind ContextKind
OpenKind = TcM Type
newOpenTypeKind
expectedKindInCtxt :: UserTypeCtxt -> ContextKind
expectedKindInCtxt :: UserTypeCtxt -> ContextKind
expectedKindInCtxt (TySynCtxt Name
_) = ContextKind
AnyKind
expectedKindInCtxt UserTypeCtxt
ThBrackCtxt = ContextKind
AnyKind
expectedKindInCtxt (GhciCtxt {}) = ContextKind
AnyKind
expectedKindInCtxt UserTypeCtxt
DefaultDeclCtxt = ContextKind
AnyKind
expectedKindInCtxt UserTypeCtxt
TypeAppCtxt = ContextKind
AnyKind
expectedKindInCtxt (ForSigCtxt Name
_) = Type -> ContextKind
TheKind Type
liftedTypeKind
expectedKindInCtxt (InstDeclCtxt {}) = Type -> ContextKind
TheKind Type
constraintKind
expectedKindInCtxt UserTypeCtxt
SpecInstCtxt = Type -> ContextKind
TheKind Type
constraintKind
expectedKindInCtxt UserTypeCtxt
_ = ContextKind
OpenKind
bindImplicitTKBndrs_Skol, bindImplicitTKBndrs_Tv,
bindImplicitTKBndrs_Q_Skol, bindImplicitTKBndrs_Q_Tv
:: [Name] -> TcM a -> TcM ([TcTyVar], a)
bindImplicitTKBndrs_Q_Skol :: forall a. HsQTvsRn -> TcM a -> TcM ([TyVar], a)
bindImplicitTKBndrs_Q_Skol = (Name -> IOEnv (Env TcGblEnv TcLclEnv) TyVar)
-> HsQTvsRn -> TcM a -> TcM ([TyVar], a)
forall a.
(Name -> IOEnv (Env TcGblEnv TcLclEnv) TyVar)
-> HsQTvsRn -> TcM a -> TcM ([TyVar], a)
bindImplicitTKBndrsX ((Name -> IOEnv (Env TcGblEnv TcLclEnv) TyVar)
-> Name -> IOEnv (Env TcGblEnv TcLclEnv) TyVar
newImplicitTyVarQ Name -> IOEnv (Env TcGblEnv TcLclEnv) TyVar
newFlexiKindedSkolemTyVar)
bindImplicitTKBndrs_Q_Tv :: forall a. HsQTvsRn -> TcM a -> TcM ([TyVar], a)
bindImplicitTKBndrs_Q_Tv = (Name -> IOEnv (Env TcGblEnv TcLclEnv) TyVar)
-> HsQTvsRn -> TcM a -> TcM ([TyVar], a)
forall a.
(Name -> IOEnv (Env TcGblEnv TcLclEnv) TyVar)
-> HsQTvsRn -> TcM a -> TcM ([TyVar], a)
bindImplicitTKBndrsX ((Name -> IOEnv (Env TcGblEnv TcLclEnv) TyVar)
-> Name -> IOEnv (Env TcGblEnv TcLclEnv) TyVar
newImplicitTyVarQ Name -> IOEnv (Env TcGblEnv TcLclEnv) TyVar
newFlexiKindedTyVarTyVar)
bindImplicitTKBndrs_Skol :: forall a. HsQTvsRn -> TcM a -> TcM ([TyVar], a)
bindImplicitTKBndrs_Skol = (Name -> IOEnv (Env TcGblEnv TcLclEnv) TyVar)
-> HsQTvsRn -> TcM a -> TcM ([TyVar], a)
forall a.
(Name -> IOEnv (Env TcGblEnv TcLclEnv) TyVar)
-> HsQTvsRn -> TcM a -> TcM ([TyVar], a)
bindImplicitTKBndrsX Name -> IOEnv (Env TcGblEnv TcLclEnv) TyVar
newFlexiKindedSkolemTyVar
bindImplicitTKBndrs_Tv :: forall a. HsQTvsRn -> TcM a -> TcM ([TyVar], a)
bindImplicitTKBndrs_Tv = (Name -> IOEnv (Env TcGblEnv TcLclEnv) TyVar)
-> HsQTvsRn -> TcM a -> TcM ([TyVar], a)
forall a.
(Name -> IOEnv (Env TcGblEnv TcLclEnv) TyVar)
-> HsQTvsRn -> TcM a -> TcM ([TyVar], a)
bindImplicitTKBndrsX Name -> IOEnv (Env TcGblEnv TcLclEnv) TyVar
cloneFlexiKindedTyVarTyVar
bindImplicitTKBndrsX
:: (Name -> TcM TcTyVar)
-> [Name]
-> TcM a
-> TcM ([TcTyVar], a)
bindImplicitTKBndrsX :: forall a.
(Name -> IOEnv (Env TcGblEnv TcLclEnv) TyVar)
-> HsQTvsRn -> TcM a -> TcM ([TyVar], a)
bindImplicitTKBndrsX Name -> IOEnv (Env TcGblEnv TcLclEnv) TyVar
new_tv HsQTvsRn
tv_names TcM a
thing_inside
= do { [TyVar]
tkvs <- (Name -> IOEnv (Env TcGblEnv TcLclEnv) TyVar)
-> HsQTvsRn -> TcM [TyVar]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM Name -> IOEnv (Env TcGblEnv TcLclEnv) TyVar
new_tv HsQTvsRn
tv_names
; String -> MsgDoc -> TcM ()
traceTc String
"bindImplicitTKBndrs" (HsQTvsRn -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr HsQTvsRn
tv_names MsgDoc -> MsgDoc -> MsgDoc
$$ [TyVar] -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr [TyVar]
tkvs)
; a
res <- [(Name, TyVar)] -> TcM a -> TcM a
forall r. [(Name, TyVar)] -> TcM r -> TcM r
tcExtendNameTyVarEnv (HsQTvsRn
tv_names HsQTvsRn -> [TyVar] -> [(Name, TyVar)]
forall a b. [a] -> [b] -> [(a, b)]
`zip` [TyVar]
tkvs)
TcM a
thing_inside
; ([TyVar], a) -> TcM ([TyVar], a)
forall (m :: * -> *) a. Monad m => a -> m a
return ([TyVar]
tkvs, a
res) }
newImplicitTyVarQ :: (Name -> TcM TcTyVar) -> Name -> TcM TcTyVar
newImplicitTyVarQ :: (Name -> IOEnv (Env TcGblEnv TcLclEnv) TyVar)
-> Name -> IOEnv (Env TcGblEnv TcLclEnv) TyVar
newImplicitTyVarQ Name -> IOEnv (Env TcGblEnv TcLclEnv) TyVar
new_tv Name
name
= do { Maybe TcTyThing
mb_tv <- Name -> TcM (Maybe TcTyThing)
tcLookupLcl_maybe Name
name
; case Maybe TcTyThing
mb_tv of
Just (ATyVar Name
_ TyVar
tv) -> TyVar -> IOEnv (Env TcGblEnv TcLclEnv) TyVar
forall (m :: * -> *) a. Monad m => a -> m a
return TyVar
tv
Maybe TcTyThing
_ -> Name -> IOEnv (Env TcGblEnv TcLclEnv) TyVar
new_tv Name
name }
newFlexiKindedTyVar :: (Name -> Kind -> TcM TyVar) -> Name -> TcM TyVar
newFlexiKindedTyVar :: (Name -> Type -> IOEnv (Env TcGblEnv TcLclEnv) TyVar)
-> Name -> IOEnv (Env TcGblEnv TcLclEnv) TyVar
newFlexiKindedTyVar Name -> Type -> IOEnv (Env TcGblEnv TcLclEnv) TyVar
new_tv Name
name
= do { Type
kind <- TcM Type
newMetaKindVar
; Name -> Type -> IOEnv (Env TcGblEnv TcLclEnv) TyVar
new_tv Name
name Type
kind }
newFlexiKindedSkolemTyVar :: Name -> TcM TyVar
newFlexiKindedSkolemTyVar :: Name -> IOEnv (Env TcGblEnv TcLclEnv) TyVar
newFlexiKindedSkolemTyVar = (Name -> Type -> IOEnv (Env TcGblEnv TcLclEnv) TyVar)
-> Name -> IOEnv (Env TcGblEnv TcLclEnv) TyVar
newFlexiKindedTyVar Name -> Type -> IOEnv (Env TcGblEnv TcLclEnv) TyVar
newSkolemTyVar
newFlexiKindedTyVarTyVar :: Name -> TcM TyVar
newFlexiKindedTyVarTyVar :: Name -> IOEnv (Env TcGblEnv TcLclEnv) TyVar
newFlexiKindedTyVarTyVar = (Name -> Type -> IOEnv (Env TcGblEnv TcLclEnv) TyVar)
-> Name -> IOEnv (Env TcGblEnv TcLclEnv) TyVar
newFlexiKindedTyVar Name -> Type -> IOEnv (Env TcGblEnv TcLclEnv) TyVar
newTyVarTyVar
cloneFlexiKindedTyVarTyVar :: Name -> TcM TyVar
cloneFlexiKindedTyVarTyVar :: Name -> IOEnv (Env TcGblEnv TcLclEnv) TyVar
cloneFlexiKindedTyVarTyVar = (Name -> Type -> IOEnv (Env TcGblEnv TcLclEnv) TyVar)
-> Name -> IOEnv (Env TcGblEnv TcLclEnv) TyVar
newFlexiKindedTyVar Name -> Type -> IOEnv (Env TcGblEnv TcLclEnv) TyVar
cloneTyVarTyVar
bindExplicitTKTele_Skol_M
:: TcTyMode
-> HsForAllTelescope GhcRn
-> TcM a
-> TcM (Either [TcReqTVBinder] [TcInvisTVBinder], a)
bindExplicitTKTele_Skol_M :: forall a.
TcTyMode
-> HsForAllTelescope GhcRn
-> TcM a
-> TcM (Either [TcReqTVBinder] [VarBndr TyVar Specificity], a)
bindExplicitTKTele_Skol_M TcTyMode
mode HsForAllTelescope GhcRn
tele TcM a
thing_inside = case HsForAllTelescope GhcRn
tele of
HsForAllVis { hsf_vis_bndrs :: forall pass. HsForAllTelescope pass -> [LHsTyVarBndr () pass]
hsf_vis_bndrs = [LHsTyVarBndr () GhcRn]
bndrs } -> do
([TcReqTVBinder]
req_tv_bndrs, a
thing) <- TcTyMode
-> [LHsTyVarBndr () GhcRn] -> TcM a -> TcM ([TcReqTVBinder], a)
forall flag a.
OutputableBndrFlag flag =>
TcTyMode
-> [LHsTyVarBndr flag GhcRn]
-> TcM a
-> TcM ([VarBndr TyVar flag], a)
bindExplicitTKBndrs_Skol_M TcTyMode
mode [LHsTyVarBndr () GhcRn]
bndrs TcM a
thing_inside
(Either [TcReqTVBinder] [VarBndr TyVar Specificity], a)
-> TcM (Either [TcReqTVBinder] [VarBndr TyVar Specificity], a)
forall (f :: * -> *) a. Applicative f => a -> f a
pure ([TcReqTVBinder]
-> Either [TcReqTVBinder] [VarBndr TyVar Specificity]
forall a b. a -> Either a b
Left [TcReqTVBinder]
req_tv_bndrs, a
thing)
HsForAllInvis { hsf_invis_bndrs :: forall pass.
HsForAllTelescope pass -> [LHsTyVarBndr Specificity pass]
hsf_invis_bndrs = [LHsTyVarBndr Specificity GhcRn]
bndrs } -> do
([VarBndr TyVar Specificity]
inv_tv_bndrs, a
thing) <- TcTyMode
-> [LHsTyVarBndr Specificity GhcRn]
-> TcM a
-> TcM ([VarBndr TyVar Specificity], a)
forall flag a.
OutputableBndrFlag flag =>
TcTyMode
-> [LHsTyVarBndr flag GhcRn]
-> TcM a
-> TcM ([VarBndr TyVar flag], a)
bindExplicitTKBndrs_Skol_M TcTyMode
mode [LHsTyVarBndr Specificity GhcRn]
bndrs TcM a
thing_inside
(Either [TcReqTVBinder] [VarBndr TyVar Specificity], a)
-> TcM (Either [TcReqTVBinder] [VarBndr TyVar Specificity], a)
forall (f :: * -> *) a. Applicative f => a -> f a
pure ([VarBndr TyVar Specificity]
-> Either [TcReqTVBinder] [VarBndr TyVar Specificity]
forall a b. b -> Either a b
Right [VarBndr TyVar Specificity]
inv_tv_bndrs, a
thing)
bindExplicitTKBndrs_Skol, bindExplicitTKBndrs_Tv
:: (OutputableBndrFlag flag)
=> [LHsTyVarBndr flag GhcRn]
-> TcM a
-> TcM ([VarBndr TyVar flag], a)
bindExplicitTKBndrs_Skol_M, bindExplicitTKBndrs_Tv_M
:: (OutputableBndrFlag flag)
=> TcTyMode
-> [LHsTyVarBndr flag GhcRn]
-> TcM a
-> TcM ([VarBndr TyVar flag], a)
bindExplicitTKBndrs_Skol :: forall flag a.
OutputableBndrFlag flag =>
[LHsTyVarBndr flag GhcRn] -> TcM a -> TcM ([VarBndr TyVar flag], a)
bindExplicitTKBndrs_Skol = (HsTyVarBndr flag GhcRn -> IOEnv (Env TcGblEnv TcLclEnv) TyVar)
-> [LHsTyVarBndr flag GhcRn]
-> TcM a
-> TcM ([VarBndr TyVar flag], a)
forall flag a.
OutputableBndrFlag flag =>
(HsTyVarBndr flag GhcRn -> IOEnv (Env TcGblEnv TcLclEnv) TyVar)
-> [LHsTyVarBndr flag GhcRn]
-> TcM a
-> TcM ([VarBndr TyVar flag], a)
bindExplicitTKBndrsX (TcTyMode
-> (Name -> Type -> IOEnv (Env TcGblEnv TcLclEnv) TyVar)
-> HsTyVarBndr flag GhcRn
-> IOEnv (Env TcGblEnv TcLclEnv) TyVar
forall flag.
TcTyMode
-> (Name -> Type -> IOEnv (Env TcGblEnv TcLclEnv) TyVar)
-> HsTyVarBndr flag GhcRn
-> IOEnv (Env TcGblEnv TcLclEnv) TyVar
tcHsTyVarBndr (TypeOrKind -> TcTyMode
mkMode TypeOrKind
KindLevel) Name -> Type -> IOEnv (Env TcGblEnv TcLclEnv) TyVar
newSkolemTyVar)
bindExplicitTKBndrs_Skol_M :: forall flag a.
OutputableBndrFlag flag =>
TcTyMode
-> [LHsTyVarBndr flag GhcRn]
-> TcM a
-> TcM ([VarBndr TyVar flag], a)
bindExplicitTKBndrs_Skol_M TcTyMode
mode = (HsTyVarBndr flag GhcRn -> IOEnv (Env TcGblEnv TcLclEnv) TyVar)
-> [LHsTyVarBndr flag GhcRn]
-> TcM a
-> TcM ([VarBndr TyVar flag], a)
forall flag a.
OutputableBndrFlag flag =>
(HsTyVarBndr flag GhcRn -> IOEnv (Env TcGblEnv TcLclEnv) TyVar)
-> [LHsTyVarBndr flag GhcRn]
-> TcM a
-> TcM ([VarBndr TyVar flag], a)
bindExplicitTKBndrsX (TcTyMode
-> (Name -> Type -> IOEnv (Env TcGblEnv TcLclEnv) TyVar)
-> HsTyVarBndr flag GhcRn
-> IOEnv (Env TcGblEnv TcLclEnv) TyVar
forall flag.
TcTyMode
-> (Name -> Type -> IOEnv (Env TcGblEnv TcLclEnv) TyVar)
-> HsTyVarBndr flag GhcRn
-> IOEnv (Env TcGblEnv TcLclEnv) TyVar
tcHsTyVarBndr (TcTyMode -> TcTyMode
kindLevel TcTyMode
mode) Name -> Type -> IOEnv (Env TcGblEnv TcLclEnv) TyVar
newSkolemTyVar)
bindExplicitTKBndrs_Tv :: forall flag a.
OutputableBndrFlag flag =>
[LHsTyVarBndr flag GhcRn] -> TcM a -> TcM ([VarBndr TyVar flag], a)
bindExplicitTKBndrs_Tv = (HsTyVarBndr flag GhcRn -> IOEnv (Env TcGblEnv TcLclEnv) TyVar)
-> [LHsTyVarBndr flag GhcRn]
-> TcM a
-> TcM ([VarBndr TyVar flag], a)
forall flag a.
OutputableBndrFlag flag =>
(HsTyVarBndr flag GhcRn -> IOEnv (Env TcGblEnv TcLclEnv) TyVar)
-> [LHsTyVarBndr flag GhcRn]
-> TcM a
-> TcM ([VarBndr TyVar flag], a)
bindExplicitTKBndrsX (TcTyMode
-> (Name -> Type -> IOEnv (Env TcGblEnv TcLclEnv) TyVar)
-> HsTyVarBndr flag GhcRn
-> IOEnv (Env TcGblEnv TcLclEnv) TyVar
forall flag.
TcTyMode
-> (Name -> Type -> IOEnv (Env TcGblEnv TcLclEnv) TyVar)
-> HsTyVarBndr flag GhcRn
-> IOEnv (Env TcGblEnv TcLclEnv) TyVar
tcHsTyVarBndr (TypeOrKind -> TcTyMode
mkMode TypeOrKind
KindLevel) Name -> Type -> IOEnv (Env TcGblEnv TcLclEnv) TyVar
cloneTyVarTyVar)
bindExplicitTKBndrs_Tv_M :: forall flag a.
OutputableBndrFlag flag =>
TcTyMode
-> [LHsTyVarBndr flag GhcRn]
-> TcM a
-> TcM ([VarBndr TyVar flag], a)
bindExplicitTKBndrs_Tv_M TcTyMode
mode = (HsTyVarBndr flag GhcRn -> IOEnv (Env TcGblEnv TcLclEnv) TyVar)
-> [LHsTyVarBndr flag GhcRn]
-> TcM a
-> TcM ([VarBndr TyVar flag], a)
forall flag a.
OutputableBndrFlag flag =>
(HsTyVarBndr flag GhcRn -> IOEnv (Env TcGblEnv TcLclEnv) TyVar)
-> [LHsTyVarBndr flag GhcRn]
-> TcM a
-> TcM ([VarBndr TyVar flag], a)
bindExplicitTKBndrsX (TcTyMode
-> (Name -> Type -> IOEnv (Env TcGblEnv TcLclEnv) TyVar)
-> HsTyVarBndr flag GhcRn
-> IOEnv (Env TcGblEnv TcLclEnv) TyVar
forall flag.
TcTyMode
-> (Name -> Type -> IOEnv (Env TcGblEnv TcLclEnv) TyVar)
-> HsTyVarBndr flag GhcRn
-> IOEnv (Env TcGblEnv TcLclEnv) TyVar
tcHsTyVarBndr (TcTyMode -> TcTyMode
kindLevel TcTyMode
mode) Name -> Type -> IOEnv (Env TcGblEnv TcLclEnv) TyVar
cloneTyVarTyVar)
bindExplicitTKBndrs_Q_Skol, bindExplicitTKBndrs_Q_Tv
:: ContextKind
-> [LHsTyVarBndr () GhcRn]
-> TcM a
-> TcM ([TcTyVar], a)
bindExplicitTKBndrs_Q_Skol :: forall a.
ContextKind -> [LHsTyVarBndr () GhcRn] -> TcM a -> TcM ([TyVar], a)
bindExplicitTKBndrs_Q_Skol ContextKind
ctxt_kind = (HsTyVarBndr () GhcRn -> IOEnv (Env TcGblEnv TcLclEnv) TyVar)
-> [LHsTyVarBndr () GhcRn] -> TcM a -> TcM ([TyVar], a)
forall a.
(HsTyVarBndr () GhcRn -> IOEnv (Env TcGblEnv TcLclEnv) TyVar)
-> [LHsTyVarBndr () GhcRn] -> TcM a -> TcM ([TyVar], a)
bindExplicitTKBndrsX_Q (ContextKind
-> (Name -> Type -> IOEnv (Env TcGblEnv TcLclEnv) TyVar)
-> HsTyVarBndr () GhcRn
-> IOEnv (Env TcGblEnv TcLclEnv) TyVar
tcHsQTyVarBndr ContextKind
ctxt_kind Name -> Type -> IOEnv (Env TcGblEnv TcLclEnv) TyVar
newSkolemTyVar)
bindExplicitTKBndrs_Q_Tv :: forall a.
ContextKind -> [LHsTyVarBndr () GhcRn] -> TcM a -> TcM ([TyVar], a)
bindExplicitTKBndrs_Q_Tv ContextKind
ctxt_kind = (HsTyVarBndr () GhcRn -> IOEnv (Env TcGblEnv TcLclEnv) TyVar)
-> [LHsTyVarBndr () GhcRn] -> TcM a -> TcM ([TyVar], a)
forall a.
(HsTyVarBndr () GhcRn -> IOEnv (Env TcGblEnv TcLclEnv) TyVar)
-> [LHsTyVarBndr () GhcRn] -> TcM a -> TcM ([TyVar], a)
bindExplicitTKBndrsX_Q (ContextKind
-> (Name -> Type -> IOEnv (Env TcGblEnv TcLclEnv) TyVar)
-> HsTyVarBndr () GhcRn
-> IOEnv (Env TcGblEnv TcLclEnv) TyVar
tcHsQTyVarBndr ContextKind
ctxt_kind Name -> Type -> IOEnv (Env TcGblEnv TcLclEnv) TyVar
newTyVarTyVar)
bindExplicitTKBndrsX_Q
:: (HsTyVarBndr () GhcRn -> TcM TcTyVar)
-> [LHsTyVarBndr () GhcRn]
-> TcM a
-> TcM ([TcTyVar], a)
bindExplicitTKBndrsX_Q :: forall a.
(HsTyVarBndr () GhcRn -> IOEnv (Env TcGblEnv TcLclEnv) TyVar)
-> [LHsTyVarBndr () GhcRn] -> TcM a -> TcM ([TyVar], a)
bindExplicitTKBndrsX_Q HsTyVarBndr () GhcRn -> IOEnv (Env TcGblEnv TcLclEnv) TyVar
tc_tv [LHsTyVarBndr () GhcRn]
hs_tvs TcM a
thing_inside
= do { ([TcReqTVBinder]
tv_bndrs,a
res) <- (HsTyVarBndr () GhcRn -> IOEnv (Env TcGblEnv TcLclEnv) TyVar)
-> [LHsTyVarBndr () GhcRn] -> TcM a -> TcM ([TcReqTVBinder], a)
forall flag a.
OutputableBndrFlag flag =>
(HsTyVarBndr flag GhcRn -> IOEnv (Env TcGblEnv TcLclEnv) TyVar)
-> [LHsTyVarBndr flag GhcRn]
-> TcM a
-> TcM ([VarBndr TyVar flag], a)
bindExplicitTKBndrsX HsTyVarBndr () GhcRn -> IOEnv (Env TcGblEnv TcLclEnv) TyVar
tc_tv [LHsTyVarBndr () GhcRn]
hs_tvs TcM a
thing_inside
; ([TyVar], a) -> TcM ([TyVar], a)
forall (m :: * -> *) a. Monad m => a -> m a
return (([TcReqTVBinder] -> [TyVar]
forall tv argf. [VarBndr tv argf] -> [tv]
binderVars [TcReqTVBinder]
tv_bndrs),a
res) }
bindExplicitTKBndrsX :: (OutputableBndrFlag flag)
=> (HsTyVarBndr flag GhcRn -> TcM TcTyVar)
-> [LHsTyVarBndr flag GhcRn]
-> TcM a
-> TcM ([VarBndr TyVar flag], a)
bindExplicitTKBndrsX :: forall flag a.
OutputableBndrFlag flag =>
(HsTyVarBndr flag GhcRn -> IOEnv (Env TcGblEnv TcLclEnv) TyVar)
-> [LHsTyVarBndr flag GhcRn]
-> TcM a
-> TcM ([VarBndr TyVar flag], a)
bindExplicitTKBndrsX HsTyVarBndr flag GhcRn -> IOEnv (Env TcGblEnv TcLclEnv) TyVar
tc_tv [LHsTyVarBndr flag GhcRn]
hs_tvs TcM a
thing_inside
= do { String -> MsgDoc -> TcM ()
traceTc String
"bindExplicTKBndrs" ([LHsTyVarBndr flag GhcRn] -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr [LHsTyVarBndr flag GhcRn]
hs_tvs)
; [LHsTyVarBndr flag GhcRn] -> TcM ([VarBndr TyVar flag], a)
go [LHsTyVarBndr flag GhcRn]
hs_tvs }
where
go :: [LHsTyVarBndr flag GhcRn] -> TcM ([VarBndr TyVar flag], a)
go [] = do { a
res <- TcM a
thing_inside
; ([VarBndr TyVar flag], a) -> TcM ([VarBndr TyVar flag], a)
forall (m :: * -> *) a. Monad m => a -> m a
return ([], a
res) }
go (L SrcSpan
_ HsTyVarBndr flag GhcRn
hs_tv : [LHsTyVarBndr flag GhcRn]
hs_tvs)
= do { TyVar
tv <- HsTyVarBndr flag GhcRn -> IOEnv (Env TcGblEnv TcLclEnv) TyVar
tc_tv HsTyVarBndr flag GhcRn
hs_tv
; ([VarBndr TyVar flag]
tvs,a
res) <- [(Name, TyVar)]
-> TcM ([VarBndr TyVar flag], a) -> TcM ([VarBndr TyVar flag], a)
forall r. [(Name, TyVar)] -> TcM r -> TcM r
tcExtendNameTyVarEnv [(HsTyVarBndr flag GhcRn -> IdP GhcRn
forall flag (p :: Pass).
HsTyVarBndr flag (GhcPass p) -> IdP (GhcPass p)
hsTyVarName HsTyVarBndr flag GhcRn
hs_tv, TyVar
tv)] (TcM ([VarBndr TyVar flag], a) -> TcM ([VarBndr TyVar flag], a))
-> TcM ([VarBndr TyVar flag], a) -> TcM ([VarBndr TyVar flag], a)
forall a b. (a -> b) -> a -> b
$
[LHsTyVarBndr flag GhcRn] -> TcM ([VarBndr TyVar flag], a)
go [LHsTyVarBndr flag GhcRn]
hs_tvs
; ([VarBndr TyVar flag], a) -> TcM ([VarBndr TyVar flag], a)
forall (m :: * -> *) a. Monad m => a -> m a
return ((TyVar -> flag -> VarBndr TyVar flag
forall var argf. var -> argf -> VarBndr var argf
Bndr TyVar
tv (HsTyVarBndr flag GhcRn -> flag
forall flag (pass :: Pass). HsTyVarBndr flag (GhcPass pass) -> flag
hsTyVarBndrFlag HsTyVarBndr flag GhcRn
hs_tv))VarBndr TyVar flag -> [VarBndr TyVar flag] -> [VarBndr TyVar flag]
forall a. a -> [a] -> [a]
:[VarBndr TyVar flag]
tvs, a
res) }
tcHsTyVarBndr :: TcTyMode -> (Name -> Kind -> TcM TyVar)
-> HsTyVarBndr flag GhcRn -> TcM TcTyVar
tcHsTyVarBndr :: forall flag.
TcTyMode
-> (Name -> Type -> IOEnv (Env TcGblEnv TcLclEnv) TyVar)
-> HsTyVarBndr flag GhcRn
-> IOEnv (Env TcGblEnv TcLclEnv) TyVar
tcHsTyVarBndr TcTyMode
_ Name -> Type -> IOEnv (Env TcGblEnv TcLclEnv) TyVar
new_tv (UserTyVar XUserTyVar GhcRn
_ flag
_ (L SrcSpan
_ IdP GhcRn
tv_nm))
= do { Type
kind <- TcM Type
newMetaKindVar
; Name -> Type -> IOEnv (Env TcGblEnv TcLclEnv) TyVar
new_tv Name
IdP GhcRn
tv_nm Type
kind }
tcHsTyVarBndr TcTyMode
mode Name -> Type -> IOEnv (Env TcGblEnv TcLclEnv) TyVar
new_tv (KindedTyVar XKindedTyVar GhcRn
_ flag
_ (L SrcSpan
_ IdP GhcRn
tv_nm) LHsKind GhcRn
lhs_kind)
= do { Type
kind <- TcTyMode -> UserTypeCtxt -> LHsKind GhcRn -> TcM Type
tc_lhs_kind_sig TcTyMode
mode (Name -> UserTypeCtxt
TyVarBndrKindCtxt Name
IdP GhcRn
tv_nm) LHsKind GhcRn
lhs_kind
; Name -> Type -> IOEnv (Env TcGblEnv TcLclEnv) TyVar
new_tv Name
IdP GhcRn
tv_nm Type
kind }
tcHsQTyVarBndr :: ContextKind
-> (Name -> Kind -> TcM TyVar)
-> HsTyVarBndr () GhcRn -> TcM TcTyVar
tcHsQTyVarBndr :: ContextKind
-> (Name -> Type -> IOEnv (Env TcGblEnv TcLclEnv) TyVar)
-> HsTyVarBndr () GhcRn
-> IOEnv (Env TcGblEnv TcLclEnv) TyVar
tcHsQTyVarBndr ContextKind
ctxt_kind Name -> Type -> IOEnv (Env TcGblEnv TcLclEnv) TyVar
new_tv (UserTyVar XUserTyVar GhcRn
_ ()
_ (L SrcSpan
_ IdP GhcRn
tv_nm))
= do { Maybe TcTyThing
mb_tv <- Name -> TcM (Maybe TcTyThing)
tcLookupLcl_maybe Name
IdP GhcRn
tv_nm
; case Maybe TcTyThing
mb_tv of
Just (ATyVar Name
_ TyVar
tv) -> TyVar -> IOEnv (Env TcGblEnv TcLclEnv) TyVar
forall (m :: * -> *) a. Monad m => a -> m a
return TyVar
tv
Maybe TcTyThing
_ -> do { Type
kind <- ContextKind -> TcM Type
newExpectedKind ContextKind
ctxt_kind
; Name -> Type -> IOEnv (Env TcGblEnv TcLclEnv) TyVar
new_tv Name
IdP GhcRn
tv_nm Type
kind } }
tcHsQTyVarBndr ContextKind
_ Name -> Type -> IOEnv (Env TcGblEnv TcLclEnv) TyVar
new_tv (KindedTyVar XKindedTyVar GhcRn
_ ()
_ (L SrcSpan
_ IdP GhcRn
tv_nm) LHsKind GhcRn
lhs_kind)
= do { Type
kind <- UserTypeCtxt -> LHsKind GhcRn -> TcM Type
tcLHsKindSig (Name -> UserTypeCtxt
TyVarBndrKindCtxt Name
IdP GhcRn
tv_nm) LHsKind GhcRn
lhs_kind
; Maybe TcTyThing
mb_tv <- Name -> TcM (Maybe TcTyThing)
tcLookupLcl_maybe Name
IdP GhcRn
tv_nm
; case Maybe TcTyThing
mb_tv of
Just (ATyVar Name
_ TyVar
tv)
-> do { TcM Coercion -> TcM ()
forall a. TcM a -> TcM ()
discardResult (TcM Coercion -> TcM ()) -> TcM Coercion -> TcM ()
forall a b. (a -> b) -> a -> b
$ Maybe (HsType GhcRn) -> Type -> Type -> TcM Coercion
unifyKind (HsType GhcRn -> Maybe (HsType GhcRn)
forall a. a -> Maybe a
Just HsType GhcRn
hs_tv)
Type
kind (TyVar -> Type
tyVarKind TyVar
tv)
; TyVar -> IOEnv (Env TcGblEnv TcLclEnv) TyVar
forall (m :: * -> *) a. Monad m => a -> m a
return TyVar
tv }
Maybe TcTyThing
_ -> Name -> Type -> IOEnv (Env TcGblEnv TcLclEnv) TyVar
new_tv Name
IdP GhcRn
tv_nm Type
kind }
where
hs_tv :: HsType GhcRn
hs_tv = XTyVar GhcRn
-> PromotionFlag -> GenLocated SrcSpan (IdP GhcRn) -> HsType GhcRn
forall pass.
XTyVar pass -> PromotionFlag -> Located (IdP pass) -> HsType pass
HsTyVar NoExtField
XTyVar GhcRn
noExtField PromotionFlag
NotPromoted (Name -> Located Name
forall e. e -> Located e
noLoc Name
IdP GhcRn
tv_nm)
bindTyClTyVars :: Name
-> (TcTyCon -> [TyConBinder] -> Kind -> TcM a) -> TcM a
bindTyClTyVars :: forall a.
Name -> (TyCon -> [TyConBinder] -> Type -> TcM a) -> TcM a
bindTyClTyVars Name
tycon_name TyCon -> [TyConBinder] -> Type -> TcM a
thing_inside
= do { TyCon
tycon <- HasDebugCallStack => Name -> TcM TyCon
Name -> TcM TyCon
tcLookupTcTyCon Name
tycon_name
; let scoped_prs :: [(Name, TyVar)]
scoped_prs = TyCon -> [(Name, TyVar)]
tcTyConScopedTyVars TyCon
tycon
res_kind :: Type
res_kind = TyCon -> Type
tyConResKind TyCon
tycon
binders :: [TyConBinder]
binders = TyCon -> [TyConBinder]
tyConBinders TyCon
tycon
; String -> MsgDoc -> TcM ()
traceTc String
"bindTyClTyVars" (Name -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr Name
tycon_name MsgDoc -> MsgDoc -> MsgDoc
<+> [TyConBinder] -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr [TyConBinder]
binders MsgDoc -> MsgDoc -> MsgDoc
$$ [(Name, TyVar)] -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr [(Name, TyVar)]
scoped_prs)
; [(Name, TyVar)] -> TcM a -> TcM a
forall r. [(Name, TyVar)] -> TcM r -> TcM r
tcExtendNameTyVarEnv [(Name, TyVar)]
scoped_prs (TcM a -> TcM a) -> TcM a -> TcM a
forall a b. (a -> b) -> a -> b
$
TyCon -> [TyConBinder] -> Type -> TcM a
thing_inside TyCon
tycon [TyConBinder]
binders Type
res_kind }
zonkAndScopedSort :: [TcTyVar] -> TcM [TcTyVar]
zonkAndScopedSort :: [TyVar] -> TcM [TyVar]
zonkAndScopedSort [TyVar]
spec_tkvs
= do { [TyVar]
spec_tkvs <- (TyVar -> IOEnv (Env TcGblEnv TcLclEnv) TyVar)
-> [TyVar] -> TcM [TyVar]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM TyVar -> IOEnv (Env TcGblEnv TcLclEnv) TyVar
zonkAndSkolemise [TyVar]
spec_tkvs
; [TyVar] -> TcM [TyVar]
forall (m :: * -> *) a. Monad m => a -> m a
return ([TyVar] -> [TyVar]
scopedSort [TyVar]
spec_tkvs) }
kindGeneralizeSome :: (TcTyVar -> Bool)
-> TcType
-> TcM [KindVar]
kindGeneralizeSome :: (TyVar -> Bool) -> Type -> TcM [TyVar]
kindGeneralizeSome TyVar -> Bool
should_gen Type
kind_or_type
= do { String -> MsgDoc -> TcM ()
traceTc String
"kindGeneralizeSome {" (Type -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr Type
kind_or_type)
; CandidatesQTvs
dvs <- Type -> TcM CandidatesQTvs
candidateQTyVarsOfKind Type
kind_or_type
; let (TyVarSet
to_promote, CandidatesQTvs
dvs') = CandidatesQTvs -> (TyVar -> Bool) -> (TyVarSet, CandidatesQTvs)
partitionCandidates CandidatesQTvs
dvs (Bool -> Bool
not (Bool -> Bool) -> (TyVar -> Bool) -> TyVar -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. TyVar -> Bool
should_gen)
; Bool
_ <- TyVarSet -> TcRnIf TcGblEnv TcLclEnv Bool
promoteTyVarSet TyVarSet
to_promote
; [TyVar]
qkvs <- CandidatesQTvs -> TcM [TyVar]
quantifyTyVars CandidatesQTvs
dvs'
; String -> MsgDoc -> TcM ()
traceTc String
"kindGeneralizeSome }" (MsgDoc -> TcM ()) -> MsgDoc -> TcM ()
forall a b. (a -> b) -> a -> b
$
[MsgDoc] -> MsgDoc
vcat [ String -> MsgDoc
text String
"Kind or type:" MsgDoc -> MsgDoc -> MsgDoc
<+> Type -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr Type
kind_or_type
, String -> MsgDoc
text String
"dvs:" MsgDoc -> MsgDoc -> MsgDoc
<+> CandidatesQTvs -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr CandidatesQTvs
dvs
, String -> MsgDoc
text String
"dvs':" MsgDoc -> MsgDoc -> MsgDoc
<+> CandidatesQTvs -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr CandidatesQTvs
dvs'
, String -> MsgDoc
text String
"to_promote:" MsgDoc -> MsgDoc -> MsgDoc
<+> TyVarSet -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr TyVarSet
to_promote
, String -> MsgDoc
text String
"qkvs:" MsgDoc -> MsgDoc -> MsgDoc
<+> [TyVar] -> MsgDoc
pprTyVars [TyVar]
qkvs ]
; [TyVar] -> TcM [TyVar]
forall (m :: * -> *) a. Monad m => a -> m a
return [TyVar]
qkvs }
kindGeneralizeAll :: TcType
-> TcM [KindVar]
kindGeneralizeAll :: Type -> TcM [TyVar]
kindGeneralizeAll Type
ty = do { String -> MsgDoc -> TcM ()
traceTc String
"kindGeneralizeAll" MsgDoc
empty
; (TyVar -> Bool) -> Type -> TcM [TyVar]
kindGeneralizeSome (Bool -> TyVar -> Bool
forall a b. a -> b -> a
const Bool
True) Type
ty }
kindGeneralizeNone :: TcType
-> TcM ()
kindGeneralizeNone :: Type -> TcM ()
kindGeneralizeNone Type
ty
= do { String -> MsgDoc -> TcM ()
traceTc String
"kindGeneralizeNone" MsgDoc
empty
; [TyVar]
kvs <- (TyVar -> Bool) -> Type -> TcM [TyVar]
kindGeneralizeSome (Bool -> TyVar -> Bool
forall a b. a -> b -> a
const Bool
False) Type
ty
; MASSERT( null kvs )
}
etaExpandAlgTyCon :: [TyConBinder]
-> Kind
-> TcM ([TyConBinder], Kind)
etaExpandAlgTyCon :: [TyConBinder] -> Type -> TcM ([TyConBinder], Type)
etaExpandAlgTyCon [TyConBinder]
tc_bndrs Type
kind
= do { SrcSpan
loc <- TcRn SrcSpan
getSrcSpanM
; UniqSupply
uniqs <- TcRnIf TcGblEnv TcLclEnv UniqSupply
forall gbl lcl. TcRnIf gbl lcl UniqSupply
newUniqueSupply
; LocalRdrEnv
rdr_env <- RnM LocalRdrEnv
getLocalRdrEnv
; let new_occs :: [OccName]
new_occs = [ OccName
occ
| String
str <- [String]
allNameStrings
, let occ :: OccName
occ = NameSpace -> String -> OccName
mkOccName NameSpace
tvName String
str
, Maybe Name -> Bool
forall a. Maybe a -> Bool
isNothing (LocalRdrEnv -> OccName -> Maybe Name
lookupLocalRdrOcc LocalRdrEnv
rdr_env OccName
occ)
, Bool -> Bool
not (OccName
occ OccName -> [OccName] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [OccName]
lhs_occs) ]
new_uniqs :: [Unique]
new_uniqs = UniqSupply -> [Unique]
uniqsFromSupply UniqSupply
uniqs
subst :: TCvSubst
subst = InScopeSet -> TCvSubst
mkEmptyTCvSubst (TyVarSet -> InScopeSet
mkInScopeSet ([TyVar] -> TyVarSet
mkVarSet [TyVar]
lhs_tvs))
; ([TyConBinder], Type) -> TcM ([TyConBinder], Type)
forall (m :: * -> *) a. Monad m => a -> m a
return (SrcSpan
-> [OccName]
-> [Unique]
-> TCvSubst
-> [TyConBinder]
-> Type
-> ([TyConBinder], Type)
go SrcSpan
loc [OccName]
new_occs [Unique]
new_uniqs TCvSubst
subst [] Type
kind) }
where
lhs_tvs :: [TyVar]
lhs_tvs = (TyConBinder -> TyVar) -> [TyConBinder] -> [TyVar]
forall a b. (a -> b) -> [a] -> [b]
map TyConBinder -> TyVar
forall tv argf. VarBndr tv argf -> tv
binderVar [TyConBinder]
tc_bndrs
lhs_occs :: [OccName]
lhs_occs = (TyVar -> OccName) -> [TyVar] -> [OccName]
forall a b. (a -> b) -> [a] -> [b]
map TyVar -> OccName
forall a. NamedThing a => a -> OccName
getOccName [TyVar]
lhs_tvs
go :: SrcSpan
-> [OccName]
-> [Unique]
-> TCvSubst
-> [TyConBinder]
-> Type
-> ([TyConBinder], Type)
go SrcSpan
loc [OccName]
occs [Unique]
uniqs TCvSubst
subst [TyConBinder]
acc Type
kind
= case Type -> Maybe (TyBinder, Type)
splitPiTy_maybe Type
kind of
Maybe (TyBinder, Type)
Nothing -> ([TyConBinder] -> [TyConBinder]
forall a. [a] -> [a]
reverse [TyConBinder]
acc, HasCallStack => TCvSubst -> Type -> Type
TCvSubst -> Type -> Type
substTy TCvSubst
subst Type
kind)
Just (Anon AnonArgFlag
af Scaled Type
arg, Type
kind')
-> SrcSpan
-> [OccName]
-> [Unique]
-> TCvSubst
-> [TyConBinder]
-> Type
-> ([TyConBinder], Type)
go SrcSpan
loc [OccName]
occs' [Unique]
uniqs' TCvSubst
subst' (TyConBinder
tcb TyConBinder -> [TyConBinder] -> [TyConBinder]
forall a. a -> [a] -> [a]
: [TyConBinder]
acc) Type
kind'
where
arg' :: Type
arg' = HasCallStack => TCvSubst -> Type -> Type
TCvSubst -> Type -> Type
substTy TCvSubst
subst (Scaled Type -> Type
forall a. Scaled a -> a
scaledThing Scaled Type
arg)
tv :: TyVar
tv = Name -> Type -> TyVar
mkTyVar (Unique -> OccName -> SrcSpan -> Name
mkInternalName Unique
uniq OccName
occ SrcSpan
loc) Type
arg'
subst' :: TCvSubst
subst' = TCvSubst -> TyVar -> TCvSubst
extendTCvInScope TCvSubst
subst TyVar
tv
tcb :: TyConBinder
tcb = TyVar -> TyConBndrVis -> TyConBinder
forall var argf. var -> argf -> VarBndr var argf
Bndr TyVar
tv (AnonArgFlag -> TyConBndrVis
AnonTCB AnonArgFlag
af)
(Unique
uniq:[Unique]
uniqs') = [Unique]
uniqs
(OccName
occ:[OccName]
occs') = [OccName]
occs
Just (Named (Bndr TyVar
tv ArgFlag
vis), Type
kind')
-> SrcSpan
-> [OccName]
-> [Unique]
-> TCvSubst
-> [TyConBinder]
-> Type
-> ([TyConBinder], Type)
go SrcSpan
loc [OccName]
occs [Unique]
uniqs TCvSubst
subst' (TyConBinder
tcb TyConBinder -> [TyConBinder] -> [TyConBinder]
forall a. a -> [a] -> [a]
: [TyConBinder]
acc) Type
kind'
where
(TCvSubst
subst', TyVar
tv') = HasCallStack => TCvSubst -> TyVar -> (TCvSubst, TyVar)
TCvSubst -> TyVar -> (TCvSubst, TyVar)
substTyVarBndr TCvSubst
subst TyVar
tv
tcb :: TyConBinder
tcb = TyVar -> TyConBndrVis -> TyConBinder
forall var argf. var -> argf -> VarBndr var argf
Bndr TyVar
tv' (ArgFlag -> TyConBndrVis
NamedTCB ArgFlag
vis)
data DataSort
= DataDeclSort NewOrData
| DataInstanceSort NewOrData
| DataFamilySort
checkDataKindSig :: DataSort -> Kind
-> TcM ()
checkDataKindSig :: DataSort -> Type -> TcM ()
checkDataKindSig DataSort
data_sort Type
kind
= do { DynFlags
dflags <- IOEnv (Env TcGblEnv TcLclEnv) DynFlags
forall (m :: * -> *). HasDynFlags m => m DynFlags
getDynFlags
; String -> MsgDoc -> TcM ()
traceTc String
"checkDataKindSig" (Type -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr Type
kind)
; Bool -> MsgDoc -> TcM ()
checkTc (DynFlags -> Bool
is_TYPE_or_Type DynFlags
dflags Bool -> Bool -> Bool
|| Bool
is_kind_var)
(DynFlags -> MsgDoc
err_msg DynFlags
dflags) }
where
res_kind :: Type
res_kind = ([TyBinder], Type) -> Type
forall a b. (a, b) -> b
snd (Type -> ([TyBinder], Type)
tcSplitPiTys Type
kind)
pp_dec :: SDoc
pp_dec :: MsgDoc
pp_dec = String -> MsgDoc
text (String -> MsgDoc) -> String -> MsgDoc
forall a b. (a -> b) -> a -> b
$
case DataSort
data_sort of
DataDeclSort NewOrData
DataType -> String
"Data type"
DataDeclSort NewOrData
NewType -> String
"Newtype"
DataInstanceSort NewOrData
DataType -> String
"Data instance"
DataInstanceSort NewOrData
NewType -> String
"Newtype instance"
DataSort
DataFamilySort -> String
"Data family"
is_newtype :: Bool
is_newtype :: Bool
is_newtype =
case DataSort
data_sort of
DataDeclSort NewOrData
new_or_data -> NewOrData
new_or_data NewOrData -> NewOrData -> Bool
forall a. Eq a => a -> a -> Bool
== NewOrData
NewType
DataInstanceSort NewOrData
new_or_data -> NewOrData
new_or_data NewOrData -> NewOrData -> Bool
forall a. Eq a => a -> a -> Bool
== NewOrData
NewType
DataSort
DataFamilySort -> Bool
False
is_data_family :: Bool
is_data_family :: Bool
is_data_family =
case DataSort
data_sort of
DataDeclSort{} -> Bool
False
DataInstanceSort{} -> Bool
False
DataSort
DataFamilySort -> Bool
True
tYPE_ok :: DynFlags -> Bool
tYPE_ok :: DynFlags -> Bool
tYPE_ok DynFlags
dflags =
(Bool
is_newtype Bool -> Bool -> Bool
&& Extension -> DynFlags -> Bool
xopt Extension
LangExt.UnliftedNewtypes DynFlags
dflags)
Bool -> Bool -> Bool
|| Bool
is_data_family
is_TYPE :: Bool
is_TYPE :: Bool
is_TYPE = Type -> Bool
tcIsRuntimeTypeKind Type
res_kind
is_Type :: Bool
is_Type :: Bool
is_Type = Type -> Bool
tcIsLiftedTypeKind Type
res_kind
is_TYPE_or_Type :: DynFlags -> Bool
is_TYPE_or_Type :: DynFlags -> Bool
is_TYPE_or_Type DynFlags
dflags | DynFlags -> Bool
tYPE_ok DynFlags
dflags = Bool
is_TYPE
| Bool
otherwise = Bool
is_Type
is_kind_var :: Bool
is_kind_var :: Bool
is_kind_var | Bool
is_data_family = Maybe (TyVar, Coercion) -> Bool
forall a. Maybe a -> Bool
isJust (Type -> Maybe (TyVar, Coercion)
tcGetCastedTyVar_maybe Type
res_kind)
| Bool
otherwise = Bool
False
err_msg :: DynFlags -> SDoc
err_msg :: DynFlags -> MsgDoc
err_msg DynFlags
dflags =
[MsgDoc] -> MsgDoc
sep [ ([MsgDoc] -> MsgDoc
sep [ MsgDoc
pp_dec MsgDoc -> MsgDoc -> MsgDoc
<+>
String -> MsgDoc
text String
"has non-" MsgDoc -> MsgDoc -> MsgDoc
<>
(if DynFlags -> Bool
tYPE_ok DynFlags
dflags then String -> MsgDoc
text String
"TYPE" else Type -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr Type
liftedTypeKind)
, (if Bool
is_data_family then String -> MsgDoc
text String
"and non-variable" else MsgDoc
empty) MsgDoc -> MsgDoc -> MsgDoc
<+>
String -> MsgDoc
text String
"return kind" MsgDoc -> MsgDoc -> MsgDoc
<+> MsgDoc -> MsgDoc
quotes (Type -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr Type
res_kind) ])
, if Bool -> Bool
not (DynFlags -> Bool
tYPE_ok DynFlags
dflags) Bool -> Bool -> Bool
&& Bool
is_TYPE Bool -> Bool -> Bool
&& Bool
is_newtype Bool -> Bool -> Bool
&&
Bool -> Bool
not (Extension -> DynFlags -> Bool
xopt Extension
LangExt.UnliftedNewtypes DynFlags
dflags)
then String -> MsgDoc
text String
"Perhaps you intended to use UnliftedNewtypes"
else MsgDoc
empty ]
checkClassKindSig :: Kind -> TcM ()
checkClassKindSig :: Type -> TcM ()
checkClassKindSig Type
kind = Bool -> MsgDoc -> TcM ()
checkTc (Type -> Bool
tcIsConstraintKind Type
kind) MsgDoc
err_msg
where
err_msg :: SDoc
err_msg :: MsgDoc
err_msg =
String -> MsgDoc
text String
"Kind signature on a class must end with" MsgDoc -> MsgDoc -> MsgDoc
<+> Type -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr Type
constraintKind MsgDoc -> MsgDoc -> MsgDoc
$$
String -> MsgDoc
text String
"unobscured by type families"
tcbVisibilities :: TyCon -> [Type] -> [TyConBndrVis]
tcbVisibilities :: TyCon -> [Type] -> [TyConBndrVis]
tcbVisibilities TyCon
tc [Type]
orig_args
= Type -> TCvSubst -> [Type] -> [TyConBndrVis]
go (TyCon -> Type
tyConKind TyCon
tc) TCvSubst
init_subst [Type]
orig_args
where
init_subst :: TCvSubst
init_subst = InScopeSet -> TCvSubst
mkEmptyTCvSubst (TyVarSet -> InScopeSet
mkInScopeSet ([Type] -> TyVarSet
tyCoVarsOfTypes [Type]
orig_args))
go :: Type -> TCvSubst -> [Type] -> [TyConBndrVis]
go Type
_ TCvSubst
_ []
= []
go Type
fun_kind TCvSubst
subst all_args :: [Type]
all_args@(Type
arg : [Type]
args)
| Just (TyBinder
tcb, Type
inner_kind) <- Type -> Maybe (TyBinder, Type)
splitPiTy_maybe Type
fun_kind
= case TyBinder
tcb of
Anon AnonArgFlag
af Scaled Type
_ -> AnonArgFlag -> TyConBndrVis
AnonTCB AnonArgFlag
af TyConBndrVis -> [TyConBndrVis] -> [TyConBndrVis]
forall a. a -> [a] -> [a]
: Type -> TCvSubst -> [Type] -> [TyConBndrVis]
go Type
inner_kind TCvSubst
subst [Type]
args
Named (Bndr TyVar
tv ArgFlag
vis) -> ArgFlag -> TyConBndrVis
NamedTCB ArgFlag
vis TyConBndrVis -> [TyConBndrVis] -> [TyConBndrVis]
forall a. a -> [a] -> [a]
: Type -> TCvSubst -> [Type] -> [TyConBndrVis]
go Type
inner_kind TCvSubst
subst' [Type]
args
where
subst' :: TCvSubst
subst' = TCvSubst -> TyVar -> Type -> TCvSubst
extendTCvSubst TCvSubst
subst TyVar
tv Type
arg
| Bool -> Bool
not (TCvSubst -> Bool
isEmptyTCvSubst TCvSubst
subst)
= Type -> TCvSubst -> [Type] -> [TyConBndrVis]
go (HasCallStack => TCvSubst -> Type -> Type
TCvSubst -> Type -> Type
substTy TCvSubst
subst Type
fun_kind) TCvSubst
init_subst [Type]
all_args
| Bool
otherwise
= String -> MsgDoc -> [TyConBndrVis]
forall a. HasCallStack => String -> MsgDoc -> a
pprPanic String
"addTcbVisibilities" (TyCon -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr TyCon
tc MsgDoc -> MsgDoc -> MsgDoc
<+> [Type] -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr [Type]
orig_args)
tcHsPartialSigType
:: UserTypeCtxt
-> LHsSigWcType GhcRn
-> TcM ( [(Name, TcTyVar)]
, Maybe TcType
, [(Name,InvisTVBinder)]
, TcThetaType
, TcType )
tcHsPartialSigType :: UserTypeCtxt
-> LHsSigWcType GhcRn
-> TcM
([(Name, TyVar)], Maybe Type, [(Name, VarBndr TyVar Specificity)],
[Type], Type)
tcHsPartialSigType UserTypeCtxt
ctxt LHsSigWcType GhcRn
sig_ty
| HsWC { hswc_ext :: forall pass thing. HsWildCardBndrs pass thing -> XHsWC pass thing
hswc_ext = XHsWC GhcRn (LHsSigType GhcRn)
sig_wcs, hswc_body :: forall pass thing. HsWildCardBndrs pass thing -> thing
hswc_body = LHsSigType GhcRn
ib_ty } <- LHsSigWcType GhcRn
sig_ty
, HsIB { hsib_ext :: forall pass thing. HsImplicitBndrs pass thing -> XHsIB pass thing
hsib_ext = XHsIB GhcRn (LHsKind GhcRn)
implicit_hs_tvs
, hsib_body :: forall pass thing. HsImplicitBndrs pass thing -> thing
hsib_body = LHsKind GhcRn
hs_ty } <- LHsSigType GhcRn
ib_ty
, ([LHsTyVarBndr Specificity GhcRn]
explicit_hs_tvs, L SrcSpan
_ [LHsKind GhcRn]
hs_ctxt, LHsKind GhcRn
hs_tau) <- LHsKind GhcRn
-> ([LHsTyVarBndr Specificity GhcRn], LHsContext GhcRn,
LHsKind GhcRn)
forall pass.
LHsType pass
-> ([LHsTyVarBndr Specificity pass], LHsContext pass, LHsType pass)
splitLHsSigmaTyInvis LHsKind GhcRn
hs_ty
= UserTypeCtxt
-> LHsKind GhcRn
-> TcM
([(Name, TyVar)], Maybe Type, [(Name, VarBndr TyVar Specificity)],
[Type], Type)
-> TcM
([(Name, TyVar)], Maybe Type, [(Name, VarBndr TyVar Specificity)],
[Type], Type)
forall a. UserTypeCtxt -> LHsKind GhcRn -> TcM a -> TcM a
addSigCtxt UserTypeCtxt
ctxt LHsKind GhcRn
hs_ty (TcM
([(Name, TyVar)], Maybe Type, [(Name, VarBndr TyVar Specificity)],
[Type], Type)
-> TcM
([(Name, TyVar)], Maybe Type, [(Name, VarBndr TyVar Specificity)],
[Type], Type))
-> TcM
([(Name, TyVar)], Maybe Type, [(Name, VarBndr TyVar Specificity)],
[Type], Type)
-> TcM
([(Name, TyVar)], Maybe Type, [(Name, VarBndr TyVar Specificity)],
[Type], Type)
forall a b. (a -> b) -> a -> b
$
do { TcTyMode
mode <- TypeOrKind -> HoleMode -> TcM TcTyMode
mkHoleMode TypeOrKind
TypeLevel HoleMode
HM_Sig
; ([TyVar]
implicit_tvs, ([VarBndr TyVar Specificity]
explicit_tvbndrs, ([(Name, TyVar)]
wcs, Maybe Type
wcx, [Type]
theta, Type
tau)))
<- String
-> TcM
([TyVar],
([VarBndr TyVar Specificity],
([(Name, TyVar)], Maybe Type, [Type], Type)))
-> TcM
([TyVar],
([VarBndr TyVar Specificity],
([(Name, TyVar)], Maybe Type, [Type], Type)))
forall a. String -> TcM a -> TcM a
solveLocalEqualities String
"tcHsPartialSigType" (TcM
([TyVar],
([VarBndr TyVar Specificity],
([(Name, TyVar)], Maybe Type, [Type], Type)))
-> TcM
([TyVar],
([VarBndr TyVar Specificity],
([(Name, TyVar)], Maybe Type, [Type], Type))))
-> TcM
([TyVar],
([VarBndr TyVar Specificity],
([(Name, TyVar)], Maybe Type, [Type], Type)))
-> TcM
([TyVar],
([VarBndr TyVar Specificity],
([(Name, TyVar)], Maybe Type, [Type], Type)))
forall a b. (a -> b) -> a -> b
$
HsQTvsRn
-> ([(Name, TyVar)]
-> TcM
([TyVar],
([VarBndr TyVar Specificity],
([(Name, TyVar)], Maybe Type, [Type], Type))))
-> TcM
([TyVar],
([VarBndr TyVar Specificity],
([(Name, TyVar)], Maybe Type, [Type], Type)))
forall a. HsQTvsRn -> ([(Name, TyVar)] -> TcM a) -> TcM a
tcNamedWildCardBinders HsQTvsRn
XHsWC GhcRn (LHsSigType GhcRn)
sig_wcs (([(Name, TyVar)]
-> TcM
([TyVar],
([VarBndr TyVar Specificity],
([(Name, TyVar)], Maybe Type, [Type], Type))))
-> TcM
([TyVar],
([VarBndr TyVar Specificity],
([(Name, TyVar)], Maybe Type, [Type], Type))))
-> ([(Name, TyVar)]
-> TcM
([TyVar],
([VarBndr TyVar Specificity],
([(Name, TyVar)], Maybe Type, [Type], Type))))
-> TcM
([TyVar],
([VarBndr TyVar Specificity],
([(Name, TyVar)], Maybe Type, [Type], Type)))
forall a b. (a -> b) -> a -> b
$ \ [(Name, TyVar)]
wcs ->
HsQTvsRn
-> TcM
([VarBndr TyVar Specificity],
([(Name, TyVar)], Maybe Type, [Type], Type))
-> TcM
([TyVar],
([VarBndr TyVar Specificity],
([(Name, TyVar)], Maybe Type, [Type], Type)))
forall a. HsQTvsRn -> TcM a -> TcM ([TyVar], a)
bindImplicitTKBndrs_Tv HsQTvsRn
XHsIB GhcRn (LHsKind GhcRn)
implicit_hs_tvs (TcM
([VarBndr TyVar Specificity],
([(Name, TyVar)], Maybe Type, [Type], Type))
-> TcM
([TyVar],
([VarBndr TyVar Specificity],
([(Name, TyVar)], Maybe Type, [Type], Type))))
-> TcM
([VarBndr TyVar Specificity],
([(Name, TyVar)], Maybe Type, [Type], Type))
-> TcM
([TyVar],
([VarBndr TyVar Specificity],
([(Name, TyVar)], Maybe Type, [Type], Type)))
forall a b. (a -> b) -> a -> b
$
TcTyMode
-> [LHsTyVarBndr Specificity GhcRn]
-> TcM ([(Name, TyVar)], Maybe Type, [Type], Type)
-> TcM
([VarBndr TyVar Specificity],
([(Name, TyVar)], Maybe Type, [Type], Type))
forall flag a.
OutputableBndrFlag flag =>
TcTyMode
-> [LHsTyVarBndr flag GhcRn]
-> TcM a
-> TcM ([VarBndr TyVar flag], a)
bindExplicitTKBndrs_Tv_M TcTyMode
mode [LHsTyVarBndr Specificity GhcRn]
explicit_hs_tvs (TcM ([(Name, TyVar)], Maybe Type, [Type], Type)
-> TcM
([VarBndr TyVar Specificity],
([(Name, TyVar)], Maybe Type, [Type], Type)))
-> TcM ([(Name, TyVar)], Maybe Type, [Type], Type)
-> TcM
([VarBndr TyVar Specificity],
([(Name, TyVar)], Maybe Type, [Type], Type))
forall a b. (a -> b) -> a -> b
$
do {
([Type]
theta, Maybe Type
wcx) <- TcTyMode -> [LHsKind GhcRn] -> TcM ([Type], Maybe Type)
tcPartialContext TcTyMode
mode [LHsKind GhcRn]
hs_ctxt
; Type
ek <- TcM Type
newOpenTypeKind
; Type
tau <- LHsKind GhcRn -> TcM Type -> TcM Type
forall a. LHsKind GhcRn -> TcM a -> TcM a
addTypeCtxt LHsKind GhcRn
hs_tau (TcM Type -> TcM Type) -> TcM Type -> TcM Type
forall a b. (a -> b) -> a -> b
$
TcTyMode -> LHsKind GhcRn -> Type -> TcM Type
tc_lhs_type TcTyMode
mode LHsKind GhcRn
hs_tau Type
ek
; ([(Name, TyVar)], Maybe Type, [Type], Type)
-> TcM ([(Name, TyVar)], Maybe Type, [Type], Type)
forall (m :: * -> *) a. Monad m => a -> m a
return ([(Name, TyVar)]
wcs, Maybe Type
wcx, [Type]
theta, Type
tau) }
; let implicit_tvbndrs :: [VarBndr TyVar Specificity]
implicit_tvbndrs = (TyVar -> VarBndr TyVar Specificity)
-> [TyVar] -> [VarBndr TyVar Specificity]
forall a b. (a -> b) -> [a] -> [b]
map (Specificity -> TyVar -> VarBndr TyVar Specificity
forall vis. vis -> TyVar -> VarBndr TyVar vis
mkTyVarBinder Specificity
SpecifiedSpec) [TyVar]
implicit_tvs
; Type -> TcM ()
kindGeneralizeNone ([VarBndr TyVar Specificity] -> Type -> Type
mkInvisForAllTys [VarBndr TyVar Specificity]
implicit_tvbndrs (Type -> Type) -> Type -> Type
forall a b. (a -> b) -> a -> b
$
[VarBndr TyVar Specificity] -> Type -> Type
mkInvisForAllTys [VarBndr TyVar Specificity]
explicit_tvbndrs (Type -> Type) -> Type -> Type
forall a b. (a -> b) -> a -> b
$
[Type] -> Type -> Type
mkPhiTy [Type]
theta (Type -> Type) -> Type -> Type
forall a b. (a -> b) -> a -> b
$
Type
tau)
; ((Name, TyVar) -> TcM ()) -> [(Name, TyVar)] -> TcM ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ (Name, TyVar) -> TcM ()
emitNamedTypeHole [(Name, TyVar)]
wcs
; [VarBndr TyVar Specificity]
implicit_tvbndrs <- (VarBndr TyVar Specificity
-> IOEnv (Env TcGblEnv TcLclEnv) (VarBndr TyVar Specificity))
-> [VarBndr TyVar Specificity]
-> IOEnv (Env TcGblEnv TcLclEnv) [VarBndr TyVar Specificity]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM VarBndr TyVar Specificity
-> IOEnv (Env TcGblEnv TcLclEnv) (VarBndr TyVar Specificity)
forall spec. VarBndr TyVar spec -> TcM (VarBndr TyVar spec)
zonkInvisTVBinder [VarBndr TyVar Specificity]
implicit_tvbndrs
; [VarBndr TyVar Specificity]
explicit_tvbndrs <- (VarBndr TyVar Specificity
-> IOEnv (Env TcGblEnv TcLclEnv) (VarBndr TyVar Specificity))
-> [VarBndr TyVar Specificity]
-> IOEnv (Env TcGblEnv TcLclEnv) [VarBndr TyVar Specificity]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM VarBndr TyVar Specificity
-> IOEnv (Env TcGblEnv TcLclEnv) (VarBndr TyVar Specificity)
forall spec. VarBndr TyVar spec -> TcM (VarBndr TyVar spec)
zonkInvisTVBinder [VarBndr TyVar Specificity]
explicit_tvbndrs
; [Type]
theta <- (Type -> TcM Type) -> [Type] -> TcM [Type]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM Type -> TcM Type
zonkTcType [Type]
theta
; Type
tau <- Type -> TcM Type
zonkTcType Type
tau
; let tv_prs :: [(Name, VarBndr TyVar Specificity)]
tv_prs = (HsQTvsRn
XHsIB GhcRn (LHsKind GhcRn)
implicit_hs_tvs HsQTvsRn
-> [VarBndr TyVar Specificity]
-> [(Name, VarBndr TyVar Specificity)]
forall a b. [a] -> [b] -> [(a, b)]
`zip` [VarBndr TyVar Specificity]
implicit_tvbndrs)
[(Name, VarBndr TyVar Specificity)]
-> [(Name, VarBndr TyVar Specificity)]
-> [(Name, VarBndr TyVar Specificity)]
forall a. [a] -> [a] -> [a]
++ ([LHsTyVarBndr Specificity GhcRn] -> [IdP GhcRn]
forall flag (p :: Pass).
[LHsTyVarBndr flag (GhcPass p)] -> [IdP (GhcPass p)]
hsLTyVarNames [LHsTyVarBndr Specificity GhcRn]
explicit_hs_tvs HsQTvsRn
-> [VarBndr TyVar Specificity]
-> [(Name, VarBndr TyVar Specificity)]
forall a b. [a] -> [b] -> [(a, b)]
`zip` [VarBndr TyVar Specificity]
explicit_tvbndrs)
; String -> MsgDoc -> TcM ()
traceTc String
"tcHsPartialSigType" ([(Name, VarBndr TyVar Specificity)] -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr [(Name, VarBndr TyVar Specificity)]
tv_prs)
; ([(Name, TyVar)], Maybe Type, [(Name, VarBndr TyVar Specificity)],
[Type], Type)
-> TcM
([(Name, TyVar)], Maybe Type, [(Name, VarBndr TyVar Specificity)],
[Type], Type)
forall (m :: * -> *) a. Monad m => a -> m a
return ([(Name, TyVar)]
wcs, Maybe Type
wcx, [(Name, VarBndr TyVar Specificity)]
tv_prs, [Type]
theta, Type
tau) }
tcPartialContext :: TcTyMode -> HsContext GhcRn -> TcM (TcThetaType, Maybe TcType)
tcPartialContext :: TcTyMode -> [LHsKind GhcRn] -> TcM ([Type], Maybe Type)
tcPartialContext TcTyMode
mode [LHsKind GhcRn]
hs_theta
| Just ([LHsKind GhcRn]
hs_theta1, LHsKind GhcRn
hs_ctxt_last) <- [LHsKind GhcRn] -> Maybe ([LHsKind GhcRn], LHsKind GhcRn)
forall a. [a] -> Maybe ([a], a)
snocView [LHsKind GhcRn]
hs_theta
, L SrcSpan
wc_loc ty :: HsType GhcRn
ty@(HsWildCardTy XWildCardTy GhcRn
_) <- LHsKind GhcRn -> LHsKind GhcRn
forall pass. LHsType pass -> LHsType pass
ignoreParens LHsKind GhcRn
hs_ctxt_last
= do { Type
wc_tv_ty <- SrcSpan -> TcM Type -> TcM Type
forall a. SrcSpan -> TcRn a -> TcRn a
setSrcSpan SrcSpan
wc_loc (TcM Type -> TcM Type) -> TcM Type -> TcM Type
forall a b. (a -> b) -> a -> b
$
TcTyMode -> HsType GhcRn -> Type -> TcM Type
tcAnonWildCardOcc TcTyMode
mode HsType GhcRn
ty Type
constraintKind
; [Type]
theta <- (LHsKind GhcRn -> TcM Type) -> [LHsKind GhcRn] -> TcM [Type]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM (TcTyMode -> LHsKind GhcRn -> TcM Type
tc_lhs_pred TcTyMode
mode) [LHsKind GhcRn]
hs_theta1
; ([Type], Maybe Type) -> TcM ([Type], Maybe Type)
forall (m :: * -> *) a. Monad m => a -> m a
return ([Type]
theta, Type -> Maybe Type
forall a. a -> Maybe a
Just Type
wc_tv_ty) }
| Bool
otherwise
= do { [Type]
theta <- (LHsKind GhcRn -> TcM Type) -> [LHsKind GhcRn] -> TcM [Type]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM (TcTyMode -> LHsKind GhcRn -> TcM Type
tc_lhs_pred TcTyMode
mode) [LHsKind GhcRn]
hs_theta
; ([Type], Maybe Type) -> TcM ([Type], Maybe Type)
forall (m :: * -> *) a. Monad m => a -> m a
return ([Type]
theta, Maybe Type
forall a. Maybe a
Nothing) }
tcHsPatSigType :: UserTypeCtxt
-> HsPatSigType GhcRn
-> TcM ( [(Name, TcTyVar)]
, [(Name, TcTyVar)]
, TcType)
tcHsPatSigType :: UserTypeCtxt
-> HsPatSigType GhcRn
-> TcM ([(Name, TyVar)], [(Name, TyVar)], Type)
tcHsPatSigType UserTypeCtxt
ctxt
(HsPS { hsps_ext :: forall pass. HsPatSigType pass -> XHsPS pass
hsps_ext = HsPSRn { hsps_nwcs :: HsPSRn -> HsQTvsRn
hsps_nwcs = HsQTvsRn
sig_wcs, hsps_imp_tvs :: HsPSRn -> HsQTvsRn
hsps_imp_tvs = HsQTvsRn
sig_ns }
, hsps_body :: forall pass. HsPatSigType pass -> LHsType pass
hsps_body = LHsKind GhcRn
hs_ty })
= UserTypeCtxt
-> LHsKind GhcRn
-> TcM ([(Name, TyVar)], [(Name, TyVar)], Type)
-> TcM ([(Name, TyVar)], [(Name, TyVar)], Type)
forall a. UserTypeCtxt -> LHsKind GhcRn -> TcM a -> TcM a
addSigCtxt UserTypeCtxt
ctxt LHsKind GhcRn
hs_ty (TcM ([(Name, TyVar)], [(Name, TyVar)], Type)
-> TcM ([(Name, TyVar)], [(Name, TyVar)], Type))
-> TcM ([(Name, TyVar)], [(Name, TyVar)], Type)
-> TcM ([(Name, TyVar)], [(Name, TyVar)], Type)
forall a b. (a -> b) -> a -> b
$
do { [(Name, TyVar)]
sig_tkv_prs <- (Name -> IOEnv (Env TcGblEnv TcLclEnv) (Name, TyVar))
-> HsQTvsRn -> IOEnv (Env TcGblEnv TcLclEnv) [(Name, TyVar)]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM Name -> IOEnv (Env TcGblEnv TcLclEnv) (Name, TyVar)
new_implicit_tv HsQTvsRn
sig_ns
; TcTyMode
mode <- TypeOrKind -> HoleMode -> TcM TcTyMode
mkHoleMode TypeOrKind
TypeLevel HoleMode
HM_Sig
; ([(Name, TyVar)]
wcs, Type
sig_ty)
<- LHsKind GhcRn
-> TcM ([(Name, TyVar)], Type) -> TcM ([(Name, TyVar)], Type)
forall a. LHsKind GhcRn -> TcM a -> TcM a
addTypeCtxt LHsKind GhcRn
hs_ty (TcM ([(Name, TyVar)], Type) -> TcM ([(Name, TyVar)], Type))
-> TcM ([(Name, TyVar)], Type) -> TcM ([(Name, TyVar)], Type)
forall a b. (a -> b) -> a -> b
$
String
-> TcM ([(Name, TyVar)], Type) -> TcM ([(Name, TyVar)], Type)
forall a. String -> TcM a -> TcM a
solveLocalEqualities String
"tcHsPatSigType" (TcM ([(Name, TyVar)], Type) -> TcM ([(Name, TyVar)], Type))
-> TcM ([(Name, TyVar)], Type) -> TcM ([(Name, TyVar)], Type)
forall a b. (a -> b) -> a -> b
$
HsQTvsRn
-> ([(Name, TyVar)] -> TcM ([(Name, TyVar)], Type))
-> TcM ([(Name, TyVar)], Type)
forall a. HsQTvsRn -> ([(Name, TyVar)] -> TcM a) -> TcM a
tcNamedWildCardBinders HsQTvsRn
sig_wcs (([(Name, TyVar)] -> TcM ([(Name, TyVar)], Type))
-> TcM ([(Name, TyVar)], Type))
-> ([(Name, TyVar)] -> TcM ([(Name, TyVar)], Type))
-> TcM ([(Name, TyVar)], Type)
forall a b. (a -> b) -> a -> b
$ \ [(Name, TyVar)]
wcs ->
[(Name, TyVar)]
-> TcM ([(Name, TyVar)], Type) -> TcM ([(Name, TyVar)], Type)
forall r. [(Name, TyVar)] -> TcM r -> TcM r
tcExtendNameTyVarEnv [(Name, TyVar)]
sig_tkv_prs (TcM ([(Name, TyVar)], Type) -> TcM ([(Name, TyVar)], Type))
-> TcM ([(Name, TyVar)], Type) -> TcM ([(Name, TyVar)], Type)
forall a b. (a -> b) -> a -> b
$
do { Type
ek <- TcM Type
newOpenTypeKind
; Type
sig_ty <- TcTyMode -> LHsKind GhcRn -> Type -> TcM Type
tc_lhs_type TcTyMode
mode LHsKind GhcRn
hs_ty Type
ek
; ([(Name, TyVar)], Type) -> TcM ([(Name, TyVar)], Type)
forall (m :: * -> *) a. Monad m => a -> m a
return ([(Name, TyVar)]
wcs, Type
sig_ty) }
; ((Name, TyVar) -> TcM ()) -> [(Name, TyVar)] -> TcM ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ (Name, TyVar) -> TcM ()
emitNamedTypeHole [(Name, TyVar)]
wcs
; Type -> TcM ()
kindGeneralizeNone Type
sig_ty
; Type
sig_ty <- Type -> TcM Type
zonkTcType Type
sig_ty
; UserTypeCtxt -> Type -> TcM ()
checkValidType UserTypeCtxt
ctxt Type
sig_ty
; String -> MsgDoc -> TcM ()
traceTc String
"tcHsPatSigType" ([(Name, TyVar)] -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr [(Name, TyVar)]
sig_tkv_prs)
; ([(Name, TyVar)], [(Name, TyVar)], Type)
-> TcM ([(Name, TyVar)], [(Name, TyVar)], Type)
forall (m :: * -> *) a. Monad m => a -> m a
return ([(Name, TyVar)]
wcs, [(Name, TyVar)]
sig_tkv_prs, Type
sig_ty) }
where
new_implicit_tv :: Name -> IOEnv (Env TcGblEnv TcLclEnv) (Name, TyVar)
new_implicit_tv Name
name
= do { Type
kind <- TcM Type
newMetaKindVar
; TyVar
tv <- case UserTypeCtxt
ctxt of
RuleSigCtxt {} -> Name -> Type -> IOEnv (Env TcGblEnv TcLclEnv) TyVar
newSkolemTyVar Name
name Type
kind
UserTypeCtxt
_ -> Name -> Type -> IOEnv (Env TcGblEnv TcLclEnv) TyVar
newPatSigTyVar Name
name Type
kind
; (Name, TyVar) -> IOEnv (Env TcGblEnv TcLclEnv) (Name, TyVar)
forall (m :: * -> *) a. Monad m => a -> m a
return (Name
name, TyVar
tv) }
unifyKinds :: [LHsType GhcRn] -> [(TcType, TcKind)] -> TcM ([TcType], TcKind)
unifyKinds :: [LHsKind GhcRn] -> [(Type, Type)] -> TcM ([Type], Type)
unifyKinds [LHsKind GhcRn]
rn_tys [(Type, Type)]
act_kinds
= do { Type
kind <- TcM Type
newMetaKindVar
; let check :: LHsKind GhcRn -> (Type, Type) -> TcM Type
check LHsKind GhcRn
rn_ty (Type
ty, Type
act_kind)
= HasDebugCallStack =>
HsType GhcRn -> Type -> Type -> Type -> TcM Type
HsType GhcRn -> Type -> Type -> Type -> TcM Type
checkExpectedKind (LHsKind GhcRn -> HsType GhcRn
forall l e. GenLocated l e -> e
unLoc LHsKind GhcRn
rn_ty) Type
ty Type
act_kind Type
kind
; [Type]
tys' <- (LHsKind GhcRn -> (Type, Type) -> TcM Type)
-> [LHsKind GhcRn] -> [(Type, Type)] -> TcM [Type]
forall (m :: * -> *) a b c.
Applicative m =>
(a -> b -> m c) -> [a] -> [b] -> m [c]
zipWithM LHsKind GhcRn -> (Type, Type) -> TcM Type
check [LHsKind GhcRn]
rn_tys [(Type, Type)]
act_kinds
; ([Type], Type) -> TcM ([Type], Type)
forall (m :: * -> *) a. Monad m => a -> m a
return ([Type]
tys', Type
kind) }
tcLHsKindSig :: UserTypeCtxt -> LHsKind GhcRn -> TcM Kind
tcLHsKindSig :: UserTypeCtxt -> LHsKind GhcRn -> TcM Type
tcLHsKindSig UserTypeCtxt
ctxt LHsKind GhcRn
hs_kind
= TcTyMode -> UserTypeCtxt -> LHsKind GhcRn -> TcM Type
tc_lhs_kind_sig (TypeOrKind -> TcTyMode
mkMode TypeOrKind
KindLevel) UserTypeCtxt
ctxt LHsKind GhcRn
hs_kind
tc_lhs_kind_sig :: TcTyMode -> UserTypeCtxt -> LHsKind GhcRn -> TcM Kind
tc_lhs_kind_sig :: TcTyMode -> UserTypeCtxt -> LHsKind GhcRn -> TcM Type
tc_lhs_kind_sig TcTyMode
mode UserTypeCtxt
ctxt LHsKind GhcRn
hs_kind
= do { Type
kind <- MsgDoc -> TcM Type -> TcM Type
forall a. MsgDoc -> TcM a -> TcM a
addErrCtxt (String -> MsgDoc
text String
"In the kind" MsgDoc -> MsgDoc -> MsgDoc
<+> MsgDoc -> MsgDoc
quotes (LHsKind GhcRn -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr LHsKind GhcRn
hs_kind)) (TcM Type -> TcM Type) -> TcM Type -> TcM Type
forall a b. (a -> b) -> a -> b
$
String -> TcM Type -> TcM Type
forall a. String -> TcM a -> TcM a
solveLocalEqualities String
"tcLHsKindSig" (TcM Type -> TcM Type) -> TcM Type -> TcM Type
forall a b. (a -> b) -> a -> b
$
TcTyMode -> LHsKind GhcRn -> Type -> TcM Type
tc_lhs_type TcTyMode
mode LHsKind GhcRn
hs_kind Type
liftedTypeKind
; String -> MsgDoc -> TcM ()
traceTc String
"tcLHsKindSig" (LHsKind GhcRn -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr LHsKind GhcRn
hs_kind MsgDoc -> MsgDoc -> MsgDoc
$$ Type -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr Type
kind)
; Type -> TcM ()
kindGeneralizeNone Type
kind
; Type
kind <- Type -> TcM Type
zonkTcType Type
kind
; UserTypeCtxt -> Type -> TcM ()
checkValidType UserTypeCtxt
ctxt Type
kind
; String -> MsgDoc -> TcM ()
traceTc String
"tcLHsKindSig2" (Type -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr Type
kind)
; Type -> TcM Type
forall (m :: * -> *) a. Monad m => a -> m a
return Type
kind }
promotionErr :: Name -> PromotionErr -> TcM a
promotionErr :: forall a. Name -> PromotionErr -> TcM a
promotionErr Name
name PromotionErr
err
= MsgDoc -> TcM a
forall a. MsgDoc -> TcM a
failWithTc (MsgDoc -> Arity -> MsgDoc -> MsgDoc
hang (PromotionErr -> MsgDoc
pprPECategory PromotionErr
err MsgDoc -> MsgDoc -> MsgDoc
<+> MsgDoc -> MsgDoc
quotes (Name -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr Name
name) MsgDoc -> MsgDoc -> MsgDoc
<+> String -> MsgDoc
text String
"cannot be used here")
Arity
2 (MsgDoc -> MsgDoc
parens MsgDoc
reason))
where
reason :: MsgDoc
reason = case PromotionErr
err of
ConstrainedDataConPE Type
pred
-> String -> MsgDoc
text String
"it has an unpromotable context"
MsgDoc -> MsgDoc -> MsgDoc
<+> MsgDoc -> MsgDoc
quotes (Type -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr Type
pred)
PromotionErr
FamDataConPE -> String -> MsgDoc
text String
"it comes from a data family instance"
PromotionErr
NoDataKindsTC -> String -> MsgDoc
text String
"perhaps you intended to use DataKinds"
PromotionErr
NoDataKindsDC -> String -> MsgDoc
text String
"perhaps you intended to use DataKinds"
PromotionErr
PatSynPE -> String -> MsgDoc
text String
"pattern synonyms cannot be promoted"
PromotionErr
_ -> String -> MsgDoc
text String
"it is defined and used in the same recursive group"
failIfEmitsConstraints :: TcM a -> TcM a
failIfEmitsConstraints :: forall a. TcM a -> TcM a
failIfEmitsConstraints TcM a
thing_inside
= TcM a -> TcM a
forall a. TcM a -> TcM a
checkNoErrs (TcM a -> TcM a) -> TcM a -> TcM a
forall a b. (a -> b) -> a -> b
$
do { (a
res, WantedConstraints
lie) <- TcM a -> TcM (a, WantedConstraints)
forall a. TcM a -> TcM (a, WantedConstraints)
captureConstraints TcM a
thing_inside
; WantedConstraints -> TcM ()
reportAllUnsolved WantedConstraints
lie
; a -> TcM a
forall (m :: * -> *) a. Monad m => a -> m a
return a
res
}
funAppCtxt :: (Outputable fun, Outputable arg) => fun -> arg -> Int -> SDoc
funAppCtxt :: forall fun arg.
(Outputable fun, Outputable arg) =>
fun -> arg -> Arity -> MsgDoc
funAppCtxt fun
fun arg
arg Arity
arg_no
= MsgDoc -> Arity -> MsgDoc -> MsgDoc
hang ([MsgDoc] -> MsgDoc
hsep [ String -> MsgDoc
text String
"In the", Arity -> MsgDoc
speakNth Arity
arg_no, PtrString -> MsgDoc
ptext (String -> PtrString
sLit String
"argument of"),
MsgDoc -> MsgDoc
quotes (fun -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr fun
fun) MsgDoc -> MsgDoc -> MsgDoc
<> String -> MsgDoc
text String
", namely"])
Arity
2 (MsgDoc -> MsgDoc
quotes (arg -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr arg
arg))
addTyConFlavCtxt :: Name -> TyConFlavour -> TcM a -> TcM a
addTyConFlavCtxt :: forall a. Name -> TyConFlavour -> TcM a -> TcM a
addTyConFlavCtxt Name
name TyConFlavour
flav
= MsgDoc -> TcM a -> TcM a
forall a. MsgDoc -> TcM a -> TcM a
addErrCtxt (MsgDoc -> TcM a -> TcM a) -> MsgDoc -> TcM a -> TcM a
forall a b. (a -> b) -> a -> b
$ [MsgDoc] -> MsgDoc
hsep [ String -> MsgDoc
text String
"In the", TyConFlavour -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr TyConFlavour
flav
, String -> MsgDoc
text String
"declaration for", MsgDoc -> MsgDoc
quotes (Name -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr Name
name) ]