module DsMonad (
DsM, mapM, mapAndUnzipM,
initDs, initDsTc, fixDs,
- foldlM, foldrM, ifOptM,
+ foldlM, foldrM, ifOptM, unsetOptM,
Applicative(..),(<$>),
- newTyVarsDs, newLocalName,
+ newLocalName,
duplicateLocalDs, newSysLocalDs, newSysLocalsDs, newUniqueId,
- newFailLocalDs,
+ newFailLocalDs, newPredVarDs,
getSrcSpanDs, putSrcSpanDs,
getModuleDs,
newUnique,
DsMetaEnv, DsMetaVal(..), dsLookupMetaEnv, dsExtendMetaEnv,
+ dsLoadModule,
+
-- Warnings
DsWarning, warnDs, failWithDs,
CanItFail(..), orFail
) where
-#include "HsVersions.h"
-
import TcRnMonad
import CoreSyn
import HsSyn
import TcIface
+import LoadIface
import RdrName
import HscTypes
import Bag
import UniqSupply
import Name
import NameEnv
-import OccName
import DynFlags
import ErrUtils
-import MonadUtils
+import FastString
import Data.IORef
\end{code}
= EqnInfo { eqn_pats :: [Pat Id], -- The patterns for an eqn
eqn_rhs :: MatchResult } -- What to do after match
+instance Outputable EquationInfo where
+ ppr (EqnInfo pats _) = ppr pats
+
type DsWrapper = CoreExpr -> CoreExpr
idDsWrapper :: DsWrapper
idDsWrapper e = e
initDs :: HscEnv
-> Module -> GlobalRdrEnv -> TypeEnv
-> DsM a
- -> IO (Maybe a)
+ -> IO (Messages, Maybe a)
-- Print errors and warnings, if any arise
initDs hsc_env mod rdr_env type_env thing_inside
-- Display any errors and warnings
-- Note: if -Werror is used, we don't signal an error here.
; msgs <- readIORef msg_var
- ; printErrorsAndWarnings dflags msgs
; let final_res | errorsFound dflags msgs = Nothing
| otherwise = case either_res of
-- a UserError exception. Then it should have put an error
-- message in msg_var, so we just discard the exception
- ; return final_res }
+ ; return (msgs, final_res) }
initDsTc :: DsM a -> TcM a
initDsTc thing_inside
mkDsEnvs dflags mod rdr_env type_env msg_var
= do -- TODO: unnecessarily monadic
let if_genv = IfGblEnv { if_rec_types = Just (mod, return type_env) }
- if_lenv = mkIfLclEnv mod (ptext SLIT("GHC error in desugarer lookup in") <+> ppr mod)
+ if_lenv = mkIfLclEnv mod (ptext (sLit "GHC error in desugarer lookup in") <+> ppr mod)
gbl_env = DsGblEnv { ds_mod = mod,
ds_if_env = (if_genv, if_lenv),
ds_unqual = mkPrintUnqualified dflags rdr_env,
ds_loc = noSrcSpan }
return (gbl_env, lcl_env)
-
\end{code}
%************************************************************************
\begin{code}
-- Make a new Id with the same print name, but different type, and new unique
-newUniqueId :: Name -> Type -> DsM Id
-newUniqueId id ty = do
- uniq <- newUnique
- return (mkSysLocal (occNameFS (nameOccName id)) uniq ty)
+newUniqueId :: Id -> Type -> DsM Id
+newUniqueId id = mkSysLocalM (occNameFS (nameOccName (idName id)))
duplicateLocalDs :: Id -> DsM Id
-duplicateLocalDs old_local = do
- uniq <- newUnique
- return (setIdUnique old_local uniq)
-
+duplicateLocalDs old_local
+ = do { uniq <- newUnique
+ ; return (setIdUnique old_local uniq) }
+
+newPredVarDs :: PredType -> DsM Var
+newPredVarDs pred
+ | isEqPred pred
+ = do { uniq <- newUnique;
+ ; let name = mkSystemName uniq (mkOccNameFS tcName (fsLit "co_pv"))
+ kind = mkPredTy pred
+ ; return (mkCoVar name kind) }
+ | otherwise
+ = newSysLocalDs (mkPredTy pred)
+
newSysLocalDs, newFailLocalDs :: Type -> DsM Id
-newSysLocalDs ty = do
- uniq <- newUnique
- return (mkSysLocal FSLIT("ds") uniq ty)
+newSysLocalDs = mkSysLocalM (fsLit "ds")
+newFailLocalDs = mkSysLocalM (fsLit "fail")
newSysLocalsDs :: [Type] -> DsM [Id]
newSysLocalsDs tys = mapM newSysLocalDs tys
-
-newFailLocalDs ty = do
- uniq <- newUnique
- return (mkSysLocal FSLIT("fail") uniq ty)
- -- The UserLocal bit just helps make the code a little clearer
-\end{code}
-
-\begin{code}
-newTyVarsDs :: [TyVar] -> DsM [TyVar]
-newTyVarsDs tyvar_tmpls = do
- uniqs <- newUniqueSupply
- return (zipWith setTyVarUnique tyvar_tmpls (uniqsFromSupply uniqs))
\end{code}
We can also reach out and either set/grab location information from
warnDs warn = do { env <- getGblEnv
; loc <- getSrcSpanDs
; let msg = mkWarnMsg loc (ds_unqual env)
- (ptext SLIT("Warning:") <+> warn)
+ (ptext (sLit "Warning:") <+> warn)
; updMutVar (ds_msgs env) (\ (w,e) -> (w `snocBag` msg, e)) }
- where
failWithDs :: SDoc -> DsM a
failWithDs err
; let msg = mkErrMsg loc (ds_unqual env) err
; updMutVar (ds_msgs env) (\ (w,e) -> (w, e `snocBag` msg))
; failM }
- where
\end{code}
\begin{code}
+instance MonadThings (IOEnv (Env DsGblEnv DsLclEnv)) where
+ lookupThing = dsLookupGlobal
+
dsLookupGlobal :: Name -> DsM TyThing
-- Very like TcEnv.tcLookupGlobal
dsLookupGlobal name
dsExtendMetaEnv menv thing_inside
= updLclEnv (\env -> env { ds_meta = ds_meta env `plusNameEnv` menv }) thing_inside
\end{code}
+
+\begin{code}
+dsLoadModule :: SDoc -> Module -> DsM ()
+dsLoadModule doc mod
+ = do { env <- getGblEnv
+ ; setEnvs (ds_if_env env)
+ (loadSysInterface doc mod >> return ())
+ }
+\end{code}
+