- \begin{code}
+\begin{code}
module TcRnMonad(
module TcRnMonad,
module TcRnTypes,
ModDetails(..), HomeModInfo(..),
Deprecs(..), FixityEnv, FixItem,
GhciMode, lookupType, unQualInScope )
-import Module ( Module, ModuleName, unitModuleEnv, foldModuleEnv )
+import Module ( Module, unitModuleEnv, foldModuleEnv )
import RdrName ( GlobalRdrEnv, emptyGlobalRdrEnv,
LocalRdrEnv, emptyLocalRdrEnv )
import Name ( Name, isInternalName )
mkLocMessage, mkLongErrMsg )
import SrcLoc ( mkGeneralSrcSpan, isGoodSrcSpan, SrcSpan, Located(..) )
import NameEnv ( emptyNameEnv )
-import NameSet ( emptyDUs, emptyNameSet )
+import NameSet ( NameSet, emptyDUs, emptyNameSet, unionNameSets, addOneToNameSet )
import OccName ( emptyOccEnv )
-import Module ( moduleName )
import Bag ( emptyBag )
import Outputable
import UniqSupply ( UniqSupply, mkSplitUniqSupply, uniqFromSupply, splitUniqSupply )
tvs_var <- newIORef emptyVarSet ;
type_env_var <- newIORef emptyNameEnv ;
dfuns_var <- newIORef emptyNameSet ;
+ keep_var <- newIORef emptyNameSet ;
th_var <- newIORef False ;
let {
tcg_insts = [],
tcg_rules = [],
tcg_fords = [],
- tcg_keep = emptyNameSet
+ tcg_keep = keep_var
} ;
lcl_env = TcLclEnv {
tcl_errs = errs_var,
return (msgs, final_res)
}
where
- init_imports = emptyImportAvails { imp_qual = unitModuleEnv mod emptyAvailEnv }
+ init_imports = emptyImportAvails { imp_env = unitModuleEnv mod emptyNameSet }
-- Initialise tcg_imports with an empty set of bindings for
-- this module, so that if we see 'module M' in the export
-- list, and there are no bindings in M, we don't bleat
recordThUse :: TcM ()
recordThUse = do { env <- getGblEnv; writeMutVar (tcg_th_used env) True }
+keepAliveTc :: Name -> TcM () -- Record the name in the keep-alive set
+keepAliveTc n = do { env <- getGblEnv;
+ ; updMutVar (tcg_keep env) (`addOneToNameSet` n) }
+
+keepAliveSetTc :: NameSet -> TcM () -- Record the name in the keep-alive set
+keepAliveSetTc ns = do { env <- getGblEnv;
+ ; updMutVar (tcg_keep env) (`unionNameSets` ns) }
+
getStage :: TcM ThStage
getStage = do { env <- getLclEnv; return (tcl_th_ctxt env) }
; let { mod = tcg_mod tcg_env
; if_env = IfGblEnv {
if_rec_types = Just (mod, return (tcg_type_env tcg_env)) }
- ; if_lenv = IfLclEnv { if_mod = moduleName mod,
+ ; if_lenv = IfLclEnv { if_mod = mod,
if_tv_env = emptyOccEnv,
if_id_env = emptyOccEnv }
}
initIfaceTc hsc_env iface do_this
= do { tc_env_var <- newIORef emptyTypeEnv
; let { gbl_env = IfGblEnv { if_rec_types = Just (mod, readMutVar tc_env_var) } ;
- ; if_lenv = IfLclEnv { if_mod = moduleName mod,
+ ; if_lenv = IfLclEnv { if_mod = mod,
if_tv_env = emptyOccEnv,
if_id_env = emptyOccEnv }
}
; initTcRnIf 'i' hsc_env gbl_env () do_this
}
-initIfaceLcl :: ModuleName -> IfL a -> IfM lcl a
+initIfaceLcl :: Module -> IfL a -> IfM lcl a
initIfaceLcl mod thing_inside
= setLclEnv (IfLclEnv { if_mod = mod,
if_tv_env = emptyOccEnv,