module DsMonad (
DsM, mapM, mapAndUnzipM,
initDs, initDsTc, fixDs,
- foldlM, foldrM, ifOptM,
+ foldlM, foldrM, ifDOptM, unsetOptM,
Applicative(..),(<$>),
newLocalName,
duplicateLocalDs, newSysLocalDs, newSysLocalsDs, newUniqueId,
- newFailLocalDs,
+ newFailLocalDs, newPredVarDs,
getSrcSpanDs, putSrcSpanDs,
getModuleDs,
newUnique,
DsMetaEnv, DsMetaVal(..), dsLookupMetaEnv, dsExtendMetaEnv,
+ dsLoadModule,
+
-- Warnings
DsWarning, warnDs, failWithDs,
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
\begin{code}
data DsMatchContext
= DsMatchContext (HsMatchContext Name) SrcSpan
- | NoMatchContext
deriving ()
data EquationInfo
\begin{code}
-- Make a new Id with the same print name, but different type, and new unique
-newUniqueId :: Name -> Type -> DsM Id
-newUniqueId id = mkSysLocalM (occNameFS (nameOccName id))
+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 = mkSysLocalM (fsLit "ds")
+newSysLocalDs = mkSysLocalM (fsLit "ds")
newFailLocalDs = mkSysLocalM (fsLit "fail")
newSysLocalsDs :: [Type] -> DsM [Id]
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}
+