X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Fcompiler%2FdeSugar%2FDsMonad.lhs;h=ae58ca9eb6663cb1a38660e4d3316ec3f69d53cc;hb=1f3a9da2d3b6dcaf0634b3d4f5dbe54f069eebb8;hp=53c9f7db9b29881129d72d1d233daee2c75cd041;hpb=438596897ebbe25a07e1c82085cfbc5bdb00f09e;p=ghc-hetmet.git diff --git a/ghc/compiler/deSugar/DsMonad.lhs b/ghc/compiler/deSugar/DsMonad.lhs index 53c9f7d..ae58ca9 100644 --- a/ghc/compiler/deSugar/DsMonad.lhs +++ b/ghc/compiler/deSugar/DsMonad.lhs @@ -13,36 +13,36 @@ module DsMonad ( duplicateLocalDs, newSysLocalDs, newSysLocalsDs, newFailLocalDs, getSrcLocDs, putSrcLocDs, - getModuleAndGroupDs, + getModuleDs, getUniqueDs, dsLookupGlobalValue, - GlobalValueEnv, + ValueEnv, dsWarn, DsWarnings, - DsMatchContext(..), DsMatchKind(..), pprDsWarnings + DsMatchContext(..), DsMatchKind(..) ) where #include "HsVersions.h" import Bag ( emptyBag, snocBag, bagToList, Bag ) -import BasicTypes ( Module ) -import ErrUtils ( WarnMsg ) +import ErrUtils ( WarnMsg, pprBagOfErrors ) import HsSyn ( OutPat ) -import Id ( mkUserLocal, mkSysLocal, setIdUnique, Id ) -import Name ( Name, varOcc, maybeWiredInIdName ) +import Id ( mkSysLocal, setIdUnique, Id ) +import Module ( Module ) +import Name ( Name, maybeWiredInIdName ) import Var ( TyVar, setTyVarUnique ) import VarEnv import Outputable import SrcLoc ( noSrcLoc, SrcLoc ) import TcHsSyn ( TypecheckedPat ) -import TcEnv ( GlobalValueEnv ) +import TcEnv ( ValueEnv ) import Type ( Type ) -import UniqSupply ( initUs, splitUniqSupply, uniqFromSupply, uniqsFromSupply, +import UniqSupply ( initUs_, splitUniqSupply, uniqFromSupply, uniqsFromSupply, UniqSM, UniqSupply ) import Unique ( Unique ) -import UniqFM ( lookupWithDefaultUFM ) -import Util ( zipWithEqual, panic ) +import UniqFM ( lookupWithDefaultUFM_Directly ) +import Util ( zipWithEqual ) infixr 9 `thenDs` \end{code} @@ -53,17 +53,15 @@ presumably include source-file location information: \begin{code} type DsM result = UniqSupply - -> GlobalValueEnv + -> ValueEnv -> SrcLoc -- to put in pattern-matching error msgs - -> (Module, Group) -- module + group name : for SCC profiling + -> Module -- module: for SCC profiling -> DsWarnings -> (result, DsWarnings) type DsWarnings = Bag WarnMsg -- The desugarer reports matches which are -- completely shadowed or incomplete patterns -type Group = FAST_STRING - {-# INLINE andDs #-} {-# INLINE thenDs #-} {-# INLINE returnDs #-} @@ -71,30 +69,30 @@ type Group = FAST_STRING -- initDs returns the UniqSupply out the end (not just the result) initDs :: UniqSupply - -> GlobalValueEnv - -> (Module, Group) -- module name: for profiling; (group name: from switches) + -> ValueEnv + -> Module -- module name: for profiling -> DsM a -> (a, DsWarnings) -initDs init_us genv module_and_group action - = action init_us genv noSrcLoc module_and_group emptyBag +initDs init_us genv mod action + = action init_us genv noSrcLoc mod emptyBag thenDs :: DsM a -> (a -> DsM b) -> DsM b andDs :: (a -> a -> a) -> DsM a -> DsM a -> DsM a -thenDs m1 m2 us genv loc mod_and_grp warns +thenDs m1 m2 us genv loc mod warns = case splitUniqSupply us of { (s1, s2) -> - case (m1 s1 genv loc mod_and_grp warns) of { (result, warns1) -> - m2 result s2 genv loc mod_and_grp warns1}} + case (m1 s1 genv loc mod warns) of { (result, warns1) -> + m2 result s2 genv loc mod warns1}} -andDs combiner m1 m2 us genv loc mod_and_grp warns +andDs combiner m1 m2 us genv loc mod warns = case splitUniqSupply us of { (s1, s2) -> - case (m1 s1 genv loc mod_and_grp warns) of { (result1, warns1) -> - case (m2 s2 genv loc mod_and_grp warns1) of { (result2, warns2) -> + case (m1 s1 genv loc mod warns) of { (result1, warns1) -> + case (m2 s2 genv loc mod warns1) of { (result2, warns2) -> (combiner result1 result2, warns2) }}} returnDs :: a -> DsM a -returnDs result us genv loc mod_and_grp warns = (result, warns) +returnDs result us genv loc mod warns = (result, warns) listDs :: [DsM a] -> DsM [a] listDs [] = returnDs [] @@ -141,29 +139,29 @@ it easier to read debugging output. \begin{code} newSysLocalDs, newFailLocalDs :: Type -> DsM Id -newSysLocalDs ty us genv loc mod_and_grp warns +newSysLocalDs ty us genv loc mod warns = case uniqFromSupply us of { assigned_uniq -> - (mkSysLocal assigned_uniq ty, warns) } + (mkSysLocal SLIT("ds") assigned_uniq ty, warns) } newSysLocalsDs tys = mapDs newSysLocalDs tys -newFailLocalDs ty us genv loc mod_and_grp warns +newFailLocalDs ty us genv loc mod warns = case uniqFromSupply us of { assigned_uniq -> - (mkUserLocal (varOcc SLIT("fail")) assigned_uniq ty, warns) } + (mkSysLocal SLIT("fail") assigned_uniq ty, warns) } -- The UserLocal bit just helps make the code a little clearer getUniqueDs :: DsM Unique -getUniqueDs us genv loc mod_and_grp warns +getUniqueDs us genv loc mod warns = case (uniqFromSupply us) of { assigned_uniq -> (assigned_uniq, warns) } duplicateLocalDs :: Id -> DsM Id -duplicateLocalDs old_local us genv loc mod_and_grp warns +duplicateLocalDs old_local us genv loc mod warns = case uniqFromSupply us of { assigned_uniq -> (setIdUnique old_local assigned_uniq, warns) } cloneTyVarsDs :: [TyVar] -> DsM [TyVar] -cloneTyVarsDs tyvars us genv loc mod_and_grp warns +cloneTyVarsDs tyvars us genv loc mod warns = case uniqsFromSupply (length tyvars) us of { uniqs -> (zipWithEqual "cloneTyVarsDs" setTyVarUnique tyvars uniqs, warns) } \end{code} @@ -171,7 +169,7 @@ cloneTyVarsDs tyvars us genv loc mod_and_grp warns \begin{code} newTyVarsDs :: [TyVar] -> DsM [TyVar] -newTyVarsDs tyvar_tmpls us genv loc mod_and_grp warns +newTyVarsDs tyvar_tmpls us genv loc mod warns = case uniqsFromSupply (length tyvar_tmpls) us of { uniqs -> (zipWithEqual "newTyVarsDs" setTyVarUnique tyvar_tmpls uniqs, warns) } \end{code} @@ -181,42 +179,39 @@ the @SrcLoc@ being carried around. \begin{code} uniqSMtoDsM :: UniqSM a -> DsM a -uniqSMtoDsM u_action us genv loc mod_and_grp warns - = (initUs us u_action, warns) +uniqSMtoDsM u_action us genv loc mod warns + = (initUs_ us u_action, warns) getSrcLocDs :: DsM SrcLoc -getSrcLocDs us genv loc mod_and_grp warns +getSrcLocDs us genv loc mod warns = (loc, warns) putSrcLocDs :: SrcLoc -> DsM a -> DsM a -putSrcLocDs new_loc expr us genv old_loc mod_and_grp warns - = expr us genv new_loc mod_and_grp warns +putSrcLocDs new_loc expr us genv old_loc mod warns + = expr us genv new_loc mod warns dsWarn :: WarnMsg -> DsM () -dsWarn warn us genv loc mod_and_grp warns = ((), warns `snocBag` warn) +dsWarn warn us genv loc mod warns = ((), warns `snocBag` warn) \end{code} \begin{code} -getModuleAndGroupDs :: DsM (FAST_STRING, FAST_STRING) -getModuleAndGroupDs us genv loc mod_and_grp warns - = (mod_and_grp, warns) +getModuleDs :: DsM Module +getModuleDs us genv loc mod warns = (mod, warns) \end{code} \begin{code} -dsLookupGlobalValue :: Name -> DsM Id -dsLookupGlobalValue name us genv loc mod_and_grp warns - = case maybeWiredInIdName name of - Just id -> (id, warns) - Nothing -> (lookupWithDefaultUFM genv def name, warns) +dsLookupGlobalValue :: Unique -> DsM Id +dsLookupGlobalValue key us genv loc mod warns + = (lookupWithDefaultUFM_Directly genv def key, warns) where - def = pprPanic "tcLookupGlobalValue:" (ppr name) + def = pprPanic "tcLookupGlobalValue:" (ppr key) \end{code} %************************************************************************ %* * -%* type synonym EquationInfo and access functions for its pieces * +\subsection{Type synonym @EquationInfo@ and access functions for its pieces} %* * %************************************************************************ @@ -234,8 +229,6 @@ data DsMatchKind | DoBindMatch | ListCompMatch | LetMatch + | RecUpdMatch deriving () - -pprDsWarnings :: DsWarnings -> SDoc -pprDsWarnings warns = vcat (bagToList warns) \end{code}