GlobalRdrEnv, LocalRdrEnv, NameCache, FixityEnv,
GhciMode, lookupType, unQualInScope )
import TcRnTypes
-import Module ( Module, foldModuleEnv )
+import Module ( Module, moduleName, unitModuleEnv, foldModuleEnv )
import Name ( Name, isInternalName )
import Type ( Type )
import NameEnv ( extendNameEnvList )
tcg_ist = mkImpTypeEnv eps hpt,
tcg_inst_env = mkImpInstEnv dflags eps hpt,
tcg_exports = [],
- tcg_imports = emptyImportAvails,
+ tcg_imports = init_imports,
tcg_binds = EmptyMonoBinds,
tcg_deprecs = NoDeprecs,
tcg_insts = [],
eps' <- readIORef eps_var ;
nc' <- readIORef nc_var ;
let { pcs' = PCS { pcs_EPS = eps', pcs_nc = nc' } ;
- final_res | errorsFound msgs = Nothing
- | otherwise = maybe_res } ;
+ final_res | errorsFound dflags msgs = Nothing
+ | otherwise = maybe_res } ;
return (pcs', final_res)
}
where
eps = pcs_EPS pcs
+ init_imports = emptyImportAvails { imp_qual = unitModuleEnv mod emptyAvailEnv }
+ -- 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
+ -- "unknown module M".
+
defaultDefaultTys :: [Type]
defaultDefaultTys = [integerTy, doubleTy]
getGlobalRdrEnv :: TcRn m GlobalRdrEnv
getGlobalRdrEnv = do { env <- getGblEnv; return (tcg_rdr_env env) }
+getImports :: TcRn m ImportAvails
+getImports = do { env <- getGblEnv; return (tcg_imports env) }
+
getFixityEnv :: TcRn m FixityEnv
getFixityEnv = do { env <- getGblEnv; return (tcg_fix_env env) }
\end{code}
\begin{code}
-getUsageVar :: TcRn m (TcRef Usages)
+getUsageVar :: TcRn m (TcRef EntityUsage)
getUsageVar = do { env <- getGblEnv; return (tcg_usages env) }
-getUsages :: TcRn m Usages
+getUsages :: TcRn m EntityUsage
getUsages = do { usg_var <- getUsageVar; readMutVar usg_var }
-updUsages :: (Usages -> Usages) -> TcRn m ()
+updUsages :: (EntityUsage -> EntityUsage) -> TcRn m ()
updUsages upd = do { usg_var <- getUsageVar ;
usg <- readMutVar usg_var ;
writeMutVar usg_var (upd usg) }
env { env_top = top_env { top_errs = v }})
addErr :: Message -> TcRn m ()
-addErr msg = do { loc <- getSrcLocM ; add_err loc msg }
+addErr msg = do { loc <- getSrcLocM ; addErrAt loc msg }
-add_err :: SrcLoc -> Message -> TcRn m ()
-add_err loc msg
+addErrAt :: SrcLoc -> Message -> TcRn m ()
+addErrAt loc msg
= do { errs_var <- getErrsVar ;
rdr_env <- getGlobalRdrEnv ;
let { err = addShortErrLocLine loc (unQualInScope rdr_env) msg } ;
addErrs :: [(SrcLoc,Message)] -> TcRn m ()
addErrs msgs = mappM_ add msgs
where
- add (loc,msg) = add_err loc msg
+ add (loc,msg) = addErrAt loc msg
addWarn :: Message -> TcRn m ()
addWarn msg
\begin{code}
-tryM :: TcRn m a -> TcRn m (Messages, Maybe a)
- -- (try m) executes m, and returns
+recoverM :: TcRn m r -- Recovery action; do this if the main one fails
+ -> TcRn m r -- Main action: do this first
+ -> TcRn m r
+recoverM recover thing
+ = do { mb_res <- tryM thing ;
+ case mb_res of
+ Left exn -> recover
+ Right res -> returnM res }
+
+tryTc :: TcRn m a -> TcRn m (Messages, Maybe a)
+ -- (tryTc m) executes m, and returns
-- Just r, if m succeeds (returning r) and caused no errors
-- Nothing, if m fails, or caused errors
-- It also returns all the errors accumulated by m
-- (even in the Just case, there might be warnings)
--
-- It always succeeds (never raises an exception)
-tryM m
+tryTc m
= do { errs_var <- newMutVar emptyMessages ;
- mb_r <- recoverM (return Nothing)
- (do { r <- setErrsVar errs_var m ;
- return (Just r) }) ;
+ mb_r <- tryM (setErrsVar errs_var m) ;
new_errs <- readMutVar errs_var ;
+ dflags <- getDOpts ;
+
return (new_errs,
case mb_r of
- Nothing -> Nothing
- Just r | errorsFound new_errs -> Nothing
- | otherwise -> Just r)
+ Left exn -> Nothing
+ Right r | errorsFound dflags new_errs -> Nothing
+ | otherwise -> Just r)
}
-tryTc :: TcM a -> TcM (Messages, Maybe a)
--- Just like tryM, except that it ensures that the LIE
+tryTcLIE :: TcM a -> TcM (Messages, Maybe a)
+-- Just like tryTc, except that it ensures that the LIE
-- for the thing is propagated only if there are no errors
-- Hence it's restricted to the type-check monad
-tryTc thing_inside
- = do { ((errs, mb_r), lie) <- getLIE (tryM thing_inside) ;
+tryTcLIE thing_inside
+ = do { ((errs, mb_r), lie) <- getLIE (tryTc thing_inside) ;
ifM (isJust mb_r) (extendLIEs lie) ;
return (errs, mb_r) }
-tryTc_ :: TcM r -> TcM r -> TcM r
+tryTcLIE_ :: TcM r -> TcM r -> TcM r
-- (tryM_ r m) tries m; if it succeeds it returns it,
-- otherwise it returns r. Any error messages added by m are discarded,
-- whether or not m succeeds.
-tryTc_ recover main
- = do { (_msgs, mb_res) <- tryTc main ;
+tryTcLIE_ recover main
+ = do { (_msgs, mb_res) <- tryTcLIE main ;
case mb_res of
Just res -> return res
Nothing -> recover }
-- If so, it fails too.
-- Regardless, any errors generated by m are propagated to the enclosing context.
checkNoErrs main
- = do { (msgs, mb_res) <- tryTc main ;
+ = do { (msgs, mb_res) <- tryTcLIE main ;
addMessages msgs ;
case mb_res of
Just r -> return r
ifErrsM bale_out normal
= do { errs_var <- getErrsVar ;
msgs <- readMutVar errs_var ;
- if errorsFound msgs then
+ dflags <- getDOpts ;
+ if errorsFound dflags msgs then
bale_out
else
normal }
= do { us <- newUniqueSupply ;
unsafeInterleaveM $
do { us_var <- newMutVar us ;
- (msgs, mb_res) <- tryTc (setUsVar us_var thing_inside) ;
+ (msgs, mb_res) <- tryTcLIE (setUsVar us_var thing_inside) ;
case mb_res of
Just r -> return (Just r)
Nothing -> do {
traceTc, traceRn :: SDoc -> TcRn a ()
traceRn = dumpOptTcRn Opt_D_dump_rn_trace
traceTc = dumpOptTcRn Opt_D_dump_tc_trace
+traceSplice = dumpOptTcRn Opt_D_dump_splices
traceHiDiffs = dumpOptTcRn Opt_D_dump_hi_diffs
dumpOptTcRn :: DynFlag -> SDoc -> TcRn a ()
\begin{code}
add_err_tcm tidy_env err_msg loc ctxt
= do { ctxt_msgs <- do_ctxt tidy_env ctxt ;
- add_err loc (vcat (err_msg : ctxt_to_use ctxt_msgs)) }
+ addErrAt loc (vcat (err_msg : ctxt_to_use ctxt_msgs)) }
do_ctxt tidy_env []
= return []