{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE UndecidableInstances #-}
{-# LANGUAGE ViewPatterns #-}
{-# LANGUAGE MultiWayIf #-}
module GHC.Tc.Gen.Head
( HsExprArg(..), HsExprLoc, TcPass(..), QLFlag(..), EWrap(..)
, splitHsApps, rebuildHsApps
, addArgWrap, isHsValArg, getFunSrcSpan
, leadingValArgs, isVisibleArg, getDeepSubsumptionFlag_DataConHead
, tcInferAppHead, tcInferAppHead_maybe
, tcInferId, tcCheckId, tcInferConLike, obviousSig
, tyConOf, tyConOfET
, nonBidirectionalErr
, pprArgInst, addFunResCtxt ) where
import {-# SOURCE #-} GHC.Tc.Gen.Expr( tcExpr, tcCheckPolyExprNC, tcPolyLExprSig )
import GHC.Prelude
import GHC.Hs
import GHC.Hs.Syn.Type
import GHC.Tc.Gen.HsType
import GHC.Tc.Gen.Expand( tcExpand )
import GHC.Tc.Gen.Bind( chooseInferredQuantifiers )
import GHC.Tc.Gen.Sig( tcUserTypeSig, tcInstSig )
import GHC.Tc.TyCl.PatSyn( patSynBuilderOcc )
import GHC.Tc.Utils.Monad
import GHC.Tc.Utils.Unify
import GHC.Tc.Utils.Instantiate
import GHC.Tc.Instance.Family ( tcLookupDataFamInst )
import GHC.Tc.Errors.Types
import GHC.Tc.Solver ( InferMode(..), simplifyInfer )
import GHC.Tc.Utils.Env
import GHC.Tc.Utils.TcMType
import GHC.Tc.Types.ErrCtxt( ReportRedundantConstraints(..) )
import GHC.Tc.Types.Origin
import GHC.Tc.Types.Constraint( WantedConstraints )
import GHC.Tc.Utils.TcType as TcType
import GHC.Tc.Types.Evidence
import GHC.Tc.Zonk.TcType
import GHC.Core.FamInstEnv ( FamInstEnvs )
import GHC.Core.UsageEnv ( singleUsageUE, UsageEnv )
import GHC.Core.PatSyn( PatSyn, patSynName )
import GHC.Core.ConLike( ConLike(..) )
import GHC.Core.DataCon
import GHC.Core.TyCon
import GHC.Core.TyCo.Rep
import GHC.Core.Type
import GHC.Types.Id
import GHC.Types.Name
import GHC.Types.Name.Reader
import GHC.Types.SrcLoc
import GHC.Types.Error
import GHC.Builtin.Names
import GHC.Driver.DynFlags
import GHC.Utils.Misc
import GHC.Utils.Outputable as Outputable
import GHC.Data.Maybe
type HsExprLoc = EpAnn AnnListItem
data TcPass = TcpRn
| TcpInst
| TcpTc
data HsExprArg (p :: TcPass) where
EValArg :: { forall (p :: TcPass). HsExprArg p -> SrcSpanAnnA
ea_loc_span :: HsExprLoc
, forall (p :: TcPass). HsExprArg p -> XEVAType p
ea_arg_ty :: !(XEVAType p)
, forall (p :: TcPass). HsExprArg p -> LHsExpr (GhcPass (XPass p))
ea_arg :: LHsExpr (GhcPass (XPass p)) }
-> HsExprArg p
EValArgQL :: { HsExprArg 'TcpInst -> SrcSpanAnnA
eaql_loc_span :: HsExprLoc
, HsExprArg 'TcpInst -> Scaled Kind
eaql_arg_ty :: Scaled TcSigmaType
, HsExprArg 'TcpInst -> LHsExpr (GhcPass 'Renamed)
eaql_larg :: LHsExpr GhcRn
, HsExprArg 'TcpInst -> HsExpr (GhcPass 'Renamed)
eaql_rn_fun :: HsExpr GhcRn
, HsExprArg 'TcpInst -> (HsExpr (GhcPass 'Typechecked), SrcSpan)
eaql_tc_fun :: (HsExpr GhcTc, SrcSpan)
, HsExprArg 'TcpInst -> UsageEnv
eaql_fun_ue :: UsageEnv
, HsExprArg 'TcpInst -> [HsExprArg 'TcpInst]
eaql_args :: [HsExprArg 'TcpInst]
, HsExprArg 'TcpInst -> WantedConstraints
eaql_wanted :: WantedConstraints
, HsExprArg 'TcpInst -> Bool
eaql_encl :: Bool
, HsExprArg 'TcpInst -> Kind
eaql_res_rho :: TcRhoType }
-> HsExprArg 'TcpInst
ETypeArg :: { ea_loc_span :: HsExprLoc
, forall (p :: TcPass). HsExprArg p -> LHsWcType (GhcPass 'Renamed)
ea_hs_ty :: LHsWcType GhcRn
, forall (p :: TcPass). HsExprArg p -> XETAType p
ea_ty_arg :: !(XETAType p) }
-> HsExprArg p
EPrag :: HsExprLoc -> (HsPragE (GhcPass (XPass p))) -> HsExprArg p
EWrap :: EWrap -> HsExprArg p
type family XETAType (p :: TcPass) where
XETAType 'TcpRn = NoExtField
XETAType _ = Type
type family XEVAType (p :: TcPass) where
XEVAType 'TcpInst = Scaled TcSigmaTypeFRR
XEVAType _ = NoExtField
data QLFlag = DoQL | NoQL
data EWrap = EPar HsExprLoc
| EExpand HsExprLoc HsCtxt
| EHsWrap HsWrapper
instance Outputable QLFlag where
ppr :: QLFlag -> SDoc
ppr QLFlag
DoQL = String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"DoQL"
ppr QLFlag
NoQL = String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"NoQL"
type family XPass (p :: TcPass) where
XPass 'TcpRn = 'Renamed
XPass 'TcpInst = 'Renamed
XPass 'TcpTc = 'Typechecked
mkEValArg :: HsExprLoc -> LHsExpr GhcRn -> HsExprArg 'TcpRn
mkEValArg :: SrcSpanAnnA -> LHsExpr (GhcPass 'Renamed) -> HsExprArg 'TcpRn
mkEValArg SrcSpanAnnA
src_loc LHsExpr (GhcPass 'Renamed)
e = EValArg { ea_arg :: LHsExpr (GhcPass (XPass 'TcpRn))
ea_arg = LHsExpr (GhcPass 'Renamed)
LHsExpr (GhcPass (XPass 'TcpRn))
e, ea_loc_span :: SrcSpanAnnA
ea_loc_span = SrcSpanAnnA
src_loc
, ea_arg_ty :: XEVAType 'TcpRn
ea_arg_ty = NoExtField
XEVAType 'TcpRn
noExtField }
mkETypeArg :: HsExprLoc -> LHsWcType GhcRn -> HsExprArg 'TcpRn
mkETypeArg :: SrcSpanAnnA -> LHsWcType (GhcPass 'Renamed) -> HsExprArg 'TcpRn
mkETypeArg SrcSpanAnnA
src_loc LHsWcType (GhcPass 'Renamed)
hs_ty =
ETypeArg { ea_loc_span :: SrcSpanAnnA
ea_loc_span = SrcSpanAnnA
src_loc
, ea_hs_ty :: LHsWcType (GhcPass 'Renamed)
ea_hs_ty = LHsWcType (GhcPass 'Renamed)
hs_ty
, ea_ty_arg :: XETAType 'TcpRn
ea_ty_arg = NoExtField
XETAType 'TcpRn
noExtField }
addArgWrap :: HsWrapper -> [HsExprArg p] -> [HsExprArg p]
addArgWrap :: forall (p :: TcPass). HsWrapper -> [HsExprArg p] -> [HsExprArg p]
addArgWrap HsWrapper
wrap [HsExprArg p]
args
| HsWrapper -> Bool
isIdHsWrapper HsWrapper
wrap = [HsExprArg p]
args
| Bool
otherwise = EWrap -> HsExprArg p
forall (p :: TcPass). EWrap -> HsExprArg p
EWrap (HsWrapper -> EWrap
EHsWrap HsWrapper
wrap) HsExprArg p -> [HsExprArg p] -> [HsExprArg p]
forall a. a -> [a] -> [a]
: [HsExprArg p]
args
getFunSrcSpan :: [HsExprArg 'TcpRn] -> TcM SrcSpan
getFunSrcSpan :: [HsExprArg 'TcpRn] -> TcM SrcSpan
getFunSrcSpan [] = TcM SrcSpan
getSrcSpanM
getFunSrcSpan (ETypeArg { ea_loc_span :: forall (p :: TcPass). HsExprArg p -> SrcSpanAnnA
ea_loc_span = SrcSpanAnnA
l } : [HsExprArg 'TcpRn]
_) = SrcSpan -> TcM SrcSpan
forall a. a -> IOEnv (Env TcGblEnv TcLclEnv) a
forall (m :: * -> *) a. Monad m => a -> m a
return (SrcSpanAnnA -> SrcSpan
forall a. HasLoc a => a -> SrcSpan
locA SrcSpanAnnA
l)
getFunSrcSpan (EValArg { ea_loc_span :: forall (p :: TcPass). HsExprArg p -> SrcSpanAnnA
ea_loc_span = SrcSpanAnnA
l } : [HsExprArg 'TcpRn]
_) = SrcSpan -> TcM SrcSpan
forall a. a -> IOEnv (Env TcGblEnv TcLclEnv) a
forall (m :: * -> *) a. Monad m => a -> m a
return (SrcSpanAnnA -> SrcSpan
forall a. HasLoc a => a -> SrcSpan
locA SrcSpanAnnA
l)
getFunSrcSpan (EPrag SrcSpanAnnA
l HsPragE (GhcPass (XPass 'TcpRn))
_ : [HsExprArg 'TcpRn]
_) = SrcSpan -> TcM SrcSpan
forall a. a -> IOEnv (Env TcGblEnv TcLclEnv) a
forall (m :: * -> *) a. Monad m => a -> m a
return (SrcSpanAnnA -> SrcSpan
forall a. HasLoc a => a -> SrcSpan
locA SrcSpanAnnA
l)
getFunSrcSpan (EWrap (EPar SrcSpanAnnA
l) : [HsExprArg 'TcpRn]
_) = SrcSpan -> TcM SrcSpan
forall a. a -> IOEnv (Env TcGblEnv TcLclEnv) a
forall (m :: * -> *) a. Monad m => a -> m a
return (SrcSpanAnnA -> SrcSpan
forall a. HasLoc a => a -> SrcSpan
locA SrcSpanAnnA
l)
getFunSrcSpan (EWrap (EExpand SrcSpanAnnA
l HsCtxt
_) : [HsExprArg 'TcpRn]
_) = SrcSpan -> TcM SrcSpan
forall a. a -> IOEnv (Env TcGblEnv TcLclEnv) a
forall (m :: * -> *) a. Monad m => a -> m a
return (SrcSpanAnnA -> SrcSpan
forall a. HasLoc a => a -> SrcSpan
locA SrcSpanAnnA
l)
getFunSrcSpan (EWrap (EHsWrap {}) : [HsExprArg 'TcpRn]
args) = [HsExprArg 'TcpRn] -> TcM SrcSpan
getFunSrcSpan [HsExprArg 'TcpRn]
args
isHsValArg :: HsExprArg id -> Bool
isHsValArg :: forall (id :: TcPass). HsExprArg id -> Bool
isHsValArg (EValArg {}) = Bool
True
isHsValArg HsExprArg id
_ = Bool
False
leadingValArgs :: [HsExprArg 'TcpRn] -> [LHsExpr GhcRn]
leadingValArgs :: [HsExprArg 'TcpRn] -> [LHsExpr (GhcPass 'Renamed)]
leadingValArgs [] = []
leadingValArgs (EValArg { ea_arg :: forall (p :: TcPass). HsExprArg p -> LHsExpr (GhcPass (XPass p))
ea_arg = LHsExpr (GhcPass (XPass 'TcpRn))
arg } : [HsExprArg 'TcpRn]
args) = LHsExpr (GhcPass (XPass 'TcpRn))
GenLocated SrcSpanAnnA (HsExpr (GhcPass 'Renamed))
arg GenLocated SrcSpanAnnA (HsExpr (GhcPass 'Renamed))
-> [GenLocated SrcSpanAnnA (HsExpr (GhcPass 'Renamed))]
-> [GenLocated SrcSpanAnnA (HsExpr (GhcPass 'Renamed))]
forall a. a -> [a] -> [a]
: [HsExprArg 'TcpRn] -> [LHsExpr (GhcPass 'Renamed)]
leadingValArgs [HsExprArg 'TcpRn]
args
leadingValArgs (EWrap {} : [HsExprArg 'TcpRn]
args) = [HsExprArg 'TcpRn] -> [LHsExpr (GhcPass 'Renamed)]
leadingValArgs [HsExprArg 'TcpRn]
args
leadingValArgs (EPrag {} : [HsExprArg 'TcpRn]
args) = [HsExprArg 'TcpRn] -> [LHsExpr (GhcPass 'Renamed)]
leadingValArgs [HsExprArg 'TcpRn]
args
leadingValArgs (ETypeArg {} : [HsExprArg 'TcpRn]
_) = []
isValArg :: HsExprArg id -> Bool
isValArg :: forall (id :: TcPass). HsExprArg id -> Bool
isValArg (EValArg {}) = Bool
True
isValArg HsExprArg id
_ = Bool
False
isVisibleArg :: HsExprArg id -> Bool
isVisibleArg :: forall (id :: TcPass). HsExprArg id -> Bool
isVisibleArg (EValArg {}) = Bool
True
isVisibleArg (ETypeArg {}) = Bool
True
isVisibleArg HsExprArg id
_ = Bool
False
instance OutputableBndrId (XPass p) => Outputable (HsExprArg p) where
ppr :: HsExprArg p -> SDoc
ppr (EPrag SrcSpanAnnA
_ HsPragE (GhcPass (XPass p))
p) = String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"EPrag" SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> HsPragE (GhcPass (XPass p)) -> SDoc
forall a. Outputable a => a -> SDoc
ppr HsPragE (GhcPass (XPass p))
p
ppr (ETypeArg { ea_hs_ty :: forall (p :: TcPass). HsExprArg p -> LHsWcType (GhcPass 'Renamed)
ea_hs_ty = LHsWcType (GhcPass 'Renamed)
hs_ty }) = Char -> SDoc
forall doc. IsLine doc => Char -> doc
char Char
'@' SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<> HsWildCardBndrs
(GhcPass 'Renamed)
(GenLocated SrcSpanAnnA (HsType (GhcPass 'Renamed)))
-> SDoc
forall a. Outputable a => a -> SDoc
ppr LHsWcType (GhcPass 'Renamed)
HsWildCardBndrs
(GhcPass 'Renamed)
(GenLocated SrcSpanAnnA (HsType (GhcPass 'Renamed)))
hs_ty
ppr (EWrap EWrap
wrap) = EWrap -> SDoc
forall a. Outputable a => a -> SDoc
ppr EWrap
wrap
ppr (EValArg { ea_arg :: forall (p :: TcPass). HsExprArg p -> LHsExpr (GhcPass (XPass p))
ea_arg = LHsExpr (GhcPass (XPass p))
arg, ea_loc_span :: forall (p :: TcPass). HsExprArg p -> SrcSpanAnnA
ea_loc_span = SrcSpanAnnA
sloc })
= String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"EValArg" SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc
braces (SrcSpanAnnA -> SDoc
forall a. Outputable a => a -> SDoc
ppr SrcSpanAnnA
sloc) SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> GenLocated SrcSpanAnnA (HsExpr (GhcPass (XPass p))) -> SDoc
forall a. Outputable a => a -> SDoc
ppr LHsExpr (GhcPass (XPass p))
GenLocated SrcSpanAnnA (HsExpr (GhcPass (XPass p)))
arg
ppr (EValArgQL { eaql_tc_fun :: HsExprArg 'TcpInst -> (HsExpr (GhcPass 'Typechecked), SrcSpan)
eaql_tc_fun = (HsExpr (GhcPass 'Typechecked), SrcSpan)
fun, eaql_args :: HsExprArg 'TcpInst -> [HsExprArg 'TcpInst]
eaql_args = [HsExprArg 'TcpInst]
args, eaql_res_rho :: HsExprArg 'TcpInst -> Kind
eaql_res_rho = Kind
ty})
= SDoc -> Int -> SDoc -> SDoc
hang (String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"EValArgQL" SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> (HsExpr (GhcPass 'Typechecked), SrcSpan) -> SDoc
forall a. Outputable a => a -> SDoc
ppr (HsExpr (GhcPass 'Typechecked), SrcSpan)
fun)
Int
2 ([SDoc] -> SDoc
forall doc. IsDoc doc => [doc] -> doc
vcat [ [HsExprArg 'TcpInst] -> SDoc
forall a. Outputable a => a -> SDoc
ppr [HsExprArg 'TcpInst]
args, String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"ea_ql_ty:" SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> Kind -> SDoc
forall a. Outputable a => a -> SDoc
ppr Kind
ty ])
pprArgInst :: HsExprArg 'TcpInst -> SDoc
pprArgInst :: HsExprArg 'TcpInst -> SDoc
pprArgInst (EPrag SrcSpanAnnA
_ HsPragE (GhcPass (XPass 'TcpInst))
p) = String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"EPrag" SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> HsPragE (GhcPass 'Renamed) -> SDoc
forall a. Outputable a => a -> SDoc
ppr HsPragE (GhcPass 'Renamed)
HsPragE (GhcPass (XPass 'TcpInst))
p
pprArgInst (ETypeArg { ea_hs_ty :: forall (p :: TcPass). HsExprArg p -> LHsWcType (GhcPass 'Renamed)
ea_hs_ty = LHsWcType (GhcPass 'Renamed)
hs_ty }) = Char -> SDoc
forall doc. IsLine doc => Char -> doc
char Char
'@' SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<> HsWildCardBndrs
(GhcPass 'Renamed)
(GenLocated SrcSpanAnnA (HsType (GhcPass 'Renamed)))
-> SDoc
forall a. Outputable a => a -> SDoc
ppr LHsWcType (GhcPass 'Renamed)
HsWildCardBndrs
(GhcPass 'Renamed)
(GenLocated SrcSpanAnnA (HsType (GhcPass 'Renamed)))
hs_ty
pprArgInst (EWrap EWrap
wrap) = EWrap -> SDoc
forall a. Outputable a => a -> SDoc
ppr EWrap
wrap
pprArgInst (EValArg { ea_arg :: forall (p :: TcPass). HsExprArg p -> LHsExpr (GhcPass (XPass p))
ea_arg = LHsExpr (GhcPass (XPass 'TcpInst))
arg, ea_arg_ty :: forall (p :: TcPass). HsExprArg p -> XEVAType p
ea_arg_ty = XEVAType 'TcpInst
ty })
= SDoc -> Int -> SDoc -> SDoc
hang (String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"EValArg" SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> GenLocated SrcSpanAnnA (HsExpr (GhcPass 'Renamed)) -> SDoc
forall a. Outputable a => a -> SDoc
ppr LHsExpr (GhcPass (XPass 'TcpInst))
GenLocated SrcSpanAnnA (HsExpr (GhcPass 'Renamed))
arg)
Int
2 (String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"arg_ty" SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> Scaled Kind -> SDoc
forall a. Outputable a => a -> SDoc
ppr Scaled Kind
XEVAType 'TcpInst
ty)
pprArgInst (EValArgQL { eaql_tc_fun :: HsExprArg 'TcpInst -> (HsExpr (GhcPass 'Typechecked), SrcSpan)
eaql_tc_fun = (HsExpr (GhcPass 'Typechecked), SrcSpan)
fun, eaql_args :: HsExprArg 'TcpInst -> [HsExprArg 'TcpInst]
eaql_args = [HsExprArg 'TcpInst]
args, eaql_res_rho :: HsExprArg 'TcpInst -> Kind
eaql_res_rho = Kind
ty})
= SDoc -> Int -> SDoc -> SDoc
hang (String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"EValArgQL" SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> (HsExpr (GhcPass 'Typechecked), SrcSpan) -> SDoc
forall a. Outputable a => a -> SDoc
ppr (HsExpr (GhcPass 'Typechecked), SrcSpan)
fun)
Int
2 ([SDoc] -> SDoc
forall doc. IsDoc doc => [doc] -> doc
vcat [ [SDoc] -> SDoc
forall doc. IsDoc doc => [doc] -> doc
vcat ((HsExprArg 'TcpInst -> SDoc) -> [HsExprArg 'TcpInst] -> [SDoc]
forall a b. (a -> b) -> [a] -> [b]
map HsExprArg 'TcpInst -> SDoc
pprArgInst [HsExprArg 'TcpInst]
args), String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"ea_ql_ty:" SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> Kind -> SDoc
forall a. Outputable a => a -> SDoc
ppr Kind
ty ])
instance Outputable EWrap where
ppr :: EWrap -> SDoc
ppr (EPar SrcSpanAnnA
_) = String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"EPar"
ppr (EHsWrap HsWrapper
w) = String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"EHsWrap" SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> HsWrapper -> SDoc
forall a. Outputable a => a -> SDoc
ppr HsWrapper
w
ppr (EExpand SrcSpanAnnA
_ HsCtxt
_) = String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"EExpand"
splitHsApps :: HsExpr GhcRn -> TcM (HsExpr GhcRn, [HsExprArg 'TcpRn])
splitHsApps :: HsExpr (GhcPass 'Renamed)
-> TcM (HsExpr (GhcPass 'Renamed), [HsExprArg 'TcpRn])
splitHsApps HsExpr (GhcPass 'Renamed)
e = HsExpr (GhcPass 'Renamed)
-> [HsExprArg 'TcpRn]
-> TcM (HsExpr (GhcPass 'Renamed), [HsExprArg 'TcpRn])
go HsExpr (GhcPass 'Renamed)
e []
where
go :: HsExpr (GhcPass 'Renamed)
-> [HsExprArg 'TcpRn]
-> TcM (HsExpr (GhcPass 'Renamed), [HsExprArg 'TcpRn])
go (HsPar XPar (GhcPass 'Renamed)
_ (L SrcSpanAnnA
l HsExpr (GhcPass 'Renamed)
fun)) [HsExprArg 'TcpRn]
args = HsExpr (GhcPass 'Renamed)
-> [HsExprArg 'TcpRn]
-> TcM (HsExpr (GhcPass 'Renamed), [HsExprArg 'TcpRn])
go HsExpr (GhcPass 'Renamed)
fun (EWrap -> HsExprArg 'TcpRn
forall (p :: TcPass). EWrap -> HsExprArg p
EWrap (SrcSpanAnnA -> EWrap
EPar SrcSpanAnnA
l) HsExprArg 'TcpRn -> [HsExprArg 'TcpRn] -> [HsExprArg 'TcpRn]
forall a. a -> [a] -> [a]
: [HsExprArg 'TcpRn]
args)
go (HsPragE XPragE (GhcPass 'Renamed)
_ HsPragE (GhcPass 'Renamed)
p (L SrcSpanAnnA
l HsExpr (GhcPass 'Renamed)
fun)) [HsExprArg 'TcpRn]
args = HsExpr (GhcPass 'Renamed)
-> [HsExprArg 'TcpRn]
-> TcM (HsExpr (GhcPass 'Renamed), [HsExprArg 'TcpRn])
go HsExpr (GhcPass 'Renamed)
fun (SrcSpanAnnA -> HsPragE (GhcPass (XPass 'TcpRn)) -> HsExprArg 'TcpRn
forall (p :: TcPass).
SrcSpanAnnA -> HsPragE (GhcPass (XPass p)) -> HsExprArg p
EPrag SrcSpanAnnA
l HsPragE (GhcPass 'Renamed)
HsPragE (GhcPass (XPass 'TcpRn))
p HsExprArg 'TcpRn -> [HsExprArg 'TcpRn] -> [HsExprArg 'TcpRn]
forall a. a -> [a] -> [a]
: [HsExprArg 'TcpRn]
args)
go (HsAppType XAppTypeE (GhcPass 'Renamed)
_ (L SrcSpanAnnA
l HsExpr (GhcPass 'Renamed)
fun) LHsWcType (NoGhcTc (GhcPass 'Renamed))
ty) [HsExprArg 'TcpRn]
args = HsExpr (GhcPass 'Renamed)
-> [HsExprArg 'TcpRn]
-> TcM (HsExpr (GhcPass 'Renamed), [HsExprArg 'TcpRn])
go HsExpr (GhcPass 'Renamed)
fun (SrcSpanAnnA -> LHsWcType (GhcPass 'Renamed) -> HsExprArg 'TcpRn
mkETypeArg SrcSpanAnnA
l LHsWcType (NoGhcTc (GhcPass 'Renamed))
LHsWcType (GhcPass 'Renamed)
ty HsExprArg 'TcpRn -> [HsExprArg 'TcpRn] -> [HsExprArg 'TcpRn]
forall a. a -> [a] -> [a]
: [HsExprArg 'TcpRn]
args)
go (HsApp XApp (GhcPass 'Renamed)
_ (L SrcSpanAnnA
l HsExpr (GhcPass 'Renamed)
fun) LHsExpr (GhcPass 'Renamed)
arg) [HsExprArg 'TcpRn]
args = HsExpr (GhcPass 'Renamed)
-> [HsExprArg 'TcpRn]
-> TcM (HsExpr (GhcPass 'Renamed), [HsExprArg 'TcpRn])
go HsExpr (GhcPass 'Renamed)
fun (SrcSpanAnnA -> LHsExpr (GhcPass 'Renamed) -> HsExprArg 'TcpRn
mkEValArg SrcSpanAnnA
l LHsExpr (GhcPass 'Renamed)
arg HsExprArg 'TcpRn -> [HsExprArg 'TcpRn] -> [HsExprArg 'TcpRn]
forall a. a -> [a] -> [a]
: [HsExprArg 'TcpRn]
args)
go HsExpr (GhcPass 'Renamed)
fun [HsExprArg 'TcpRn]
args = do { mb_hse <- HsExpr (GhcPass 'Renamed)
-> TcM (Maybe (HsExpansion (GhcPass 'Renamed)))
tcExpand HsExpr (GhcPass 'Renamed)
fun
; case mb_hse of
Just (HSE { hse_ctxt :: forall p. HsExpansion p -> HsCtxt
hse_ctxt = HsCtxt
orig, hse_exp :: forall p. HsExpansion p -> LHsExpr p
hse_exp = L SrcSpanAnnA
l HsExpr (GhcPass 'Renamed)
fun' })
-> HsExpr (GhcPass 'Renamed)
-> [HsExprArg 'TcpRn]
-> TcM (HsExpr (GhcPass 'Renamed), [HsExprArg 'TcpRn])
go HsExpr (GhcPass 'Renamed)
fun' (EWrap -> HsExprArg 'TcpRn
forall (p :: TcPass). EWrap -> HsExprArg p
EWrap (SrcSpanAnnA -> HsCtxt -> EWrap
EExpand SrcSpanAnnA
l HsCtxt
orig) HsExprArg 'TcpRn -> [HsExprArg 'TcpRn] -> [HsExprArg 'TcpRn]
forall a. a -> [a] -> [a]
: [HsExprArg 'TcpRn]
args)
Maybe (HsExpansion (GhcPass 'Renamed))
Nothing
-> (HsExpr (GhcPass 'Renamed), [HsExprArg 'TcpRn])
-> TcM (HsExpr (GhcPass 'Renamed), [HsExprArg 'TcpRn])
forall a. a -> IOEnv (Env TcGblEnv TcLclEnv) a
forall (m :: * -> *) a. Monad m => a -> m a
return (HsExpr (GhcPass 'Renamed)
fun, [HsExprArg 'TcpRn]
args) }
rebuildHsApps :: HsExpr GhcTc
-> [HsExprArg 'TcpTc]
-> HsExpr GhcTc
rebuildHsApps :: HsExpr (GhcPass 'Typechecked)
-> [HsExprArg 'TcpTc] -> HsExpr (GhcPass 'Typechecked)
rebuildHsApps HsExpr (GhcPass 'Typechecked)
fun [] = HsExpr (GhcPass 'Typechecked)
fun
rebuildHsApps HsExpr (GhcPass 'Typechecked)
fun (HsExprArg 'TcpTc
arg : [HsExprArg 'TcpTc]
args)
= case HsExprArg 'TcpTc
arg of
EValArg { ea_arg :: forall (p :: TcPass). HsExprArg p -> LHsExpr (GhcPass (XPass p))
ea_arg = LHsExpr (GhcPass (XPass 'TcpTc))
arg, ea_loc_span :: forall (p :: TcPass). HsExprArg p -> SrcSpanAnnA
ea_loc_span = SrcSpanAnnA
l }
-> HsExpr (GhcPass 'Typechecked)
-> [HsExprArg 'TcpTc] -> HsExpr (GhcPass 'Typechecked)
rebuildHsApps (XApp (GhcPass 'Typechecked)
-> LHsExpr (GhcPass 'Typechecked)
-> LHsExpr (GhcPass 'Typechecked)
-> HsExpr (GhcPass 'Typechecked)
forall p. XApp p -> LHsExpr p -> LHsExpr p -> HsExpr p
HsApp XApp (GhcPass 'Typechecked)
NoExtField
noExtField (SrcSpanAnnA
-> HsExpr (GhcPass 'Typechecked)
-> GenLocated SrcSpanAnnA (HsExpr (GhcPass 'Typechecked))
forall l e. l -> e -> GenLocated l e
L SrcSpanAnnA
l HsExpr (GhcPass 'Typechecked)
fun) LHsExpr (GhcPass 'Typechecked)
LHsExpr (GhcPass (XPass 'TcpTc))
arg) [HsExprArg 'TcpTc]
args
ETypeArg { ea_hs_ty :: forall (p :: TcPass). HsExprArg p -> LHsWcType (GhcPass 'Renamed)
ea_hs_ty = LHsWcType (GhcPass 'Renamed)
hs_ty, ea_ty_arg :: forall (p :: TcPass). HsExprArg p -> XETAType p
ea_ty_arg = XETAType 'TcpTc
ty, ea_loc_span :: forall (p :: TcPass). HsExprArg p -> SrcSpanAnnA
ea_loc_span = SrcSpanAnnA
l }
-> HsExpr (GhcPass 'Typechecked)
-> [HsExprArg 'TcpTc] -> HsExpr (GhcPass 'Typechecked)
rebuildHsApps (XAppTypeE (GhcPass 'Typechecked)
-> LHsExpr (GhcPass 'Typechecked)
-> LHsWcType (NoGhcTc (GhcPass 'Typechecked))
-> HsExpr (GhcPass 'Typechecked)
forall p.
XAppTypeE p -> LHsExpr p -> LHsWcType (NoGhcTc p) -> HsExpr p
HsAppType XAppTypeE (GhcPass 'Typechecked)
XETAType 'TcpTc
ty (SrcSpanAnnA
-> HsExpr (GhcPass 'Typechecked)
-> GenLocated SrcSpanAnnA (HsExpr (GhcPass 'Typechecked))
forall l e. l -> e -> GenLocated l e
L SrcSpanAnnA
l HsExpr (GhcPass 'Typechecked)
fun) LHsWcType (NoGhcTc (GhcPass 'Typechecked))
LHsWcType (GhcPass 'Renamed)
hs_ty) [HsExprArg 'TcpTc]
args
EPrag SrcSpanAnnA
l HsPragE (GhcPass (XPass 'TcpTc))
p
-> HsExpr (GhcPass 'Typechecked)
-> [HsExprArg 'TcpTc] -> HsExpr (GhcPass 'Typechecked)
rebuildHsApps (XPragE (GhcPass 'Typechecked)
-> HsPragE (GhcPass 'Typechecked)
-> LHsExpr (GhcPass 'Typechecked)
-> HsExpr (GhcPass 'Typechecked)
forall p. XPragE p -> HsPragE p -> LHsExpr p -> HsExpr p
HsPragE XPragE (GhcPass 'Typechecked)
NoExtField
noExtField HsPragE (GhcPass 'Typechecked)
HsPragE (GhcPass (XPass 'TcpTc))
p (SrcSpanAnnA
-> HsExpr (GhcPass 'Typechecked)
-> GenLocated SrcSpanAnnA (HsExpr (GhcPass 'Typechecked))
forall l e. l -> e -> GenLocated l e
L SrcSpanAnnA
l HsExpr (GhcPass 'Typechecked)
fun)) [HsExprArg 'TcpTc]
args
EWrap (EPar SrcSpanAnnA
l)
-> HsExpr (GhcPass 'Typechecked)
-> [HsExprArg 'TcpTc] -> HsExpr (GhcPass 'Typechecked)
rebuildHsApps (XPar (GhcPass 'Typechecked)
-> LHsExpr (GhcPass 'Typechecked) -> HsExpr (GhcPass 'Typechecked)
forall p. XPar p -> LHsExpr p -> HsExpr p
HsPar XPar (GhcPass 'Typechecked)
NoExtField
noExtField (SrcSpanAnnA
-> HsExpr (GhcPass 'Typechecked)
-> GenLocated SrcSpanAnnA (HsExpr (GhcPass 'Typechecked))
forall l e. l -> e -> GenLocated l e
L SrcSpanAnnA
l HsExpr (GhcPass 'Typechecked)
fun)) [HsExprArg 'TcpTc]
args
EWrap (EExpand SrcSpanAnnA
l HsCtxt
o)
-> HsExpr (GhcPass 'Typechecked)
-> [HsExprArg 'TcpTc] -> HsExpr (GhcPass 'Typechecked)
rebuildHsApps (XXExpr (GhcPass 'Typechecked) -> HsExpr (GhcPass 'Typechecked)
forall p. XXExpr p -> HsExpr p
XExpr (HsExpansion (GhcPass 'Typechecked) -> XXExprGhcTc
ExpandedThingTc (HsCtxt
-> LHsExpr (GhcPass 'Typechecked)
-> HsExpansion (GhcPass 'Typechecked)
forall p. HsCtxt -> LHsExpr p -> HsExpansion p
HSE HsCtxt
o (SrcSpanAnnA
-> HsExpr (GhcPass 'Typechecked)
-> GenLocated SrcSpanAnnA (HsExpr (GhcPass 'Typechecked))
forall l e. l -> e -> GenLocated l e
L SrcSpanAnnA
l HsExpr (GhcPass 'Typechecked)
fun)))) [HsExprArg 'TcpTc]
args
EWrap (EHsWrap HsWrapper
wrap)
-> HsExpr (GhcPass 'Typechecked)
-> [HsExprArg 'TcpTc] -> HsExpr (GhcPass 'Typechecked)
rebuildHsApps (HsWrapper
-> HsExpr (GhcPass 'Typechecked) -> HsExpr (GhcPass 'Typechecked)
mkHsWrap HsWrapper
wrap HsExpr (GhcPass 'Typechecked)
fun) [HsExprArg 'TcpTc]
args
tcInferAppHead :: (HsExpr GhcRn, SrcSpan)
-> TcM (HsExpr GhcTc, TcSigmaType)
tcInferAppHead :: (HsExpr (GhcPass 'Renamed), SrcSpan)
-> TcM (HsExpr (GhcPass 'Typechecked), Kind)
tcInferAppHead (HsExpr (GhcPass 'Renamed)
fun,SrcSpan
fun_lspan)
= SrcSpan
-> TcM (HsExpr (GhcPass 'Typechecked), Kind)
-> TcM (HsExpr (GhcPass 'Typechecked), Kind)
forall a. SrcSpan -> TcRn a -> TcRn a
setSrcSpan SrcSpan
fun_lspan (TcM (HsExpr (GhcPass 'Typechecked), Kind)
-> TcM (HsExpr (GhcPass 'Typechecked), Kind))
-> TcM (HsExpr (GhcPass 'Typechecked), Kind)
-> TcM (HsExpr (GhcPass 'Typechecked), Kind)
forall a b. (a -> b) -> a -> b
$
do { mb_tc_fun <- HsExpr (GhcPass 'Renamed)
-> TcM (Maybe (HsExpr (GhcPass 'Typechecked), Kind))
tcInferAppHead_maybe HsExpr (GhcPass 'Renamed)
fun
; case mb_tc_fun of
Just (HsExpr (GhcPass 'Typechecked)
fun', Kind
fun_sigma) -> (HsExpr (GhcPass 'Typechecked), Kind)
-> TcM (HsExpr (GhcPass 'Typechecked), Kind)
forall a. a -> IOEnv (Env TcGblEnv TcLclEnv) a
forall (m :: * -> *) a. Monad m => a -> m a
return (HsExpr (GhcPass 'Typechecked)
fun', Kind
fun_sigma)
Maybe (HsExpr (GhcPass 'Typechecked), Kind)
Nothing -> (ExpRhoType -> TcM (HsExpr (GhcPass 'Typechecked)))
-> TcM (HsExpr (GhcPass 'Typechecked), Kind)
forall a. (ExpRhoType -> TcM a) -> TcM (a, Kind)
runInferRho (HsExpr (GhcPass 'Renamed)
-> ExpRhoType -> TcM (HsExpr (GhcPass 'Typechecked))
tcExpr HsExpr (GhcPass 'Renamed)
fun) }
tcInferAppHead_maybe :: HsExpr GhcRn
-> TcM (Maybe (HsExpr GhcTc, TcSigmaType))
tcInferAppHead_maybe :: HsExpr (GhcPass 'Renamed)
-> TcM (Maybe (HsExpr (GhcPass 'Typechecked), Kind))
tcInferAppHead_maybe HsExpr (GhcPass 'Renamed)
fun = case HsExpr (GhcPass 'Renamed)
fun of
HsVar XVar (GhcPass 'Renamed)
_ LIdOccP (GhcPass 'Renamed)
nm -> (HsExpr (GhcPass 'Typechecked), Kind)
-> Maybe (HsExpr (GhcPass 'Typechecked), Kind)
(HsExpr (GhcPass 'Typechecked), Kind)
-> Maybe (HsExpr (GhcPass 'Typechecked), Kind)
forall a. a -> Maybe a
Just ((HsExpr (GhcPass 'Typechecked), Kind)
-> Maybe (HsExpr (GhcPass 'Typechecked), Kind))
-> TcM (HsExpr (GhcPass 'Typechecked), Kind)
-> TcM (Maybe (HsExpr (GhcPass 'Typechecked), Kind))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> GenLocated SrcSpanAnnN (WithUserRdr Name)
-> TcM (HsExpr (GhcPass 'Typechecked), Kind)
tcInferId LIdOccP (GhcPass 'Renamed)
GenLocated SrcSpanAnnN (WithUserRdr Name)
nm
ExprWithTySig XExprWithTySig (GhcPass 'Renamed)
_ LHsExpr (GhcPass 'Renamed)
e LHsSigWcType (NoGhcTc (GhcPass 'Renamed))
hs_ty -> (HsExpr (GhcPass 'Typechecked), Kind)
-> Maybe (HsExpr (GhcPass 'Typechecked), Kind)
(HsExpr (GhcPass 'Typechecked), Kind)
-> Maybe (HsExpr (GhcPass 'Typechecked), Kind)
forall a. a -> Maybe a
Just ((HsExpr (GhcPass 'Typechecked), Kind)
-> Maybe (HsExpr (GhcPass 'Typechecked), Kind))
-> TcM (HsExpr (GhcPass 'Typechecked), Kind)
-> TcM (Maybe (HsExpr (GhcPass 'Typechecked), Kind))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> LHsExpr (GhcPass 'Renamed)
-> LHsSigWcType (NoGhcTc (GhcPass 'Renamed))
-> TcM (HsExpr (GhcPass 'Typechecked), Kind)
tcExprWithSig LHsExpr (GhcPass 'Renamed)
e LHsSigWcType (NoGhcTc (GhcPass 'Renamed))
hs_ty
HsOverLit XOverLitE (GhcPass 'Renamed)
_ HsOverLit (GhcPass 'Renamed)
lit -> (HsExpr (GhcPass 'Typechecked), Kind)
-> Maybe (HsExpr (GhcPass 'Typechecked), Kind)
(HsExpr (GhcPass 'Typechecked), Kind)
-> Maybe (HsExpr (GhcPass 'Typechecked), Kind)
forall a. a -> Maybe a
Just ((HsExpr (GhcPass 'Typechecked), Kind)
-> Maybe (HsExpr (GhcPass 'Typechecked), Kind))
-> TcM (HsExpr (GhcPass 'Typechecked), Kind)
-> TcM (Maybe (HsExpr (GhcPass 'Typechecked), Kind))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> HsOverLit (GhcPass 'Renamed)
-> TcM (HsExpr (GhcPass 'Typechecked), Kind)
tcInferOverLit HsOverLit (GhcPass 'Renamed)
lit
XExpr (HsRecSelRn FieldOcc (GhcPass 'Renamed)
f) -> (HsExpr (GhcPass 'Typechecked), Kind)
-> Maybe (HsExpr (GhcPass 'Typechecked), Kind)
(HsExpr (GhcPass 'Typechecked), Kind)
-> Maybe (HsExpr (GhcPass 'Typechecked), Kind)
forall a. a -> Maybe a
Just ((HsExpr (GhcPass 'Typechecked), Kind)
-> Maybe (HsExpr (GhcPass 'Typechecked), Kind))
-> TcM (HsExpr (GhcPass 'Typechecked), Kind)
-> TcM (Maybe (HsExpr (GhcPass 'Typechecked), Kind))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> FieldOcc (GhcPass 'Renamed)
-> TcM (HsExpr (GhcPass 'Typechecked), Kind)
tcInferRecSelId FieldOcc (GhcPass 'Renamed)
f
HsExpr (GhcPass 'Renamed)
_ -> Maybe (HsExpr (GhcPass 'Typechecked), Kind)
-> TcM (Maybe (HsExpr (GhcPass 'Typechecked), Kind))
forall a. a -> IOEnv (Env TcGblEnv TcLclEnv) a
forall (m :: * -> *) a. Monad m => a -> m a
return Maybe (HsExpr (GhcPass 'Typechecked), Kind)
forall a. Maybe a
Nothing
tcInferRecSelId :: FieldOcc GhcRn
-> TcM ( (HsExpr GhcTc, TcSigmaType))
tcInferRecSelId :: FieldOcc (GhcPass 'Renamed)
-> TcM (HsExpr (GhcPass 'Typechecked), Kind)
tcInferRecSelId (FieldOcc XCFieldOcc (GhcPass 'Renamed)
lbl (L SrcSpanAnnN
l Name
sel_name))
= do { sel_id <- TcM TcTyVar
tc_rec_sel_id
; let expr = XXExpr (GhcPass 'Typechecked) -> HsExpr (GhcPass 'Typechecked)
forall p. XXExpr p -> HsExpr p
XExpr (FieldOcc (GhcPass 'Typechecked) -> XXExprGhcTc
HsRecSelTc (XCFieldOcc (GhcPass 'Typechecked)
-> LIdP (GhcPass 'Typechecked) -> FieldOcc (GhcPass 'Typechecked)
forall pass. XCFieldOcc pass -> LIdP pass -> FieldOcc pass
FieldOcc XCFieldOcc (GhcPass 'Renamed)
XCFieldOcc (GhcPass 'Typechecked)
lbl (SrcSpanAnnN -> TcTyVar -> GenLocated SrcSpanAnnN TcTyVar
forall l e. l -> e -> GenLocated l e
L SrcSpanAnnN
l TcTyVar
sel_id)))
; return $ (expr, idType sel_id)
}
where
occ :: OccName
occ :: OccName
occ = Name -> OccName
nameOccName Name
sel_name
tc_rec_sel_id :: TcM TcId
tc_rec_sel_id :: TcM TcTyVar
tc_rec_sel_id
= do { thing <- Name -> TcM TcTyThing
tcLookup Name
sel_name
; case thing of
ATcId { tct_id :: TcTyThing -> TcTyVar
tct_id = TcTyVar
id }
-> do { OccName -> TcTyVar -> TcM ()
check_naughty OccName
occ TcTyVar
id
; TcTyVar -> TcM ()
check_local_id TcTyVar
id
; TcTyVar -> TcM TcTyVar
forall a. a -> IOEnv (Env TcGblEnv TcLclEnv) a
forall (m :: * -> *) a. Monad m => a -> m a
return TcTyVar
id }
AGlobal (AnId TcTyVar
id)
-> do { OccName -> TcTyVar -> TcM ()
check_naughty OccName
occ TcTyVar
id
; TcTyVar -> TcM TcTyVar
forall a. a -> IOEnv (Env TcGblEnv TcLclEnv) a
forall (m :: * -> *) a. Monad m => a -> m a
return TcTyVar
id }
TcTyThing
_ -> TcRnMessage -> TcM TcTyVar
forall a. TcRnMessage -> TcM a
failWithTc (TcRnMessage -> TcM TcTyVar) -> TcRnMessage -> TcM TcTyVar
forall a b. (a -> b) -> a -> b
$ TcTyThing -> TcRnMessage
TcRnExpectedValueId TcTyThing
thing }
obviousSig :: HsExpr GhcRn -> Maybe (LHsSigWcType GhcRn)
obviousSig :: HsExpr (GhcPass 'Renamed)
-> Maybe (LHsSigWcType (GhcPass 'Renamed))
obviousSig (ExprWithTySig XExprWithTySig (GhcPass 'Renamed)
_ LHsExpr (GhcPass 'Renamed)
_ LHsSigWcType (NoGhcTc (GhcPass 'Renamed))
ty) = HsWildCardBndrs
(GhcPass 'Renamed)
(GenLocated SrcSpanAnnA (HsSigType (GhcPass 'Renamed)))
-> Maybe
(HsWildCardBndrs
(GhcPass 'Renamed)
(GenLocated SrcSpanAnnA (HsSigType (GhcPass 'Renamed))))
forall a. a -> Maybe a
Just LHsSigWcType (NoGhcTc (GhcPass 'Renamed))
HsWildCardBndrs
(GhcPass 'Renamed)
(GenLocated SrcSpanAnnA (HsSigType (GhcPass 'Renamed)))
ty
obviousSig (HsPar XPar (GhcPass 'Renamed)
_ LHsExpr (GhcPass 'Renamed)
p) = HsExpr (GhcPass 'Renamed)
-> Maybe (LHsSigWcType (GhcPass 'Renamed))
obviousSig (GenLocated SrcSpanAnnA (HsExpr (GhcPass 'Renamed))
-> HsExpr (GhcPass 'Renamed)
forall l e. GenLocated l e -> e
unLoc LHsExpr (GhcPass 'Renamed)
GenLocated SrcSpanAnnA (HsExpr (GhcPass 'Renamed))
p)
obviousSig (HsPragE XPragE (GhcPass 'Renamed)
_ HsPragE (GhcPass 'Renamed)
_ LHsExpr (GhcPass 'Renamed)
p) = HsExpr (GhcPass 'Renamed)
-> Maybe (LHsSigWcType (GhcPass 'Renamed))
obviousSig (GenLocated SrcSpanAnnA (HsExpr (GhcPass 'Renamed))
-> HsExpr (GhcPass 'Renamed)
forall l e. GenLocated l e -> e
unLoc LHsExpr (GhcPass 'Renamed)
GenLocated SrcSpanAnnA (HsExpr (GhcPass 'Renamed))
p)
obviousSig HsExpr (GhcPass 'Renamed)
_ = Maybe (LHsSigWcType (GhcPass 'Renamed))
Maybe
(HsWildCardBndrs
(GhcPass 'Renamed)
(GenLocated SrcSpanAnnA (HsSigType (GhcPass 'Renamed))))
forall a. Maybe a
Nothing
tyConOf :: FamInstEnvs -> TcSigmaType -> Maybe TyCon
tyConOf :: FamInstEnvs -> Kind -> Maybe TyCon
tyConOf FamInstEnvs
fam_inst_envs Kind
ty0
= case HasDebugCallStack => Kind -> Maybe (TyCon, [Kind])
Kind -> Maybe (TyCon, [Kind])
tcSplitTyConApp_maybe Kind
ty of
Just (TyCon
tc, [Kind]
tys) -> TyCon -> Maybe TyCon
forall a. a -> Maybe a
Just ((TyCon, [Kind], Coercion) -> TyCon
forall a b c. (a, b, c) -> a
fstOf3 (FamInstEnvs -> TyCon -> [Kind] -> (TyCon, [Kind], Coercion)
tcLookupDataFamInst FamInstEnvs
fam_inst_envs TyCon
tc [Kind]
tys))
Maybe (TyCon, [Kind])
Nothing -> Maybe TyCon
forall a. Maybe a
Nothing
where
([TcTyVar]
_, [Kind]
_, Kind
ty) = Kind -> ([TcTyVar], [Kind], Kind)
tcSplitSigmaTy Kind
ty0
tyConOfET :: FamInstEnvs -> ExpRhoType -> Maybe TyCon
tyConOfET :: FamInstEnvs -> ExpRhoType -> Maybe TyCon
tyConOfET FamInstEnvs
fam_inst_envs ExpRhoType
ty0 = FamInstEnvs -> Kind -> Maybe TyCon
tyConOf FamInstEnvs
fam_inst_envs (Kind -> Maybe TyCon) -> Maybe Kind -> Maybe TyCon
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< ExpRhoType -> Maybe Kind
checkingExpType_maybe ExpRhoType
ty0
tcExprWithSig :: LHsExpr GhcRn -> LHsSigWcType (NoGhcTc GhcRn)
-> TcM (HsExpr GhcTc, TcSigmaType)
tcExprWithSig :: LHsExpr (GhcPass 'Renamed)
-> LHsSigWcType (NoGhcTc (GhcPass 'Renamed))
-> TcM (HsExpr (GhcPass 'Typechecked), Kind)
tcExprWithSig LHsExpr (GhcPass 'Renamed)
expr LHsSigWcType (NoGhcTc (GhcPass 'Renamed))
hs_ty
= do { sig_info <- TcM TcIdSig -> TcM TcIdSig
forall r. TcM r -> TcM r
checkNoErrs (TcM TcIdSig -> TcM TcIdSig) -> TcM TcIdSig -> TcM TcIdSig
forall a b. (a -> b) -> a -> b
$
SrcSpan
-> LHsSigWcType (GhcPass 'Renamed) -> Maybe Name -> TcM TcIdSig
tcUserTypeSig SrcSpan
loc LHsSigWcType (NoGhcTc (GhcPass 'Renamed))
LHsSigWcType (GhcPass 'Renamed)
hs_ty Maybe Name
forall a. Maybe a
Nothing
; (expr', poly_ty) <- tcExprSig expr sig_info
; return (ExprWithTySig noExtField expr' hs_ty, poly_ty) }
where
loc :: SrcSpan
loc = GenLocated SrcSpanAnnA (HsSigType (GhcPass 'Renamed)) -> SrcSpan
forall a e. HasLoc a => GenLocated a e -> SrcSpan
getLocA (LHsSigWcType (GhcPass 'Renamed) -> LHsSigType (GhcPass 'Renamed)
forall (p :: Pass).
LHsSigWcType (GhcPass p) -> LHsSigType (GhcPass p)
dropWildCards LHsSigWcType (NoGhcTc (GhcPass 'Renamed))
LHsSigWcType (GhcPass 'Renamed)
hs_ty)
tcExprSig :: LHsExpr GhcRn -> TcIdSig -> TcM (LHsExpr GhcTc, TcSigmaType)
tcExprSig :: LHsExpr (GhcPass 'Renamed)
-> TcIdSig -> TcM (LHsExpr (GhcPass 'Typechecked), Kind)
tcExprSig LHsExpr (GhcPass 'Renamed)
expr (TcCompleteSig TcCompleteSig
sig)
= do { expr' <- LHsExpr (GhcPass 'Renamed)
-> TcCompleteSig -> TcM (LHsExpr (GhcPass 'Typechecked))
tcPolyLExprSig LHsExpr (GhcPass 'Renamed)
expr TcCompleteSig
sig
; return (expr', idType (sig_bndr sig)) }
tcExprSig LHsExpr (GhcPass 'Renamed)
expr sig :: TcIdSig
sig@(TcPartialSig (PSig { psig_name :: TcPartialSig -> Name
psig_name = Name
name, psig_loc :: TcPartialSig -> SrcSpan
psig_loc = SrcSpan
loc }))
= SrcSpan
-> TcM (LHsExpr (GhcPass 'Typechecked), Kind)
-> TcM (LHsExpr (GhcPass 'Typechecked), Kind)
forall a. SrcSpan -> TcRn a -> TcRn a
setSrcSpan SrcSpan
loc (TcM (LHsExpr (GhcPass 'Typechecked), Kind)
-> TcM (LHsExpr (GhcPass 'Typechecked), Kind))
-> TcM (LHsExpr (GhcPass 'Typechecked), Kind)
-> TcM (LHsExpr (GhcPass 'Typechecked), Kind)
forall a b. (a -> b) -> a -> b
$
do { (tclvl, wanted, (expr', sig_inst))
<- TcM
(GenLocated SrcSpanAnnA (HsExpr (GhcPass 'Typechecked)),
TcIdSigInst)
-> TcM
(TcLevel, WantedConstraints,
(GenLocated SrcSpanAnnA (HsExpr (GhcPass 'Typechecked)),
TcIdSigInst))
forall a. TcM a -> TcM (TcLevel, WantedConstraints, a)
pushLevelAndCaptureConstraints (TcM
(GenLocated SrcSpanAnnA (HsExpr (GhcPass 'Typechecked)),
TcIdSigInst)
-> TcM
(TcLevel, WantedConstraints,
(GenLocated SrcSpanAnnA (HsExpr (GhcPass 'Typechecked)),
TcIdSigInst)))
-> TcM
(GenLocated SrcSpanAnnA (HsExpr (GhcPass 'Typechecked)),
TcIdSigInst)
-> TcM
(TcLevel, WantedConstraints,
(GenLocated SrcSpanAnnA (HsExpr (GhcPass 'Typechecked)),
TcIdSigInst))
forall a b. (a -> b) -> a -> b
$
do { sig_inst <- TcIdSig -> TcM TcIdSigInst
tcInstSig TcIdSig
sig
; expr' <- tcExtendNameTyVarEnv (mapSnd binderVar $ sig_inst_skols sig_inst) $
tcExtendNameTyVarEnv (sig_inst_wcs sig_inst) $
tcCheckPolyExprNC expr (sig_inst_tau sig_inst)
; return (expr', sig_inst) }
; let tau = TcIdSigInst -> Kind
sig_inst_tau TcIdSigInst
sig_inst
infer_mode | [Kind] -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null (TcIdSigInst -> [Kind]
sig_inst_theta TcIdSigInst
sig_inst)
, Maybe Kind -> Bool
forall a. Maybe a -> Bool
isNothing (TcIdSigInst -> Maybe Kind
sig_inst_wcx TcIdSigInst
sig_inst)
= InferMode
ApplyMR
| Bool
otherwise
= InferMode
NoRestrictions
; ((qtvs, givens, ev_binds, _), residual)
<- captureConstraints $
simplifyInfer NotTopLevel tclvl infer_mode
[sig_inst] [(name, tau)] wanted
; emitConstraints residual
; tau <- liftZonkM $ zonkTcType tau
; let inferred_theta = (TcTyVar -> Kind) -> [TcTyVar] -> [Kind]
forall a b. (a -> b) -> [a] -> [b]
map TcTyVar -> Kind
evVarPred [TcTyVar]
givens
tau_tvs = Kind -> TyCoVarSet
tyCoVarsOfType Kind
tau
; (binders, my_theta) <- chooseInferredQuantifiers residual inferred_theta
tau_tvs qtvs (Just sig_inst)
; let inferred_sigma = [TcTyVar] -> [Kind] -> Kind -> Kind
HasDebugCallStack => [TcTyVar] -> [Kind] -> Kind -> Kind
mkInfSigmaTy [TcTyVar]
qtvs [Kind]
inferred_theta Kind
tau
my_sigma = [InvisTVBinder] -> Kind -> Kind
mkInvisForAllTys [InvisTVBinder]
binders ([Kind] -> Kind -> Kind
HasDebugCallStack => [Kind] -> Kind -> Kind
mkPhiTy [Kind]
my_theta Kind
tau)
; wrap <- if inferred_sigma `eqType` my_sigma
then return idHsWrapper
else tcSubTypeSigma ExprSigOrigin (ExprSigCtxt NoRRC) inferred_sigma my_sigma
; traceTc "tcExpSig" (ppr qtvs $$ ppr givens $$ ppr inferred_sigma $$ ppr my_sigma)
; let poly_wrap = HsWrapper
wrap
HsWrapper -> HsWrapper -> HsWrapper
<.> [TcTyVar] -> HsWrapper
mkWpTyLams [TcTyVar]
qtvs
HsWrapper -> HsWrapper -> HsWrapper
<.> [TcTyVar] -> HsWrapper
mkWpEvLams [TcTyVar]
givens
HsWrapper -> HsWrapper -> HsWrapper
<.> TcEvBinds -> HsWrapper
mkWpLet TcEvBinds
ev_binds
; return (mkLHsWrap poly_wrap expr', my_sigma) }
tcInferOverLit :: HsOverLit GhcRn -> TcM (HsExpr GhcTc, TcSigmaType)
tcInferOverLit :: HsOverLit (GhcPass 'Renamed)
-> TcM (HsExpr (GhcPass 'Typechecked), Kind)
tcInferOverLit lit :: HsOverLit (GhcPass 'Renamed)
lit@(OverLit { ol_val :: forall p. HsOverLit p -> OverLitVal
ol_val = OverLitVal
val
, ol_ext :: forall p. HsOverLit p -> XOverLit p
ol_ext = OverLitRn { ol_rebindable :: OverLitRn -> Bool
ol_rebindable = Bool
rebindable
, ol_from_fun :: OverLitRn -> LIdP (GhcPass 'Renamed)
ol_from_fun = L SrcSpanAnnN
loc Name
from_name } })
=
do { hs_lit <- OverLitVal -> TcM (HsLit (GhcPass 'Typechecked))
mkOverLit OverLitVal
val
; from_id <- tcLookupId from_name
; (wrap1, from_ty) <- topInstantiate (LiteralOrigin lit) (idType from_id)
; let
thing = Name -> TypedThing
NameThing Name
from_name
mb_thing = TypedThing -> Maybe TypedThing
forall a. a -> Maybe a
Just TypedThing
thing
herald = TypedThing -> HsExpr (GhcPass 'Typechecked) -> ExpectedFunTyCtxt
forall (p :: Pass).
Outputable (HsExpr (GhcPass p)) =>
TypedThing -> HsExpr (GhcPass p) -> ExpectedFunTyCtxt
ExpectedFunTyArg TypedThing
thing (XLitE (GhcPass 'Typechecked)
-> HsLit (GhcPass 'Typechecked) -> HsExpr (GhcPass 'Typechecked)
forall p. XLitE p -> HsLit p -> HsExpr p
HsLit XLitE (GhcPass 'Typechecked)
NoExtField
noExtField HsLit (GhcPass 'Typechecked)
hs_lit)
; (co2, sarg_ty, res_ty) <- matchActualFunTy herald mb_thing (1, from_ty) from_ty
; co <- unifyType mb_thing (hsLitType hs_lit) (scaledThing sarg_ty)
; let lit_expr = SrcSpanAnnA
-> HsExpr (GhcPass 'Typechecked)
-> GenLocated SrcSpanAnnA (HsExpr (GhcPass 'Typechecked))
forall l e. l -> e -> GenLocated l e
L (SrcSpanAnnN -> SrcSpanAnnA
forall a b. (HasLoc a, HasAnnotation b) => a -> b
l2l SrcSpanAnnN
loc) (HsExpr (GhcPass 'Typechecked)
-> GenLocated SrcSpanAnnA (HsExpr (GhcPass 'Typechecked)))
-> HsExpr (GhcPass 'Typechecked)
-> GenLocated SrcSpanAnnA (HsExpr (GhcPass 'Typechecked))
forall a b. (a -> b) -> a -> b
$ Coercion
-> HsExpr (GhcPass 'Typechecked) -> HsExpr (GhcPass 'Typechecked)
mkHsWrapCo Coercion
co (HsExpr (GhcPass 'Typechecked) -> HsExpr (GhcPass 'Typechecked))
-> HsExpr (GhcPass 'Typechecked) -> HsExpr (GhcPass 'Typechecked)
forall a b. (a -> b) -> a -> b
$
XLitE (GhcPass 'Typechecked)
-> HsLit (GhcPass 'Typechecked) -> HsExpr (GhcPass 'Typechecked)
forall p. XLitE p -> HsLit p -> HsExpr p
HsLit XLitE (GhcPass 'Typechecked)
NoExtField
noExtField HsLit (GhcPass 'Typechecked)
hs_lit
from_expr = HsWrapper
-> HsExpr (GhcPass 'Typechecked) -> HsExpr (GhcPass 'Typechecked)
mkHsWrap (Coercion -> HsWrapper
mkWpCastN Coercion
co2 HsWrapper -> HsWrapper -> HsWrapper
<.> HsWrapper
wrap1) (HsExpr (GhcPass 'Typechecked) -> HsExpr (GhcPass 'Typechecked))
-> HsExpr (GhcPass 'Typechecked) -> HsExpr (GhcPass 'Typechecked)
forall a b. (a -> b) -> a -> b
$
LIdP (GhcPass 'Typechecked) -> HsExpr (GhcPass 'Typechecked)
forall (p :: Pass).
IsPass p =>
LIdP (GhcPass p) -> HsExpr (GhcPass p)
mkHsVar (SrcSpanAnnN -> TcTyVar -> GenLocated SrcSpanAnnN TcTyVar
forall l e. l -> e -> GenLocated l e
L SrcSpanAnnN
loc TcTyVar
from_id)
witness = XApp (GhcPass 'Typechecked)
-> LHsExpr (GhcPass 'Typechecked)
-> LHsExpr (GhcPass 'Typechecked)
-> HsExpr (GhcPass 'Typechecked)
forall p. XApp p -> LHsExpr p -> LHsExpr p -> HsExpr p
HsApp XApp (GhcPass 'Typechecked)
NoExtField
noExtField (SrcSpanAnnA
-> HsExpr (GhcPass 'Typechecked)
-> GenLocated SrcSpanAnnA (HsExpr (GhcPass 'Typechecked))
forall l e. l -> e -> GenLocated l e
L (SrcSpanAnnN -> SrcSpanAnnA
forall a b. (HasLoc a, HasAnnotation b) => a -> b
l2l SrcSpanAnnN
loc) HsExpr (GhcPass 'Typechecked)
from_expr) LHsExpr (GhcPass 'Typechecked)
GenLocated SrcSpanAnnA (HsExpr (GhcPass 'Typechecked))
lit_expr
lit' = OverLit { ol_val :: OverLitVal
ol_val = OverLitVal
val
, ol_ext :: XOverLit (GhcPass 'Typechecked)
ol_ext = OverLitTc { ol_rebindable :: Bool
ol_rebindable = Bool
rebindable
, ol_witness :: HsExpr (GhcPass 'Typechecked)
ol_witness = HsExpr (GhcPass 'Typechecked)
witness
, ol_type :: Kind
ol_type = Kind
res_ty } }
; return (HsOverLit noExtField lit', res_ty) }
tcCheckId :: Name -> ExpRhoType -> TcM (HsExpr GhcTc)
tcCheckId :: Name -> ExpRhoType -> TcM (HsExpr (GhcPass 'Typechecked))
tcCheckId Name
name ExpRhoType
res_ty
= do { (expr, actual_res_ty) <- GenLocated SrcSpanAnnN (WithUserRdr Name)
-> TcM (HsExpr (GhcPass 'Typechecked), Kind)
tcInferId (WithUserRdr Name -> GenLocated SrcSpanAnnN (WithUserRdr Name)
forall e a. HasAnnotation e => a -> GenLocated e a
noLocA (WithUserRdr Name -> GenLocated SrcSpanAnnN (WithUserRdr Name))
-> WithUserRdr Name -> GenLocated SrcSpanAnnN (WithUserRdr Name)
forall a b. (a -> b) -> a -> b
$ Name -> WithUserRdr Name
noUserRdr Name
name)
; traceTc "tcCheckId" (vcat [ppr name, ppr actual_res_ty, ppr res_ty])
; addFunResCtxt expr [] actual_res_ty res_ty $
tcWrapResultO (OccurrenceOf name) rn_fun expr actual_res_ty res_ty }
where
rn_fun :: HsExpr (GhcPass 'Renamed)
rn_fun = LIdP (GhcPass 'Renamed) -> HsExpr (GhcPass 'Renamed)
forall (p :: Pass).
IsPass p =>
LIdP (GhcPass p) -> HsExpr (GhcPass p)
mkHsVar (Name -> GenLocated SrcSpanAnnN Name
forall e a. HasAnnotation e => a -> GenLocated e a
noLocA Name
name)
tcInferId :: LocatedN (WithUserRdr Name) -> TcM (HsExpr GhcTc, TcSigmaType)
tcInferId :: GenLocated SrcSpanAnnN (WithUserRdr Name)
-> TcM (HsExpr (GhcPass 'Typechecked), Kind)
tcInferId lname :: GenLocated SrcSpanAnnN (WithUserRdr Name)
lname@(L SrcSpanAnnN
loc (WithUserRdr RdrName
rdr Name
id_name))
| Name
id_name Name -> Unique -> Bool
forall a. Uniquable a => a -> Unique -> Bool
`hasKey` Unique
assertIdKey
=
do { dflags <- IOEnv (Env TcGblEnv TcLclEnv) DynFlags
forall (m :: * -> *). HasDynFlags m => m DynFlags
getDynFlags
; if gopt Opt_IgnoreAsserts dflags
then tc_infer_id lname
else tc_infer_id (L loc $ WithUserRdr rdr assertErrorName) }
| Bool
otherwise
= GenLocated SrcSpanAnnN (WithUserRdr Name)
-> TcM (HsExpr (GhcPass 'Typechecked), Kind)
tc_infer_id GenLocated SrcSpanAnnN (WithUserRdr Name)
lname
tc_infer_id :: LocatedN (WithUserRdr Name) -> TcM (HsExpr GhcTc, TcSigmaType)
tc_infer_id :: GenLocated SrcSpanAnnN (WithUserRdr Name)
-> TcM (HsExpr (GhcPass 'Typechecked), Kind)
tc_infer_id (L SrcSpanAnnN
loc (WithUserRdr RdrName
rdr Name
id_name))
= do { thing <- Name -> TcM TcTyThing
tcLookup Name
id_name
; (expr,ty) <- case thing of
ATcId { tct_id :: TcTyThing -> TcTyVar
tct_id = TcTyVar
id }
-> do { TcTyVar -> TcM ()
check_local_id TcTyVar
id
; TcTyVar -> TcM (HsExpr (GhcPass 'Typechecked), Kind)
return_id TcTyVar
id }
AGlobal (AnId TcTyVar
id) -> TcTyVar -> TcM (HsExpr (GhcPass 'Typechecked), Kind)
return_id TcTyVar
id
AGlobal (AConLike ConLike
cl) -> ConLike -> TcM (HsExpr (GhcPass 'Typechecked), Kind)
tcInferConLike ConLike
cl
(TcTyThing -> Maybe TyCon
tcTyThingTyCon_maybe -> Just TyCon
tc) -> WhatLooking
-> WithUserRdr Name -> TcM (HsExpr (GhcPass 'Typechecked), Kind)
forall a. WhatLooking -> WithUserRdr Name -> TcM a
failIllegalTyCon WhatLooking
WL_Term (RdrName -> Name -> WithUserRdr Name
forall a. RdrName -> a -> WithUserRdr a
WithUserRdr RdrName
rdr (TyCon -> Name
tyConName TyCon
tc))
ATyVar Name
name TcTyVar
_ -> WithUserRdr Name -> TcM (HsExpr (GhcPass 'Typechecked), Kind)
forall a. WithUserRdr Name -> TcM a
failIllegalTyVar (RdrName -> Name -> WithUserRdr Name
forall a. RdrName -> a -> WithUserRdr a
WithUserRdr RdrName
rdr Name
name)
TcTyThing
_ -> TcRnMessage -> TcM (HsExpr (GhcPass 'Typechecked), Kind)
forall a. TcRnMessage -> TcM a
failWithTc (TcRnMessage -> TcM (HsExpr (GhcPass 'Typechecked), Kind))
-> TcRnMessage -> TcM (HsExpr (GhcPass 'Typechecked), Kind)
forall a b. (a -> b) -> a -> b
$ TcTyThing -> TcRnMessage
TcRnExpectedValueId TcTyThing
thing
; traceTc "tcInferId" (ppr id_name <+> dcolon <+> ppr ty)
; return (expr, ty) }
where
return_id :: TcTyVar -> TcM (HsExpr (GhcPass 'Typechecked), Kind)
return_id TcTyVar
id = (HsExpr (GhcPass 'Typechecked), Kind)
-> TcM (HsExpr (GhcPass 'Typechecked), Kind)
forall a. a -> IOEnv (Env TcGblEnv TcLclEnv) a
forall (m :: * -> *) a. Monad m => a -> m a
return (LIdP (GhcPass 'Typechecked) -> HsExpr (GhcPass 'Typechecked)
forall (p :: Pass).
IsPass p =>
LIdP (GhcPass p) -> HsExpr (GhcPass p)
mkHsVar (SrcSpanAnnN -> TcTyVar -> GenLocated SrcSpanAnnN TcTyVar
forall l e. l -> e -> GenLocated l e
L SrcSpanAnnN
loc TcTyVar
id), TcTyVar -> Kind
idType TcTyVar
id)
check_local_id :: Id -> TcM ()
check_local_id :: TcTyVar -> TcM ()
check_local_id TcTyVar
id
= do { UsageEnv -> TcM ()
tcEmitBindingUsage (UsageEnv -> TcM ()) -> UsageEnv -> TcM ()
forall a b. (a -> b) -> a -> b
$ TcTyVar -> UsageEnv
singleUsageUE TcTyVar
id }
check_naughty :: OccName -> TcId -> TcM ()
check_naughty :: OccName -> TcTyVar -> TcM ()
check_naughty OccName
lbl TcTyVar
id
| TcTyVar -> Bool
isNaughtyRecordSelector TcTyVar
id = TcRnMessage -> TcM ()
forall a. TcRnMessage -> TcM a
failWithTc (OccName -> TcRnMessage
TcRnRecSelectorEscapedTyVar OccName
lbl)
| Bool
otherwise = () -> TcM ()
forall a. a -> IOEnv (Env TcGblEnv TcLclEnv) a
forall (m :: * -> *) a. Monad m => a -> m a
return ()
tcInferConLike :: ConLike -> TcM (HsExpr GhcTc, TcSigmaType)
tcInferConLike :: ConLike -> TcM (HsExpr (GhcPass 'Typechecked), Kind)
tcInferConLike (RealDataCon DataCon
con) = DataCon -> TcM (HsExpr (GhcPass 'Typechecked), Kind)
tcInferDataCon DataCon
con
tcInferConLike (PatSynCon PatSyn
ps) = PatSyn -> TcM (HsExpr (GhcPass 'Typechecked), Kind)
tcInferPatSyn PatSyn
ps
tcInferDataCon :: DataCon -> TcM (HsExpr GhcTc, TcSigmaType)
tcInferDataCon :: DataCon -> TcM (HsExpr (GhcPass 'Typechecked), Kind)
tcInferDataCon DataCon
con =
(HsExpr (GhcPass 'Typechecked), Kind)
-> TcM (HsExpr (GhcPass 'Typechecked), Kind)
forall a. a -> IOEnv (Env TcGblEnv TcLclEnv) a
forall (m :: * -> *) a. Monad m => a -> m a
return (XXExpr (GhcPass 'Typechecked) -> HsExpr (GhcPass 'Typechecked)
forall p. XXExpr p -> HsExpr p
XExpr (ConLike -> XXExprGhcTc
ConLike -> XXExprGhcTc
ConLikeTc (ConLike -> XXExprGhcTc) -> ConLike -> XXExprGhcTc
forall a b. (a -> b) -> a -> b
$ DataCon -> ConLike
RealDataCon DataCon
con), TcTyVar -> Kind
idType (TcTyVar -> Kind) -> TcTyVar -> Kind
forall a b. (a -> b) -> a -> b
$ DataCon -> TcTyVar
dataConWrapId DataCon
con)
tcInferPatSyn :: PatSyn -> TcM (HsExpr GhcTc, TcSigmaType)
tcInferPatSyn :: PatSyn -> TcM (HsExpr (GhcPass 'Typechecked), Kind)
tcInferPatSyn PatSyn
ps
= case PatSyn -> Maybe (HsExpr (GhcPass 'Typechecked), Kind)
patSynBuilderOcc PatSyn
ps of
Just (HsExpr (GhcPass 'Typechecked)
expr,Kind
ty) -> (HsExpr (GhcPass 'Typechecked), Kind)
-> TcM (HsExpr (GhcPass 'Typechecked), Kind)
forall a. a -> IOEnv (Env TcGblEnv TcLclEnv) a
forall (m :: * -> *) a. Monad m => a -> m a
return (HsExpr (GhcPass 'Typechecked)
expr,Kind
ty)
Maybe (HsExpr (GhcPass 'Typechecked), Kind)
Nothing -> TcRnMessage -> TcM (HsExpr (GhcPass 'Typechecked), Kind)
forall a. TcRnMessage -> TcM a
failWithTc (Name -> TcRnMessage
nonBidirectionalErr (PatSyn -> Name
patSynName PatSyn
ps))
nonBidirectionalErr :: Name -> TcRnMessage
nonBidirectionalErr :: Name -> TcRnMessage
nonBidirectionalErr = Name -> TcRnMessage
Name -> TcRnMessage
TcRnPatSynNotBidirectional
addFunResCtxt :: HasDebugCallStack
=> HsExpr GhcTc -> [HsExprArg p]
-> TcType -> ExpRhoType
-> TcM a -> TcM a
addFunResCtxt :: forall (p :: TcPass) a.
HasDebugCallStack =>
HsExpr (GhcPass 'Typechecked)
-> [HsExprArg p] -> Kind -> ExpRhoType -> TcM a -> TcM a
addFunResCtxt HsExpr (GhcPass 'Typechecked)
fun [HsExprArg p]
args Kind
fun_res_ty ExpRhoType
env_ty TcM a
thing_inside
= HsCtxt -> TcM a -> TcM a
forall a. HsCtxt -> TcM a -> TcM a
addErrCtxt (HsExpr (GhcPass 'Typechecked)
-> Int -> Kind -> ExpRhoType -> HsCtxt
FunResCtxt HsExpr (GhcPass 'Typechecked)
fun ((HsExprArg p -> Bool) -> [HsExprArg p] -> Int
forall a. (a -> Bool) -> [a] -> Int
count HsExprArg p -> Bool
forall (id :: TcPass). HsExprArg id -> Bool
isValArg [HsExprArg p]
args) Kind
fun_res_ty ExpRhoType
env_ty) (TcM a -> TcM a) -> TcM a -> TcM a
forall a b. (a -> b) -> a -> b
$
TcM a
thing_inside