{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TupleSections #-}
module GHC.Tc.Utils.TcType (
TcType, TcSigmaType, TcTypeFRR, TcSigmaTypeFRR,
TcRhoType, TcTauType, TcPredType, TcThetaType,
TcTyVar, TcTyVarSet, TcDTyVarSet, TcTyCoVarSet, TcDTyCoVarSet,
TcKind, TcCoVar, TcTyCoVar, TcTyVarBinder, TcInvisTVBinder, TcReqTVBinder,
TcTyCon, MonoTcTyCon, PolyTcTyCon, TcTyConBinder, KnotTied,
ExpType(..), InferResult(..),
ExpTypeFRR, ExpSigmaType, ExpSigmaTypeFRR,
ExpRhoType,
mkCheckExpType,
checkingExpType_maybe, checkingExpType,
SyntaxOpType(..), synKnownType, mkSynFunTys,
TcLevel(..), topTcLevel, pushTcLevel, isTopTcLevel,
strictlyDeeperThan, deeperThanOrSame, sameDepthAs,
tcTypeLevel, tcTyVarLevel, maxTcLevel, minTcLevel,
TcTyVarDetails(..), pprTcTyVarDetails, vanillaSkolemTvUnk,
MetaDetails(Flexi, Indirect), MetaInfo(..), skolemSkolInfo,
isImmutableTyVar, isSkolemTyVar, isMetaTyVar, isMetaTyVarTy, isTyVarTy,
tcIsTcTyVar, isTyVarTyVar, isOverlappableTyVar, isTyConableTyVar,
ConcreteTvOrigin(..), isConcreteTyVar_maybe, isConcreteTyVar,
isConcreteTyVarTy, isConcreteTyVarTy_maybe, isConcreteInfo,
isAmbiguousTyVar, isCycleBreakerTyVar, metaTyVarRef, metaTyVarInfo,
isFlexi, isIndirect, isRuntimeUnkSkol,
metaTyVarTcLevel, setMetaTyVarTcLevel, metaTyVarTcLevel_maybe,
isTouchableMetaTyVar, isPromotableMetaTyVar,
findDupTyVarTvs, mkTyVarNamePairs,
mkInfSigmaTy, mkSpecSigmaTy, mkSigmaTy, mkPhiTy, tcMkPhiTy,
tcMkDFunSigmaTy, tcMkDFunPhiTy,
getTyVar, getTyVar_maybe, getCastedTyVar_maybe,
tcSplitForAllTyVarBinder_maybe,
tcSplitForAllTyVars, tcSplitForAllInvisTyVars, tcSplitSomeForAllTyVars,
tcSplitForAllReqTVBinders, tcSplitForAllInvisTVBinders,
tcSplitPiTys, tcSplitPiTy_maybe, tcSplitForAllTyVarBinders,
tcSplitPhiTy, tcSplitPredFunTy_maybe,
tcSplitFunTy_maybe, tcSplitFunTys, tcFunArgTy, tcFunResultTy, tcFunResultTyN,
tcSplitFunTysN,
tcSplitTyConApp, tcSplitTyConApp_maybe,
tcTyConAppTyCon, tcTyConAppTyCon_maybe, tcTyConAppArgs,
tcSplitAppTy_maybe, tcSplitAppTy, tcSplitAppTys, tcSplitAppTyNoView_maybe,
tcSplitSigmaTy, tcSplitNestedSigmaTys, tcSplitIOType_maybe,
isSigmaTy, isRhoTy, isRhoExpTy, isOverloadedTy,
isFloatingPrimTy, isDoubleTy, isFloatTy, isIntTy, isWordTy, isStringTy,
isIntegerTy, isNaturalTy,
isBoolTy, isUnitTy, isCharTy,
isTauTy, isTauTyCon, tcIsTyVarTy,
isPredTy, isTyVarClassPred,
checkValidClsArgs, hasTyVarHead,
isRigidTy, anyTy_maybe,
eqType, eqTypes, nonDetCmpType, nonDetCmpTypes, eqTypeX,
pickyEqType, tcEqType, tcEqKind, tcEqTypeNoKindCheck, tcEqTypeVis,
tcEqTyConApps, eqForAllVis, eqVarBndrs,
deNoteType,
getDFunTyKey, evVarPred,
ambigTkvsOfTy,
mkMinimalBySCs, transSuperClasses,
pickCapturedPreds,
immSuperClasses, boxEqPred,
isImprovementPred,
tcTyFamInsts, tcTyFamInstsAndVis, tcTyConAppTyFamInstsAndVis, isTyFamFree,
exactTyCoVarsOfType, exactTyCoVarsOfTypes,
anyRewritableTyVar, anyRewritableTyFamApp,
PatersonSize(..), PatersonCondFailure(..),
PatersonCondFailureContext(..),
ltPatersonSize,
pSizeZero, pSizeOne,
pSizeType, pSizeTypeX, pSizeTypes,
pSizeClassPred, pSizeClassPredX,
pSizeTyConApp,
noMoreTyVars, allDistinctTyVars,
TypeSize, sizeType, sizeTypes, scopedSort,
isTerminatingClass, isStuckTypeFamily,
Kind, liftedTypeKind, constraintKind,
isLiftedTypeKind, isUnliftedTypeKind, isTYPEorCONSTRAINT,
Type, PredType, ThetaType, PiTyBinder,
ForAllTyFlag(..), FunTyFlag(..),
mkForAllTy, mkForAllTys, mkInvisForAllTys, mkTyCoInvForAllTys,
mkSpecForAllTys, mkTyCoInvForAllTy,
mkInfForAllTy, mkInfForAllTys,
mkVisFunTy, mkVisFunTyMany, mkVisFunTysMany,
mkScaledFunTys,
mkInvisFunTy, mkInvisFunTys,
mkTyConApp, mkAppTy, mkAppTys,
mkTyConTy, mkTyVarTy, mkTyVarTys,
mkTyCoVarTy, mkTyCoVarTys,
isClassPred, isEqPrimPred, isIPLikePred, isEqPred,
isEqualityClass, mkClassPred,
tcSplitQuantPredTy, tcSplitDFunTy, tcSplitDFunHead, tcSplitMethodTy,
isRuntimeRepVar, isFixedRuntimeRepKind,
isVisiblePiTyBinder, isInvisiblePiTyBinder,
Subst(..),
TvSubstEnv, emptySubst, mkEmptySubst,
zipTvSubst,
mkTvSubstPrs, notElemSubst, unionSubst,
getTvSubstEnv, getSubstInScope, extendSubstInScope,
extendSubstInScopeList, extendSubstInScopeSet, extendTvSubstAndInScope,
Type.lookupTyVar, Type.extendTCvSubst, Type.substTyVarBndr,
Type.extendTvSubst,
isInScope, mkSubst, mkTvSubst, zipTyEnv, zipCoEnv,
Type.substTy, substTys, substScaledTys, substTyWith, substTyWithCoVars,
substTyAddInScope,
substTyUnchecked, substTysUnchecked, substScaledTyUnchecked,
substThetaUnchecked,
substTyWithUnchecked,
substCoUnchecked, substCoWithUnchecked,
substTheta,
isUnliftedType,
isUnboxedTupleType,
isPrimitiveType,
coreView,
tyCoVarsOfType, tyCoVarsOfTypes, closeOverKinds,
tyCoFVsOfType, tyCoFVsOfTypes,
tyCoVarsOfTypeDSet, tyCoVarsOfTypesDSet, closeOverKindsDSet,
tyCoVarsOfTypeList, tyCoVarsOfTypesList,
noFreeVarsOfType,
pprKind, pprParendKind, pprSigmaType,
pprType, pprParendType, pprTypeApp,
pprTheta, pprParendTheta, pprThetaArrowTy, pprClassPred,
pprTCvBndr, pprTCvBndrs,
tyConVisibilities, isNextTyConArgVisible, isNextArgVisible
) where
import GHC.Prelude
import GHC.Core.TyCo.Rep
import GHC.Core.TyCo.Subst ( mkTvSubst, substTyWithCoVars )
import GHC.Core.TyCo.Compare
import GHC.Core.TyCo.FVs
import GHC.Core.TyCo.Ppr
import GHC.Core.Class
import GHC.Types.Var
import GHC.Types.Var.Set
import GHC.Core.Coercion
import GHC.Core.Type as Type
import GHC.Core.Predicate
import GHC.Core.TyCon
import {-# SOURCE #-} GHC.Tc.Types.Origin
( SkolemInfo, unkSkol
, FixedRuntimeRepOrigin, FixedRuntimeRepContext )
import GHC.Types.Name as Name
import GHC.Types.Name.Set
import GHC.Builtin.Names
import GHC.Builtin.Types ( coercibleClass, eqClass, heqClass, unitTyConKey
, listTyCon, constraintKind )
import GHC.Types.Basic
import GHC.Utils.Misc
import GHC.Data.Maybe
import GHC.Data.List.SetOps ( getNth, findDupsEq )
import GHC.Utils.Outputable
import GHC.Utils.Panic
import GHC.Utils.Panic.Plain
import Data.IORef ( IORef )
import Data.List.NonEmpty( NonEmpty(..) )
import Data.List ( partition, nub, (\\) )
type TcCoVar = CoVar
type TcType = Type
type TcTyCoVar = Var
type TcTypeFRR = TcType
type TcTyVarBinder = TyVarBinder
type TcInvisTVBinder = InvisTVBinder
type TcReqTVBinder = ReqTVBinder
type TcTyCon = TyCon
type MonoTcTyCon = TcTyCon
type PolyTcTyCon = TcTyCon
type TcTyConBinder = TyConBinder
type TcPredType = PredType
type TcThetaType = ThetaType
type TcSigmaType = TcType
type TcSigmaTypeFRR = TcSigmaType
type TcRhoType = TcType
type TcTauType = TcType
type TcKind = Kind
type TcTyVarSet = TyVarSet
type TcTyCoVarSet = TyCoVarSet
type TcDTyVarSet = DTyVarSet
type TcDTyCoVarSet = DTyCoVarSet
data ExpType = Check TcType
| Infer !InferResult
data InferResult
= IR { InferResult -> Unique
ir_uniq :: Unique
, InferResult -> TcLevel
ir_lvl :: TcLevel
, InferResult -> Maybe FixedRuntimeRepContext
ir_frr :: Maybe FixedRuntimeRepContext
, InferResult -> IORef (Maybe Type)
ir_ref :: IORef (Maybe TcType) }
type ExpSigmaType = ExpType
type ExpTypeFRR = ExpType
type ExpSigmaTypeFRR = ExpTypeFRR
type ExpRhoType = ExpType
instance Outputable ExpType where
ppr :: ExpType -> SDoc
ppr (Check Type
ty) = String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"Check" SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc
braces (Type -> SDoc
forall a. Outputable a => a -> SDoc
ppr Type
ty)
ppr (Infer InferResult
ir) = InferResult -> SDoc
forall a. Outputable a => a -> SDoc
ppr InferResult
ir
instance Outputable InferResult where
ppr :: InferResult -> SDoc
ppr (IR { ir_uniq :: InferResult -> Unique
ir_uniq = Unique
u, ir_lvl :: InferResult -> TcLevel
ir_lvl = TcLevel
lvl, ir_frr :: InferResult -> Maybe FixedRuntimeRepContext
ir_frr = Maybe FixedRuntimeRepContext
mb_frr })
= String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"Infer" SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<> SDoc
mb_frr_text SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc
braces (Unique -> SDoc
forall a. Outputable a => a -> SDoc
ppr Unique
u SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<> SDoc
forall doc. IsLine doc => doc
comma SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<> TcLevel -> SDoc
forall a. Outputable a => a -> SDoc
ppr TcLevel
lvl)
where
mb_frr_text :: SDoc
mb_frr_text = case Maybe FixedRuntimeRepContext
mb_frr of
Just FixedRuntimeRepContext
_ -> String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"FRR"
Maybe FixedRuntimeRepContext
Nothing -> SDoc
forall doc. IsOutput doc => doc
empty
mkCheckExpType :: TcType -> ExpType
mkCheckExpType :: Type -> ExpType
mkCheckExpType = Type -> ExpType
Check
checkingExpType_maybe :: ExpType -> Maybe TcType
checkingExpType_maybe :: ExpType -> Maybe Type
checkingExpType_maybe (Check Type
ty) = Type -> Maybe Type
forall a. a -> Maybe a
Just Type
ty
checkingExpType_maybe (Infer {}) = Maybe Type
forall a. Maybe a
Nothing
checkingExpType :: String -> ExpType -> TcType
checkingExpType :: String -> ExpType -> Type
checkingExpType String
_ (Check Type
ty) = Type
ty
checkingExpType String
err ExpType
et = String -> SDoc -> Type
forall a. HasCallStack => String -> SDoc -> a
pprPanic String
"checkingExpType" (String -> SDoc
forall doc. IsLine doc => String -> doc
text String
err SDoc -> SDoc -> SDoc
forall doc. IsDoc doc => doc -> doc -> doc
$$ ExpType -> SDoc
forall a. Outputable a => a -> SDoc
ppr ExpType
et)
data SyntaxOpType
= SynAny
| SynRho
| SynList
| SynFun SyntaxOpType SyntaxOpType
| SynType ExpType
infixr 0 `SynFun`
synKnownType :: TcType -> SyntaxOpType
synKnownType :: Type -> SyntaxOpType
synKnownType = ExpType -> SyntaxOpType
SynType (ExpType -> SyntaxOpType)
-> (Type -> ExpType) -> Type -> SyntaxOpType
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Type -> ExpType
mkCheckExpType
mkSynFunTys :: [SyntaxOpType] -> ExpType -> SyntaxOpType
mkSynFunTys :: [SyntaxOpType] -> ExpType -> SyntaxOpType
mkSynFunTys [SyntaxOpType]
arg_tys ExpType
res_ty = (SyntaxOpType -> SyntaxOpType -> SyntaxOpType)
-> SyntaxOpType -> [SyntaxOpType] -> SyntaxOpType
forall a b. (a -> b -> b) -> b -> [a] -> b
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr SyntaxOpType -> SyntaxOpType -> SyntaxOpType
SynFun (ExpType -> SyntaxOpType
SynType ExpType
res_ty) [SyntaxOpType]
arg_tys
data TcTyVarDetails
= SkolemTv
SkolemInfo
TcLevel
Bool
| RuntimeUnk
| MetaTv { TcTyVarDetails -> MetaInfo
mtv_info :: MetaInfo
, TcTyVarDetails -> IORef MetaDetails
mtv_ref :: IORef MetaDetails
, TcTyVarDetails -> TcLevel
mtv_tclvl :: TcLevel }
vanillaSkolemTvUnk :: HasCallStack => TcTyVarDetails
vanillaSkolemTvUnk :: HasCallStack => TcTyVarDetails
vanillaSkolemTvUnk = SkolemInfo -> TcLevel -> Bool -> TcTyVarDetails
SkolemTv SkolemInfo
HasCallStack => SkolemInfo
unkSkol TcLevel
topTcLevel Bool
False
instance Outputable TcTyVarDetails where
ppr :: TcTyVarDetails -> SDoc
ppr = TcTyVarDetails -> SDoc
pprTcTyVarDetails
pprTcTyVarDetails :: TcTyVarDetails -> SDoc
pprTcTyVarDetails :: TcTyVarDetails -> SDoc
pprTcTyVarDetails (RuntimeUnk {}) = String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"rt"
pprTcTyVarDetails (SkolemTv SkolemInfo
_sk TcLevel
lvl Bool
True) = String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"ssk" SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<> SDoc
forall doc. IsLine doc => doc
colon SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<> TcLevel -> SDoc
forall a. Outputable a => a -> SDoc
ppr TcLevel
lvl
pprTcTyVarDetails (SkolemTv SkolemInfo
_sk TcLevel
lvl Bool
False) = String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"sk" SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<> SDoc
forall doc. IsLine doc => doc
colon SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<> TcLevel -> SDoc
forall a. Outputable a => a -> SDoc
ppr TcLevel
lvl
pprTcTyVarDetails (MetaTv { mtv_info :: TcTyVarDetails -> MetaInfo
mtv_info = MetaInfo
info, mtv_tclvl :: TcTyVarDetails -> TcLevel
mtv_tclvl = TcLevel
tclvl })
= MetaInfo -> SDoc
forall a. Outputable a => a -> SDoc
ppr MetaInfo
info SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<> SDoc
forall doc. IsLine doc => doc
colon SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<> TcLevel -> SDoc
forall a. Outputable a => a -> SDoc
ppr TcLevel
tclvl
data MetaDetails
= Flexi
| Indirect TcType
data MetaInfo
= TauTv
| TyVarTv
| RuntimeUnkTv
| CycleBreakerTv
| ConcreteTv ConcreteTvOrigin
instance Outputable MetaDetails where
ppr :: MetaDetails -> SDoc
ppr MetaDetails
Flexi = String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"Flexi"
ppr (Indirect Type
ty) = String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"Indirect" SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> Type -> SDoc
forall a. Outputable a => a -> SDoc
ppr Type
ty
instance Outputable MetaInfo where
ppr :: MetaInfo -> SDoc
ppr MetaInfo
TauTv = String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"tau"
ppr MetaInfo
TyVarTv = String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"tyv"
ppr MetaInfo
RuntimeUnkTv = String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"rutv"
ppr MetaInfo
CycleBreakerTv = String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"cbv"
ppr (ConcreteTv {}) = String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"conc"
data ConcreteTvOrigin
= ConcreteFRR FixedRuntimeRepOrigin
newtype TcLevel = TcLevel Int deriving( TcLevel -> TcLevel -> Bool
(TcLevel -> TcLevel -> Bool)
-> (TcLevel -> TcLevel -> Bool) -> Eq TcLevel
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: TcLevel -> TcLevel -> Bool
== :: TcLevel -> TcLevel -> Bool
$c/= :: TcLevel -> TcLevel -> Bool
/= :: TcLevel -> TcLevel -> Bool
Eq, Eq TcLevel
Eq TcLevel =>
(TcLevel -> TcLevel -> Ordering)
-> (TcLevel -> TcLevel -> Bool)
-> (TcLevel -> TcLevel -> Bool)
-> (TcLevel -> TcLevel -> Bool)
-> (TcLevel -> TcLevel -> Bool)
-> (TcLevel -> TcLevel -> TcLevel)
-> (TcLevel -> TcLevel -> TcLevel)
-> Ord TcLevel
TcLevel -> TcLevel -> Bool
TcLevel -> TcLevel -> Ordering
TcLevel -> TcLevel -> TcLevel
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: TcLevel -> TcLevel -> Ordering
compare :: TcLevel -> TcLevel -> Ordering
$c< :: TcLevel -> TcLevel -> Bool
< :: TcLevel -> TcLevel -> Bool
$c<= :: TcLevel -> TcLevel -> Bool
<= :: TcLevel -> TcLevel -> Bool
$c> :: TcLevel -> TcLevel -> Bool
> :: TcLevel -> TcLevel -> Bool
$c>= :: TcLevel -> TcLevel -> Bool
>= :: TcLevel -> TcLevel -> Bool
$cmax :: TcLevel -> TcLevel -> TcLevel
max :: TcLevel -> TcLevel -> TcLevel
$cmin :: TcLevel -> TcLevel -> TcLevel
min :: TcLevel -> TcLevel -> TcLevel
Ord )
maxTcLevel :: TcLevel -> TcLevel -> TcLevel
maxTcLevel :: TcLevel -> TcLevel -> TcLevel
maxTcLevel (TcLevel Int
a) (TcLevel Int
b) = Int -> TcLevel
TcLevel (Int
a Int -> Int -> Int
forall a. Ord a => a -> a -> a
`max` Int
b)
minTcLevel :: TcLevel -> TcLevel -> TcLevel
minTcLevel :: TcLevel -> TcLevel -> TcLevel
minTcLevel (TcLevel Int
a) (TcLevel Int
b) = Int -> TcLevel
TcLevel (Int
a Int -> Int -> Int
forall a. Ord a => a -> a -> a
`min` Int
b)
topTcLevel :: TcLevel
topTcLevel :: TcLevel
topTcLevel = Int -> TcLevel
TcLevel Int
0
isTopTcLevel :: TcLevel -> Bool
isTopTcLevel :: TcLevel -> Bool
isTopTcLevel (TcLevel Int
0) = Bool
True
isTopTcLevel TcLevel
_ = Bool
False
pushTcLevel :: TcLevel -> TcLevel
pushTcLevel :: TcLevel -> TcLevel
pushTcLevel (TcLevel Int
us) = Int -> TcLevel
TcLevel (Int
us Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1)
strictlyDeeperThan :: TcLevel -> TcLevel -> Bool
strictlyDeeperThan :: TcLevel -> TcLevel -> Bool
strictlyDeeperThan (TcLevel Int
tv_tclvl) (TcLevel Int
ctxt_tclvl)
= Int
tv_tclvl Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
ctxt_tclvl
deeperThanOrSame :: TcLevel -> TcLevel -> Bool
deeperThanOrSame :: TcLevel -> TcLevel -> Bool
deeperThanOrSame (TcLevel Int
tv_tclvl) (TcLevel Int
ctxt_tclvl)
= Int
tv_tclvl Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>= Int
ctxt_tclvl
sameDepthAs :: TcLevel -> TcLevel -> Bool
sameDepthAs :: TcLevel -> TcLevel -> Bool
sameDepthAs (TcLevel Int
ctxt_tclvl) (TcLevel Int
tv_tclvl)
= Int
ctxt_tclvl Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
tv_tclvl
checkTcLevelInvariant :: TcLevel -> TcLevel -> Bool
checkTcLevelInvariant :: TcLevel -> TcLevel -> Bool
checkTcLevelInvariant (TcLevel Int
ctxt_tclvl) (TcLevel Int
tv_tclvl)
= Int
ctxt_tclvl Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>= Int
tv_tclvl
tcTyVarLevel :: TcTyVar -> TcLevel
tcTyVarLevel :: TyVar -> TcLevel
tcTyVarLevel TyVar
tv
= case TyVar -> TcTyVarDetails
tcTyVarDetails TyVar
tv of
MetaTv { mtv_tclvl :: TcTyVarDetails -> TcLevel
mtv_tclvl = TcLevel
tv_lvl } -> TcLevel
tv_lvl
SkolemTv SkolemInfo
_ TcLevel
tv_lvl Bool
_ -> TcLevel
tv_lvl
TcTyVarDetails
RuntimeUnk -> TcLevel
topTcLevel
tcTypeLevel :: TcType -> TcLevel
tcTypeLevel :: Type -> TcLevel
tcTypeLevel Type
ty
= (TyVar -> TcLevel -> TcLevel) -> TcLevel -> DVarSet -> TcLevel
forall a. (TyVar -> a -> a) -> a -> DVarSet -> a
nonDetStrictFoldDVarSet TyVar -> TcLevel -> TcLevel
add TcLevel
topTcLevel (Type -> DVarSet
tyCoVarsOfTypeDSet Type
ty)
where
add :: TyVar -> TcLevel -> TcLevel
add TyVar
v TcLevel
lvl
| TyVar -> Bool
isTcTyVar TyVar
v = TcLevel
lvl TcLevel -> TcLevel -> TcLevel
`maxTcLevel` TyVar -> TcLevel
tcTyVarLevel TyVar
v
| Bool
otherwise = TcLevel
lvl
instance Outputable TcLevel where
ppr :: TcLevel -> SDoc
ppr (TcLevel Int
us) = Int -> SDoc
forall a. Outputable a => a -> SDoc
ppr Int
us
tcTyFamInsts :: Type -> [(TyCon, [Type])]
tcTyFamInsts :: Type -> [(TyCon, [Type])]
tcTyFamInsts = ((Bool, TyCon, [Type]) -> (TyCon, [Type]))
-> [(Bool, TyCon, [Type])] -> [(TyCon, [Type])]
forall a b. (a -> b) -> [a] -> [b]
map (\(Bool
_,TyCon
b,[Type]
c) -> (TyCon
b,[Type]
c)) ([(Bool, TyCon, [Type])] -> [(TyCon, [Type])])
-> (Type -> [(Bool, TyCon, [Type])]) -> Type -> [(TyCon, [Type])]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Type -> [(Bool, TyCon, [Type])]
tcTyFamInstsAndVis
tcTyFamInstsAndVis :: Type -> [(Bool, TyCon, [Type])]
tcTyFamInstsAndVis :: Type -> [(Bool, TyCon, [Type])]
tcTyFamInstsAndVis = Bool -> Type -> [(Bool, TyCon, [Type])]
tcTyFamInstsAndVisX Bool
False
tcTyFamInstsAndVisX
:: Bool
-> Type -> [(Bool, TyCon, [Type])]
tcTyFamInstsAndVisX :: Bool -> Type -> [(Bool, TyCon, [Type])]
tcTyFamInstsAndVisX = Bool -> Type -> [(Bool, TyCon, [Type])]
go
where
go :: Bool -> Type -> [(Bool, TyCon, [Type])]
go Bool
is_invis_arg Type
ty
| Just Type
exp_ty <- Type -> Maybe Type
coreView Type
ty = Bool -> Type -> [(Bool, TyCon, [Type])]
go Bool
is_invis_arg Type
exp_ty
go Bool
_ (TyVarTy TyVar
_) = []
go Bool
is_invis_arg (TyConApp TyCon
tc [Type]
tys)
| TyCon -> Bool
isTypeFamilyTyCon TyCon
tc
= [(Bool
is_invis_arg, TyCon
tc, Int -> [Type] -> [Type]
forall a. Int -> [a] -> [a]
take (TyCon -> Int
tyConArity TyCon
tc) [Type]
tys)]
| Bool
otherwise
= Bool -> TyCon -> [Type] -> [(Bool, TyCon, [Type])]
tcTyConAppTyFamInstsAndVisX Bool
is_invis_arg TyCon
tc [Type]
tys
go Bool
_ (LitTy {}) = []
go Bool
is_invis_arg (ForAllTy ForAllTyBinder
bndr Type
ty) = Bool -> Type -> [(Bool, TyCon, [Type])]
go Bool
is_invis_arg (ForAllTyBinder -> Type
forall argf. VarBndr TyVar argf -> Type
binderType ForAllTyBinder
bndr)
[(Bool, TyCon, [Type])]
-> [(Bool, TyCon, [Type])] -> [(Bool, TyCon, [Type])]
forall a. [a] -> [a] -> [a]
++ Bool -> Type -> [(Bool, TyCon, [Type])]
go Bool
is_invis_arg Type
ty
go Bool
is_invis_arg (FunTy FunTyFlag
_ Type
w Type
ty1 Type
ty2) = Bool -> Type -> [(Bool, TyCon, [Type])]
go Bool
is_invis_arg Type
w
[(Bool, TyCon, [Type])]
-> [(Bool, TyCon, [Type])] -> [(Bool, TyCon, [Type])]
forall a. [a] -> [a] -> [a]
++ Bool -> Type -> [(Bool, TyCon, [Type])]
go Bool
is_invis_arg Type
ty1
[(Bool, TyCon, [Type])]
-> [(Bool, TyCon, [Type])] -> [(Bool, TyCon, [Type])]
forall a. [a] -> [a] -> [a]
++ Bool -> Type -> [(Bool, TyCon, [Type])]
go Bool
is_invis_arg Type
ty2
go Bool
is_invis_arg ty :: Type
ty@(AppTy Type
_ Type
_) =
let (Type
ty_head, [Type]
ty_args) = Type -> (Type, [Type])
splitAppTys Type
ty
ty_arg_flags :: [ForAllTyFlag]
ty_arg_flags = Type -> [Type] -> [ForAllTyFlag]
appTyForAllTyFlags Type
ty_head [Type]
ty_args
in Bool -> Type -> [(Bool, TyCon, [Type])]
go Bool
is_invis_arg Type
ty_head
[(Bool, TyCon, [Type])]
-> [(Bool, TyCon, [Type])] -> [(Bool, TyCon, [Type])]
forall a. [a] -> [a] -> [a]
++ [[(Bool, TyCon, [Type])]] -> [(Bool, TyCon, [Type])]
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat ((ForAllTyFlag -> Type -> [(Bool, TyCon, [Type])])
-> [ForAllTyFlag] -> [Type] -> [[(Bool, TyCon, [Type])]]
forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWith (\ForAllTyFlag
flag -> Bool -> Type -> [(Bool, TyCon, [Type])]
go (ForAllTyFlag -> Bool
isInvisibleForAllTyFlag ForAllTyFlag
flag))
[ForAllTyFlag]
ty_arg_flags [Type]
ty_args)
go Bool
is_invis_arg (CastTy Type
ty KindCoercion
_) = Bool -> Type -> [(Bool, TyCon, [Type])]
go Bool
is_invis_arg Type
ty
go Bool
_ (CoercionTy KindCoercion
_) = []
tcTyConAppTyFamInstsAndVis :: TyCon -> [Type] -> [(Bool, TyCon, [Type])]
tcTyConAppTyFamInstsAndVis :: TyCon -> [Type] -> [(Bool, TyCon, [Type])]
tcTyConAppTyFamInstsAndVis = Bool -> TyCon -> [Type] -> [(Bool, TyCon, [Type])]
tcTyConAppTyFamInstsAndVisX Bool
False
tcTyConAppTyFamInstsAndVisX
:: Bool
-> TyCon -> [Type] -> [(Bool, TyCon, [Type])]
tcTyConAppTyFamInstsAndVisX :: Bool -> TyCon -> [Type] -> [(Bool, TyCon, [Type])]
tcTyConAppTyFamInstsAndVisX Bool
is_invis_arg TyCon
tc [Type]
tys =
let ([Type]
invis_tys, [Type]
vis_tys) = TyCon -> [Type] -> ([Type], [Type])
partitionInvisibleTypes TyCon
tc [Type]
tys
in [[(Bool, TyCon, [Type])]] -> [(Bool, TyCon, [Type])]
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat ([[(Bool, TyCon, [Type])]] -> [(Bool, TyCon, [Type])])
-> [[(Bool, TyCon, [Type])]] -> [(Bool, TyCon, [Type])]
forall a b. (a -> b) -> a -> b
$ (Type -> [(Bool, TyCon, [Type])])
-> [Type] -> [[(Bool, TyCon, [Type])]]
forall a b. (a -> b) -> [a] -> [b]
map (Bool -> Type -> [(Bool, TyCon, [Type])]
tcTyFamInstsAndVisX Bool
True) [Type]
invis_tys
[[(Bool, TyCon, [Type])]]
-> [[(Bool, TyCon, [Type])]] -> [[(Bool, TyCon, [Type])]]
forall a. [a] -> [a] -> [a]
++ (Type -> [(Bool, TyCon, [Type])])
-> [Type] -> [[(Bool, TyCon, [Type])]]
forall a b. (a -> b) -> [a] -> [b]
map (Bool -> Type -> [(Bool, TyCon, [Type])]
tcTyFamInstsAndVisX Bool
is_invis_arg) [Type]
vis_tys
isTyFamFree :: Type -> Bool
isTyFamFree :: Type -> Bool
isTyFamFree = [(TyCon, [Type])] -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null ([(TyCon, [Type])] -> Bool)
-> (Type -> [(TyCon, [Type])]) -> Type -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Type -> [(TyCon, [Type])]
tcTyFamInsts
any_rewritable :: EqRel
-> (EqRel -> TcTyVar -> Bool)
-> (EqRel -> TyCon -> [TcType] -> Bool)
-> (TyCon -> Bool)
-> TcType -> Bool
{-# INLINE any_rewritable #-}
any_rewritable :: EqRel
-> (EqRel -> TyVar -> Bool)
-> (EqRel -> TyCon -> [Type] -> Bool)
-> (TyCon -> Bool)
-> Type
-> Bool
any_rewritable EqRel
role EqRel -> TyVar -> Bool
tv_pred EqRel -> TyCon -> [Type] -> Bool
tc_pred TyCon -> Bool
should_expand
= EqRel -> VarSet -> Type -> Bool
go EqRel
role VarSet
emptyVarSet
where
go_tv :: EqRel -> VarSet -> TyVar -> Bool
go_tv EqRel
rl VarSet
bvs TyVar
tv | TyVar
tv TyVar -> VarSet -> Bool
`elemVarSet` VarSet
bvs = Bool
False
| Bool
otherwise = EqRel -> TyVar -> Bool
tv_pred EqRel
rl TyVar
tv
go :: EqRel -> VarSet -> Type -> Bool
go EqRel
rl VarSet
bvs ty :: Type
ty@(TyConApp TyCon
tc [Type]
tys)
| TyCon -> Bool
isTypeSynonymTyCon TyCon
tc
, TyCon -> Bool
should_expand TyCon
tc
, Just Type
ty' <- Type -> Maybe Type
coreView Type
ty
= EqRel -> VarSet -> Type -> Bool
go EqRel
rl VarSet
bvs Type
ty'
| EqRel -> TyCon -> [Type] -> Bool
tc_pred EqRel
rl TyCon
tc [Type]
tys
= Bool
True
| Bool
otherwise
= EqRel -> VarSet -> TyCon -> [Type] -> Bool
go_tc EqRel
rl VarSet
bvs TyCon
tc [Type]
tys
go EqRel
rl VarSet
bvs (TyVarTy TyVar
tv) = EqRel -> VarSet -> TyVar -> Bool
go_tv EqRel
rl VarSet
bvs TyVar
tv
go EqRel
_ VarSet
_ (LitTy {}) = Bool
False
go EqRel
rl VarSet
bvs (AppTy Type
fun Type
arg) = EqRel -> VarSet -> Type -> Bool
go EqRel
rl VarSet
bvs Type
fun Bool -> Bool -> Bool
|| EqRel -> VarSet -> Type -> Bool
go EqRel
NomEq VarSet
bvs Type
arg
go EqRel
rl VarSet
bvs (FunTy FunTyFlag
_ Type
w Type
arg Type
res) = EqRel -> VarSet -> Type -> Bool
go EqRel
NomEq VarSet
bvs Type
arg_rep Bool -> Bool -> Bool
|| EqRel -> VarSet -> Type -> Bool
go EqRel
NomEq VarSet
bvs Type
res_rep Bool -> Bool -> Bool
||
EqRel -> VarSet -> Type -> Bool
go EqRel
rl VarSet
bvs Type
arg Bool -> Bool -> Bool
|| EqRel -> VarSet -> Type -> Bool
go EqRel
rl VarSet
bvs Type
res Bool -> Bool -> Bool
|| EqRel -> VarSet -> Type -> Bool
go EqRel
NomEq VarSet
bvs Type
w
where arg_rep :: Type
arg_rep = HasDebugCallStack => Type -> Type
Type -> Type
getRuntimeRep Type
arg
res_rep :: Type
res_rep = HasDebugCallStack => Type -> Type
Type -> Type
getRuntimeRep Type
res
go EqRel
rl VarSet
bvs (ForAllTy ForAllTyBinder
tv Type
ty) = EqRel -> VarSet -> Type -> Bool
go EqRel
rl (VarSet
bvs VarSet -> TyVar -> VarSet
`extendVarSet` ForAllTyBinder -> TyVar
forall tv argf. VarBndr tv argf -> tv
binderVar ForAllTyBinder
tv) Type
ty
go EqRel
rl VarSet
bvs (CastTy Type
ty KindCoercion
_) = EqRel -> VarSet -> Type -> Bool
go EqRel
rl VarSet
bvs Type
ty
go EqRel
_ VarSet
_ (CoercionTy KindCoercion
_) = Bool
False
go_tc :: EqRel -> VarSet -> TyCon -> [Type] -> Bool
go_tc EqRel
NomEq VarSet
bvs TyCon
_ [Type]
tys = (Type -> Bool) -> [Type] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any (EqRel -> VarSet -> Type -> Bool
go EqRel
NomEq VarSet
bvs) [Type]
tys
go_tc EqRel
ReprEq VarSet
bvs TyCon
tc [Type]
tys = ((Role, Type) -> Bool) -> [(Role, Type)] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any (VarSet -> (Role, Type) -> Bool
go_arg VarSet
bvs)
(TyCon -> [Role]
tyConRoleListRepresentational TyCon
tc [Role] -> [Type] -> [(Role, Type)]
forall a b. [a] -> [b] -> [(a, b)]
`zip` [Type]
tys)
go_arg :: VarSet -> (Role, Type) -> Bool
go_arg VarSet
bvs (Role
Nominal, Type
ty) = EqRel -> VarSet -> Type -> Bool
go EqRel
NomEq VarSet
bvs Type
ty
go_arg VarSet
bvs (Role
Representational, Type
ty) = EqRel -> VarSet -> Type -> Bool
go EqRel
ReprEq VarSet
bvs Type
ty
go_arg VarSet
_ (Role
Phantom, Type
_) = Bool
False
anyRewritableTyVar :: EqRel
-> (EqRel -> TcTyVar -> Bool)
-> TcType -> Bool
anyRewritableTyVar :: EqRel -> (EqRel -> TyVar -> Bool) -> Type -> Bool
anyRewritableTyVar EqRel
role EqRel -> TyVar -> Bool
pred
= EqRel
-> (EqRel -> TyVar -> Bool)
-> (EqRel -> TyCon -> [Type] -> Bool)
-> (TyCon -> Bool)
-> Type
-> Bool
any_rewritable EqRel
role EqRel -> TyVar -> Bool
pred
(\ EqRel
_ TyCon
_ [Type]
_ -> Bool
False)
(\ TyCon
_ -> Bool
False)
anyRewritableTyFamApp :: EqRel
-> (EqRel -> TyCon -> [TcType] -> Bool)
-> TcType -> Bool
anyRewritableTyFamApp :: EqRel -> (EqRel -> TyCon -> [Type] -> Bool) -> Type -> Bool
anyRewritableTyFamApp EqRel
role EqRel -> TyCon -> [Type] -> Bool
check_tyconapp
= EqRel
-> (EqRel -> TyVar -> Bool)
-> (EqRel -> TyCon -> [Type] -> Bool)
-> (TyCon -> Bool)
-> Type
-> Bool
any_rewritable EqRel
role (\ EqRel
_ TyVar
_ -> Bool
False) EqRel -> TyCon -> [Type] -> Bool
check_tyconapp (Bool -> Bool
not (Bool -> Bool) -> (TyCon -> Bool) -> TyCon -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. TyCon -> Bool
isFamFreeTyCon)
exactTyCoVarsOfType :: Type -> TyCoVarSet
exactTyCoVarsOfTypes :: [Type] -> TyCoVarSet
exactTyCoVarsOfType :: Type -> VarSet
exactTyCoVarsOfType Type
ty = Endo VarSet -> VarSet
runTyCoVars (Type -> Endo VarSet
exact_ty Type
ty)
exactTyCoVarsOfTypes :: [Type] -> VarSet
exactTyCoVarsOfTypes [Type]
tys = Endo VarSet -> VarSet
runTyCoVars ([Type] -> Endo VarSet
exact_tys [Type]
tys)
exact_ty :: Type -> Endo TyCoVarSet
exact_tys :: [Type] -> Endo TyCoVarSet
(Type -> Endo VarSet
exact_ty, [Type] -> Endo VarSet
exact_tys, KindCoercion -> Endo VarSet
_, [KindCoercion] -> Endo VarSet
_) = TyCoFolder VarSet (Endo VarSet)
-> VarSet
-> (Type -> Endo VarSet, [Type] -> Endo VarSet,
KindCoercion -> Endo VarSet, [KindCoercion] -> Endo VarSet)
forall a env.
Monoid a =>
TyCoFolder env a
-> env
-> (Type -> a, [Type] -> a, KindCoercion -> a, [KindCoercion] -> a)
foldTyCo TyCoFolder VarSet (Endo VarSet)
exactTcvFolder VarSet
emptyVarSet
exactTcvFolder :: TyCoFolder TyCoVarSet (Endo TyCoVarSet)
exactTcvFolder :: TyCoFolder VarSet (Endo VarSet)
exactTcvFolder = TyCoFolder VarSet (Endo VarSet)
deepTcvFolder { tcf_view = coreView }
tcIsTcTyVar :: TcTyVar -> Bool
tcIsTcTyVar :: TyVar -> Bool
tcIsTcTyVar TyVar
tv = TyVar -> Bool
isTyVar TyVar
tv
isPromotableMetaTyVar :: TcTyVar -> Bool
isPromotableMetaTyVar :: TyVar -> Bool
isPromotableMetaTyVar TyVar
tv
| TyVar -> Bool
isTyVar TyVar
tv
, MetaTv { mtv_info :: TcTyVarDetails -> MetaInfo
mtv_info = MetaInfo
info } <- TyVar -> TcTyVarDetails
tcTyVarDetails TyVar
tv
= MetaInfo -> Bool
isTouchableInfo MetaInfo
info
| Bool
otherwise
= Bool
False
isTouchableMetaTyVar :: TcLevel -> TcTyVar -> Bool
isTouchableMetaTyVar :: TcLevel -> TyVar -> Bool
isTouchableMetaTyVar TcLevel
ctxt_tclvl TyVar
tv
| TyVar -> Bool
isTyVar TyVar
tv
, MetaTv { mtv_tclvl :: TcTyVarDetails -> TcLevel
mtv_tclvl = TcLevel
tv_tclvl, mtv_info :: TcTyVarDetails -> MetaInfo
mtv_info = MetaInfo
info } <- TyVar -> TcTyVarDetails
tcTyVarDetails TyVar
tv
, MetaInfo -> Bool
isTouchableInfo MetaInfo
info
= Bool -> SDoc -> Bool -> Bool
forall a. HasCallStack => Bool -> SDoc -> a -> a
assertPpr (TcLevel -> TcLevel -> Bool
checkTcLevelInvariant TcLevel
ctxt_tclvl TcLevel
tv_tclvl)
(TyVar -> SDoc
forall a. Outputable a => a -> SDoc
ppr TyVar
tv SDoc -> SDoc -> SDoc
forall doc. IsDoc doc => doc -> doc -> doc
$$ TcLevel -> SDoc
forall a. Outputable a => a -> SDoc
ppr TcLevel
tv_tclvl SDoc -> SDoc -> SDoc
forall doc. IsDoc doc => doc -> doc -> doc
$$ TcLevel -> SDoc
forall a. Outputable a => a -> SDoc
ppr TcLevel
ctxt_tclvl) (Bool -> Bool) -> Bool -> Bool
forall a b. (a -> b) -> a -> b
$
TcLevel
tv_tclvl TcLevel -> TcLevel -> Bool
`sameDepthAs` TcLevel
ctxt_tclvl
| Bool
otherwise = Bool
False
isImmutableTyVar :: TyVar -> Bool
isImmutableTyVar :: TyVar -> Bool
isImmutableTyVar TyVar
tv = TyVar -> Bool
isSkolemTyVar TyVar
tv
isTyConableTyVar, isSkolemTyVar, isOverlappableTyVar,
isMetaTyVar, isAmbiguousTyVar, isCycleBreakerTyVar :: TcTyVar -> Bool
isTyConableTyVar :: TyVar -> Bool
isTyConableTyVar TyVar
tv
| TyVar -> Bool
isTyVar TyVar
tv
= case TyVar -> TcTyVarDetails
tcTyVarDetails TyVar
tv of
MetaTv { mtv_info :: TcTyVarDetails -> MetaInfo
mtv_info = MetaInfo
TyVarTv } -> Bool
False
TcTyVarDetails
_ -> Bool
True
| Bool
otherwise = Bool
True
isSkolemTyVar :: TyVar -> Bool
isSkolemTyVar TyVar
tv
= Bool -> SDoc -> Bool -> Bool
forall a. HasCallStack => Bool -> SDoc -> a -> a
assertPpr (TyVar -> Bool
tcIsTcTyVar TyVar
tv) (TyVar -> SDoc
forall a. Outputable a => a -> SDoc
ppr TyVar
tv) (Bool -> Bool) -> Bool -> Bool
forall a b. (a -> b) -> a -> b
$
case TyVar -> TcTyVarDetails
tcTyVarDetails TyVar
tv of
MetaTv {} -> Bool
False
TcTyVarDetails
_other -> Bool
True
skolemSkolInfo :: TcTyVar -> SkolemInfo
skolemSkolInfo :: TyVar -> SkolemInfo
skolemSkolInfo TyVar
tv
= Bool -> SkolemInfo -> SkolemInfo
forall a. HasCallStack => Bool -> a -> a
assert (TyVar -> Bool
isSkolemTyVar TyVar
tv) (SkolemInfo -> SkolemInfo) -> SkolemInfo -> SkolemInfo
forall a b. (a -> b) -> a -> b
$
case TyVar -> TcTyVarDetails
tcTyVarDetails TyVar
tv of
SkolemTv SkolemInfo
skol_info TcLevel
_ Bool
_ -> SkolemInfo
skol_info
TcTyVarDetails
RuntimeUnk -> String -> SkolemInfo
forall a. HasCallStack => String -> a
panic String
"RuntimeUnk"
MetaTv {} -> String -> SkolemInfo
forall a. HasCallStack => String -> a
panic String
"skolemSkolInfo"
isOverlappableTyVar :: TyVar -> Bool
isOverlappableTyVar TyVar
tv
| TyVar -> Bool
isTyVar TyVar
tv
= case TyVar -> TcTyVarDetails
tcTyVarDetails TyVar
tv of
SkolemTv SkolemInfo
_ TcLevel
_ Bool
overlappable -> Bool
overlappable
TcTyVarDetails
_ -> Bool
False
| Bool
otherwise = Bool
False
isMetaTyVar :: TyVar -> Bool
isMetaTyVar TyVar
tv
| TyVar -> Bool
isTyVar TyVar
tv
= case TyVar -> TcTyVarDetails
tcTyVarDetails TyVar
tv of
MetaTv {} -> Bool
True
TcTyVarDetails
_ -> Bool
False
| Bool
otherwise = Bool
False
isAmbiguousTyVar :: TyVar -> Bool
isAmbiguousTyVar TyVar
tv
| TyVar -> Bool
isTyVar TyVar
tv
= case TyVar -> TcTyVarDetails
tcTyVarDetails TyVar
tv of
MetaTv {} -> Bool
True
RuntimeUnk {} -> Bool
True
TcTyVarDetails
_ -> Bool
False
| Bool
otherwise = Bool
False
isCycleBreakerTyVar :: TyVar -> Bool
isCycleBreakerTyVar TyVar
tv
| TyVar -> Bool
isTyVar TyVar
tv
, MetaTv { mtv_info :: TcTyVarDetails -> MetaInfo
mtv_info = MetaInfo
CycleBreakerTv } <- TyVar -> TcTyVarDetails
tcTyVarDetails TyVar
tv
= Bool
True
| Bool
otherwise
= Bool
False
isConcreteTyVar_maybe :: TcTyVar -> Maybe ConcreteTvOrigin
isConcreteTyVar_maybe :: TyVar -> Maybe ConcreteTvOrigin
isConcreteTyVar_maybe TyVar
tv
| TyVar -> Bool
isTcTyVar TyVar
tv
, MetaTv { mtv_info :: TcTyVarDetails -> MetaInfo
mtv_info = ConcreteTv ConcreteTvOrigin
conc_orig } <- TyVar -> TcTyVarDetails
tcTyVarDetails TyVar
tv
= ConcreteTvOrigin -> Maybe ConcreteTvOrigin
forall a. a -> Maybe a
Just ConcreteTvOrigin
conc_orig
| Bool
otherwise
= Maybe ConcreteTvOrigin
forall a. Maybe a
Nothing
isConcreteInfo :: MetaInfo -> Bool
isConcreteInfo :: MetaInfo -> Bool
isConcreteInfo (ConcreteTv {}) = Bool
True
isConcreteInfo MetaInfo
_ = Bool
False
isConcreteTyVar :: TcTyVar -> Bool
isConcreteTyVar :: TyVar -> Bool
isConcreteTyVar = Maybe ConcreteTvOrigin -> Bool
forall a. Maybe a -> Bool
isJust (Maybe ConcreteTvOrigin -> Bool)
-> (TyVar -> Maybe ConcreteTvOrigin) -> TyVar -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. TyVar -> Maybe ConcreteTvOrigin
isConcreteTyVar_maybe
isConcreteTyVarTy :: TcType -> Bool
isConcreteTyVarTy :: Type -> Bool
isConcreteTyVarTy = Maybe (TyVar, ConcreteTvOrigin) -> Bool
forall a. Maybe a -> Bool
isJust (Maybe (TyVar, ConcreteTvOrigin) -> Bool)
-> (Type -> Maybe (TyVar, ConcreteTvOrigin)) -> Type -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Type -> Maybe (TyVar, ConcreteTvOrigin)
isConcreteTyVarTy_maybe
isConcreteTyVarTy_maybe :: TcType -> Maybe (TcTyVar, ConcreteTvOrigin)
isConcreteTyVarTy_maybe :: Type -> Maybe (TyVar, ConcreteTvOrigin)
isConcreteTyVarTy_maybe (TyVarTy TyVar
tv) = (TyVar
tv, ) (ConcreteTvOrigin -> (TyVar, ConcreteTvOrigin))
-> Maybe ConcreteTvOrigin -> Maybe (TyVar, ConcreteTvOrigin)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> TyVar -> Maybe ConcreteTvOrigin
isConcreteTyVar_maybe TyVar
tv
isConcreteTyVarTy_maybe Type
_ = Maybe (TyVar, ConcreteTvOrigin)
forall a. Maybe a
Nothing
isMetaTyVarTy :: TcType -> Bool
isMetaTyVarTy :: Type -> Bool
isMetaTyVarTy (TyVarTy TyVar
tv) = TyVar -> Bool
isMetaTyVar TyVar
tv
isMetaTyVarTy Type
_ = Bool
False
metaTyVarInfo :: TcTyVar -> MetaInfo
metaTyVarInfo :: TyVar -> MetaInfo
metaTyVarInfo TyVar
tv
= case TyVar -> TcTyVarDetails
tcTyVarDetails TyVar
tv of
MetaTv { mtv_info :: TcTyVarDetails -> MetaInfo
mtv_info = MetaInfo
info } -> MetaInfo
info
TcTyVarDetails
_ -> String -> SDoc -> MetaInfo
forall a. HasCallStack => String -> SDoc -> a
pprPanic String
"metaTyVarInfo" (TyVar -> SDoc
forall a. Outputable a => a -> SDoc
ppr TyVar
tv)
isTouchableInfo :: MetaInfo -> Bool
isTouchableInfo :: MetaInfo -> Bool
isTouchableInfo MetaInfo
info
| MetaInfo
CycleBreakerTv <- MetaInfo
info = Bool
False
| Bool
otherwise = Bool
True
metaTyVarTcLevel :: TcTyVar -> TcLevel
metaTyVarTcLevel :: TyVar -> TcLevel
metaTyVarTcLevel TyVar
tv
= case TyVar -> TcTyVarDetails
tcTyVarDetails TyVar
tv of
MetaTv { mtv_tclvl :: TcTyVarDetails -> TcLevel
mtv_tclvl = TcLevel
tclvl } -> TcLevel
tclvl
TcTyVarDetails
_ -> String -> SDoc -> TcLevel
forall a. HasCallStack => String -> SDoc -> a
pprPanic String
"metaTyVarTcLevel" (TyVar -> SDoc
forall a. Outputable a => a -> SDoc
ppr TyVar
tv)
metaTyVarTcLevel_maybe :: TcTyVar -> Maybe TcLevel
metaTyVarTcLevel_maybe :: TyVar -> Maybe TcLevel
metaTyVarTcLevel_maybe TyVar
tv
= case TyVar -> TcTyVarDetails
tcTyVarDetails TyVar
tv of
MetaTv { mtv_tclvl :: TcTyVarDetails -> TcLevel
mtv_tclvl = TcLevel
tclvl } -> TcLevel -> Maybe TcLevel
forall a. a -> Maybe a
Just TcLevel
tclvl
TcTyVarDetails
_ -> Maybe TcLevel
forall a. Maybe a
Nothing
metaTyVarRef :: TyVar -> IORef MetaDetails
metaTyVarRef :: TyVar -> IORef MetaDetails
metaTyVarRef TyVar
tv
= case TyVar -> TcTyVarDetails
tcTyVarDetails TyVar
tv of
MetaTv { mtv_ref :: TcTyVarDetails -> IORef MetaDetails
mtv_ref = IORef MetaDetails
ref } -> IORef MetaDetails
ref
TcTyVarDetails
_ -> String -> SDoc -> IORef MetaDetails
forall a. HasCallStack => String -> SDoc -> a
pprPanic String
"metaTyVarRef" (TyVar -> SDoc
forall a. Outputable a => a -> SDoc
ppr TyVar
tv)
setMetaTyVarTcLevel :: TcTyVar -> TcLevel -> TcTyVar
setMetaTyVarTcLevel :: TyVar -> TcLevel -> TyVar
setMetaTyVarTcLevel TyVar
tv TcLevel
tclvl
= case TyVar -> TcTyVarDetails
tcTyVarDetails TyVar
tv of
details :: TcTyVarDetails
details@(MetaTv {}) -> TyVar -> TcTyVarDetails -> TyVar
setTcTyVarDetails TyVar
tv (TcTyVarDetails
details { mtv_tclvl = tclvl })
TcTyVarDetails
_ -> String -> SDoc -> TyVar
forall a. HasCallStack => String -> SDoc -> a
pprPanic String
"metaTyVarTcLevel" (TyVar -> SDoc
forall a. Outputable a => a -> SDoc
ppr TyVar
tv)
isTyVarTyVar :: Var -> Bool
isTyVarTyVar :: TyVar -> Bool
isTyVarTyVar TyVar
tv
= case TyVar -> TcTyVarDetails
tcTyVarDetails TyVar
tv of
MetaTv { mtv_info :: TcTyVarDetails -> MetaInfo
mtv_info = MetaInfo
TyVarTv } -> Bool
True
TcTyVarDetails
_ -> Bool
False
isFlexi, isIndirect :: MetaDetails -> Bool
isFlexi :: MetaDetails -> Bool
isFlexi MetaDetails
Flexi = Bool
True
isFlexi MetaDetails
_ = Bool
False
isIndirect :: MetaDetails -> Bool
isIndirect (Indirect Type
_) = Bool
True
isIndirect MetaDetails
_ = Bool
False
isRuntimeUnkSkol :: TyVar -> Bool
isRuntimeUnkSkol :: TyVar -> Bool
isRuntimeUnkSkol TyVar
x
| TcTyVarDetails
RuntimeUnk <- TyVar -> TcTyVarDetails
tcTyVarDetails TyVar
x = Bool
True
| Bool
otherwise = Bool
False
mkTyVarNamePairs :: [TyVar] -> [(Name,TyVar)]
mkTyVarNamePairs :: [TyVar] -> [(Name, TyVar)]
mkTyVarNamePairs [TyVar]
tvs = [(TyVar -> Name
tyVarName TyVar
tv, TyVar
tv) | TyVar
tv <- [TyVar]
tvs]
findDupTyVarTvs :: [(Name,TcTyVar)] -> [(Name,Name)]
findDupTyVarTvs :: [(Name, TyVar)] -> [(Name, Name)]
findDupTyVarTvs [(Name, TyVar)]
prs
= (NonEmpty (Name, TyVar) -> [(Name, Name)])
-> [NonEmpty (Name, TyVar)] -> [(Name, Name)]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap NonEmpty (Name, TyVar) -> [(Name, Name)]
forall {b} {b}. NonEmpty (b, b) -> [(b, b)]
mk_result_prs ([NonEmpty (Name, TyVar)] -> [(Name, Name)])
-> [NonEmpty (Name, TyVar)] -> [(Name, Name)]
forall a b. (a -> b) -> a -> b
$
((Name, TyVar) -> (Name, TyVar) -> Bool)
-> [(Name, TyVar)] -> [NonEmpty (Name, TyVar)]
forall a. (a -> a -> Bool) -> [a] -> [NonEmpty a]
findDupsEq (Name, TyVar) -> (Name, TyVar) -> Bool
forall {a} {a} {a}. Eq a => (a, a) -> (a, a) -> Bool
eq_snd [(Name, TyVar)]
prs
where
eq_snd :: (a, a) -> (a, a) -> Bool
eq_snd (a
_,a
tv1) (a
_,a
tv2) = a
tv1 a -> a -> Bool
forall a. Eq a => a -> a -> Bool
== a
tv2
mk_result_prs :: NonEmpty (b, b) -> [(b, b)]
mk_result_prs ((b
n1,b
_) :| [(b, b)]
xs) = ((b, b) -> (b, b)) -> [(b, b)] -> [(b, b)]
forall a b. (a -> b) -> [a] -> [b]
map (\(b
n2,b
_) -> (b
n1,b
n2)) [(b, b)]
xs
ambigTkvsOfTy :: TcType -> ([Var],[Var])
ambigTkvsOfTy :: Type -> ([TyVar], [TyVar])
ambigTkvsOfTy Type
ty
= (TyVar -> Bool) -> [TyVar] -> ([TyVar], [TyVar])
forall a. (a -> Bool) -> [a] -> ([a], [a])
partition (TyVar -> VarSet -> Bool
`elemVarSet` VarSet
dep_tkv_set) [TyVar]
ambig_tkvs
where
tkvs :: [TyVar]
tkvs = Type -> [TyVar]
tyCoVarsOfTypeList Type
ty
ambig_tkvs :: [TyVar]
ambig_tkvs = (TyVar -> Bool) -> [TyVar] -> [TyVar]
forall a. (a -> Bool) -> [a] -> [a]
filter TyVar -> Bool
isAmbiguousTyVar [TyVar]
tkvs
dep_tkv_set :: VarSet
dep_tkv_set = [Type] -> VarSet
tyCoVarsOfTypes ((TyVar -> Type) -> [TyVar] -> [Type]
forall a b. (a -> b) -> [a] -> [b]
map TyVar -> Type
tyVarKind [TyVar]
tkvs)
mkInfSigmaTy :: HasDebugCallStack => [TyCoVar] -> [PredType] -> Type -> Type
mkInfSigmaTy :: HasDebugCallStack => [TyVar] -> [Type] -> Type -> Type
mkInfSigmaTy [TyVar]
tyvars [Type]
theta Type
ty = [ForAllTyBinder] -> [Type] -> Type -> Type
HasDebugCallStack => [ForAllTyBinder] -> [Type] -> Type -> Type
mkSigmaTy (ForAllTyFlag -> [TyVar] -> [ForAllTyBinder]
forall vis. vis -> [TyVar] -> [VarBndr TyVar vis]
mkForAllTyBinders ForAllTyFlag
Inferred [TyVar]
tyvars) [Type]
theta Type
ty
mkSpecSigmaTy :: HasDebugCallStack => [TyVar] -> [PredType] -> Type -> Type
mkSpecSigmaTy :: HasDebugCallStack => [TyVar] -> [Type] -> Type -> Type
mkSpecSigmaTy [TyVar]
tyvars [Type]
preds Type
ty = [ForAllTyBinder] -> [Type] -> Type -> Type
HasDebugCallStack => [ForAllTyBinder] -> [Type] -> Type -> Type
mkSigmaTy (ForAllTyFlag -> [TyVar] -> [ForAllTyBinder]
forall vis. vis -> [TyVar] -> [VarBndr TyVar vis]
mkForAllTyBinders ForAllTyFlag
Specified [TyVar]
tyvars) [Type]
preds Type
ty
mkSigmaTy :: HasDebugCallStack => [ForAllTyBinder] -> [PredType] -> Type -> Type
mkSigmaTy :: HasDebugCallStack => [ForAllTyBinder] -> [Type] -> Type -> Type
mkSigmaTy [ForAllTyBinder]
bndrs [Type]
theta Type
tau = [ForAllTyBinder] -> Type -> Type
mkForAllTys [ForAllTyBinder]
bndrs ([Type] -> Type -> Type
HasDebugCallStack => [Type] -> Type -> Type
mkPhiTy [Type]
theta Type
tau)
tcMkDFunSigmaTy :: [TyVar] -> ThetaType -> Type -> Type
tcMkDFunSigmaTy :: [TyVar] -> [Type] -> Type -> Type
tcMkDFunSigmaTy [TyVar]
tvs [Type]
theta Type
res_ty
= [ForAllTyBinder] -> Type -> Type
mkForAllTys (ForAllTyFlag -> [TyVar] -> [ForAllTyBinder]
forall vis. vis -> [TyVar] -> [VarBndr TyVar vis]
mkForAllTyBinders ForAllTyFlag
Specified [TyVar]
tvs) (Type -> Type) -> Type -> Type
forall a b. (a -> b) -> a -> b
$
[Type] -> Type -> Type
HasDebugCallStack => [Type] -> Type -> Type
tcMkDFunPhiTy [Type]
theta Type
res_ty
mkPhiTy :: HasDebugCallStack => [PredType] -> Type -> Type
mkPhiTy :: HasDebugCallStack => [Type] -> Type -> Type
mkPhiTy = [Type] -> Type -> Type
HasDebugCallStack => [Type] -> Type -> Type
mkInvisFunTys
tcMkPhiTy :: HasDebugCallStack => [PredType] -> Type -> Type
tcMkPhiTy :: HasDebugCallStack => [Type] -> Type -> Type
tcMkPhiTy [Type]
tys Type
ty = (Type -> Type -> Type) -> Type -> [Type] -> Type
forall a b. (a -> b -> b) -> b -> [a] -> b
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr (TypeOrConstraint -> Type -> Type -> Type
tcMkInvisFunTy TypeOrConstraint
TypeLike) Type
ty [Type]
tys
tcMkDFunPhiTy :: HasDebugCallStack => [PredType] -> Type -> Type
tcMkDFunPhiTy :: HasDebugCallStack => [Type] -> Type -> Type
tcMkDFunPhiTy [Type]
preds Type
res = (Type -> Type -> Type) -> Type -> [Type] -> Type
forall a b. (a -> b -> b) -> b -> [a] -> b
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr (TypeOrConstraint -> Type -> Type -> Type
tcMkInvisFunTy TypeOrConstraint
ConstraintLike) Type
res [Type]
preds
getDFunTyKey :: Type -> OccName
getDFunTyKey :: Type -> OccName
getDFunTyKey Type
ty | Just Type
ty' <- Type -> Maybe Type
coreView Type
ty = Type -> OccName
getDFunTyKey Type
ty'
getDFunTyKey (TyVarTy TyVar
tv) = TyVar -> OccName
forall a. NamedThing a => a -> OccName
getOccName TyVar
tv
getDFunTyKey (TyConApp TyCon
tc [Type]
_) = TyCon -> OccName
forall a. NamedThing a => a -> OccName
getOccName TyCon
tc
getDFunTyKey (LitTy TyLit
x) = TyLit -> OccName
getDFunTyLitKey TyLit
x
getDFunTyKey (AppTy Type
fun Type
_) = Type -> OccName
getDFunTyKey Type
fun
getDFunTyKey (FunTy { ft_af :: Type -> FunTyFlag
ft_af = FunTyFlag
af }) = TyCon -> OccName
forall a. NamedThing a => a -> OccName
getOccName (FunTyFlag -> TyCon
funTyFlagTyCon FunTyFlag
af)
getDFunTyKey (ForAllTy ForAllTyBinder
_ Type
t) = Type -> OccName
getDFunTyKey Type
t
getDFunTyKey (CastTy Type
ty KindCoercion
_) = Type -> OccName
getDFunTyKey Type
ty
getDFunTyKey t :: Type
t@(CoercionTy KindCoercion
_) = String -> SDoc -> OccName
forall a. HasCallStack => String -> SDoc -> a
pprPanic String
"getDFunTyKey" (Type -> SDoc
forall a. Outputable a => a -> SDoc
ppr Type
t)
getDFunTyLitKey :: TyLit -> OccName
getDFunTyLitKey :: TyLit -> OccName
getDFunTyLitKey (NumTyLit Integer
n) = NameSpace -> String -> OccName
mkOccName NameSpace
Name.varName (Integer -> String
forall a. Show a => a -> String
show Integer
n)
getDFunTyLitKey (StrTyLit FastString
n) = NameSpace -> String -> OccName
mkOccName NameSpace
Name.varName (FastString -> String
forall a. Show a => a -> String
show FastString
n)
getDFunTyLitKey (CharTyLit Char
n) = NameSpace -> String -> OccName
mkOccName NameSpace
Name.varName (Char -> String
forall a. Show a => a -> String
show Char
n)
tcSplitPiTys :: Type -> ([PiTyVarBinder], Type)
tcSplitPiTys :: Type -> ([PiTyVarBinder], Type)
tcSplitPiTys Type
ty
= Bool -> ([PiTyVarBinder], Type) -> ([PiTyVarBinder], Type)
forall a. HasCallStack => Bool -> a -> a
assert ((PiTyVarBinder -> Bool) -> [PiTyVarBinder] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all PiTyVarBinder -> Bool
isTyBinder (([PiTyVarBinder], Type) -> [PiTyVarBinder]
forall a b. (a, b) -> a
fst ([PiTyVarBinder], Type)
sty))
([PiTyVarBinder], Type)
sty
where sty :: ([PiTyVarBinder], Type)
sty = Type -> ([PiTyVarBinder], Type)
splitPiTys Type
ty
tcSplitPiTy_maybe :: Type -> Maybe (PiTyVarBinder, Type)
tcSplitPiTy_maybe :: Type -> Maybe (PiTyVarBinder, Type)
tcSplitPiTy_maybe Type
ty
= Bool -> Maybe (PiTyVarBinder, Type) -> Maybe (PiTyVarBinder, Type)
forall a. HasCallStack => Bool -> a -> a
assert (Maybe (PiTyVarBinder, Type) -> Bool
forall {b}. Maybe (PiTyVarBinder, b) -> Bool
isMaybeTyBinder Maybe (PiTyVarBinder, Type)
sty)
Maybe (PiTyVarBinder, Type)
sty
where
sty :: Maybe (PiTyVarBinder, Type)
sty = Type -> Maybe (PiTyVarBinder, Type)
splitPiTy_maybe Type
ty
isMaybeTyBinder :: Maybe (PiTyVarBinder, b) -> Bool
isMaybeTyBinder (Just (PiTyVarBinder
t,b
_)) = PiTyVarBinder -> Bool
isTyBinder PiTyVarBinder
t
isMaybeTyBinder Maybe (PiTyVarBinder, b)
_ = Bool
True
tcSplitForAllTyVarBinder_maybe :: Type -> Maybe (TyVarBinder, Type)
tcSplitForAllTyVarBinder_maybe :: Type -> Maybe (ForAllTyBinder, Type)
tcSplitForAllTyVarBinder_maybe Type
ty | Just Type
ty' <- Type -> Maybe Type
coreView Type
ty = Type -> Maybe (ForAllTyBinder, Type)
tcSplitForAllTyVarBinder_maybe Type
ty'
tcSplitForAllTyVarBinder_maybe (ForAllTy ForAllTyBinder
tv Type
ty) = Bool
-> ((ForAllTyBinder, Type) -> Maybe (ForAllTyBinder, Type))
-> (ForAllTyBinder, Type)
-> Maybe (ForAllTyBinder, Type)
forall a. HasCallStack => Bool -> a -> a
assert (ForAllTyBinder -> Bool
forall vis. VarBndr TyVar vis -> Bool
isTyVarBinder ForAllTyBinder
tv ) (ForAllTyBinder, Type) -> Maybe (ForAllTyBinder, Type)
forall a. a -> Maybe a
Just (ForAllTyBinder
tv, Type
ty)
tcSplitForAllTyVarBinder_maybe Type
_ = Maybe (ForAllTyBinder, Type)
forall a. Maybe a
Nothing
tcSplitForAllTyVars :: Type -> ([TyVar], Type)
tcSplitForAllTyVars :: Type -> ([TyVar], Type)
tcSplitForAllTyVars Type
ty
= Bool -> ([TyVar], Type) -> ([TyVar], Type)
forall a. HasCallStack => Bool -> a -> a
assert ((TyVar -> Bool) -> [TyVar] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all TyVar -> Bool
isTyVar (([TyVar], Type) -> [TyVar]
forall a b. (a, b) -> a
fst ([TyVar], Type)
sty)) ([TyVar], Type)
sty
where sty :: ([TyVar], Type)
sty = Type -> ([TyVar], Type)
splitForAllTyCoVars Type
ty
tcSplitForAllInvisTyVars :: Type -> ([TyVar], Type)
tcSplitForAllInvisTyVars :: Type -> ([TyVar], Type)
tcSplitForAllInvisTyVars Type
ty = (ForAllTyFlag -> Bool) -> Type -> ([TyVar], Type)
tcSplitSomeForAllTyVars ForAllTyFlag -> Bool
isInvisibleForAllTyFlag Type
ty
tcSplitSomeForAllTyVars :: (ForAllTyFlag -> Bool) -> Type -> ([TyVar], Type)
tcSplitSomeForAllTyVars :: (ForAllTyFlag -> Bool) -> Type -> ([TyVar], Type)
tcSplitSomeForAllTyVars ForAllTyFlag -> Bool
argf_pred Type
ty
= Type -> Type -> [TyVar] -> ([TyVar], Type)
split Type
ty Type
ty []
where
split :: Type -> Type -> [TyVar] -> ([TyVar], Type)
split Type
_ (ForAllTy (Bndr TyVar
tv ForAllTyFlag
argf) Type
ty) [TyVar]
tvs
| ForAllTyFlag -> Bool
argf_pred ForAllTyFlag
argf = Type -> Type -> [TyVar] -> ([TyVar], Type)
split Type
ty Type
ty (TyVar
tvTyVar -> [TyVar] -> [TyVar]
forall a. a -> [a] -> [a]
:[TyVar]
tvs)
split Type
orig_ty Type
ty [TyVar]
tvs | Just Type
ty' <- Type -> Maybe Type
coreView Type
ty = Type -> Type -> [TyVar] -> ([TyVar], Type)
split Type
orig_ty Type
ty' [TyVar]
tvs
split Type
orig_ty Type
_ [TyVar]
tvs = ([TyVar] -> [TyVar]
forall a. [a] -> [a]
reverse [TyVar]
tvs, Type
orig_ty)
tcSplitForAllReqTVBinders :: Type -> ([TcReqTVBinder], Type)
tcSplitForAllReqTVBinders :: Type -> ([TcReqTVBinder], Type)
tcSplitForAllReqTVBinders Type
ty = Bool -> ([TcReqTVBinder], Type) -> ([TcReqTVBinder], Type)
forall a. HasCallStack => Bool -> a -> a
assert ((TcReqTVBinder -> Bool) -> [TcReqTVBinder] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all TcReqTVBinder -> Bool
forall vis. VarBndr TyVar vis -> Bool
isTyVarBinder (([TcReqTVBinder], Type) -> [TcReqTVBinder]
forall a b. (a, b) -> a
fst ([TcReqTVBinder], Type)
sty) ) ([TcReqTVBinder], Type)
sty
where sty :: ([TcReqTVBinder], Type)
sty = Type -> ([TcReqTVBinder], Type)
splitForAllReqTyBinders Type
ty
tcSplitForAllInvisTVBinders :: Type -> ([TcInvisTVBinder], Type)
tcSplitForAllInvisTVBinders :: Type -> ([TcInvisTVBinder], Type)
tcSplitForAllInvisTVBinders Type
ty = Bool -> ([TcInvisTVBinder], Type) -> ([TcInvisTVBinder], Type)
forall a. HasCallStack => Bool -> a -> a
assert ((TcInvisTVBinder -> Bool) -> [TcInvisTVBinder] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all (TyVar -> Bool
isTyVar (TyVar -> Bool)
-> (TcInvisTVBinder -> TyVar) -> TcInvisTVBinder -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. TcInvisTVBinder -> TyVar
forall tv argf. VarBndr tv argf -> tv
binderVar) (([TcInvisTVBinder], Type) -> [TcInvisTVBinder]
forall a b. (a, b) -> a
fst ([TcInvisTVBinder], Type)
sty)) ([TcInvisTVBinder], Type)
sty
where sty :: ([TcInvisTVBinder], Type)
sty = Type -> ([TcInvisTVBinder], Type)
splitForAllInvisTyBinders Type
ty
tcSplitForAllTyVarBinders :: Type -> ([TyVarBinder], Type)
tcSplitForAllTyVarBinders :: Type -> ([ForAllTyBinder], Type)
tcSplitForAllTyVarBinders Type
ty = Bool -> ([ForAllTyBinder], Type) -> ([ForAllTyBinder], Type)
forall a. HasCallStack => Bool -> a -> a
assert ((ForAllTyBinder -> Bool) -> [ForAllTyBinder] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all ForAllTyBinder -> Bool
forall vis. VarBndr TyVar vis -> Bool
isTyVarBinder (([ForAllTyBinder], Type) -> [ForAllTyBinder]
forall a b. (a, b) -> a
fst ([ForAllTyBinder], Type)
sty)) ([ForAllTyBinder], Type)
sty
where sty :: ([ForAllTyBinder], Type)
sty = Type -> ([ForAllTyBinder], Type)
splitForAllForAllTyBinders Type
ty
tcSplitPredFunTy_maybe :: Type -> Maybe (PredType, Type)
tcSplitPredFunTy_maybe :: Type -> Maybe (Type, Type)
tcSplitPredFunTy_maybe Type
ty
| Just Type
ty' <- Type -> Maybe Type
coreView Type
ty = Type -> Maybe (Type, Type)
tcSplitPredFunTy_maybe Type
ty'
tcSplitPredFunTy_maybe (FunTy { ft_af :: Type -> FunTyFlag
ft_af = FunTyFlag
af, ft_arg :: Type -> Type
ft_arg = Type
arg, ft_res :: Type -> Type
ft_res = Type
res })
| FunTyFlag -> Bool
isInvisibleFunArg FunTyFlag
af
= (Type, Type) -> Maybe (Type, Type)
forall a. a -> Maybe a
Just (Type
arg, Type
res)
tcSplitPredFunTy_maybe Type
_
= Maybe (Type, Type)
forall a. Maybe a
Nothing
tcSplitPhiTy :: Type -> (ThetaType, Type)
tcSplitPhiTy :: Type -> ([Type], Type)
tcSplitPhiTy Type
ty
= Type -> [Type] -> ([Type], Type)
split Type
ty []
where
split :: Type -> [Type] -> ([Type], Type)
split Type
ty [Type]
ts
= case Type -> Maybe (Type, Type)
tcSplitPredFunTy_maybe Type
ty of
Just (Type
pred, Type
ty) -> Type -> [Type] -> ([Type], Type)
split Type
ty (Type
predType -> [Type] -> [Type]
forall a. a -> [a] -> [a]
:[Type]
ts)
Maybe (Type, Type)
Nothing -> ([Type] -> [Type]
forall a. [a] -> [a]
reverse [Type]
ts, Type
ty)
tcSplitSigmaTy :: Type -> ([TyVar], ThetaType, Type)
tcSplitSigmaTy :: Type -> ([TyVar], [Type], Type)
tcSplitSigmaTy Type
ty = case Type -> ([TyVar], Type)
tcSplitForAllInvisTyVars Type
ty of
([TyVar]
tvs, Type
rho) -> case Type -> ([Type], Type)
tcSplitPhiTy Type
rho of
([Type]
theta, Type
tau) -> ([TyVar]
tvs, [Type]
theta, Type
tau)
tcSplitNestedSigmaTys :: Type -> ([TyVar], ThetaType, Type)
tcSplitNestedSigmaTys :: Type -> ([TyVar], [Type], Type)
tcSplitNestedSigmaTys Type
ty
| ([Scaled Type]
arg_tys, Type
body_ty) <- Type -> ([Scaled Type], Type)
tcSplitFunTys Type
ty
, ([TyVar]
tvs1, [Type]
theta1, Type
rho1) <- Type -> ([TyVar], [Type], Type)
tcSplitSigmaTy Type
body_ty
, Bool -> Bool
not ([TyVar] -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [TyVar]
tvs1 Bool -> Bool -> Bool
&& [Type] -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [Type]
theta1)
= let ([TyVar]
tvs2, [Type]
theta2, Type
rho2) = Type -> ([TyVar], [Type], Type)
tcSplitNestedSigmaTys Type
rho1
in ([TyVar]
tvs1 [TyVar] -> [TyVar] -> [TyVar]
forall a. [a] -> [a] -> [a]
++ [TyVar]
tvs2, [Type]
theta1 [Type] -> [Type] -> [Type]
forall a. [a] -> [a] -> [a]
++ [Type]
theta2, [Scaled Type] -> Type -> Type
HasDebugCallStack => [Scaled Type] -> Type -> Type
mkScaledFunTys [Scaled Type]
arg_tys Type
rho2)
| Bool
otherwise = ([], [], Type
ty)
tcTyConAppTyCon :: Type -> TyCon
tcTyConAppTyCon :: Type -> TyCon
tcTyConAppTyCon Type
ty
= case Type -> Maybe TyCon
tcTyConAppTyCon_maybe Type
ty of
Just TyCon
tc -> TyCon
tc
Maybe TyCon
Nothing -> String -> SDoc -> TyCon
forall a. HasCallStack => String -> SDoc -> a
pprPanic String
"tcTyConAppTyCon" (Type -> SDoc
pprType Type
ty)
tcTyConAppTyCon_maybe :: Type -> Maybe TyCon
tcTyConAppTyCon_maybe :: Type -> Maybe TyCon
tcTyConAppTyCon_maybe Type
ty | Just Type
ty' <- Type -> Maybe Type
coreView Type
ty = Type -> Maybe TyCon
tcTyConAppTyCon_maybe Type
ty'
tcTyConAppTyCon_maybe (TyConApp TyCon
tc [Type]
_) = TyCon -> Maybe TyCon
forall a. a -> Maybe a
Just TyCon
tc
tcTyConAppTyCon_maybe (FunTy { ft_af :: Type -> FunTyFlag
ft_af = FunTyFlag
af }) = TyCon -> Maybe TyCon
forall a. a -> Maybe a
Just (FunTyFlag -> TyCon
funTyFlagTyCon FunTyFlag
af)
tcTyConAppTyCon_maybe Type
_ = Maybe TyCon
forall a. Maybe a
Nothing
tcTyConAppArgs :: Type -> [Type]
tcTyConAppArgs :: Type -> [Type]
tcTyConAppArgs Type
ty = case HasCallStack => Type -> Maybe (TyCon, [Type])
Type -> Maybe (TyCon, [Type])
tcSplitTyConApp_maybe Type
ty of
Just (TyCon
_, [Type]
args) -> [Type]
args
Maybe (TyCon, [Type])
Nothing -> String -> SDoc -> [Type]
forall a. HasCallStack => String -> SDoc -> a
pprPanic String
"tcTyConAppArgs" (Type -> SDoc
pprType Type
ty)
tcSplitFunTys :: Type -> ([Scaled Type], Type)
tcSplitFunTys :: Type -> ([Scaled Type], Type)
tcSplitFunTys Type
ty = case Type -> Maybe (Scaled Type, Type)
tcSplitFunTy_maybe Type
ty of
Maybe (Scaled Type, Type)
Nothing -> ([], Type
ty)
Just (Scaled Type
arg,Type
res) -> (Scaled Type
argScaled Type -> [Scaled Type] -> [Scaled Type]
forall a. a -> [a] -> [a]
:[Scaled Type]
args, Type
res')
where
([Scaled Type]
args,Type
res') = Type -> ([Scaled Type], Type)
tcSplitFunTys Type
res
tcSplitFunTy_maybe :: Type -> Maybe (Scaled Type, Type)
tcSplitFunTy_maybe :: Type -> Maybe (Scaled Type, Type)
tcSplitFunTy_maybe Type
ty
| Just Type
ty' <- Type -> Maybe Type
coreView Type
ty = Type -> Maybe (Scaled Type, Type)
tcSplitFunTy_maybe Type
ty'
tcSplitFunTy_maybe (FunTy { ft_af :: Type -> FunTyFlag
ft_af = FunTyFlag
af, ft_mult :: Type -> Type
ft_mult = Type
w, ft_arg :: Type -> Type
ft_arg = Type
arg, ft_res :: Type -> Type
ft_res = Type
res })
| FunTyFlag -> Bool
isVisibleFunArg FunTyFlag
af = (Scaled Type, Type) -> Maybe (Scaled Type, Type)
forall a. a -> Maybe a
Just (Type -> Type -> Scaled Type
forall a. Type -> a -> Scaled a
Scaled Type
w Type
arg, Type
res)
tcSplitFunTy_maybe Type
_ = Maybe (Scaled Type, Type)
forall a. Maybe a
Nothing
tcSplitFunTysN :: Arity
-> TcRhoType
-> Either Arity
([Scaled TcSigmaType],
TcSigmaType)
tcSplitFunTysN :: Int -> Type -> Either Int ([Scaled Type], Type)
tcSplitFunTysN Int
n Type
ty
| Int
n Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
0
= ([Scaled Type], Type) -> Either Int ([Scaled Type], Type)
forall a b. b -> Either a b
Right ([], Type
ty)
| Just (Scaled Type
arg,Type
res) <- Type -> Maybe (Scaled Type, Type)
tcSplitFunTy_maybe Type
ty
= case Int -> Type -> Either Int ([Scaled Type], Type)
tcSplitFunTysN (Int
nInt -> Int -> Int
forall a. Num a => a -> a -> a
-Int
1) Type
res of
Left Int
m -> Int -> Either Int ([Scaled Type], Type)
forall a b. a -> Either a b
Left Int
m
Right ([Scaled Type]
args,Type
body) -> ([Scaled Type], Type) -> Either Int ([Scaled Type], Type)
forall a b. b -> Either a b
Right (Scaled Type
argScaled Type -> [Scaled Type] -> [Scaled Type]
forall a. a -> [a] -> [a]
:[Scaled Type]
args, Type
body)
| Bool
otherwise
= Int -> Either Int ([Scaled Type], Type)
forall a b. a -> Either a b
Left Int
n
tcSplitFunTy :: Type -> (Scaled Type, Type)
tcSplitFunTy :: Type -> (Scaled Type, Type)
tcSplitFunTy Type
ty = String -> Maybe (Scaled Type, Type) -> (Scaled Type, Type)
forall a. HasCallStack => String -> Maybe a -> a
expectJust String
"tcSplitFunTy" (Type -> Maybe (Scaled Type, Type)
tcSplitFunTy_maybe Type
ty)
tcFunArgTy :: Type -> Scaled Type
tcFunArgTy :: Type -> Scaled Type
tcFunArgTy Type
ty = (Scaled Type, Type) -> Scaled Type
forall a b. (a, b) -> a
fst (Type -> (Scaled Type, Type)
tcSplitFunTy Type
ty)
tcFunResultTy :: Type -> Type
tcFunResultTy :: Type -> Type
tcFunResultTy Type
ty = (Scaled Type, Type) -> Type
forall a b. (a, b) -> b
snd (Type -> (Scaled Type, Type)
tcSplitFunTy Type
ty)
tcFunResultTyN :: HasDebugCallStack => Arity -> Type -> Type
tcFunResultTyN :: HasDebugCallStack => Int -> Type -> Type
tcFunResultTyN Int
n Type
ty
| Right ([Scaled Type]
_, Type
res_ty) <- Int -> Type -> Either Int ([Scaled Type], Type)
tcSplitFunTysN Int
n Type
ty
= Type
res_ty
| Bool
otherwise
= String -> SDoc -> Type
forall a. HasCallStack => String -> SDoc -> a
pprPanic String
"tcFunResultTyN" (Int -> SDoc
forall a. Outputable a => a -> SDoc
ppr Int
n SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> Type -> SDoc
forall a. Outputable a => a -> SDoc
ppr Type
ty)
tcSplitAppTy_maybe :: Type -> Maybe (Type, Type)
tcSplitAppTy_maybe :: Type -> Maybe (Type, Type)
tcSplitAppTy_maybe Type
ty | Just Type
ty' <- Type -> Maybe Type
coreView Type
ty = Type -> Maybe (Type, Type)
tcSplitAppTy_maybe Type
ty'
tcSplitAppTy_maybe Type
ty = Type -> Maybe (Type, Type)
tcSplitAppTyNoView_maybe Type
ty
tcSplitAppTy :: Type -> (Type, Type)
tcSplitAppTy :: Type -> (Type, Type)
tcSplitAppTy Type
ty = case Type -> Maybe (Type, Type)
tcSplitAppTy_maybe Type
ty of
Just (Type, Type)
stuff -> (Type, Type)
stuff
Maybe (Type, Type)
Nothing -> String -> SDoc -> (Type, Type)
forall a. HasCallStack => String -> SDoc -> a
pprPanic String
"tcSplitAppTy" (Type -> SDoc
pprType Type
ty)
tcSplitAppTys :: Type -> (Type, [Type])
tcSplitAppTys :: Type -> (Type, [Type])
tcSplitAppTys Type
ty
= Type -> [Type] -> (Type, [Type])
go Type
ty []
where
go :: Type -> [Type] -> (Type, [Type])
go Type
ty [Type]
args = case Type -> Maybe (Type, Type)
tcSplitAppTy_maybe Type
ty of
Just (Type
ty', Type
arg) -> Type -> [Type] -> (Type, [Type])
go Type
ty' (Type
argType -> [Type] -> [Type]
forall a. a -> [a] -> [a]
:[Type]
args)
Maybe (Type, Type)
Nothing -> (Type
ty,[Type]
args)
tcIsTyVarTy :: Type -> Bool
tcIsTyVarTy :: Type -> Bool
tcIsTyVarTy Type
ty | Just Type
ty' <- Type -> Maybe Type
coreView Type
ty = Type -> Bool
tcIsTyVarTy Type
ty'
tcIsTyVarTy (CastTy Type
ty KindCoercion
_) = Type -> Bool
tcIsTyVarTy Type
ty
tcIsTyVarTy (TyVarTy TyVar
_) = Bool
True
tcIsTyVarTy Type
_ = Bool
False
tcSplitQuantPredTy :: Type -> ([TyVar], [Type], PredType)
tcSplitQuantPredTy :: Type -> ([TyVar], [Type], Type)
tcSplitQuantPredTy Type
ty
= case Type -> ([TyVar], Type)
tcSplitForAllInvisTyVars Type
ty of { ([TyVar]
tvs, Type
rho) ->
case Type -> ([Scaled Type], Type)
splitFunTys Type
rho of { ([Scaled Type]
theta, Type
head) ->
([TyVar]
tvs, (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]
theta, Type
head) }}
tcSplitDFunTy :: Type -> ([TyVar], [Type], Class, [Type])
tcSplitDFunTy :: Type -> ([TyVar], [Type], Class, [Type])
tcSplitDFunTy Type
ty
= case Type -> ([TyVar], [Type], Type)
tcSplitQuantPredTy Type
ty of { ([TyVar]
tvs, [Type]
theta, Type
head) ->
case Type -> (Class, [Type])
tcSplitDFunHead Type
head of { (Class
clas, [Type]
tys) ->
([TyVar]
tvs, [Type]
theta, Class
clas, [Type]
tys) }}
tcSplitDFunHead :: Type -> (Class, [Type])
tcSplitDFunHead :: Type -> (Class, [Type])
tcSplitDFunHead = HasDebugCallStack => Type -> (Class, [Type])
Type -> (Class, [Type])
getClassPredTys
tcSplitMethodTy :: Type -> ([TyVar], PredType, Type)
tcSplitMethodTy :: Type -> ([TyVar], Type, Type)
tcSplitMethodTy Type
ty
| ([TyVar]
sel_tyvars,Type
sel_rho) <- Type -> ([TyVar], Type)
tcSplitForAllInvisTyVars Type
ty
, Just (Type
first_pred, Type
local_meth_ty) <- Type -> Maybe (Type, Type)
tcSplitPredFunTy_maybe Type
sel_rho
= ([TyVar]
sel_tyvars, Type
first_pred, Type
local_meth_ty)
| Bool
otherwise
= String -> SDoc -> ([TyVar], Type, Type)
forall a. HasCallStack => String -> SDoc -> a
pprPanic String
"tcSplitMethodTy" (Type -> SDoc
forall a. Outputable a => a -> SDoc
ppr Type
ty)
isTyVarClassPred :: PredType -> Bool
isTyVarClassPred :: Type -> Bool
isTyVarClassPred Type
ty = case Type -> Maybe (Class, [Type])
getClassPredTys_maybe Type
ty of
Just (Class
_, [Type]
tys) -> (Type -> Bool) -> [Type] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all Type -> Bool
isTyVarTy [Type]
tys
Maybe (Class, [Type])
_ -> Bool
False
checkValidClsArgs :: Bool -> Class -> [KindOrType] -> Bool
checkValidClsArgs :: Bool -> Class -> [Type] -> Bool
checkValidClsArgs Bool
flexible_contexts Class
cls [Type]
kts
| Bool
flexible_contexts = Bool
True
| Bool
otherwise = (Type -> Bool) -> [Type] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all Type -> Bool
hasTyVarHead [Type]
tys
where
tys :: [Type]
tys = TyCon -> [Type] -> [Type]
filterOutInvisibleTypes (Class -> TyCon
classTyCon Class
cls) [Type]
kts
hasTyVarHead :: Type -> Bool
hasTyVarHead :: Type -> Bool
hasTyVarHead Type
ty
| Type -> Bool
tcIsTyVarTy Type
ty = Bool
True
| Bool
otherwise
= case Type -> Maybe (Type, Type)
tcSplitAppTy_maybe Type
ty of
Just (Type
ty, Type
_) -> Type -> Bool
hasTyVarHead Type
ty
Maybe (Type, Type)
Nothing -> Bool
False
evVarPred :: EvVar -> PredType
evVarPred :: TyVar -> Type
evVarPred TyVar
var = TyVar -> Type
varType TyVar
var
boxEqPred :: EqRel -> Type -> Type -> Maybe (Class, [Type])
boxEqPred :: EqRel -> Type -> Type -> Maybe (Class, [Type])
boxEqPred EqRel
eq_rel Type
ty1 Type
ty2
= case EqRel
eq_rel of
EqRel
NomEq | Bool
homo_kind -> (Class, [Type]) -> Maybe (Class, [Type])
forall a. a -> Maybe a
Just (Class
eqClass, [Type
k1, Type
ty1, Type
ty2])
| Bool
otherwise -> (Class, [Type]) -> Maybe (Class, [Type])
forall a. a -> Maybe a
Just (Class
heqClass, [Type
k1, Type
k2, Type
ty1, Type
ty2])
EqRel
ReprEq | Bool
homo_kind -> (Class, [Type]) -> Maybe (Class, [Type])
forall a. a -> Maybe a
Just (Class
coercibleClass, [Type
k1, Type
ty1, Type
ty2])
| Bool
otherwise -> Maybe (Class, [Type])
forall a. Maybe a
Nothing
where
k1 :: Type
k1 = HasDebugCallStack => Type -> Type
Type -> Type
typeKind Type
ty1
k2 :: Type
k2 = HasDebugCallStack => Type -> Type
Type -> Type
typeKind Type
ty2
homo_kind :: Bool
homo_kind = Type
k1 HasDebugCallStack => Type -> Type -> Bool
Type -> Type -> Bool
`tcEqType` Type
k2
pickCapturedPreds
:: TyVarSet
-> TcThetaType
-> TcThetaType
pickCapturedPreds :: VarSet -> [Type] -> [Type]
pickCapturedPreds VarSet
qtvs [Type]
theta
= (Type -> Bool) -> [Type] -> [Type]
forall a. (a -> Bool) -> [a] -> [a]
filter Type -> Bool
captured [Type]
theta
where
captured :: Type -> Bool
captured Type
pred = Type -> Bool
isIPLikePred Type
pred Bool -> Bool -> Bool
|| (Type -> VarSet
tyCoVarsOfType Type
pred VarSet -> VarSet -> Bool
`intersectsVarSet` VarSet
qtvs)
type PredWithSCs a = (PredType, [PredType], a)
mkMinimalBySCs :: forall a. (a -> PredType) -> [a] -> [a]
mkMinimalBySCs :: forall a. (a -> Type) -> [a] -> [a]
mkMinimalBySCs a -> Type
get_pred [a]
xs = [PredWithSCs a] -> [PredWithSCs a] -> [a]
go [PredWithSCs a]
preds_with_scs []
where
preds_with_scs :: [PredWithSCs a]
preds_with_scs :: [PredWithSCs a]
preds_with_scs = [ (Type
pred, Type -> [Type]
implicants Type
pred, a
x)
| a
x <- [a]
xs
, let pred :: Type
pred = a -> Type
get_pred a
x ]
go :: [PredWithSCs a]
-> [PredWithSCs a]
-> [a]
go :: [PredWithSCs a] -> [PredWithSCs a] -> [a]
go [] [PredWithSCs a]
min_preds
= [a] -> [a]
forall a. [a] -> [a]
reverse ((PredWithSCs a -> a) -> [PredWithSCs a] -> [a]
forall a b. (a -> b) -> [a] -> [b]
map PredWithSCs a -> a
forall a b c. (a, b, c) -> c
thdOf3 [PredWithSCs a]
min_preds)
go (work_item :: PredWithSCs a
work_item@(Type
p,[Type]
_,a
_) : [PredWithSCs a]
work_list) [PredWithSCs a]
min_preds
| EqPred EqRel
_ Type
t1 Type
t2 <- Type -> Pred
classifyPredType Type
p
, Type
t1 HasDebugCallStack => Type -> Type -> Bool
Type -> Type -> Bool
`tcEqType` Type
t2
= [PredWithSCs a] -> [PredWithSCs a] -> [a]
go [PredWithSCs a]
work_list [PredWithSCs a]
min_preds
| Type
p Type -> [PredWithSCs a] -> Bool
`in_cloud` [PredWithSCs a]
work_list Bool -> Bool -> Bool
|| Type
p Type -> [PredWithSCs a] -> Bool
`in_cloud` [PredWithSCs a]
min_preds
= [PredWithSCs a] -> [PredWithSCs a] -> [a]
go [PredWithSCs a]
work_list [PredWithSCs a]
min_preds
| Bool
otherwise
= [PredWithSCs a] -> [PredWithSCs a] -> [a]
go [PredWithSCs a]
work_list (PredWithSCs a
work_item PredWithSCs a -> [PredWithSCs a] -> [PredWithSCs a]
forall a. a -> [a] -> [a]
: [PredWithSCs a]
min_preds)
in_cloud :: PredType -> [PredWithSCs a] -> Bool
in_cloud :: Type -> [PredWithSCs a] -> Bool
in_cloud Type
p [PredWithSCs a]
ps = [Bool] -> Bool
forall (t :: * -> *). Foldable t => t Bool -> Bool
or [ Type
p HasDebugCallStack => Type -> Type -> Bool
Type -> Type -> Bool
`tcEqType` Type
p' | (Type
_, [Type]
scs, a
_) <- [PredWithSCs a]
ps, Type
p' <- [Type]
scs ]
implicants :: Type -> [Type]
implicants Type
pred
= Type
pred Type -> [Type] -> [Type]
forall a. a -> [a] -> [a]
: Type -> [Type]
eq_extras Type
pred [Type] -> [Type] -> [Type]
forall a. [a] -> [a] -> [a]
++ Type -> [Type]
transSuperClasses Type
pred
eq_extras :: Type -> [Type]
eq_extras Type
pred
= case Type -> Pred
classifyPredType Type
pred of
EqPred EqRel
r Type
t1 Type
t2 -> [Role -> Type -> Type -> Type
mkPrimEqPredRole (EqRel -> Role
eqRelRole EqRel
r) Type
t2 Type
t1]
ClassPred Class
cls [Type
k1,Type
k2,Type
t1,Type
t2]
| Class
cls Class -> Unique -> Bool
forall a. Uniquable a => a -> Unique -> Bool
`hasKey` Unique
heqTyConKey -> [Class -> [Type] -> Type
mkClassPred Class
cls [Type
k2, Type
k1, Type
t2, Type
t1]]
ClassPred Class
cls [Type
k,Type
t1,Type
t2]
| Class
cls Class -> Unique -> Bool
forall a. Uniquable a => a -> Unique -> Bool
`hasKey` Unique
eqTyConKey -> [Class -> [Type] -> Type
mkClassPred Class
cls [Type
k, Type
t2, Type
t1]]
Pred
_ -> []
transSuperClasses :: PredType -> [PredType]
transSuperClasses :: Type -> [Type]
transSuperClasses Type
p
= NameSet -> Type -> [Type]
go NameSet
emptyNameSet Type
p
where
go :: NameSet -> PredType -> [PredType]
go :: NameSet -> Type -> [Type]
go NameSet
rec_clss Type
p
| ClassPred Class
cls [Type]
tys <- Type -> Pred
classifyPredType Type
p
, let cls_nm :: Name
cls_nm = Class -> Name
className Class
cls
, Bool -> Bool
not (Name
cls_nm Name -> NameSet -> Bool
`elemNameSet` NameSet
rec_clss)
, let rec_clss' :: NameSet
rec_clss' | Class -> Bool
isCTupleClass Class
cls = NameSet
rec_clss
| Bool
otherwise = NameSet
rec_clss NameSet -> Name -> NameSet
`extendNameSet` Name
cls_nm
= [ Type
p' | Type
sc <- Class -> [Type] -> [Type]
immSuperClasses Class
cls [Type]
tys
, Type
p' <- Type
sc Type -> [Type] -> [Type]
forall a. a -> [a] -> [a]
: NameSet -> Type -> [Type]
go NameSet
rec_clss' Type
sc ]
| Bool
otherwise
= []
immSuperClasses :: Class -> [Type] -> [PredType]
immSuperClasses :: Class -> [Type] -> [Type]
immSuperClasses Class
cls [Type]
tys
= HasDebugCallStack => Subst -> [Type] -> [Type]
Subst -> [Type] -> [Type]
substTheta ([TyVar] -> [Type] -> Subst
HasDebugCallStack => [TyVar] -> [Type] -> Subst
zipTvSubst [TyVar]
tyvars [Type]
tys) [Type]
sc_theta
where
([TyVar]
tyvars,[Type]
sc_theta,[TyVar]
_,[ClassOpItem]
_) = Class -> ([TyVar], [Type], [TyVar], [ClassOpItem])
classBigSig Class
cls
isImprovementPred :: PredType -> Bool
isImprovementPred :: Type -> Bool
isImprovementPred Type
ty
= case Type -> Pred
classifyPredType Type
ty of
EqPred EqRel
NomEq Type
t1 Type
t2 -> Bool -> Bool
not (Type
t1 HasDebugCallStack => Type -> Type -> Bool
Type -> Type -> Bool
`tcEqType` Type
t2)
EqPred EqRel
ReprEq Type
_ Type
_ -> Bool
False
ClassPred Class
cls [Type]
_ -> Class -> Bool
classHasFds Class
cls
IrredPred {} -> Bool
True
ForAllPred {} -> Bool
False
isSigmaTy :: TcType -> Bool
isSigmaTy :: Type -> Bool
isSigmaTy Type
ty | Just Type
ty' <- Type -> Maybe Type
coreView Type
ty = Type -> Bool
isSigmaTy Type
ty'
isSigmaTy (ForAllTy {}) = Bool
True
isSigmaTy (FunTy { ft_af :: Type -> FunTyFlag
ft_af = FunTyFlag
af }) = FunTyFlag -> Bool
isInvisibleFunArg FunTyFlag
af
isSigmaTy Type
_ = Bool
False
isRhoTy :: TcType -> Bool
isRhoTy :: Type -> Bool
isRhoTy Type
ty | Just Type
ty' <- Type -> Maybe Type
coreView Type
ty = Type -> Bool
isRhoTy Type
ty'
isRhoTy (ForAllTy {}) = Bool
False
isRhoTy (FunTy { ft_af :: Type -> FunTyFlag
ft_af = FunTyFlag
af }) = FunTyFlag -> Bool
isVisibleFunArg FunTyFlag
af
isRhoTy Type
_ = Bool
True
isRhoExpTy :: ExpType -> Bool
isRhoExpTy :: ExpType -> Bool
isRhoExpTy (Check Type
ty) = Type -> Bool
isRhoTy Type
ty
isRhoExpTy (Infer {}) = Bool
True
isOverloadedTy :: Type -> Bool
isOverloadedTy :: Type -> Bool
isOverloadedTy Type
ty | Just Type
ty' <- Type -> Maybe Type
coreView Type
ty = Type -> Bool
isOverloadedTy Type
ty'
isOverloadedTy (ForAllTy ForAllTyBinder
_ Type
ty) = Type -> Bool
isOverloadedTy Type
ty
isOverloadedTy (FunTy { ft_af :: Type -> FunTyFlag
ft_af = FunTyFlag
af }) = FunTyFlag -> Bool
isInvisibleFunArg FunTyFlag
af
isOverloadedTy Type
_ = Bool
False
isFloatTy, isDoubleTy,
isFloatPrimTy, isDoublePrimTy,
isIntegerTy, isNaturalTy,
isIntTy, isWordTy, isBoolTy,
isUnitTy, isCharTy :: Type -> Bool
isFloatTy :: Type -> Bool
isFloatTy = Unique -> Type -> Bool
is_tc Unique
floatTyConKey
isDoubleTy :: Type -> Bool
isDoubleTy = Unique -> Type -> Bool
is_tc Unique
doubleTyConKey
isFloatPrimTy :: Type -> Bool
isFloatPrimTy = Unique -> Type -> Bool
is_tc Unique
floatPrimTyConKey
isDoublePrimTy :: Type -> Bool
isDoublePrimTy = Unique -> Type -> Bool
is_tc Unique
doublePrimTyConKey
isIntegerTy :: Type -> Bool
isIntegerTy = Unique -> Type -> Bool
is_tc Unique
integerTyConKey
isNaturalTy :: Type -> Bool
isNaturalTy = Unique -> Type -> Bool
is_tc Unique
naturalTyConKey
isIntTy :: Type -> Bool
isIntTy = Unique -> Type -> Bool
is_tc Unique
intTyConKey
isWordTy :: Type -> Bool
isWordTy = Unique -> Type -> Bool
is_tc Unique
wordTyConKey
isBoolTy :: Type -> Bool
isBoolTy = Unique -> Type -> Bool
is_tc Unique
boolTyConKey
isUnitTy :: Type -> Bool
isUnitTy = Unique -> Type -> Bool
is_tc Unique
unitTyConKey
isCharTy :: Type -> Bool
isCharTy = Unique -> Type -> Bool
is_tc Unique
charTyConKey
anyTy_maybe :: Type -> Maybe Kind
anyTy_maybe :: Type -> Maybe Type
anyTy_maybe Type
ty
| Just (TyCon
tc, [Type
k]) <- HasDebugCallStack => Type -> Maybe (TyCon, [Type])
Type -> Maybe (TyCon, [Type])
splitTyConApp_maybe Type
ty
, TyCon -> Unique
forall a. Uniquable a => a -> Unique
getUnique TyCon
tc Unique -> Unique -> Bool
forall a. Eq a => a -> a -> Bool
== Unique
anyTyConKey
= Type -> Maybe Type
forall a. a -> Maybe a
Just Type
k
| Bool
otherwise
= Maybe Type
forall a. Maybe a
Nothing
isFloatingPrimTy :: Type -> Bool
isFloatingPrimTy :: Type -> Bool
isFloatingPrimTy Type
ty = Type -> Bool
isFloatPrimTy Type
ty Bool -> Bool -> Bool
|| Type -> Bool
isDoublePrimTy Type
ty
isStringTy :: Type -> Bool
isStringTy :: Type -> Bool
isStringTy Type
ty
= case HasCallStack => Type -> Maybe (TyCon, [Type])
Type -> Maybe (TyCon, [Type])
tcSplitTyConApp_maybe Type
ty of
Just (TyCon
tc, [Type
arg_ty]) -> TyCon
tc TyCon -> TyCon -> Bool
forall a. Eq a => a -> a -> Bool
== TyCon
listTyCon Bool -> Bool -> Bool
&& Type -> Bool
isCharTy Type
arg_ty
Maybe (TyCon, [Type])
_ -> Bool
False
is_tc :: Unique -> Type -> Bool
is_tc :: Unique -> Type -> Bool
is_tc Unique
uniq Type
ty = case HasCallStack => Type -> Maybe (TyCon, [Type])
Type -> Maybe (TyCon, [Type])
tcSplitTyConApp_maybe Type
ty of
Just (TyCon
tc, [Type]
_) -> Unique
uniq Unique -> Unique -> Bool
forall a. Eq a => a -> a -> Bool
== TyCon -> Unique
forall a. Uniquable a => a -> Unique
getUnique TyCon
tc
Maybe (TyCon, [Type])
Nothing -> Bool
False
isRigidTy :: TcType -> Bool
isRigidTy :: Type -> Bool
isRigidTy Type
ty
| Just (TyCon
tc,[Type]
_) <- HasCallStack => Type -> Maybe (TyCon, [Type])
Type -> Maybe (TyCon, [Type])
tcSplitTyConApp_maybe Type
ty = TyCon -> Role -> Bool
isGenerativeTyCon TyCon
tc Role
Nominal
| Just {} <- Type -> Maybe (Type, Type)
tcSplitAppTy_maybe Type
ty = Bool
True
| Type -> Bool
isForAllTy Type
ty = Bool
True
| Bool
otherwise = Bool
False
deNoteType :: Type -> Type
deNoteType :: Type -> Type
deNoteType Type
ty | Just Type
ty' <- Type -> Maybe Type
coreView Type
ty = Type -> Type
deNoteType Type
ty'
deNoteType Type
ty = Type
ty
tcSplitIOType_maybe :: Type -> Maybe (TyCon, Type)
tcSplitIOType_maybe :: Type -> Maybe (TyCon, Type)
tcSplitIOType_maybe Type
ty
= case HasCallStack => Type -> Maybe (TyCon, [Type])
Type -> Maybe (TyCon, [Type])
tcSplitTyConApp_maybe Type
ty of
Just (TyCon
io_tycon, [Type
io_res_ty])
| TyCon
io_tycon TyCon -> Unique -> Bool
forall a. Uniquable a => a -> Unique -> Bool
`hasKey` Unique
ioTyConKey ->
(TyCon, Type) -> Maybe (TyCon, Type)
forall a. a -> Maybe a
Just (TyCon
io_tycon, Type
io_res_ty)
Maybe (TyCon, [Type])
_ ->
Maybe (TyCon, Type)
forall a. Maybe a
Nothing
tyConVisibilities :: TyCon -> [Bool]
tyConVisibilities :: TyCon -> [Bool]
tyConVisibilities TyCon
tc = [Bool]
tc_binder_viss [Bool] -> [Bool] -> [Bool]
forall a. [a] -> [a] -> [a]
++ [Bool]
tc_return_kind_viss [Bool] -> [Bool] -> [Bool]
forall a. [a] -> [a] -> [a]
++ Bool -> [Bool]
forall a. a -> [a]
repeat Bool
True
where
tc_binder_viss :: [Bool]
tc_binder_viss = (VarBndr TyVar TyConBndrVis -> Bool)
-> [VarBndr TyVar TyConBndrVis] -> [Bool]
forall a b. (a -> b) -> [a] -> [b]
map VarBndr TyVar TyConBndrVis -> Bool
forall tv. VarBndr tv TyConBndrVis -> Bool
isVisibleTyConBinder (TyCon -> [VarBndr TyVar TyConBndrVis]
tyConBinders TyCon
tc)
tc_return_kind_viss :: [Bool]
tc_return_kind_viss = (PiTyVarBinder -> Bool) -> [PiTyVarBinder] -> [Bool]
forall a b. (a -> b) -> [a] -> [b]
map PiTyVarBinder -> Bool
isVisiblePiTyBinder (([PiTyVarBinder], Type) -> [PiTyVarBinder]
forall a b. (a, b) -> a
fst (([PiTyVarBinder], Type) -> [PiTyVarBinder])
-> ([PiTyVarBinder], Type) -> [PiTyVarBinder]
forall a b. (a -> b) -> a -> b
$ Type -> ([PiTyVarBinder], Type)
tcSplitPiTys (TyCon -> Type
tyConResKind TyCon
tc))
isNextTyConArgVisible :: TyCon -> [Type] -> Bool
isNextTyConArgVisible :: TyCon -> [Type] -> Bool
isNextTyConArgVisible TyCon
tc [Type]
tys
= TyCon -> [Bool]
tyConVisibilities TyCon
tc [Bool] -> Int -> Bool
forall a. Outputable a => [a] -> Int -> a
`getNth` [Type] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [Type]
tys
isNextArgVisible :: TcType -> Bool
isNextArgVisible :: Type -> Bool
isNextArgVisible Type
ty
| Just (PiTyVarBinder
bndr, Type
_) <- Type -> Maybe (PiTyVarBinder, Type)
tcSplitPiTy_maybe (HasDebugCallStack => Type -> Type
Type -> Type
typeKind Type
ty) = PiTyVarBinder -> Bool
isVisiblePiTyBinder PiTyVarBinder
bndr
| Bool
otherwise = Bool
True
data PatersonCondFailure
= PCF_TyVar
[TyVar]
| PCF_Size
| PCF_TyFam
TyCon
data PatersonCondFailureContext
= InInstanceDecl
| InTyFamEquation
data PatersonSize
= PS_TyFam TyCon
| PS_Vanilla { PatersonSize -> [TyVar]
ps_tvs :: [TyVar]
, PatersonSize -> Int
ps_size :: Int
}
instance Outputable PatersonSize where
ppr :: PatersonSize -> SDoc
ppr (PS_TyFam TyCon
tc) = String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"PS_TyFam" SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> TyCon -> SDoc
forall a. Outputable a => a -> SDoc
ppr TyCon
tc
ppr (PS_Vanilla { ps_tvs :: PatersonSize -> [TyVar]
ps_tvs = [TyVar]
tvs, ps_size :: PatersonSize -> Int
ps_size = Int
size })
= String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"PS_Vanilla" SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc
braces ([SDoc] -> SDoc
forall doc. IsLine doc => [doc] -> doc
sep [ String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"ps_tvs =" SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> [TyVar] -> SDoc
forall a. Outputable a => a -> SDoc
ppr [TyVar]
tvs SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<> SDoc
forall doc. IsLine doc => doc
comma
, String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"ps_size =" SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> Int -> SDoc
forall doc. IsLine doc => Int -> doc
int Int
size ])
pSizeZero, pSizeOne :: PatersonSize
pSizeZero :: PatersonSize
pSizeZero = PS_Vanilla { ps_tvs :: [TyVar]
ps_tvs = [], ps_size :: Int
ps_size = Int
0 }
pSizeOne :: PatersonSize
pSizeOne = PS_Vanilla { ps_tvs :: [TyVar]
ps_tvs = [], ps_size :: Int
ps_size = Int
1 }
ltPatersonSize :: PatersonSize
-> PatersonSize
-> Maybe PatersonCondFailure
ltPatersonSize :: PatersonSize -> PatersonSize -> Maybe PatersonCondFailure
ltPatersonSize (PS_Vanilla { ps_tvs :: PatersonSize -> [TyVar]
ps_tvs = [TyVar]
tvs1, ps_size :: PatersonSize -> Int
ps_size = Int
s1 })
(PS_Vanilla { ps_tvs :: PatersonSize -> [TyVar]
ps_tvs = [TyVar]
tvs2, ps_size :: PatersonSize -> Int
ps_size = Int
s2 })
| Int
s1 Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>= Int
s2 = PatersonCondFailure -> Maybe PatersonCondFailure
forall a. a -> Maybe a
Just PatersonCondFailure
PCF_Size
| bad_tvs :: [TyVar]
bad_tvs@(TyVar
_:[TyVar]
_) <- [TyVar] -> [TyVar] -> [TyVar]
noMoreTyVars [TyVar]
tvs1 [TyVar]
tvs2 = PatersonCondFailure -> Maybe PatersonCondFailure
forall a. a -> Maybe a
Just ([TyVar] -> PatersonCondFailure
PCF_TyVar [TyVar]
bad_tvs)
| Bool
otherwise = Maybe PatersonCondFailure
forall a. Maybe a
Nothing
ltPatersonSize (PS_TyFam TyCon
tc) PatersonSize
_ = PatersonCondFailure -> Maybe PatersonCondFailure
forall a. a -> Maybe a
Just (TyCon -> PatersonCondFailure
PCF_TyFam TyCon
tc)
ltPatersonSize PatersonSize
_ (PS_TyFam TyCon
tc) = PatersonCondFailure -> Maybe PatersonCondFailure
forall a. a -> Maybe a
Just (TyCon -> PatersonCondFailure
PCF_TyFam TyCon
tc)
noMoreTyVars :: [TyVar]
-> [TyVar]
-> [TyVar]
noMoreTyVars :: [TyVar] -> [TyVar] -> [TyVar]
noMoreTyVars [TyVar]
tvs [TyVar]
head_tvs
= [TyVar] -> [TyVar]
forall a. Eq a => [a] -> [a]
nub ([TyVar]
tvs [TyVar] -> [TyVar] -> [TyVar]
forall a. Eq a => [a] -> [a] -> [a]
\\ [TyVar]
head_tvs)
addPSize :: PatersonSize -> PatersonSize -> PatersonSize
addPSize :: PatersonSize -> PatersonSize -> PatersonSize
addPSize ps1 :: PatersonSize
ps1@(PS_TyFam {}) PatersonSize
_ = PatersonSize
ps1
addPSize PatersonSize
_ ps2 :: PatersonSize
ps2@(PS_TyFam {}) = PatersonSize
ps2
addPSize (PS_Vanilla { ps_tvs :: PatersonSize -> [TyVar]
ps_tvs = [TyVar]
tvs1, ps_size :: PatersonSize -> Int
ps_size = Int
s1 })
(PS_Vanilla { ps_tvs :: PatersonSize -> [TyVar]
ps_tvs = [TyVar]
tvs2, ps_size :: PatersonSize -> Int
ps_size = Int
s2 })
= PS_Vanilla { ps_tvs :: [TyVar]
ps_tvs = [TyVar]
tvs1 [TyVar] -> [TyVar] -> [TyVar]
forall a. [a] -> [a] -> [a]
++ [TyVar]
tvs2, ps_size :: Int
ps_size = Int
s1 Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
s2 }
pSizeType :: Type -> PatersonSize
pSizeType :: Type -> PatersonSize
pSizeType = VarSet -> Type -> PatersonSize
pSizeTypeX VarSet
emptyVarSet
pSizeTypes :: [Type] -> PatersonSize
pSizeTypes :: [Type] -> PatersonSize
pSizeTypes = VarSet -> PatersonSize -> [Type] -> PatersonSize
pSizeTypesX VarSet
emptyVarSet PatersonSize
pSizeZero
pSizeTypeX :: VarSet -> Type -> PatersonSize
pSizeTypeX :: VarSet -> Type -> PatersonSize
pSizeTypeX VarSet
bvs Type
ty | Just Type
exp_ty <- Type -> Maybe Type
coreView Type
ty = VarSet -> Type -> PatersonSize
pSizeTypeX VarSet
bvs Type
exp_ty
pSizeTypeX VarSet
bvs (TyVarTy TyVar
tv)
| TyVar
tv TyVar -> VarSet -> Bool
`elemVarSet` VarSet
bvs = PatersonSize
pSizeOne
| Bool
otherwise = PS_Vanilla { ps_tvs :: [TyVar]
ps_tvs = [TyVar
tv], ps_size :: Int
ps_size = Int
1 }
pSizeTypeX VarSet
_ (LitTy {}) = PatersonSize
pSizeOne
pSizeTypeX VarSet
bvs (TyConApp TyCon
tc [Type]
tys) = VarSet -> TyCon -> [Type] -> PatersonSize
pSizeTyConAppX VarSet
bvs TyCon
tc [Type]
tys
pSizeTypeX VarSet
bvs (AppTy Type
fun Type
arg) = VarSet -> Type -> PatersonSize
pSizeTypeX VarSet
bvs Type
fun PatersonSize -> PatersonSize -> PatersonSize
`addPSize` VarSet -> Type -> PatersonSize
pSizeTypeX VarSet
bvs Type
arg
pSizeTypeX VarSet
bvs (FunTy FunTyFlag
_ Type
w Type
arg Type
res) = VarSet -> Type -> PatersonSize
pSizeTypeX VarSet
bvs Type
w PatersonSize -> PatersonSize -> PatersonSize
`addPSize` VarSet -> Type -> PatersonSize
pSizeTypeX VarSet
bvs Type
arg PatersonSize -> PatersonSize -> PatersonSize
`addPSize`
VarSet -> Type -> PatersonSize
pSizeTypeX VarSet
bvs Type
res
pSizeTypeX VarSet
bvs (ForAllTy (Bndr TyVar
tv ForAllTyFlag
_) Type
ty) = VarSet -> Type -> PatersonSize
pSizeTypeX VarSet
bvs (TyVar -> Type
tyVarKind TyVar
tv) PatersonSize -> PatersonSize -> PatersonSize
`addPSize`
VarSet -> Type -> PatersonSize
pSizeTypeX (VarSet
bvs VarSet -> TyVar -> VarSet
`extendVarSet` TyVar
tv) Type
ty
pSizeTypeX VarSet
bvs (CastTy Type
ty KindCoercion
_) = VarSet -> Type -> PatersonSize
pSizeTypeX VarSet
bvs Type
ty
pSizeTypeX VarSet
_ (CoercionTy {}) = PatersonSize
pSizeOne
pSizeTypesX :: VarSet -> PatersonSize -> [Type] -> PatersonSize
pSizeTypesX :: VarSet -> PatersonSize -> [Type] -> PatersonSize
pSizeTypesX VarSet
bvs PatersonSize
sz [Type]
tys = (Type -> PatersonSize -> PatersonSize)
-> PatersonSize -> [Type] -> PatersonSize
forall a b. (a -> b -> b) -> b -> [a] -> b
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr (PatersonSize -> PatersonSize -> PatersonSize
addPSize (PatersonSize -> PatersonSize -> PatersonSize)
-> (Type -> PatersonSize) -> Type -> PatersonSize -> PatersonSize
forall b c a. (b -> c) -> (a -> b) -> a -> c
. VarSet -> Type -> PatersonSize
pSizeTypeX VarSet
bvs) PatersonSize
sz [Type]
tys
pSizeTyConApp :: TyCon -> [Type] -> PatersonSize
pSizeTyConApp :: TyCon -> [Type] -> PatersonSize
pSizeTyConApp = VarSet -> TyCon -> [Type] -> PatersonSize
pSizeTyConAppX VarSet
emptyVarSet
pSizeTyConAppX :: VarSet -> TyCon -> [Type] -> PatersonSize
pSizeTyConAppX :: VarSet -> TyCon -> [Type] -> PatersonSize
pSizeTyConAppX VarSet
bvs TyCon
tc [Type]
tys
| TyCon -> Bool
isTypeFamilyTyCon TyCon
tc = TyCon -> PatersonSize
pSizeTyFamApp TyCon
tc
| Bool
otherwise = VarSet -> PatersonSize -> [Type] -> PatersonSize
pSizeTypesX VarSet
bvs PatersonSize
pSizeOne [Type]
tys
pSizeTyFamApp :: TyCon -> PatersonSize
pSizeTyFamApp :: TyCon -> PatersonSize
pSizeTyFamApp TyCon
tc
| TyCon -> Bool
isStuckTypeFamily TyCon
tc = PatersonSize
pSizeZero
| Bool
otherwise = TyCon -> PatersonSize
PS_TyFam TyCon
tc
pSizeClassPred :: Class -> [Type] -> PatersonSize
pSizeClassPred :: Class -> [Type] -> PatersonSize
pSizeClassPred = VarSet -> Class -> [Type] -> PatersonSize
pSizeClassPredX VarSet
emptyVarSet
pSizeClassPredX :: VarSet -> Class -> [Type] -> PatersonSize
pSizeClassPredX :: VarSet -> Class -> [Type] -> PatersonSize
pSizeClassPredX VarSet
bvs Class
cls [Type]
tys
| Class -> Bool
isTerminatingClass Class
cls
= PatersonSize
pSizeZero
| Bool
otherwise
= VarSet -> PatersonSize -> [Type] -> PatersonSize
pSizeTypesX VarSet
bvs PatersonSize
pSizeOne ([Type] -> PatersonSize) -> [Type] -> PatersonSize
forall a b. (a -> b) -> a -> b
$
TyCon -> [Type] -> [Type]
filterOutInvisibleTypes (Class -> TyCon
classTyCon Class
cls) [Type]
tys
isStuckTypeFamily :: TyCon -> Bool
isStuckTypeFamily :: TyCon -> Bool
isStuckTypeFamily TyCon
tc
= TyCon
tc TyCon -> Unique -> Bool
forall a. Uniquable a => a -> Unique -> Bool
`hasKey` Unique
errorMessageTypeErrorFamKey
Bool -> Bool -> Bool
|| TyCon
tc TyCon -> Unique -> Bool
forall a. Uniquable a => a -> Unique -> Bool
`hasKey` Unique
anyTyConKey
isTerminatingClass :: Class -> Bool
isTerminatingClass :: Class -> Bool
isTerminatingClass Class
cls
= Class -> Bool
isIPClass Class
cls
Bool -> Bool -> Bool
|| Class -> Bool
isEqualityClass Class
cls
Bool -> Bool -> Bool
|| Class
cls Class -> Unique -> Bool
forall a. Uniquable a => a -> Unique -> Bool
`hasKey` Unique
typeableClassKey
Bool -> Bool -> Bool
|| Class
cls Class -> Unique -> Bool
forall a. Uniquable a => a -> Unique -> Bool
`hasKey` Unique
unsatisfiableClassNameKey
allDistinctTyVars :: TyVarSet -> [KindOrType] -> Bool
allDistinctTyVars :: VarSet -> [Type] -> Bool
allDistinctTyVars VarSet
_ [] = Bool
True
allDistinctTyVars VarSet
tkvs (Type
ty : [Type]
tys)
= case Type -> Maybe TyVar
getTyVar_maybe Type
ty of
Maybe TyVar
Nothing -> Bool
False
Just TyVar
tv | TyVar
tv TyVar -> VarSet -> Bool
`elemVarSet` VarSet
tkvs -> Bool
False
| Bool
otherwise -> VarSet -> [Type] -> Bool
allDistinctTyVars (VarSet
tkvs VarSet -> TyVar -> VarSet
`extendVarSet` TyVar
tv) [Type]
tys
type TypeSize = IntWithInf
sizeType :: Type -> TypeSize
sizeType :: Type -> TypeSize
sizeType Type
ty = PatersonSize -> TypeSize
toTypeSize (Type -> PatersonSize
pSizeType Type
ty)
sizeTypes :: [Type] -> TypeSize
sizeTypes :: [Type] -> TypeSize
sizeTypes [Type]
tys = PatersonSize -> TypeSize
toTypeSize ((Type -> PatersonSize -> PatersonSize)
-> PatersonSize -> [Type] -> PatersonSize
forall a b. (a -> b -> b) -> b -> [a] -> b
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr (PatersonSize -> PatersonSize -> PatersonSize
addPSize (PatersonSize -> PatersonSize -> PatersonSize)
-> (Type -> PatersonSize) -> Type -> PatersonSize -> PatersonSize
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Type -> PatersonSize
pSizeType) PatersonSize
pSizeZero [Type]
tys)
toTypeSize :: PatersonSize -> TypeSize
toTypeSize :: PatersonSize -> TypeSize
toTypeSize (PS_TyFam {}) = TypeSize
infinity
toTypeSize (PS_Vanilla { ps_size :: PatersonSize -> Int
ps_size = Int
size }) = Int -> TypeSize
mkIntWithInf Int
size