{-# LANGUAGE CPP #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE TypeFamilies #-}
module GHC.Tc.Instance.Typeable(mkTypeableBinds, tyConIsTypeable) where
#include "HsVersions.h"
import GHC.Prelude
import GHC.Platform
import GHC.Types.Basic ( Boxity(..), neverInlinePragma, SourceText(..) )
import GHC.Iface.Env( newGlobalBinder )
import GHC.Core.TyCo.Rep( Type(..), TyLit(..) )
import GHC.Tc.Utils.Env
import GHC.Tc.Types.Evidence ( mkWpTyApps )
import GHC.Tc.Utils.Monad
import GHC.Tc.Utils.TcType
import GHC.Driver.Types ( lookupId )
import GHC.Builtin.Names
import GHC.Builtin.Types.Prim ( primTyCons )
import GHC.Builtin.Types
( tupleTyCon, sumTyCon, runtimeRepTyCon
, vecCountTyCon, vecElemTyCon
, nilDataCon, consDataCon )
import GHC.Types.Name
import GHC.Types.Id
import GHC.Core.Type
import GHC.Core.TyCon
import GHC.Core.DataCon
import GHC.Unit.Module
import GHC.Hs
import GHC.Driver.Session
import GHC.Data.Bag
import GHC.Types.Var ( VarBndr(..) )
import GHC.Core.Map
import GHC.Settings.Constants
import GHC.Utils.Fingerprint(Fingerprint(..), fingerprintString, fingerprintFingerprints)
import GHC.Utils.Outputable
import GHC.Data.FastString ( FastString, mkFastString, fsLit )
import Control.Monad.Trans.State
import Control.Monad.Trans.Class (lift)
import Data.Maybe ( isJust )
import Data.Word( Word64 )
mkTypeableBinds :: TcM TcGblEnv
mkTypeableBinds :: TcM TcGblEnv
mkTypeableBinds
= do { DynFlags
dflags <- IOEnv (Env TcGblEnv TcLclEnv) DynFlags
forall (m :: * -> *). HasDynFlags m => m DynFlags
External instance of the constraint type forall env. ContainsDynFlags env => HasDynFlags (IOEnv env)
External instance of the constraint type forall gbl lcl. ContainsDynFlags (Env gbl lcl)
getDynFlags
; if GeneralFlag -> DynFlags -> Bool
gopt GeneralFlag
Opt_NoTypeableBinds DynFlags
dflags then TcM TcGblEnv
forall gbl lcl. TcRnIf gbl lcl gbl
getGblEnv else do
{
; TcGblEnv
tcg_env <- TcM TcGblEnv
mkModIdBindings
; (TcGblEnv
tcg_env, [TypeRepTodo]
prim_todos) <- TcGblEnv
-> TcRnIf TcGblEnv TcLclEnv (TcGblEnv, [TypeRepTodo])
-> TcRnIf TcGblEnv TcLclEnv (TcGblEnv, [TypeRepTodo])
forall gbl lcl a. gbl -> TcRnIf gbl lcl a -> TcRnIf gbl lcl a
setGblEnv TcGblEnv
tcg_env TcRnIf TcGblEnv TcLclEnv (TcGblEnv, [TypeRepTodo])
mkPrimTypeableTodos
; TcGblEnv -> TcM TcGblEnv -> TcM TcGblEnv
forall gbl lcl a. gbl -> TcRnIf gbl lcl a -> TcRnIf gbl lcl a
setGblEnv TcGblEnv
tcg_env (TcM TcGblEnv -> TcM TcGblEnv) -> TcM TcGblEnv -> TcM TcGblEnv
forall a b. (a -> b) -> a -> b
$
do { Module
mod <- IOEnv (Env TcGblEnv TcLclEnv) Module
forall (m :: * -> *). HasModule m => m Module
External instance of the constraint type forall env. ContainsModule env => HasModule (IOEnv env)
External instance of the constraint type forall gbl lcl. ContainsModule gbl => ContainsModule (Env gbl lcl)
External instance of the constraint type ContainsModule TcGblEnv
getModule
; let tycons :: [TyCon]
tycons = (TyCon -> Bool) -> [TyCon] -> [TyCon]
forall a. (a -> Bool) -> [a] -> [a]
filter TyCon -> Bool
needs_typeable_binds (TcGblEnv -> [TyCon]
tcg_tcs TcGblEnv
tcg_env)
mod_id :: Var
mod_id = case TcGblEnv -> Maybe Var
tcg_tr_module TcGblEnv
tcg_env of
Just Var
mod_id -> Var
mod_id
Maybe Var
Nothing -> String -> SDoc -> Var
forall a. HasCallStack => String -> SDoc -> a
pprPanic String
"tcMkTypeableBinds" ([TyCon] -> SDoc
forall a. Outputable a => a -> SDoc
External instance of the constraint type forall a. Outputable a => Outputable [a]
External instance of the constraint type Outputable TyCon
ppr [TyCon]
tycons)
; String -> SDoc -> TcRn ()
traceTc String
"mkTypeableBinds" ([TyCon] -> SDoc
forall a. Outputable a => a -> SDoc
External instance of the constraint type forall a. Outputable a => Outputable [a]
External instance of the constraint type Outputable TyCon
ppr [TyCon]
tycons)
; TypeRepTodo
this_mod_todos <- Module -> Var -> [TyCon] -> TcM TypeRepTodo
todoForTyCons Module
mod Var
mod_id [TyCon]
tycons
; [TypeRepTodo] -> TcM TcGblEnv
mkTypeRepTodoBinds (TypeRepTodo
this_mod_todos TypeRepTodo -> [TypeRepTodo] -> [TypeRepTodo]
forall a. a -> [a] -> [a]
: [TypeRepTodo]
prim_todos)
} } }
where
needs_typeable_binds :: TyCon -> Bool
needs_typeable_binds TyCon
tc
| TyCon
tc TyCon -> [TyCon] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
External instance of the constraint type Eq TyCon
External instance of the constraint type Foldable []
`elem` [TyCon
runtimeRepTyCon, TyCon
vecCountTyCon, TyCon
vecElemTyCon]
= Bool
False
| Bool
otherwise =
TyCon -> Bool
isAlgTyCon TyCon
tc
Bool -> Bool -> Bool
|| TyCon -> Bool
isDataFamilyTyCon TyCon
tc
Bool -> Bool -> Bool
|| TyCon -> Bool
isClassTyCon TyCon
tc
mkModIdBindings :: TcM TcGblEnv
mkModIdBindings :: TcM TcGblEnv
mkModIdBindings
= do { Module
mod <- IOEnv (Env TcGblEnv TcLclEnv) Module
forall (m :: * -> *). HasModule m => m Module
External instance of the constraint type forall env. ContainsModule env => HasModule (IOEnv env)
External instance of the constraint type forall gbl lcl. ContainsModule gbl => ContainsModule (Env gbl lcl)
External instance of the constraint type ContainsModule TcGblEnv
getModule
; SrcSpan
loc <- TcRn SrcSpan
getSrcSpanM
; Name
mod_nm <- Module -> OccName -> SrcSpan -> TcRnIf TcGblEnv TcLclEnv Name
forall a b. Module -> OccName -> SrcSpan -> TcRnIf a b Name
newGlobalBinder Module
mod (String -> OccName
mkVarOcc String
"$trModule") SrcSpan
loc
; TyCon
trModuleTyCon <- Name -> TcM TyCon
tcLookupTyCon Name
trModuleTyConName
; let mod_id :: Var
mod_id = Name -> Kind -> Var
mkExportedVanillaId Name
mod_nm (TyCon -> [Kind] -> Kind
mkTyConApp TyCon
trModuleTyCon [])
; LHsBind (GhcPass 'Typechecked)
mod_bind <- IdP (GhcPass 'Typechecked)
-> LHsExpr (GhcPass 'Typechecked) -> LHsBind (GhcPass 'Typechecked)
forall (p :: Pass).
IdP (GhcPass p) -> LHsExpr (GhcPass p) -> LHsBind (GhcPass p)
mkVarBind Var
IdP (GhcPass 'Typechecked)
mod_id (LHsExpr (GhcPass 'Typechecked) -> LHsBind (GhcPass 'Typechecked))
-> IOEnv (Env TcGblEnv TcLclEnv) (LHsExpr (GhcPass 'Typechecked))
-> IOEnv (Env TcGblEnv TcLclEnv) (LHsBind (GhcPass 'Typechecked))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
External instance of the constraint type forall env. Functor (IOEnv env)
<$> Module
-> IOEnv (Env TcGblEnv TcLclEnv) (LHsExpr (GhcPass 'Typechecked))
mkModIdRHS Module
mod
; TcGblEnv
tcg_env <- [Var] -> TcM TcGblEnv -> TcM TcGblEnv
forall a. [Var] -> TcM a -> TcM a
tcExtendGlobalValEnv [Var
mod_id] TcM TcGblEnv
forall gbl lcl. TcRnIf gbl lcl gbl
getGblEnv
; TcGblEnv -> TcM TcGblEnv
forall (m :: * -> *) a. Monad m => a -> m a
External instance of the constraint type forall m. Monad (IOEnv m)
return (TcGblEnv
tcg_env { tcg_tr_module :: Maybe Var
tcg_tr_module = Var -> Maybe Var
forall a. a -> Maybe a
Just Var
mod_id }
TcGblEnv -> [LHsBinds (GhcPass 'Typechecked)] -> TcGblEnv
`addTypecheckedBinds` [LHsBind (GhcPass 'Typechecked) -> LHsBinds (GhcPass 'Typechecked)
forall a. a -> Bag a
unitBag LHsBind (GhcPass 'Typechecked)
mod_bind]) }
mkModIdRHS :: Module -> TcM (LHsExpr GhcTc)
mkModIdRHS :: Module
-> IOEnv (Env TcGblEnv TcLclEnv) (LHsExpr (GhcPass 'Typechecked))
mkModIdRHS Module
mod
= do { DataCon
trModuleDataCon <- Name -> TcM DataCon
tcLookupDataCon Name
trModuleDataConName
; FastString -> LHsExpr (GhcPass 'Typechecked)
trNameLit <- TcM (FastString -> LHsExpr (GhcPass 'Typechecked))
mkTrNameLit
; LHsExpr (GhcPass 'Typechecked)
-> IOEnv (Env TcGblEnv TcLclEnv) (LHsExpr (GhcPass 'Typechecked))
forall (m :: * -> *) a. Monad m => a -> m a
External instance of the constraint type forall m. Monad (IOEnv m)
return (LHsExpr (GhcPass 'Typechecked)
-> IOEnv (Env TcGblEnv TcLclEnv) (LHsExpr (GhcPass 'Typechecked)))
-> LHsExpr (GhcPass 'Typechecked)
-> IOEnv (Env TcGblEnv TcLclEnv) (LHsExpr (GhcPass 'Typechecked))
forall a b. (a -> b) -> a -> b
$ DataCon -> LHsExpr (GhcPass 'Typechecked)
nlHsDataCon DataCon
trModuleDataCon
LHsExpr (GhcPass 'Typechecked)
-> LHsExpr (GhcPass 'Typechecked) -> LHsExpr (GhcPass 'Typechecked)
forall (id :: Pass).
IsPass id =>
LHsExpr (GhcPass id)
-> LHsExpr (GhcPass id) -> LHsExpr (GhcPass id)
External instance of the constraint type IsPass 'Typechecked
`nlHsApp` FastString -> LHsExpr (GhcPass 'Typechecked)
trNameLit (GenUnit UnitId -> FastString
unitFS (Module -> GenUnit UnitId
forall unit. GenModule unit -> unit
moduleUnit Module
mod))
LHsExpr (GhcPass 'Typechecked)
-> LHsExpr (GhcPass 'Typechecked) -> LHsExpr (GhcPass 'Typechecked)
forall (id :: Pass).
IsPass id =>
LHsExpr (GhcPass id)
-> LHsExpr (GhcPass id) -> LHsExpr (GhcPass id)
External instance of the constraint type IsPass 'Typechecked
`nlHsApp` FastString -> LHsExpr (GhcPass 'Typechecked)
trNameLit (ModuleName -> FastString
moduleNameFS (Module -> ModuleName
forall unit. GenModule unit -> ModuleName
moduleName Module
mod))
}
data TypeableTyCon
= TypeableTyCon
{ TypeableTyCon -> TyCon
tycon :: !TyCon
, TypeableTyCon -> Var
tycon_rep_id :: !Id
}
data TypeRepTodo
= TypeRepTodo
{ TypeRepTodo -> LHsExpr (GhcPass 'Typechecked)
mod_rep_expr :: LHsExpr GhcTc
, TypeRepTodo -> Fingerprint
pkg_fingerprint :: !Fingerprint
, TypeRepTodo -> Fingerprint
mod_fingerprint :: !Fingerprint
, TypeRepTodo -> [TypeableTyCon]
todo_tycons :: [TypeableTyCon]
}
| ExportedKindRepsTodo [(Kind, Id)]
todoForTyCons :: Module -> Id -> [TyCon] -> TcM TypeRepTodo
todoForTyCons :: Module -> Var -> [TyCon] -> TcM TypeRepTodo
todoForTyCons Module
mod Var
mod_id [TyCon]
tycons = do
Kind
trTyConTy <- TyCon -> Kind
mkTyConTy (TyCon -> Kind) -> TcM TyCon -> IOEnv (Env TcGblEnv TcLclEnv) Kind
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
External instance of the constraint type forall env. Functor (IOEnv env)
<$> Name -> TcM TyCon
tcLookupTyCon Name
trTyConTyConName
let mk_rep_id :: TyConRepName -> Id
mk_rep_id :: Name -> Var
mk_rep_id Name
rep_name = Name -> Kind -> Var
mkExportedVanillaId Name
rep_name Kind
trTyConTy
let typeable_tycons :: [TypeableTyCon]
typeable_tycons :: [TypeableTyCon]
typeable_tycons =
[ TypeableTyCon :: TyCon -> Var -> TypeableTyCon
TypeableTyCon { tycon :: TyCon
tycon = TyCon
tc''
, tycon_rep_id :: Var
tycon_rep_id = Name -> Var
mk_rep_id Name
rep_name
}
| TyCon
tc <- [TyCon]
tycons
, TyCon
tc' <- TyCon
tc TyCon -> [TyCon] -> [TyCon]
forall a. a -> [a] -> [a]
: TyCon -> [TyCon]
tyConATs TyCon
tc
, let promoted :: [TyCon]
promoted = (DataCon -> TyCon) -> [DataCon] -> [TyCon]
forall a b. (a -> b) -> [a] -> [b]
map DataCon -> TyCon
promoteDataCon (TyCon -> [DataCon]
tyConDataCons TyCon
tc')
, TyCon
tc'' <- TyCon
tc' TyCon -> [TyCon] -> [TyCon]
forall a. a -> [a] -> [a]
: [TyCon]
promoted
, Bool -> Bool
not (Bool -> Bool) -> Bool -> Bool
forall a b. (a -> b) -> a -> b
$ TyCon -> Bool
isFamInstTyCon TyCon
tc''
, Just Name
rep_name <- Maybe Name -> [Maybe Name]
forall (f :: * -> *) a. Applicative f => a -> f a
External instance of the constraint type Applicative []
pure (Maybe Name -> [Maybe Name]) -> Maybe Name -> [Maybe Name]
forall a b. (a -> b) -> a -> b
$ TyCon -> Maybe Name
tyConRepName_maybe TyCon
tc''
, TyCon -> Bool
tyConIsTypeable TyCon
tc''
]
TypeRepTodo -> TcM TypeRepTodo
forall (m :: * -> *) a. Monad m => a -> m a
External instance of the constraint type forall m. Monad (IOEnv m)
return TypeRepTodo :: LHsExpr (GhcPass 'Typechecked)
-> Fingerprint -> Fingerprint -> [TypeableTyCon] -> TypeRepTodo
TypeRepTodo { mod_rep_expr :: LHsExpr (GhcPass 'Typechecked)
mod_rep_expr = IdP (GhcPass 'Typechecked) -> LHsExpr (GhcPass 'Typechecked)
forall (id :: Pass). IdP (GhcPass id) -> LHsExpr (GhcPass id)
nlHsVar Var
IdP (GhcPass 'Typechecked)
mod_id
, pkg_fingerprint :: Fingerprint
pkg_fingerprint = Fingerprint
pkg_fpr
, mod_fingerprint :: Fingerprint
mod_fingerprint = Fingerprint
mod_fpr
, todo_tycons :: [TypeableTyCon]
todo_tycons = [TypeableTyCon]
typeable_tycons
}
where
mod_fpr :: Fingerprint
mod_fpr = String -> Fingerprint
fingerprintString (String -> Fingerprint) -> String -> Fingerprint
forall a b. (a -> b) -> a -> b
$ ModuleName -> String
moduleNameString (ModuleName -> String) -> ModuleName -> String
forall a b. (a -> b) -> a -> b
$ Module -> ModuleName
forall unit. GenModule unit -> ModuleName
moduleName Module
mod
pkg_fpr :: Fingerprint
pkg_fpr = String -> Fingerprint
fingerprintString (String -> Fingerprint) -> String -> Fingerprint
forall a b. (a -> b) -> a -> b
$ GenUnit UnitId -> String
unitString (GenUnit UnitId -> String) -> GenUnit UnitId -> String
forall a b. (a -> b) -> a -> b
$ Module -> GenUnit UnitId
forall unit. GenModule unit -> unit
moduleUnit Module
mod
todoForExportedKindReps :: [(Kind, Name)] -> TcM TypeRepTodo
todoForExportedKindReps :: [(Kind, Name)] -> TcM TypeRepTodo
todoForExportedKindReps [(Kind, Name)]
kinds = do
Kind
trKindRepTy <- TyCon -> Kind
mkTyConTy (TyCon -> Kind) -> TcM TyCon -> IOEnv (Env TcGblEnv TcLclEnv) Kind
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
External instance of the constraint type forall env. Functor (IOEnv env)
<$> Name -> TcM TyCon
tcLookupTyCon Name
kindRepTyConName
let mkId :: (Kind, Name) -> (Kind, Var)
mkId (Kind
k, Name
name) = (Kind
k, Name -> Kind -> Var
mkExportedVanillaId Name
name Kind
trKindRepTy)
TypeRepTodo -> TcM TypeRepTodo
forall (m :: * -> *) a. Monad m => a -> m a
External instance of the constraint type forall m. Monad (IOEnv m)
return (TypeRepTodo -> TcM TypeRepTodo) -> TypeRepTodo -> TcM TypeRepTodo
forall a b. (a -> b) -> a -> b
$ [(Kind, Var)] -> TypeRepTodo
ExportedKindRepsTodo ([(Kind, Var)] -> TypeRepTodo) -> [(Kind, Var)] -> TypeRepTodo
forall a b. (a -> b) -> a -> b
$ ((Kind, Name) -> (Kind, Var)) -> [(Kind, Name)] -> [(Kind, Var)]
forall a b. (a -> b) -> [a] -> [b]
map (Kind, Name) -> (Kind, Var)
mkId [(Kind, Name)]
kinds
mkTypeRepTodoBinds :: [TypeRepTodo] -> TcM TcGblEnv
mkTypeRepTodoBinds :: [TypeRepTodo] -> TcM TcGblEnv
mkTypeRepTodoBinds [] = TcM TcGblEnv
forall gbl lcl. TcRnIf gbl lcl gbl
getGblEnv
mkTypeRepTodoBinds [TypeRepTodo]
todos
= do { TypeableStuff
stuff <- TcM TypeableStuff
collect_stuff
; let produced_bndrs :: [Id]
produced_bndrs :: [Var]
produced_bndrs = [ Var
tycon_rep_id
| todo :: TypeRepTodo
todo@(TypeRepTodo{}) <- [TypeRepTodo]
todos
, TypeableTyCon {TyCon
Var
tycon :: TyCon
tycon_rep_id :: Var
tycon_rep_id :: TypeableTyCon -> Var
tycon :: TypeableTyCon -> TyCon
..} <- TypeRepTodo -> [TypeableTyCon]
todo_tycons TypeRepTodo
todo
] [Var] -> [Var] -> [Var]
forall a. [a] -> [a] -> [a]
++
[ Var
rep_id
| ExportedKindRepsTodo [(Kind, Var)]
kinds <- [TypeRepTodo]
todos
, (Kind
_, Var
rep_id) <- [(Kind, Var)]
kinds
]
; TcGblEnv
gbl_env <- [Var] -> TcM TcGblEnv -> TcM TcGblEnv
forall a. [Var] -> TcM a -> TcM a
tcExtendGlobalValEnv [Var]
produced_bndrs TcM TcGblEnv
forall gbl lcl. TcRnIf gbl lcl gbl
getGblEnv
; let mk_binds :: TypeRepTodo -> KindRepM [LHsBinds GhcTc]
mk_binds :: TypeRepTodo -> KindRepM [LHsBinds (GhcPass 'Typechecked)]
mk_binds todo :: TypeRepTodo
todo@(TypeRepTodo {}) =
(TypeableTyCon -> KindRepM (LHsBinds (GhcPass 'Typechecked)))
-> [TypeableTyCon] -> KindRepM [LHsBinds (GhcPass 'Typechecked)]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
Instance of class: Monad of the constraint type Monad KindRepM
External instance of the constraint type Traversable []
mapM (TypeableStuff
-> TypeRepTodo
-> TypeableTyCon
-> KindRepM (LHsBinds (GhcPass 'Typechecked))
mkTyConRepBinds TypeableStuff
stuff TypeRepTodo
todo) (TypeRepTodo -> [TypeableTyCon]
todo_tycons TypeRepTodo
todo)
mk_binds (ExportedKindRepsTodo [(Kind, Var)]
kinds) =
TypeableStuff -> [(Kind, Var)] -> KindRepM ()
mkExportedKindReps TypeableStuff
stuff [(Kind, Var)]
kinds KindRepM ()
-> KindRepM [LHsBinds (GhcPass 'Typechecked)]
-> KindRepM [LHsBinds (GhcPass 'Typechecked)]
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
Instance of class: Monad of the constraint type Monad KindRepM
>> [LHsBinds (GhcPass 'Typechecked)]
-> KindRepM [LHsBinds (GhcPass 'Typechecked)]
forall (m :: * -> *) a. Monad m => a -> m a
Instance of class: Monad of the constraint type Monad KindRepM
return []
; (TcGblEnv
gbl_env, [[LHsBinds (GhcPass 'Typechecked)]]
binds) <- TcGblEnv
-> TcRnIf
TcGblEnv TcLclEnv (TcGblEnv, [[LHsBinds (GhcPass 'Typechecked)]])
-> TcRnIf
TcGblEnv TcLclEnv (TcGblEnv, [[LHsBinds (GhcPass 'Typechecked)]])
forall gbl lcl a. gbl -> TcRnIf gbl lcl a -> TcRnIf gbl lcl a
setGblEnv TcGblEnv
gbl_env
(TcRnIf
TcGblEnv TcLclEnv (TcGblEnv, [[LHsBinds (GhcPass 'Typechecked)]])
-> TcRnIf
TcGblEnv TcLclEnv (TcGblEnv, [[LHsBinds (GhcPass 'Typechecked)]]))
-> TcRnIf
TcGblEnv TcLclEnv (TcGblEnv, [[LHsBinds (GhcPass 'Typechecked)]])
-> TcRnIf
TcGblEnv TcLclEnv (TcGblEnv, [[LHsBinds (GhcPass 'Typechecked)]])
forall a b. (a -> b) -> a -> b
$ KindRepM [[LHsBinds (GhcPass 'Typechecked)]]
-> TcRnIf
TcGblEnv TcLclEnv (TcGblEnv, [[LHsBinds (GhcPass 'Typechecked)]])
forall a. KindRepM a -> TcRn (TcGblEnv, a)
runKindRepM ((TypeRepTodo -> KindRepM [LHsBinds (GhcPass 'Typechecked)])
-> [TypeRepTodo] -> KindRepM [[LHsBinds (GhcPass 'Typechecked)]]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
Instance of class: Monad of the constraint type Monad KindRepM
External instance of the constraint type Traversable []
mapM TypeRepTodo -> KindRepM [LHsBinds (GhcPass 'Typechecked)]
mk_binds [TypeRepTodo]
todos)
; TcGblEnv -> TcM TcGblEnv
forall (m :: * -> *) a. Monad m => a -> m a
External instance of the constraint type forall m. Monad (IOEnv m)
return (TcGblEnv -> TcM TcGblEnv) -> TcGblEnv -> TcM TcGblEnv
forall a b. (a -> b) -> a -> b
$ TcGblEnv
gbl_env TcGblEnv -> [LHsBinds (GhcPass 'Typechecked)] -> TcGblEnv
`addTypecheckedBinds` [[LHsBinds (GhcPass 'Typechecked)]]
-> [LHsBinds (GhcPass 'Typechecked)]
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
External instance of the constraint type Foldable []
concat [[LHsBinds (GhcPass 'Typechecked)]]
binds }
mkPrimTypeableTodos :: TcM (TcGblEnv, [TypeRepTodo])
mkPrimTypeableTodos :: TcRnIf TcGblEnv TcLclEnv (TcGblEnv, [TypeRepTodo])
mkPrimTypeableTodos
= do { Module
mod <- IOEnv (Env TcGblEnv TcLclEnv) Module
forall (m :: * -> *). HasModule m => m Module
External instance of the constraint type forall env. ContainsModule env => HasModule (IOEnv env)
External instance of the constraint type forall gbl lcl. ContainsModule gbl => ContainsModule (Env gbl lcl)
External instance of the constraint type ContainsModule TcGblEnv
getModule
; if Module
mod Module -> Module -> Bool
forall a. Eq a => a -> a -> Bool
External instance of the constraint type forall unit. Eq unit => Eq (GenModule unit)
External instance of the constraint type Eq (GenUnit UnitId)
== Module
gHC_TYPES
then do {
TyCon
trModuleTyCon <- Name -> TcM TyCon
tcLookupTyCon Name
trModuleTyConName
; let ghc_prim_module_id :: Var
ghc_prim_module_id =
Name -> Kind -> Var
mkExportedVanillaId Name
trGhcPrimModuleName
(TyCon -> Kind
mkTyConTy TyCon
trModuleTyCon)
; LHsBind (GhcPass 'Typechecked)
ghc_prim_module_bind <- IdP (GhcPass 'Typechecked)
-> LHsExpr (GhcPass 'Typechecked) -> LHsBind (GhcPass 'Typechecked)
forall (p :: Pass).
IdP (GhcPass p) -> LHsExpr (GhcPass p) -> LHsBind (GhcPass p)
mkVarBind Var
IdP (GhcPass 'Typechecked)
ghc_prim_module_id
(LHsExpr (GhcPass 'Typechecked) -> LHsBind (GhcPass 'Typechecked))
-> IOEnv (Env TcGblEnv TcLclEnv) (LHsExpr (GhcPass 'Typechecked))
-> IOEnv (Env TcGblEnv TcLclEnv) (LHsBind (GhcPass 'Typechecked))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
External instance of the constraint type forall env. Functor (IOEnv env)
<$> Module
-> IOEnv (Env TcGblEnv TcLclEnv) (LHsExpr (GhcPass 'Typechecked))
mkModIdRHS Module
gHC_PRIM
; TcGblEnv
gbl_env <- [Var] -> TcM TcGblEnv -> TcM TcGblEnv
forall a. [Var] -> TcM a -> TcM a
tcExtendGlobalValEnv [Var
ghc_prim_module_id]
TcM TcGblEnv
forall gbl lcl. TcRnIf gbl lcl gbl
getGblEnv
; let gbl_env' :: TcGblEnv
gbl_env' = TcGblEnv
gbl_env TcGblEnv -> [LHsBinds (GhcPass 'Typechecked)] -> TcGblEnv
`addTypecheckedBinds`
[LHsBind (GhcPass 'Typechecked) -> LHsBinds (GhcPass 'Typechecked)
forall a. a -> Bag a
unitBag LHsBind (GhcPass 'Typechecked)
ghc_prim_module_bind]
; TypeRepTodo
todo1 <- [(Kind, Name)] -> TcM TypeRepTodo
todoForExportedKindReps [(Kind, Name)]
builtInKindReps
; TypeRepTodo
todo2 <- Module -> Var -> [TyCon] -> TcM TypeRepTodo
todoForTyCons Module
gHC_PRIM Var
ghc_prim_module_id
[TyCon]
ghcPrimTypeableTyCons
; (TcGblEnv, [TypeRepTodo])
-> TcRnIf TcGblEnv TcLclEnv (TcGblEnv, [TypeRepTodo])
forall (m :: * -> *) a. Monad m => a -> m a
External instance of the constraint type forall m. Monad (IOEnv m)
return ( TcGblEnv
gbl_env' , [TypeRepTodo
todo1, TypeRepTodo
todo2])
}
else do TcGblEnv
gbl_env <- TcM TcGblEnv
forall gbl lcl. TcRnIf gbl lcl gbl
getGblEnv
(TcGblEnv, [TypeRepTodo])
-> TcRnIf TcGblEnv TcLclEnv (TcGblEnv, [TypeRepTodo])
forall (m :: * -> *) a. Monad m => a -> m a
External instance of the constraint type forall m. Monad (IOEnv m)
return (TcGblEnv
gbl_env, [])
}
ghcPrimTypeableTyCons :: [TyCon]
ghcPrimTypeableTyCons :: [TyCon]
ghcPrimTypeableTyCons = [[TyCon]] -> [TyCon]
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
External instance of the constraint type Foldable []
concat
[ [ TyCon
runtimeRepTyCon, TyCon
vecCountTyCon, TyCon
vecElemTyCon, TyCon
funTyCon ]
, (Int -> TyCon) -> [Int] -> [TyCon]
forall a b. (a -> b) -> [a] -> [b]
map (Boxity -> Int -> TyCon
tupleTyCon Boxity
Unboxed) [Int
0..Int
mAX_TUPLE_SIZE]
, (Int -> TyCon) -> [Int] -> [TyCon]
forall a b. (a -> b) -> [a] -> [b]
map Int -> TyCon
sumTyCon [Int
2..Int
mAX_SUM_SIZE]
, [TyCon]
primTyCons
]
data TypeableStuff
= Stuff { TypeableStuff -> Platform
platform :: Platform
, TypeableStuff -> DataCon
trTyConDataCon :: DataCon
, TypeableStuff -> FastString -> LHsExpr (GhcPass 'Typechecked)
trNameLit :: FastString -> LHsExpr GhcTc
, TypeableStuff -> TyCon
kindRepTyCon :: TyCon
, TypeableStuff -> DataCon
kindRepTyConAppDataCon :: DataCon
, TypeableStuff -> DataCon
kindRepVarDataCon :: DataCon
, TypeableStuff -> DataCon
kindRepAppDataCon :: DataCon
, TypeableStuff -> DataCon
kindRepFunDataCon :: DataCon
, TypeableStuff -> DataCon
kindRepTYPEDataCon :: DataCon
, TypeableStuff -> DataCon
kindRepTypeLitSDataCon :: DataCon
, TypeableStuff -> DataCon
typeLitSymbolDataCon :: DataCon
, TypeableStuff -> DataCon
typeLitNatDataCon :: DataCon
}
collect_stuff :: TcM TypeableStuff
collect_stuff :: TcM TypeableStuff
collect_stuff = do
Platform
platform <- DynFlags -> Platform
targetPlatform (DynFlags -> Platform)
-> IOEnv (Env TcGblEnv TcLclEnv) DynFlags
-> IOEnv (Env TcGblEnv TcLclEnv) Platform
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
External instance of the constraint type forall env. Functor (IOEnv env)
<$> IOEnv (Env TcGblEnv TcLclEnv) DynFlags
forall (m :: * -> *). HasDynFlags m => m DynFlags
External instance of the constraint type forall env. ContainsDynFlags env => HasDynFlags (IOEnv env)
External instance of the constraint type forall gbl lcl. ContainsDynFlags (Env gbl lcl)
getDynFlags
DataCon
trTyConDataCon <- Name -> TcM DataCon
tcLookupDataCon Name
trTyConDataConName
TyCon
kindRepTyCon <- Name -> TcM TyCon
tcLookupTyCon Name
kindRepTyConName
DataCon
kindRepTyConAppDataCon <- Name -> TcM DataCon
tcLookupDataCon Name
kindRepTyConAppDataConName
DataCon
kindRepVarDataCon <- Name -> TcM DataCon
tcLookupDataCon Name
kindRepVarDataConName
DataCon
kindRepAppDataCon <- Name -> TcM DataCon
tcLookupDataCon Name
kindRepAppDataConName
DataCon
kindRepFunDataCon <- Name -> TcM DataCon
tcLookupDataCon Name
kindRepFunDataConName
DataCon
kindRepTYPEDataCon <- Name -> TcM DataCon
tcLookupDataCon Name
kindRepTYPEDataConName
DataCon
kindRepTypeLitSDataCon <- Name -> TcM DataCon
tcLookupDataCon Name
kindRepTypeLitSDataConName
DataCon
typeLitSymbolDataCon <- Name -> TcM DataCon
tcLookupDataCon Name
typeLitSymbolDataConName
DataCon
typeLitNatDataCon <- Name -> TcM DataCon
tcLookupDataCon Name
typeLitNatDataConName
FastString -> LHsExpr (GhcPass 'Typechecked)
trNameLit <- TcM (FastString -> LHsExpr (GhcPass 'Typechecked))
mkTrNameLit
TypeableStuff -> TcM TypeableStuff
forall (m :: * -> *) a. Monad m => a -> m a
External instance of the constraint type forall m. Monad (IOEnv m)
return Stuff :: Platform
-> DataCon
-> (FastString -> LHsExpr (GhcPass 'Typechecked))
-> TyCon
-> DataCon
-> DataCon
-> DataCon
-> DataCon
-> DataCon
-> DataCon
-> DataCon
-> DataCon
-> TypeableStuff
Stuff {Platform
TyCon
DataCon
FastString -> LHsExpr (GhcPass 'Typechecked)
trNameLit :: FastString -> LHsExpr (GhcPass 'Typechecked)
typeLitNatDataCon :: DataCon
typeLitSymbolDataCon :: DataCon
kindRepTypeLitSDataCon :: DataCon
kindRepTYPEDataCon :: DataCon
kindRepFunDataCon :: DataCon
kindRepAppDataCon :: DataCon
kindRepVarDataCon :: DataCon
kindRepTyConAppDataCon :: DataCon
kindRepTyCon :: TyCon
trTyConDataCon :: DataCon
platform :: Platform
typeLitNatDataCon :: DataCon
typeLitSymbolDataCon :: DataCon
kindRepTypeLitSDataCon :: DataCon
kindRepTYPEDataCon :: DataCon
kindRepFunDataCon :: DataCon
kindRepAppDataCon :: DataCon
kindRepVarDataCon :: DataCon
kindRepTyConAppDataCon :: DataCon
kindRepTyCon :: TyCon
trNameLit :: FastString -> LHsExpr (GhcPass 'Typechecked)
trTyConDataCon :: DataCon
platform :: Platform
..}
mkTrNameLit :: TcM (FastString -> LHsExpr GhcTc)
mkTrNameLit :: TcM (FastString -> LHsExpr (GhcPass 'Typechecked))
mkTrNameLit = do
DataCon
trNameSDataCon <- Name -> TcM DataCon
tcLookupDataCon Name
trNameSDataConName
let trNameLit :: FastString -> LHsExpr GhcTc
trNameLit :: FastString -> LHsExpr (GhcPass 'Typechecked)
trNameLit FastString
fs = LHsExpr (GhcPass 'Typechecked) -> LHsExpr (GhcPass 'Typechecked)
forall (id :: Pass). LHsExpr (GhcPass id) -> LHsExpr (GhcPass id)
nlHsPar (LHsExpr (GhcPass 'Typechecked) -> LHsExpr (GhcPass 'Typechecked))
-> LHsExpr (GhcPass 'Typechecked) -> LHsExpr (GhcPass 'Typechecked)
forall a b. (a -> b) -> a -> b
$ DataCon -> LHsExpr (GhcPass 'Typechecked)
nlHsDataCon DataCon
trNameSDataCon
LHsExpr (GhcPass 'Typechecked)
-> LHsExpr (GhcPass 'Typechecked) -> LHsExpr (GhcPass 'Typechecked)
forall (id :: Pass).
IsPass id =>
LHsExpr (GhcPass id)
-> LHsExpr (GhcPass id) -> LHsExpr (GhcPass id)
External instance of the constraint type IsPass 'Typechecked
`nlHsApp` HsLit (GhcPass 'Typechecked) -> LHsExpr (GhcPass 'Typechecked)
forall (p :: Pass). HsLit (GhcPass p) -> LHsExpr (GhcPass p)
nlHsLit (FastString -> HsLit (GhcPass 'Typechecked)
forall (p :: Pass). FastString -> HsLit (GhcPass p)
mkHsStringPrimLit FastString
fs)
(FastString -> LHsExpr (GhcPass 'Typechecked))
-> TcM (FastString -> LHsExpr (GhcPass 'Typechecked))
forall (m :: * -> *) a. Monad m => a -> m a
External instance of the constraint type forall m. Monad (IOEnv m)
return FastString -> LHsExpr (GhcPass 'Typechecked)
trNameLit
mkTyConRepBinds :: TypeableStuff -> TypeRepTodo
-> TypeableTyCon -> KindRepM (LHsBinds GhcTc)
mkTyConRepBinds :: TypeableStuff
-> TypeRepTodo
-> TypeableTyCon
-> KindRepM (LHsBinds (GhcPass 'Typechecked))
mkTyConRepBinds TypeableStuff
stuff TypeRepTodo
todo (TypeableTyCon {TyCon
Var
tycon_rep_id :: Var
tycon :: TyCon
tycon_rep_id :: TypeableTyCon -> Var
tycon :: TypeableTyCon -> TyCon
..})
= do
let ([TyCoVarBinder]
bndrs, Kind
kind) = Kind -> ([TyCoVarBinder], Kind)
splitForAllVarBndrs (TyCon -> Kind
tyConKind TyCon
tycon)
TcRn () -> KindRepM ()
forall a. TcRn a -> KindRepM a
liftTc (TcRn () -> KindRepM ()) -> TcRn () -> KindRepM ()
forall a b. (a -> b) -> a -> b
$ String -> SDoc -> TcRn ()
traceTc String
"mkTyConKindRepBinds"
(TyCon -> SDoc
forall a. Outputable a => a -> SDoc
External instance of the constraint type Outputable TyCon
ppr TyCon
tycon SDoc -> SDoc -> SDoc
$$ Kind -> SDoc
forall a. Outputable a => a -> SDoc
External instance of the constraint type Outputable Kind
ppr (TyCon -> Kind
tyConKind TyCon
tycon) SDoc -> SDoc -> SDoc
$$ Kind -> SDoc
forall a. Outputable a => a -> SDoc
External instance of the constraint type Outputable Kind
ppr Kind
kind)
let ctx :: CmEnv
ctx = [Var] -> CmEnv
mkDeBruijnContext ((TyCoVarBinder -> Var) -> [TyCoVarBinder] -> [Var]
forall a b. (a -> b) -> [a] -> [b]
map TyCoVarBinder -> Var
forall tv argf. VarBndr tv argf -> tv
binderVar [TyCoVarBinder]
bndrs)
LHsExpr (GhcPass 'Typechecked)
kind_rep <- TypeableStuff
-> CmEnv -> Kind -> KindRepM (LHsExpr (GhcPass 'Typechecked))
getKindRep TypeableStuff
stuff CmEnv
ctx Kind
kind
let tycon_rep_rhs :: LHsExpr (GhcPass 'Typechecked)
tycon_rep_rhs = TypeableStuff
-> TypeRepTodo
-> TyCon
-> LHsExpr (GhcPass 'Typechecked)
-> LHsExpr (GhcPass 'Typechecked)
mkTyConRepTyConRHS TypeableStuff
stuff TypeRepTodo
todo TyCon
tycon LHsExpr (GhcPass 'Typechecked)
kind_rep
tycon_rep_bind :: LHsBind (GhcPass 'Typechecked)
tycon_rep_bind = IdP (GhcPass 'Typechecked)
-> LHsExpr (GhcPass 'Typechecked) -> LHsBind (GhcPass 'Typechecked)
forall (p :: Pass).
IdP (GhcPass p) -> LHsExpr (GhcPass p) -> LHsBind (GhcPass p)
mkVarBind Var
IdP (GhcPass 'Typechecked)
tycon_rep_id LHsExpr (GhcPass 'Typechecked)
tycon_rep_rhs
LHsBinds (GhcPass 'Typechecked)
-> KindRepM (LHsBinds (GhcPass 'Typechecked))
forall (m :: * -> *) a. Monad m => a -> m a
Instance of class: Monad of the constraint type Monad KindRepM
return (LHsBinds (GhcPass 'Typechecked)
-> KindRepM (LHsBinds (GhcPass 'Typechecked)))
-> LHsBinds (GhcPass 'Typechecked)
-> KindRepM (LHsBinds (GhcPass 'Typechecked))
forall a b. (a -> b) -> a -> b
$ LHsBind (GhcPass 'Typechecked) -> LHsBinds (GhcPass 'Typechecked)
forall a. a -> Bag a
unitBag LHsBind (GhcPass 'Typechecked)
tycon_rep_bind
tyConIsTypeable :: TyCon -> Bool
tyConIsTypeable :: TyCon -> Bool
tyConIsTypeable TyCon
tc =
Maybe Name -> Bool
forall a. Maybe a -> Bool
isJust (TyCon -> Maybe Name
tyConRepName_maybe TyCon
tc)
Bool -> Bool -> Bool
&& Kind -> Bool
kindIsTypeable (Kind -> Kind
dropForAlls (Kind -> Kind) -> Kind -> Kind
forall a b. (a -> b) -> a -> b
$ TyCon -> Kind
tyConKind TyCon
tc)
kindIsTypeable :: Kind -> Bool
kindIsTypeable :: Kind -> Bool
kindIsTypeable Kind
ty
| Just Kind
ty' <- Kind -> Maybe Kind
coreView Kind
ty = Kind -> Bool
kindIsTypeable Kind
ty'
kindIsTypeable Kind
ty
| Kind -> Bool
isLiftedTypeKind Kind
ty = Bool
True
kindIsTypeable (TyVarTy Var
_) = Bool
True
kindIsTypeable (AppTy Kind
a Kind
b) = Kind -> Bool
kindIsTypeable Kind
a Bool -> Bool -> Bool
&& Kind -> Bool
kindIsTypeable Kind
b
kindIsTypeable (FunTy AnonArgFlag
_ Kind
a Kind
b) = Kind -> Bool
kindIsTypeable Kind
a Bool -> Bool -> Bool
&& Kind -> Bool
kindIsTypeable Kind
b
kindIsTypeable (TyConApp TyCon
tc [Kind]
args) = TyCon -> Bool
tyConIsTypeable TyCon
tc
Bool -> Bool -> Bool
&& (Kind -> Bool) -> [Kind] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
External instance of the constraint type Foldable []
all Kind -> Bool
kindIsTypeable [Kind]
args
kindIsTypeable (ForAllTy{}) = Bool
False
kindIsTypeable (LitTy TyLit
_) = Bool
True
kindIsTypeable (CastTy{}) = Bool
False
kindIsTypeable (CoercionTy{}) = Bool
False
type KindRepEnv = TypeMap (Id, Maybe (LHsExpr GhcTc))
newtype KindRepM a = KindRepM { KindRepM a -> StateT KindRepEnv TcRn a
unKindRepM :: StateT KindRepEnv TcRn a }
deriving (a -> KindRepM b -> KindRepM a
(a -> b) -> KindRepM a -> KindRepM b
(forall a b. (a -> b) -> KindRepM a -> KindRepM b)
-> (forall a b. a -> KindRepM b -> KindRepM a) -> Functor KindRepM
forall a b. a -> KindRepM b -> KindRepM a
forall a b. (a -> b) -> KindRepM a -> KindRepM b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
<$ :: a -> KindRepM b -> KindRepM a
$c<$ :: forall a b. a -> KindRepM b -> KindRepM a
fmap :: (a -> b) -> KindRepM a -> KindRepM b
$cfmap :: forall a b. (a -> b) -> KindRepM a -> KindRepM b
External instance of the constraint type forall (m :: * -> *) s. Functor m => Functor (StateT s m)
External instance of the constraint type forall env. Functor (IOEnv env)
Functor, Functor KindRepM
a -> KindRepM a
Functor KindRepM
-> (forall a. a -> KindRepM a)
-> (forall a b. KindRepM (a -> b) -> KindRepM a -> KindRepM b)
-> (forall a b c.
(a -> b -> c) -> KindRepM a -> KindRepM b -> KindRepM c)
-> (forall a b. KindRepM a -> KindRepM b -> KindRepM b)
-> (forall a b. KindRepM a -> KindRepM b -> KindRepM a)
-> Applicative KindRepM
KindRepM a -> KindRepM b -> KindRepM b
KindRepM a -> KindRepM b -> KindRepM a
KindRepM (a -> b) -> KindRepM a -> KindRepM b
(a -> b -> c) -> KindRepM a -> KindRepM b -> KindRepM c
forall a. a -> KindRepM a
forall a b. KindRepM a -> KindRepM b -> KindRepM a
forall a b. KindRepM a -> KindRepM b -> KindRepM b
forall a b. KindRepM (a -> b) -> KindRepM a -> KindRepM b
forall a b c.
(a -> b -> c) -> KindRepM a -> KindRepM b -> KindRepM c
forall (f :: * -> *).
Functor f
-> (forall a. a -> f a)
-> (forall a b. f (a -> b) -> f a -> f b)
-> (forall a b c. (a -> b -> c) -> f a -> f b -> f c)
-> (forall a b. f a -> f b -> f b)
-> (forall a b. f a -> f b -> f a)
-> Applicative f
<* :: KindRepM a -> KindRepM b -> KindRepM a
$c<* :: forall a b. KindRepM a -> KindRepM b -> KindRepM a
*> :: KindRepM a -> KindRepM b -> KindRepM b
$c*> :: forall a b. KindRepM a -> KindRepM b -> KindRepM b
liftA2 :: (a -> b -> c) -> KindRepM a -> KindRepM b -> KindRepM c
$cliftA2 :: forall a b c.
(a -> b -> c) -> KindRepM a -> KindRepM b -> KindRepM c
<*> :: KindRepM (a -> b) -> KindRepM a -> KindRepM b
$c<*> :: forall a b. KindRepM (a -> b) -> KindRepM a -> KindRepM b
pure :: a -> KindRepM a
$cpure :: forall a. a -> KindRepM a
External instance of the constraint type forall (m :: * -> *) s.
(Functor m, Monad m) =>
Applicative (StateT s m)
Instance of class: Functor of the constraint type Functor KindRepM
Instance of class: Functor of the constraint type Functor KindRepM
External instance of the constraint type forall env. Functor (IOEnv env)
External instance of the constraint type forall m. Monad (IOEnv m)
Applicative, Applicative KindRepM
a -> KindRepM a
Applicative KindRepM
-> (forall a b. KindRepM a -> (a -> KindRepM b) -> KindRepM b)
-> (forall a b. KindRepM a -> KindRepM b -> KindRepM b)
-> (forall a. a -> KindRepM a)
-> Monad KindRepM
KindRepM a -> (a -> KindRepM b) -> KindRepM b
KindRepM a -> KindRepM b -> KindRepM b
forall a. a -> KindRepM a
forall a b. KindRepM a -> KindRepM b -> KindRepM b
forall a b. KindRepM a -> (a -> KindRepM b) -> KindRepM b
forall (m :: * -> *).
Applicative m
-> (forall a b. m a -> (a -> m b) -> m b)
-> (forall a b. m a -> m b -> m b)
-> (forall a. a -> m a)
-> Monad m
return :: a -> KindRepM a
$creturn :: forall a. a -> KindRepM a
>> :: KindRepM a -> KindRepM b -> KindRepM b
$c>> :: forall a b. KindRepM a -> KindRepM b -> KindRepM b
>>= :: KindRepM a -> (a -> KindRepM b) -> KindRepM b
$c>>= :: forall a b. KindRepM a -> (a -> KindRepM b) -> KindRepM b
External instance of the constraint type forall (m :: * -> *) s. Monad m => Monad (StateT s m)
Instance of class: Applicative of the constraint type Applicative KindRepM
Instance of class: Applicative of the constraint type Applicative KindRepM
External instance of the constraint type forall m. Monad (IOEnv m)
Monad)
liftTc :: TcRn a -> KindRepM a
liftTc :: TcRn a -> KindRepM a
liftTc = StateT KindRepEnv TcRn a -> KindRepM a
forall a. StateT KindRepEnv TcRn a -> KindRepM a
KindRepM (StateT KindRepEnv TcRn a -> KindRepM a)
-> (TcRn a -> StateT KindRepEnv TcRn a) -> TcRn a -> KindRepM a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. TcRn a -> StateT KindRepEnv TcRn a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
External instance of the constraint type forall m. Monad (IOEnv m)
External instance of the constraint type forall s. MonadTrans (StateT s)
lift
builtInKindReps :: [(Kind, Name)]
builtInKindReps :: [(Kind, Name)]
builtInKindReps =
[ (Kind
star, Name
starKindRepName)
, (Kind -> Kind -> Kind
mkVisFunTy Kind
star Kind
star, Name
starArrStarKindRepName)
, ([Kind] -> Kind -> Kind
mkVisFunTys [Kind
star, Kind
star] Kind
star, Name
starArrStarArrStarKindRepName)
]
where
star :: Kind
star = Kind
liftedTypeKind
initialKindRepEnv :: TcRn KindRepEnv
initialKindRepEnv :: TcRn KindRepEnv
initialKindRepEnv = (KindRepEnv -> (Kind, Name) -> TcRn KindRepEnv)
-> KindRepEnv -> [(Kind, Name)] -> TcRn KindRepEnv
forall (t :: * -> *) (m :: * -> *) b a.
(Foldable t, Monad m) =>
(b -> a -> m b) -> b -> t a -> m b
External instance of the constraint type forall m. Monad (IOEnv m)
External instance of the constraint type Foldable []
foldlM KindRepEnv -> (Kind, Name) -> TcRn KindRepEnv
forall {a}.
TypeMap (Var, Maybe a)
-> (Kind, Name)
-> IOEnv (Env TcGblEnv TcLclEnv) (TypeMap (Var, Maybe a))
add_kind_rep KindRepEnv
forall a. TypeMap a
emptyTypeMap [(Kind, Name)]
builtInKindReps
where
add_kind_rep :: TypeMap (Var, Maybe a)
-> (Kind, Name)
-> IOEnv (Env TcGblEnv TcLclEnv) (TypeMap (Var, Maybe a))
add_kind_rep TypeMap (Var, Maybe a)
acc (Kind
k,Name
n) = do
Var
id <- Name -> TcM Var
tcLookupId Name
n
TypeMap (Var, Maybe a)
-> IOEnv (Env TcGblEnv TcLclEnv) (TypeMap (Var, Maybe a))
forall (m :: * -> *) a. Monad m => a -> m a
External instance of the constraint type forall m. Monad (IOEnv m)
return (TypeMap (Var, Maybe a)
-> IOEnv (Env TcGblEnv TcLclEnv) (TypeMap (Var, Maybe a)))
-> TypeMap (Var, Maybe a)
-> IOEnv (Env TcGblEnv TcLclEnv) (TypeMap (Var, Maybe a))
forall a b. (a -> b) -> a -> b
$! TypeMap (Var, Maybe a)
-> Kind -> (Var, Maybe a) -> TypeMap (Var, Maybe a)
forall a. TypeMap a -> Kind -> a -> TypeMap a
extendTypeMap TypeMap (Var, Maybe a)
acc Kind
k (Var
id, Maybe a
forall a. Maybe a
Nothing)
mkExportedKindReps :: TypeableStuff
-> [(Kind, Id)]
-> KindRepM ()
mkExportedKindReps :: TypeableStuff -> [(Kind, Var)] -> KindRepM ()
mkExportedKindReps TypeableStuff
stuff = ((Kind, Var) -> KindRepM ()) -> [(Kind, Var)] -> KindRepM ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
Instance of class: Monad of the constraint type Monad KindRepM
External instance of the constraint type Foldable []
mapM_ (Kind, Var) -> KindRepM ()
kindrep_binding
where
empty_scope :: CmEnv
empty_scope = [Var] -> CmEnv
mkDeBruijnContext []
kindrep_binding :: (Kind, Id) -> KindRepM ()
kindrep_binding :: (Kind, Var) -> KindRepM ()
kindrep_binding (Kind
kind, Var
rep_bndr) = do
LHsExpr (GhcPass 'Typechecked)
rhs <- TypeableStuff
-> CmEnv -> Kind -> KindRepM (LHsExpr (GhcPass 'Typechecked))
mkKindRepRhs TypeableStuff
stuff CmEnv
empty_scope Kind
kind
CmEnv
-> Kind -> Var -> LHsExpr (GhcPass 'Typechecked) -> KindRepM ()
addKindRepBind CmEnv
empty_scope Kind
kind Var
rep_bndr LHsExpr (GhcPass 'Typechecked)
rhs
addKindRepBind :: CmEnv -> Kind -> Id -> LHsExpr GhcTc -> KindRepM ()
addKindRepBind :: CmEnv
-> Kind -> Var -> LHsExpr (GhcPass 'Typechecked) -> KindRepM ()
addKindRepBind CmEnv
in_scope Kind
k Var
bndr LHsExpr (GhcPass 'Typechecked)
rhs =
StateT KindRepEnv TcRn () -> KindRepM ()
forall a. StateT KindRepEnv TcRn a -> KindRepM a
KindRepM (StateT KindRepEnv TcRn () -> KindRepM ())
-> StateT KindRepEnv TcRn () -> KindRepM ()
forall a b. (a -> b) -> a -> b
$ (KindRepEnv -> KindRepEnv) -> StateT KindRepEnv TcRn ()
forall (m :: * -> *) s. Monad m => (s -> s) -> StateT s m ()
External instance of the constraint type forall m. Monad (IOEnv m)
modify' ((KindRepEnv -> KindRepEnv) -> StateT KindRepEnv TcRn ())
-> (KindRepEnv -> KindRepEnv) -> StateT KindRepEnv TcRn ()
forall a b. (a -> b) -> a -> b
$
\KindRepEnv
env -> KindRepEnv
-> CmEnv
-> Kind
-> (Var, Maybe (LHsExpr (GhcPass 'Typechecked)))
-> KindRepEnv
forall a. TypeMap a -> CmEnv -> Kind -> a -> TypeMap a
extendTypeMapWithScope KindRepEnv
env CmEnv
in_scope Kind
k (Var
bndr, LHsExpr (GhcPass 'Typechecked)
-> Maybe (LHsExpr (GhcPass 'Typechecked))
forall a. a -> Maybe a
Just LHsExpr (GhcPass 'Typechecked)
rhs)
runKindRepM :: KindRepM a -> TcRn (TcGblEnv, a)
runKindRepM :: KindRepM a -> TcRn (TcGblEnv, a)
runKindRepM (KindRepM StateT KindRepEnv TcRn a
action) = do
KindRepEnv
kindRepEnv <- TcRn KindRepEnv
initialKindRepEnv
(a
res, KindRepEnv
reps_env) <- StateT KindRepEnv TcRn a -> KindRepEnv -> TcRn (a, KindRepEnv)
forall s (m :: * -> *) a. StateT s m a -> s -> m (a, s)
runStateT StateT KindRepEnv TcRn a
action KindRepEnv
kindRepEnv
let rep_binds :: [(Var, LHsExpr (GhcPass 'Typechecked))]
rep_binds = ((Var, Maybe (LHsExpr (GhcPass 'Typechecked)))
-> [(Var, LHsExpr (GhcPass 'Typechecked))]
-> [(Var, LHsExpr (GhcPass 'Typechecked))])
-> [(Var, LHsExpr (GhcPass 'Typechecked))]
-> KindRepEnv
-> [(Var, LHsExpr (GhcPass 'Typechecked))]
forall a b. (a -> b -> b) -> b -> TypeMap a -> b
foldTypeMap (Var, Maybe (LHsExpr (GhcPass 'Typechecked)))
-> [(Var, LHsExpr (GhcPass 'Typechecked))]
-> [(Var, LHsExpr (GhcPass 'Typechecked))]
forall {a} {b}. (a, Maybe b) -> [(a, b)] -> [(a, b)]
to_bind_pair [] KindRepEnv
reps_env
to_bind_pair :: (a, Maybe b) -> [(a, b)] -> [(a, b)]
to_bind_pair (a
bndr, Just b
rhs) [(a, b)]
rest = (a
bndr, b
rhs) (a, b) -> [(a, b)] -> [(a, b)]
forall a. a -> [a] -> [a]
: [(a, b)]
rest
to_bind_pair (a
_, Maybe b
Nothing) [(a, b)]
rest = [(a, b)]
rest
TcGblEnv
tcg_env <- [Var] -> TcM TcGblEnv -> TcM TcGblEnv
forall a. [Var] -> TcM a -> TcM a
tcExtendGlobalValEnv (((Var, LHsExpr (GhcPass 'Typechecked)) -> Var)
-> [(Var, LHsExpr (GhcPass 'Typechecked))] -> [Var]
forall a b. (a -> b) -> [a] -> [b]
map (Var, LHsExpr (GhcPass 'Typechecked)) -> Var
forall a b. (a, b) -> a
fst [(Var, LHsExpr (GhcPass 'Typechecked))]
rep_binds) TcM TcGblEnv
forall gbl lcl. TcRnIf gbl lcl gbl
getGblEnv
let binds :: [LHsBind (GhcPass 'Typechecked)]
binds = ((Var, LHsExpr (GhcPass 'Typechecked))
-> LHsBind (GhcPass 'Typechecked))
-> [(Var, LHsExpr (GhcPass 'Typechecked))]
-> [LHsBind (GhcPass 'Typechecked)]
forall a b. (a -> b) -> [a] -> [b]
map ((Var
-> LHsExpr (GhcPass 'Typechecked)
-> LHsBind (GhcPass 'Typechecked))
-> (Var, LHsExpr (GhcPass 'Typechecked))
-> LHsBind (GhcPass 'Typechecked)
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry Var
-> LHsExpr (GhcPass 'Typechecked) -> LHsBind (GhcPass 'Typechecked)
forall (p :: Pass).
IdP (GhcPass p) -> LHsExpr (GhcPass p) -> LHsBind (GhcPass p)
mkVarBind) [(Var, LHsExpr (GhcPass 'Typechecked))]
rep_binds
tcg_env' :: TcGblEnv
tcg_env' = TcGblEnv
tcg_env TcGblEnv -> [LHsBinds (GhcPass 'Typechecked)] -> TcGblEnv
`addTypecheckedBinds` [[LHsBind (GhcPass 'Typechecked)] -> LHsBinds (GhcPass 'Typechecked)
forall a. [a] -> Bag a
listToBag [LHsBind (GhcPass 'Typechecked)]
binds]
(TcGblEnv, a) -> TcRn (TcGblEnv, a)
forall (m :: * -> *) a. Monad m => a -> m a
External instance of the constraint type forall m. Monad (IOEnv m)
return (TcGblEnv
tcg_env', a
res)
getKindRep :: TypeableStuff -> CmEnv
-> Kind
-> KindRepM (LHsExpr GhcTc)
getKindRep :: TypeableStuff
-> CmEnv -> Kind -> KindRepM (LHsExpr (GhcPass 'Typechecked))
getKindRep stuff :: TypeableStuff
stuff@(Stuff {Platform
TyCon
DataCon
FastString -> LHsExpr (GhcPass 'Typechecked)
typeLitNatDataCon :: DataCon
typeLitSymbolDataCon :: DataCon
kindRepTypeLitSDataCon :: DataCon
kindRepTYPEDataCon :: DataCon
kindRepFunDataCon :: DataCon
kindRepAppDataCon :: DataCon
kindRepVarDataCon :: DataCon
kindRepTyConAppDataCon :: DataCon
kindRepTyCon :: TyCon
trNameLit :: FastString -> LHsExpr (GhcPass 'Typechecked)
trTyConDataCon :: DataCon
platform :: Platform
typeLitNatDataCon :: TypeableStuff -> DataCon
typeLitSymbolDataCon :: TypeableStuff -> DataCon
kindRepTypeLitSDataCon :: TypeableStuff -> DataCon
kindRepTYPEDataCon :: TypeableStuff -> DataCon
kindRepFunDataCon :: TypeableStuff -> DataCon
kindRepAppDataCon :: TypeableStuff -> DataCon
kindRepVarDataCon :: TypeableStuff -> DataCon
kindRepTyConAppDataCon :: TypeableStuff -> DataCon
kindRepTyCon :: TypeableStuff -> TyCon
trNameLit :: TypeableStuff -> FastString -> LHsExpr (GhcPass 'Typechecked)
trTyConDataCon :: TypeableStuff -> DataCon
platform :: TypeableStuff -> Platform
..}) CmEnv
in_scope = Kind -> KindRepM (LHsExpr (GhcPass 'Typechecked))
go
where
go :: Kind -> KindRepM (LHsExpr GhcTc)
go :: Kind -> KindRepM (LHsExpr (GhcPass 'Typechecked))
go = StateT KindRepEnv TcRn (LHsExpr (GhcPass 'Typechecked))
-> KindRepM (LHsExpr (GhcPass 'Typechecked))
forall a. StateT KindRepEnv TcRn a -> KindRepM a
KindRepM (StateT KindRepEnv TcRn (LHsExpr (GhcPass 'Typechecked))
-> KindRepM (LHsExpr (GhcPass 'Typechecked)))
-> (Kind
-> StateT KindRepEnv TcRn (LHsExpr (GhcPass 'Typechecked)))
-> Kind
-> KindRepM (LHsExpr (GhcPass 'Typechecked))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (KindRepEnv
-> IOEnv
(Env TcGblEnv TcLclEnv)
(LHsExpr (GhcPass 'Typechecked), KindRepEnv))
-> StateT KindRepEnv TcRn (LHsExpr (GhcPass 'Typechecked))
forall s (m :: * -> *) a. (s -> m (a, s)) -> StateT s m a
StateT ((KindRepEnv
-> IOEnv
(Env TcGblEnv TcLclEnv)
(LHsExpr (GhcPass 'Typechecked), KindRepEnv))
-> StateT KindRepEnv TcRn (LHsExpr (GhcPass 'Typechecked)))
-> (Kind
-> KindRepEnv
-> IOEnv
(Env TcGblEnv TcLclEnv)
(LHsExpr (GhcPass 'Typechecked), KindRepEnv))
-> Kind
-> StateT KindRepEnv TcRn (LHsExpr (GhcPass 'Typechecked))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Kind
-> KindRepEnv
-> IOEnv
(Env TcGblEnv TcLclEnv)
(LHsExpr (GhcPass 'Typechecked), KindRepEnv)
go'
go' :: Kind -> KindRepEnv -> TcRn (LHsExpr GhcTc, KindRepEnv)
go' :: Kind
-> KindRepEnv
-> IOEnv
(Env TcGblEnv TcLclEnv)
(LHsExpr (GhcPass 'Typechecked), KindRepEnv)
go' Kind
k KindRepEnv
env
| Just Kind
k' <- Kind -> Maybe Kind
tcView Kind
k = Kind
-> KindRepEnv
-> IOEnv
(Env TcGblEnv TcLclEnv)
(LHsExpr (GhcPass 'Typechecked), KindRepEnv)
go' Kind
k' KindRepEnv
env
| Just (Var
id, Maybe (LHsExpr (GhcPass 'Typechecked))
_) <- KindRepEnv
-> CmEnv
-> Kind
-> Maybe (Var, Maybe (LHsExpr (GhcPass 'Typechecked)))
forall a. TypeMap a -> CmEnv -> Kind -> Maybe a
lookupTypeMapWithScope KindRepEnv
env CmEnv
in_scope Kind
k
= (LHsExpr (GhcPass 'Typechecked), KindRepEnv)
-> IOEnv
(Env TcGblEnv TcLclEnv)
(LHsExpr (GhcPass 'Typechecked), KindRepEnv)
forall (m :: * -> *) a. Monad m => a -> m a
External instance of the constraint type forall m. Monad (IOEnv m)
return (IdP (GhcPass 'Typechecked) -> LHsExpr (GhcPass 'Typechecked)
forall (id :: Pass). IdP (GhcPass id) -> LHsExpr (GhcPass id)
nlHsVar Var
IdP (GhcPass 'Typechecked)
id, KindRepEnv
env)
| Bool
otherwise
= do
Var
rep_bndr <- (Var -> InlinePragma -> Var
`setInlinePragma` InlinePragma
neverInlinePragma)
(Var -> Var) -> TcM Var -> TcM Var
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
External instance of the constraint type forall env. Functor (IOEnv env)
<$> FastString -> Kind -> TcM Var
forall gbl lcl. FastString -> Kind -> TcRnIf gbl lcl Var
newSysLocalId (String -> FastString
fsLit String
"$krep") (TyCon -> Kind
mkTyConTy TyCon
kindRepTyCon)
(StateT KindRepEnv TcRn (LHsExpr (GhcPass 'Typechecked))
-> KindRepEnv
-> IOEnv
(Env TcGblEnv TcLclEnv)
(LHsExpr (GhcPass 'Typechecked), KindRepEnv))
-> KindRepEnv
-> StateT KindRepEnv TcRn (LHsExpr (GhcPass 'Typechecked))
-> IOEnv
(Env TcGblEnv TcLclEnv)
(LHsExpr (GhcPass 'Typechecked), KindRepEnv)
forall a b c. (a -> b -> c) -> b -> a -> c
flip StateT KindRepEnv TcRn (LHsExpr (GhcPass 'Typechecked))
-> KindRepEnv
-> IOEnv
(Env TcGblEnv TcLclEnv)
(LHsExpr (GhcPass 'Typechecked), KindRepEnv)
forall s (m :: * -> *) a. StateT s m a -> s -> m (a, s)
runStateT KindRepEnv
env (StateT KindRepEnv TcRn (LHsExpr (GhcPass 'Typechecked))
-> IOEnv
(Env TcGblEnv TcLclEnv)
(LHsExpr (GhcPass 'Typechecked), KindRepEnv))
-> StateT KindRepEnv TcRn (LHsExpr (GhcPass 'Typechecked))
-> IOEnv
(Env TcGblEnv TcLclEnv)
(LHsExpr (GhcPass 'Typechecked), KindRepEnv)
forall a b. (a -> b) -> a -> b
$ KindRepM (LHsExpr (GhcPass 'Typechecked))
-> StateT KindRepEnv TcRn (LHsExpr (GhcPass 'Typechecked))
forall a. KindRepM a -> StateT KindRepEnv TcRn a
unKindRepM (KindRepM (LHsExpr (GhcPass 'Typechecked))
-> StateT KindRepEnv TcRn (LHsExpr (GhcPass 'Typechecked)))
-> KindRepM (LHsExpr (GhcPass 'Typechecked))
-> StateT KindRepEnv TcRn (LHsExpr (GhcPass 'Typechecked))
forall a b. (a -> b) -> a -> b
$ do
LHsExpr (GhcPass 'Typechecked)
rhs <- TypeableStuff
-> CmEnv -> Kind -> KindRepM (LHsExpr (GhcPass 'Typechecked))
mkKindRepRhs TypeableStuff
stuff CmEnv
in_scope Kind
k
CmEnv
-> Kind -> Var -> LHsExpr (GhcPass 'Typechecked) -> KindRepM ()
addKindRepBind CmEnv
in_scope Kind
k Var
rep_bndr LHsExpr (GhcPass 'Typechecked)
rhs
LHsExpr (GhcPass 'Typechecked)
-> KindRepM (LHsExpr (GhcPass 'Typechecked))
forall (m :: * -> *) a. Monad m => a -> m a
Instance of class: Monad of the constraint type Monad KindRepM
return (LHsExpr (GhcPass 'Typechecked)
-> KindRepM (LHsExpr (GhcPass 'Typechecked)))
-> LHsExpr (GhcPass 'Typechecked)
-> KindRepM (LHsExpr (GhcPass 'Typechecked))
forall a b. (a -> b) -> a -> b
$ IdP (GhcPass 'Typechecked) -> LHsExpr (GhcPass 'Typechecked)
forall (id :: Pass). IdP (GhcPass id) -> LHsExpr (GhcPass id)
nlHsVar Var
IdP (GhcPass 'Typechecked)
rep_bndr
mkKindRepRhs :: TypeableStuff
-> CmEnv
-> Kind
-> KindRepM (LHsExpr GhcTc)
mkKindRepRhs :: TypeableStuff
-> CmEnv -> Kind -> KindRepM (LHsExpr (GhcPass 'Typechecked))
mkKindRepRhs stuff :: TypeableStuff
stuff@(Stuff {Platform
TyCon
DataCon
FastString -> LHsExpr (GhcPass 'Typechecked)
typeLitNatDataCon :: DataCon
typeLitSymbolDataCon :: DataCon
kindRepTypeLitSDataCon :: DataCon
kindRepTYPEDataCon :: DataCon
kindRepFunDataCon :: DataCon
kindRepAppDataCon :: DataCon
kindRepVarDataCon :: DataCon
kindRepTyConAppDataCon :: DataCon
kindRepTyCon :: TyCon
trNameLit :: FastString -> LHsExpr (GhcPass 'Typechecked)
trTyConDataCon :: DataCon
platform :: Platform
typeLitNatDataCon :: TypeableStuff -> DataCon
typeLitSymbolDataCon :: TypeableStuff -> DataCon
kindRepTypeLitSDataCon :: TypeableStuff -> DataCon
kindRepTYPEDataCon :: TypeableStuff -> DataCon
kindRepFunDataCon :: TypeableStuff -> DataCon
kindRepAppDataCon :: TypeableStuff -> DataCon
kindRepVarDataCon :: TypeableStuff -> DataCon
kindRepTyConAppDataCon :: TypeableStuff -> DataCon
kindRepTyCon :: TypeableStuff -> TyCon
trNameLit :: TypeableStuff -> FastString -> LHsExpr (GhcPass 'Typechecked)
trTyConDataCon :: TypeableStuff -> DataCon
platform :: TypeableStuff -> Platform
..}) CmEnv
in_scope = Kind -> KindRepM (LHsExpr (GhcPass 'Typechecked))
new_kind_rep
where
new_kind_rep :: Kind -> KindRepM (LHsExpr (GhcPass 'Typechecked))
new_kind_rep Kind
k
| Bool -> Bool
not (Kind -> Bool
tcIsConstraintKind Kind
k)
, Just Kind
arg <- HasDebugCallStack => Kind -> Maybe Kind
Kind -> Maybe Kind
External instance of the constraint type HasDebugCallStack
kindRep_maybe Kind
k
, Just (TyCon
tc, []) <- HasDebugCallStack => Kind -> Maybe (TyCon, [Kind])
Kind -> Maybe (TyCon, [Kind])
External instance of the constraint type HasDebugCallStack
splitTyConApp_maybe Kind
arg
, Just DataCon
dc <- TyCon -> Maybe DataCon
isPromotedDataCon_maybe TyCon
tc
= LHsExpr (GhcPass 'Typechecked)
-> KindRepM (LHsExpr (GhcPass 'Typechecked))
forall (m :: * -> *) a. Monad m => a -> m a
Instance of class: Monad of the constraint type Monad KindRepM
return (LHsExpr (GhcPass 'Typechecked)
-> KindRepM (LHsExpr (GhcPass 'Typechecked)))
-> LHsExpr (GhcPass 'Typechecked)
-> KindRepM (LHsExpr (GhcPass 'Typechecked))
forall a b. (a -> b) -> a -> b
$ DataCon -> LHsExpr (GhcPass 'Typechecked)
nlHsDataCon DataCon
kindRepTYPEDataCon LHsExpr (GhcPass 'Typechecked)
-> LHsExpr (GhcPass 'Typechecked) -> LHsExpr (GhcPass 'Typechecked)
forall (id :: Pass).
IsPass id =>
LHsExpr (GhcPass id)
-> LHsExpr (GhcPass id) -> LHsExpr (GhcPass id)
External instance of the constraint type IsPass 'Typechecked
`nlHsApp` DataCon -> LHsExpr (GhcPass 'Typechecked)
nlHsDataCon DataCon
dc
new_kind_rep (TyVarTy Var
v)
| Just Int
idx <- CmEnv -> Var -> Maybe Int
lookupCME CmEnv
in_scope Var
v
= LHsExpr (GhcPass 'Typechecked)
-> KindRepM (LHsExpr (GhcPass 'Typechecked))
forall (m :: * -> *) a. Monad m => a -> m a
Instance of class: Monad of the constraint type Monad KindRepM
return (LHsExpr (GhcPass 'Typechecked)
-> KindRepM (LHsExpr (GhcPass 'Typechecked)))
-> LHsExpr (GhcPass 'Typechecked)
-> KindRepM (LHsExpr (GhcPass 'Typechecked))
forall a b. (a -> b) -> a -> b
$ DataCon -> LHsExpr (GhcPass 'Typechecked)
nlHsDataCon DataCon
kindRepVarDataCon
LHsExpr (GhcPass 'Typechecked)
-> LHsExpr (GhcPass 'Typechecked) -> LHsExpr (GhcPass 'Typechecked)
forall (id :: Pass).
IsPass id =>
LHsExpr (GhcPass id)
-> LHsExpr (GhcPass id) -> LHsExpr (GhcPass id)
External instance of the constraint type IsPass 'Typechecked
`nlHsApp` Integer -> LHsExpr (GhcPass 'Typechecked)
forall (p :: Pass). Integer -> LHsExpr (GhcPass p)
nlHsIntLit (Int -> Integer
forall a b. (Integral a, Num b) => a -> b
External instance of the constraint type Num Integer
External instance of the constraint type Integral Int
fromIntegral Int
idx)
| Bool
otherwise
= String -> SDoc -> KindRepM (LHsExpr (GhcPass 'Typechecked))
forall a. HasCallStack => String -> SDoc -> a
pprPanic String
"mkTyConKindRepBinds.go(tyvar)" (Var -> SDoc
forall a. Outputable a => a -> SDoc
External instance of the constraint type Outputable Var
ppr Var
v)
new_kind_rep (AppTy Kind
t1 Kind
t2)
= do LHsExpr (GhcPass 'Typechecked)
rep1 <- TypeableStuff
-> CmEnv -> Kind -> KindRepM (LHsExpr (GhcPass 'Typechecked))
getKindRep TypeableStuff
stuff CmEnv
in_scope Kind
t1
LHsExpr (GhcPass 'Typechecked)
rep2 <- TypeableStuff
-> CmEnv -> Kind -> KindRepM (LHsExpr (GhcPass 'Typechecked))
getKindRep TypeableStuff
stuff CmEnv
in_scope Kind
t2
LHsExpr (GhcPass 'Typechecked)
-> KindRepM (LHsExpr (GhcPass 'Typechecked))
forall (m :: * -> *) a. Monad m => a -> m a
Instance of class: Monad of the constraint type Monad KindRepM
return (LHsExpr (GhcPass 'Typechecked)
-> KindRepM (LHsExpr (GhcPass 'Typechecked)))
-> LHsExpr (GhcPass 'Typechecked)
-> KindRepM (LHsExpr (GhcPass 'Typechecked))
forall a b. (a -> b) -> a -> b
$ DataCon -> LHsExpr (GhcPass 'Typechecked)
nlHsDataCon DataCon
kindRepAppDataCon
LHsExpr (GhcPass 'Typechecked)
-> LHsExpr (GhcPass 'Typechecked) -> LHsExpr (GhcPass 'Typechecked)
forall (id :: Pass).
IsPass id =>
LHsExpr (GhcPass id)
-> LHsExpr (GhcPass id) -> LHsExpr (GhcPass id)
External instance of the constraint type IsPass 'Typechecked
`nlHsApp` LHsExpr (GhcPass 'Typechecked)
rep1 LHsExpr (GhcPass 'Typechecked)
-> LHsExpr (GhcPass 'Typechecked) -> LHsExpr (GhcPass 'Typechecked)
forall (id :: Pass).
IsPass id =>
LHsExpr (GhcPass id)
-> LHsExpr (GhcPass id) -> LHsExpr (GhcPass id)
External instance of the constraint type IsPass 'Typechecked
`nlHsApp` LHsExpr (GhcPass 'Typechecked)
rep2
new_kind_rep k :: Kind
k@(TyConApp TyCon
tc [Kind]
tys)
| Just Name
rep_name <- TyCon -> Maybe Name
tyConRepName_maybe TyCon
tc
= do Var
rep_id <- TcM Var -> KindRepM Var
forall a. TcRn a -> KindRepM a
liftTc (TcM Var -> KindRepM Var) -> TcM Var -> KindRepM Var
forall a b. (a -> b) -> a -> b
$ Name -> TcM Var
forall (m :: * -> *). MonadThings m => Name -> m Var
External instance of the constraint type MonadThings TcRn
lookupId Name
rep_name
[LHsExpr (GhcPass 'Typechecked)]
tys' <- (Kind -> KindRepM (LHsExpr (GhcPass 'Typechecked)))
-> [Kind] -> KindRepM [LHsExpr (GhcPass 'Typechecked)]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
Instance of class: Monad of the constraint type Monad KindRepM
External instance of the constraint type Traversable []
mapM (TypeableStuff
-> CmEnv -> Kind -> KindRepM (LHsExpr (GhcPass 'Typechecked))
getKindRep TypeableStuff
stuff CmEnv
in_scope) [Kind]
tys
LHsExpr (GhcPass 'Typechecked)
-> KindRepM (LHsExpr (GhcPass 'Typechecked))
forall (m :: * -> *) a. Monad m => a -> m a
Instance of class: Monad of the constraint type Monad KindRepM
return (LHsExpr (GhcPass 'Typechecked)
-> KindRepM (LHsExpr (GhcPass 'Typechecked)))
-> LHsExpr (GhcPass 'Typechecked)
-> KindRepM (LHsExpr (GhcPass 'Typechecked))
forall a b. (a -> b) -> a -> b
$ DataCon -> LHsExpr (GhcPass 'Typechecked)
nlHsDataCon DataCon
kindRepTyConAppDataCon
LHsExpr (GhcPass 'Typechecked)
-> LHsExpr (GhcPass 'Typechecked) -> LHsExpr (GhcPass 'Typechecked)
forall (id :: Pass).
IsPass id =>
LHsExpr (GhcPass id)
-> LHsExpr (GhcPass id) -> LHsExpr (GhcPass id)
External instance of the constraint type IsPass 'Typechecked
`nlHsApp` IdP (GhcPass 'Typechecked) -> LHsExpr (GhcPass 'Typechecked)
forall (id :: Pass). IdP (GhcPass id) -> LHsExpr (GhcPass id)
nlHsVar Var
IdP (GhcPass 'Typechecked)
rep_id
LHsExpr (GhcPass 'Typechecked)
-> LHsExpr (GhcPass 'Typechecked) -> LHsExpr (GhcPass 'Typechecked)
forall (id :: Pass).
IsPass id =>
LHsExpr (GhcPass id)
-> LHsExpr (GhcPass id) -> LHsExpr (GhcPass id)
External instance of the constraint type IsPass 'Typechecked
`nlHsApp` Kind
-> [LHsExpr (GhcPass 'Typechecked)]
-> LHsExpr (GhcPass 'Typechecked)
mkList (TyCon -> Kind
mkTyConTy TyCon
kindRepTyCon) [LHsExpr (GhcPass 'Typechecked)]
tys'
| Bool
otherwise
= String -> SDoc -> KindRepM (LHsExpr (GhcPass 'Typechecked))
forall a. HasCallStack => String -> SDoc -> a
pprPanic String
"mkTyConKindRepBinds(TyConApp)" (TyCon -> SDoc
forall a. Outputable a => a -> SDoc
External instance of the constraint type Outputable TyCon
ppr TyCon
tc SDoc -> SDoc -> SDoc
$$ Kind -> SDoc
forall a. Outputable a => a -> SDoc
External instance of the constraint type Outputable Kind
ppr Kind
k)
new_kind_rep (ForAllTy (Bndr Var
var ArgFlag
_) Kind
ty)
= String -> SDoc -> KindRepM (LHsExpr (GhcPass 'Typechecked))
forall a. HasCallStack => String -> SDoc -> a
pprPanic String
"mkTyConKindRepBinds(ForAllTy)" (Var -> SDoc
forall a. Outputable a => a -> SDoc
External instance of the constraint type Outputable Var
ppr Var
var SDoc -> SDoc -> SDoc
$$ Kind -> SDoc
forall a. Outputable a => a -> SDoc
External instance of the constraint type Outputable Kind
ppr Kind
ty)
new_kind_rep (FunTy AnonArgFlag
_ Kind
t1 Kind
t2)
= do LHsExpr (GhcPass 'Typechecked)
rep1 <- TypeableStuff
-> CmEnv -> Kind -> KindRepM (LHsExpr (GhcPass 'Typechecked))
getKindRep TypeableStuff
stuff CmEnv
in_scope Kind
t1
LHsExpr (GhcPass 'Typechecked)
rep2 <- TypeableStuff
-> CmEnv -> Kind -> KindRepM (LHsExpr (GhcPass 'Typechecked))
getKindRep TypeableStuff
stuff CmEnv
in_scope Kind
t2
LHsExpr (GhcPass 'Typechecked)
-> KindRepM (LHsExpr (GhcPass 'Typechecked))
forall (m :: * -> *) a. Monad m => a -> m a
Instance of class: Monad of the constraint type Monad KindRepM
return (LHsExpr (GhcPass 'Typechecked)
-> KindRepM (LHsExpr (GhcPass 'Typechecked)))
-> LHsExpr (GhcPass 'Typechecked)
-> KindRepM (LHsExpr (GhcPass 'Typechecked))
forall a b. (a -> b) -> a -> b
$ DataCon -> LHsExpr (GhcPass 'Typechecked)
nlHsDataCon DataCon
kindRepFunDataCon
LHsExpr (GhcPass 'Typechecked)
-> LHsExpr (GhcPass 'Typechecked) -> LHsExpr (GhcPass 'Typechecked)
forall (id :: Pass).
IsPass id =>
LHsExpr (GhcPass id)
-> LHsExpr (GhcPass id) -> LHsExpr (GhcPass id)
External instance of the constraint type IsPass 'Typechecked
`nlHsApp` LHsExpr (GhcPass 'Typechecked)
rep1 LHsExpr (GhcPass 'Typechecked)
-> LHsExpr (GhcPass 'Typechecked) -> LHsExpr (GhcPass 'Typechecked)
forall (id :: Pass).
IsPass id =>
LHsExpr (GhcPass id)
-> LHsExpr (GhcPass id) -> LHsExpr (GhcPass id)
External instance of the constraint type IsPass 'Typechecked
`nlHsApp` LHsExpr (GhcPass 'Typechecked)
rep2
new_kind_rep (LitTy (NumTyLit Integer
n))
= LHsExpr (GhcPass 'Typechecked)
-> KindRepM (LHsExpr (GhcPass 'Typechecked))
forall (m :: * -> *) a. Monad m => a -> m a
Instance of class: Monad of the constraint type Monad KindRepM
return (LHsExpr (GhcPass 'Typechecked)
-> KindRepM (LHsExpr (GhcPass 'Typechecked)))
-> LHsExpr (GhcPass 'Typechecked)
-> KindRepM (LHsExpr (GhcPass 'Typechecked))
forall a b. (a -> b) -> a -> b
$ DataCon -> LHsExpr (GhcPass 'Typechecked)
nlHsDataCon DataCon
kindRepTypeLitSDataCon
LHsExpr (GhcPass 'Typechecked)
-> LHsExpr (GhcPass 'Typechecked) -> LHsExpr (GhcPass 'Typechecked)
forall (id :: Pass).
IsPass id =>
LHsExpr (GhcPass id)
-> LHsExpr (GhcPass id) -> LHsExpr (GhcPass id)
External instance of the constraint type IsPass 'Typechecked
`nlHsApp` DataCon -> LHsExpr (GhcPass 'Typechecked)
nlHsDataCon DataCon
typeLitNatDataCon
LHsExpr (GhcPass 'Typechecked)
-> LHsExpr (GhcPass 'Typechecked) -> LHsExpr (GhcPass 'Typechecked)
forall (id :: Pass).
IsPass id =>
LHsExpr (GhcPass id)
-> LHsExpr (GhcPass id) -> LHsExpr (GhcPass id)
External instance of the constraint type IsPass 'Typechecked
`nlHsApp` HsLit (GhcPass 'Typechecked) -> LHsExpr (GhcPass 'Typechecked)
forall (p :: Pass). HsLit (GhcPass p) -> LHsExpr (GhcPass p)
nlHsLit (FastString -> HsLit (GhcPass 'Typechecked)
forall (p :: Pass). FastString -> HsLit (GhcPass p)
mkHsStringPrimLit (FastString -> HsLit (GhcPass 'Typechecked))
-> FastString -> HsLit (GhcPass 'Typechecked)
forall a b. (a -> b) -> a -> b
$ String -> FastString
mkFastString (String -> FastString) -> String -> FastString
forall a b. (a -> b) -> a -> b
$ Integer -> String
forall a. Show a => a -> String
External instance of the constraint type Show Integer
show Integer
n)
new_kind_rep (LitTy (StrTyLit FastString
s))
= LHsExpr (GhcPass 'Typechecked)
-> KindRepM (LHsExpr (GhcPass 'Typechecked))
forall (m :: * -> *) a. Monad m => a -> m a
Instance of class: Monad of the constraint type Monad KindRepM
return (LHsExpr (GhcPass 'Typechecked)
-> KindRepM (LHsExpr (GhcPass 'Typechecked)))
-> LHsExpr (GhcPass 'Typechecked)
-> KindRepM (LHsExpr (GhcPass 'Typechecked))
forall a b. (a -> b) -> a -> b
$ DataCon -> LHsExpr (GhcPass 'Typechecked)
nlHsDataCon DataCon
kindRepTypeLitSDataCon
LHsExpr (GhcPass 'Typechecked)
-> LHsExpr (GhcPass 'Typechecked) -> LHsExpr (GhcPass 'Typechecked)
forall (id :: Pass).
IsPass id =>
LHsExpr (GhcPass id)
-> LHsExpr (GhcPass id) -> LHsExpr (GhcPass id)
External instance of the constraint type IsPass 'Typechecked
`nlHsApp` DataCon -> LHsExpr (GhcPass 'Typechecked)
nlHsDataCon DataCon
typeLitSymbolDataCon
LHsExpr (GhcPass 'Typechecked)
-> LHsExpr (GhcPass 'Typechecked) -> LHsExpr (GhcPass 'Typechecked)
forall (id :: Pass).
IsPass id =>
LHsExpr (GhcPass id)
-> LHsExpr (GhcPass id) -> LHsExpr (GhcPass id)
External instance of the constraint type IsPass 'Typechecked
`nlHsApp` HsLit (GhcPass 'Typechecked) -> LHsExpr (GhcPass 'Typechecked)
forall (p :: Pass). HsLit (GhcPass p) -> LHsExpr (GhcPass p)
nlHsLit (FastString -> HsLit (GhcPass 'Typechecked)
forall (p :: Pass). FastString -> HsLit (GhcPass p)
mkHsStringPrimLit (FastString -> HsLit (GhcPass 'Typechecked))
-> FastString -> HsLit (GhcPass 'Typechecked)
forall a b. (a -> b) -> a -> b
$ String -> FastString
mkFastString (String -> FastString) -> String -> FastString
forall a b. (a -> b) -> a -> b
$ FastString -> String
forall a. Show a => a -> String
External instance of the constraint type Show FastString
show FastString
s)
new_kind_rep (CastTy Kind
ty KindCoercion
co)
= String -> SDoc -> KindRepM (LHsExpr (GhcPass 'Typechecked))
forall a. HasCallStack => String -> SDoc -> a
pprPanic String
"mkTyConKindRepBinds.go(cast)" (Kind -> SDoc
forall a. Outputable a => a -> SDoc
External instance of the constraint type Outputable Kind
ppr Kind
ty SDoc -> SDoc -> SDoc
$$ KindCoercion -> SDoc
forall a. Outputable a => a -> SDoc
External instance of the constraint type Outputable KindCoercion
ppr KindCoercion
co)
new_kind_rep (CoercionTy KindCoercion
co)
= String -> SDoc -> KindRepM (LHsExpr (GhcPass 'Typechecked))
forall a. HasCallStack => String -> SDoc -> a
pprPanic String
"mkTyConKindRepBinds.go(coercion)" (KindCoercion -> SDoc
forall a. Outputable a => a -> SDoc
External instance of the constraint type Outputable KindCoercion
ppr KindCoercion
co)
mkTyConRepTyConRHS :: TypeableStuff -> TypeRepTodo
-> TyCon
-> LHsExpr GhcTc
-> LHsExpr GhcTc
mkTyConRepTyConRHS :: TypeableStuff
-> TypeRepTodo
-> TyCon
-> LHsExpr (GhcPass 'Typechecked)
-> LHsExpr (GhcPass 'Typechecked)
mkTyConRepTyConRHS (Stuff {Platform
TyCon
DataCon
FastString -> LHsExpr (GhcPass 'Typechecked)
typeLitNatDataCon :: DataCon
typeLitSymbolDataCon :: DataCon
kindRepTypeLitSDataCon :: DataCon
kindRepTYPEDataCon :: DataCon
kindRepFunDataCon :: DataCon
kindRepAppDataCon :: DataCon
kindRepVarDataCon :: DataCon
kindRepTyConAppDataCon :: DataCon
kindRepTyCon :: TyCon
trNameLit :: FastString -> LHsExpr (GhcPass 'Typechecked)
trTyConDataCon :: DataCon
platform :: Platform
typeLitNatDataCon :: TypeableStuff -> DataCon
typeLitSymbolDataCon :: TypeableStuff -> DataCon
kindRepTypeLitSDataCon :: TypeableStuff -> DataCon
kindRepTYPEDataCon :: TypeableStuff -> DataCon
kindRepFunDataCon :: TypeableStuff -> DataCon
kindRepAppDataCon :: TypeableStuff -> DataCon
kindRepVarDataCon :: TypeableStuff -> DataCon
kindRepTyConAppDataCon :: TypeableStuff -> DataCon
kindRepTyCon :: TypeableStuff -> TyCon
trNameLit :: TypeableStuff -> FastString -> LHsExpr (GhcPass 'Typechecked)
trTyConDataCon :: TypeableStuff -> DataCon
platform :: TypeableStuff -> Platform
..}) TypeRepTodo
todo TyCon
tycon LHsExpr (GhcPass 'Typechecked)
kind_rep
= DataCon -> LHsExpr (GhcPass 'Typechecked)
nlHsDataCon DataCon
trTyConDataCon
LHsExpr (GhcPass 'Typechecked)
-> LHsExpr (GhcPass 'Typechecked) -> LHsExpr (GhcPass 'Typechecked)
forall (id :: Pass).
IsPass id =>
LHsExpr (GhcPass id)
-> LHsExpr (GhcPass id) -> LHsExpr (GhcPass id)
External instance of the constraint type IsPass 'Typechecked
`nlHsApp` HsLit (GhcPass 'Typechecked) -> LHsExpr (GhcPass 'Typechecked)
forall (p :: Pass). HsLit (GhcPass p) -> LHsExpr (GhcPass p)
nlHsLit (Platform -> Word64 -> HsLit (GhcPass 'Typechecked)
word64 Platform
platform Word64
high)
LHsExpr (GhcPass 'Typechecked)
-> LHsExpr (GhcPass 'Typechecked) -> LHsExpr (GhcPass 'Typechecked)
forall (id :: Pass).
IsPass id =>
LHsExpr (GhcPass id)
-> LHsExpr (GhcPass id) -> LHsExpr (GhcPass id)
External instance of the constraint type IsPass 'Typechecked
`nlHsApp` HsLit (GhcPass 'Typechecked) -> LHsExpr (GhcPass 'Typechecked)
forall (p :: Pass). HsLit (GhcPass p) -> LHsExpr (GhcPass p)
nlHsLit (Platform -> Word64 -> HsLit (GhcPass 'Typechecked)
word64 Platform
platform Word64
low)
LHsExpr (GhcPass 'Typechecked)
-> LHsExpr (GhcPass 'Typechecked) -> LHsExpr (GhcPass 'Typechecked)
forall (id :: Pass).
IsPass id =>
LHsExpr (GhcPass id)
-> LHsExpr (GhcPass id) -> LHsExpr (GhcPass id)
External instance of the constraint type IsPass 'Typechecked
`nlHsApp` TypeRepTodo -> LHsExpr (GhcPass 'Typechecked)
mod_rep_expr TypeRepTodo
todo
LHsExpr (GhcPass 'Typechecked)
-> LHsExpr (GhcPass 'Typechecked) -> LHsExpr (GhcPass 'Typechecked)
forall (id :: Pass).
IsPass id =>
LHsExpr (GhcPass id)
-> LHsExpr (GhcPass id) -> LHsExpr (GhcPass id)
External instance of the constraint type IsPass 'Typechecked
`nlHsApp` FastString -> LHsExpr (GhcPass 'Typechecked)
trNameLit (String -> FastString
mkFastString String
tycon_str)
LHsExpr (GhcPass 'Typechecked)
-> LHsExpr (GhcPass 'Typechecked) -> LHsExpr (GhcPass 'Typechecked)
forall (id :: Pass).
IsPass id =>
LHsExpr (GhcPass id)
-> LHsExpr (GhcPass id) -> LHsExpr (GhcPass id)
External instance of the constraint type IsPass 'Typechecked
`nlHsApp` HsLit (GhcPass 'Typechecked) -> LHsExpr (GhcPass 'Typechecked)
forall (p :: Pass). HsLit (GhcPass p) -> LHsExpr (GhcPass p)
nlHsLit (Int -> HsLit (GhcPass 'Typechecked)
int Int
n_kind_vars)
LHsExpr (GhcPass 'Typechecked)
-> LHsExpr (GhcPass 'Typechecked) -> LHsExpr (GhcPass 'Typechecked)
forall (id :: Pass).
IsPass id =>
LHsExpr (GhcPass id)
-> LHsExpr (GhcPass id) -> LHsExpr (GhcPass id)
External instance of the constraint type IsPass 'Typechecked
`nlHsApp` LHsExpr (GhcPass 'Typechecked)
kind_rep
where
n_kind_vars :: Int
n_kind_vars = [TyConBinder] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
External instance of the constraint type Foldable []
length ([TyConBinder] -> Int) -> [TyConBinder] -> Int
forall a b. (a -> b) -> a -> b
$ (TyConBinder -> Bool) -> [TyConBinder] -> [TyConBinder]
forall a. (a -> Bool) -> [a] -> [a]
filter TyConBinder -> Bool
isNamedTyConBinder (TyCon -> [TyConBinder]
tyConBinders TyCon
tycon)
tycon_str :: String
tycon_str = String -> String
add_tick (OccName -> String
occNameString (TyCon -> OccName
forall a. NamedThing a => a -> OccName
External instance of the constraint type NamedThing TyCon
getOccName TyCon
tycon))
add_tick :: String -> String
add_tick String
s | TyCon -> Bool
isPromotedDataCon TyCon
tycon = Char
'\'' Char -> String -> String
forall a. a -> [a] -> [a]
: String
s
| Bool
otherwise = String
s
Fingerprint Word64
high Word64
low = [Fingerprint] -> Fingerprint
fingerprintFingerprints [ TypeRepTodo -> Fingerprint
pkg_fingerprint TypeRepTodo
todo
, TypeRepTodo -> Fingerprint
mod_fingerprint TypeRepTodo
todo
, String -> Fingerprint
fingerprintString String
tycon_str
]
int :: Int -> HsLit GhcTc
int :: Int -> HsLit (GhcPass 'Typechecked)
int Int
n = XHsIntPrim (GhcPass 'Typechecked)
-> Integer -> HsLit (GhcPass 'Typechecked)
forall x. XHsIntPrim x -> Integer -> HsLit x
HsIntPrim (String -> SourceText
SourceText (String -> SourceText) -> String -> SourceText
forall a b. (a -> b) -> a -> b
$ Int -> String
forall a. Show a => a -> String
External instance of the constraint type Show Int
show Int
n) (Int -> Integer
forall a. Integral a => a -> Integer
External instance of the constraint type Integral Int
toInteger Int
n)
word64 :: Platform -> Word64 -> HsLit GhcTc
word64 :: Platform -> Word64 -> HsLit (GhcPass 'Typechecked)
word64 Platform
platform Word64
n = case Platform -> PlatformWordSize
platformWordSize Platform
platform of
PlatformWordSize
PW4 -> XHsWord64Prim (GhcPass 'Typechecked)
-> Integer -> HsLit (GhcPass 'Typechecked)
forall x. XHsWord64Prim x -> Integer -> HsLit x
HsWord64Prim SourceText
XHsWord64Prim (GhcPass 'Typechecked)
NoSourceText (Word64 -> Integer
forall a. Integral a => a -> Integer
External instance of the constraint type Integral Word64
toInteger Word64
n)
PlatformWordSize
PW8 -> XHsWordPrim (GhcPass 'Typechecked)
-> Integer -> HsLit (GhcPass 'Typechecked)
forall x. XHsWordPrim x -> Integer -> HsLit x
HsWordPrim SourceText
XHsWordPrim (GhcPass 'Typechecked)
NoSourceText (Word64 -> Integer
forall a. Integral a => a -> Integer
External instance of the constraint type Integral Word64
toInteger Word64
n)
mkList :: Type -> [LHsExpr GhcTc] -> LHsExpr GhcTc
mkList :: Kind
-> [LHsExpr (GhcPass 'Typechecked)]
-> LHsExpr (GhcPass 'Typechecked)
mkList Kind
ty = (LHsExpr (GhcPass 'Typechecked)
-> LHsExpr (GhcPass 'Typechecked)
-> LHsExpr (GhcPass 'Typechecked))
-> LHsExpr (GhcPass 'Typechecked)
-> [LHsExpr (GhcPass 'Typechecked)]
-> LHsExpr (GhcPass 'Typechecked)
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
External instance of the constraint type Foldable []
foldr LHsExpr (GhcPass 'Typechecked)
-> LHsExpr (GhcPass 'Typechecked) -> LHsExpr (GhcPass 'Typechecked)
consApp (Kind -> LHsExpr (GhcPass 'Typechecked)
nilExpr Kind
ty)
where
cons :: LHsExpr (GhcPass 'Typechecked)
cons = Kind -> LHsExpr (GhcPass 'Typechecked)
consExpr Kind
ty
consApp :: LHsExpr GhcTc -> LHsExpr GhcTc -> LHsExpr GhcTc
consApp :: LHsExpr (GhcPass 'Typechecked)
-> LHsExpr (GhcPass 'Typechecked) -> LHsExpr (GhcPass 'Typechecked)
consApp LHsExpr (GhcPass 'Typechecked)
x LHsExpr (GhcPass 'Typechecked)
xs = LHsExpr (GhcPass 'Typechecked)
cons LHsExpr (GhcPass 'Typechecked)
-> LHsExpr (GhcPass 'Typechecked) -> LHsExpr (GhcPass 'Typechecked)
forall (id :: Pass).
IsPass id =>
LHsExpr (GhcPass id)
-> LHsExpr (GhcPass id) -> LHsExpr (GhcPass id)
External instance of the constraint type IsPass 'Typechecked
`nlHsApp` LHsExpr (GhcPass 'Typechecked)
x LHsExpr (GhcPass 'Typechecked)
-> LHsExpr (GhcPass 'Typechecked) -> LHsExpr (GhcPass 'Typechecked)
forall (id :: Pass).
IsPass id =>
LHsExpr (GhcPass id)
-> LHsExpr (GhcPass id) -> LHsExpr (GhcPass id)
External instance of the constraint type IsPass 'Typechecked
`nlHsApp` LHsExpr (GhcPass 'Typechecked)
xs
nilExpr :: Type -> LHsExpr GhcTc
nilExpr :: Kind -> LHsExpr (GhcPass 'Typechecked)
nilExpr Kind
ty = HsWrapper
-> LHsExpr (GhcPass 'Typechecked) -> LHsExpr (GhcPass 'Typechecked)
mkLHsWrap ([Kind] -> HsWrapper
mkWpTyApps [Kind
ty]) (DataCon -> LHsExpr (GhcPass 'Typechecked)
nlHsDataCon DataCon
nilDataCon)
consExpr :: Type -> LHsExpr GhcTc
consExpr :: Kind -> LHsExpr (GhcPass 'Typechecked)
consExpr Kind
ty = HsWrapper
-> LHsExpr (GhcPass 'Typechecked) -> LHsExpr (GhcPass 'Typechecked)
mkLHsWrap ([Kind] -> HsWrapper
mkWpTyApps [Kind
ty]) (DataCon -> LHsExpr (GhcPass 'Typechecked)
nlHsDataCon DataCon
consDataCon)