X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Fcompiler%2FdeSugar%2FDsMonad.lhs;h=53c9f7db9b29881129d72d1d233daee2c75cd041;hb=438596897ebbe25a07e1c82085cfbc5bdb00f09e;hp=3428be64465324c973a2cb5a722228066016cb10;hpb=44f98be5b3bc7aaf2c5961667b16ee8eca3e67c1;p=ghc-hetmet.git diff --git a/ghc/compiler/deSugar/DsMonad.lhs b/ghc/compiler/deSugar/DsMonad.lhs index 3428be6..53c9f7d 100644 --- a/ghc/compiler/deSugar/DsMonad.lhs +++ b/ghc/compiler/deSugar/DsMonad.lhs @@ -1,55 +1,48 @@ % -% (c) The GRASP/AQUA Project, Glasgow University, 1992-1996 +% (c) The GRASP/AQUA Project, Glasgow University, 1992-1998 % \section[DsMonad]{@DsMonad@: monadery used in desugaring} \begin{code} -#include "HsVersions.h" - module DsMonad ( - SYN_IE(DsM), + DsM, initDs, returnDs, thenDs, andDs, mapDs, listDs, - mapAndUnzipDs, zipWithDs, + mapAndUnzipDs, zipWithDs, foldlDs, uniqSMtoDsM, newTyVarsDs, cloneTyVarsDs, duplicateLocalDs, newSysLocalDs, newSysLocalsDs, newFailLocalDs, getSrcLocDs, putSrcLocDs, getModuleAndGroupDs, - extendEnvDs, lookupEnvDs, - SYN_IE(DsIdEnv), - - dsShadowWarn, dsIncompleteWarn, - SYN_IE(DsWarnings), - DsMatchContext(..), DsMatchKind(..), pprDsWarnings, - DsWarnFlavour -- Nuke with 1.4 + getUniqueDs, + dsLookupGlobalValue, + GlobalValueEnv, + dsWarn, + DsWarnings, + DsMatchContext(..), DsMatchKind(..), pprDsWarnings ) where -IMP_Ubiq() +#include "HsVersions.h" import Bag ( emptyBag, snocBag, bagToList, Bag ) -import BasicTypes ( SYN_IE(Module) ) -import CmdLineOpts ( opt_PprUserLength ) -import CoreSyn ( SYN_IE(CoreExpr) ) -import CoreUtils ( substCoreExpr ) +import BasicTypes ( Module ) +import ErrUtils ( WarnMsg ) import HsSyn ( OutPat ) -import Id ( mkSysLocal, mkIdWithNewUniq, - lookupIdEnv, growIdEnvList, GenId, SYN_IE(IdEnv), - SYN_IE(Id) - ) -import PprType ( GenType, GenTyVar ) -import Outputable ( pprQuote, Outputable(..), PprStyle(..) ) -import Pretty +import Id ( mkUserLocal, mkSysLocal, setIdUnique, Id ) +import Name ( Name, varOcc, maybeWiredInIdName ) +import Var ( TyVar, setTyVarUnique ) +import VarEnv +import Outputable import SrcLoc ( noSrcLoc, SrcLoc ) -import TcHsSyn ( SYN_IE(TypecheckedPat) ) -import Type ( SYN_IE(Type) ) -import TyVar ( nullTyVarEnv, cloneTyVar, GenTyVar{-instance Eq-}, SYN_IE(TyVar) ) -import Unique ( Unique{-instances-} ) -import UniqSupply ( splitUniqSupply, getUnique, getUniques, - mapUs, thenUs, returnUs, SYN_IE(UniqSM), - UniqSupply ) -import Util ( assoc, mapAccumL, zipWithEqual, panic ) +import TcHsSyn ( TypecheckedPat ) +import TcEnv ( GlobalValueEnv ) +import Type ( Type ) +import UniqSupply ( initUs, splitUniqSupply, uniqFromSupply, uniqsFromSupply, + UniqSM, UniqSupply ) +import Unique ( Unique ) +import UniqFM ( lookupWithDefaultUFM ) +import Util ( zipWithEqual, panic ) infixr 9 `thenDs` \end{code} @@ -60,14 +53,13 @@ presumably include source-file location information: \begin{code} type DsM result = UniqSupply + -> GlobalValueEnv -> SrcLoc -- to put in pattern-matching error msgs -> (Module, Group) -- module + group name : for SCC profiling - -> DsIdEnv -> DsWarnings -> (result, DsWarnings) -type DsWarnings = Bag (DsWarnFlavour, DsMatchContext) - -- The desugarer reports matches which are +type DsWarnings = Bag WarnMsg -- The desugarer reports matches which are -- completely shadowed or incomplete patterns type Group = FAST_STRING @@ -79,30 +71,30 @@ type Group = FAST_STRING -- initDs returns the UniqSupply out the end (not just the result) initDs :: UniqSupply - -> DsIdEnv + -> GlobalValueEnv -> (Module, Group) -- module name: for profiling; (group name: from switches) -> DsM a -> (a, DsWarnings) -initDs init_us env module_and_group action - = action init_us noSrcLoc module_and_group env emptyBag +initDs init_us genv module_and_group action + = action init_us genv noSrcLoc module_and_group emptyBag thenDs :: DsM a -> (a -> DsM b) -> DsM b andDs :: (a -> a -> a) -> DsM a -> DsM a -> DsM a -thenDs m1 m2 us loc mod_and_grp env warns +thenDs m1 m2 us genv loc mod_and_grp warns = case splitUniqSupply us of { (s1, s2) -> - case (m1 s1 loc mod_and_grp env warns) of { (result, warns1) -> - m2 result s2 loc mod_and_grp env warns1}} + case (m1 s1 genv loc mod_and_grp warns) of { (result, warns1) -> + m2 result s2 genv loc mod_and_grp warns1}} -andDs combiner m1 m2 us loc mod_and_grp env warns +andDs combiner m1 m2 us genv loc mod_and_grp warns = case splitUniqSupply us of { (s1, s2) -> - case (m1 s1 loc mod_and_grp env warns) of { (result1, warns1) -> - case (m2 s2 loc mod_and_grp env warns1) of { (result2, warns2) -> + case (m1 s1 genv loc mod_and_grp warns) of { (result1, warns1) -> + case (m2 s2 genv loc mod_and_grp warns1) of { (result2, warns2) -> (combiner result1 result2, warns2) }}} returnDs :: a -> DsM a -returnDs result us loc mod_and_grp env warns = (result, warns) +returnDs result us genv loc mod_and_grp warns = (result, warns) listDs :: [DsM a] -> DsM [a] listDs [] = returnDs [] @@ -119,6 +111,12 @@ mapDs f (x:xs) mapDs f xs `thenDs` \ rs -> returnDs (r:rs) +foldlDs :: (a -> b -> DsM a) -> a -> [b] -> DsM a + +foldlDs k z [] = returnDs z +foldlDs k z (x:xs) = k z x `thenDs` \ r -> + foldlDs k r xs + mapAndUnzipDs :: (a -> DsM (b, c)) -> [a] -> DsM ([b], [c]) mapAndUnzipDs f [] = returnDs ([], []) @@ -142,32 +140,40 @@ functions are defined with it. The difference in name-strings makes it easier to read debugging output. \begin{code} -newLocalDs :: FAST_STRING -> Type -> DsM Id -newLocalDs nm ty us loc mod_and_grp env warns - = case (getUnique us) of { assigned_uniq -> - (mkSysLocal nm assigned_uniq ty loc, warns) } +newSysLocalDs, newFailLocalDs :: Type -> DsM Id +newSysLocalDs ty us genv loc mod_and_grp warns + = case uniqFromSupply us of { assigned_uniq -> + (mkSysLocal assigned_uniq ty, warns) } + +newSysLocalsDs tys = mapDs newSysLocalDs tys + +newFailLocalDs ty us genv loc mod_and_grp warns + = case uniqFromSupply us of { assigned_uniq -> + (mkUserLocal (varOcc SLIT("fail")) assigned_uniq ty, warns) } + -- The UserLocal bit just helps make the code a little clearer -newSysLocalDs = newLocalDs SLIT("ds") -newSysLocalsDs tys = mapDs (newLocalDs SLIT("ds")) tys -newFailLocalDs = newLocalDs SLIT("fail") +getUniqueDs :: DsM Unique +getUniqueDs us genv loc mod_and_grp warns + = case (uniqFromSupply us) of { assigned_uniq -> + (assigned_uniq, warns) } duplicateLocalDs :: Id -> DsM Id -duplicateLocalDs old_local us loc mod_and_grp env warns - = case (getUnique us) of { assigned_uniq -> - (mkIdWithNewUniq old_local assigned_uniq, warns) } +duplicateLocalDs old_local us genv loc mod_and_grp warns + = case uniqFromSupply us of { assigned_uniq -> + (setIdUnique old_local assigned_uniq, warns) } cloneTyVarsDs :: [TyVar] -> DsM [TyVar] -cloneTyVarsDs tyvars us loc mod_and_grp env warns - = case (getUniques (length tyvars) us) of { uniqs -> - (zipWithEqual "cloneTyVarsDs" cloneTyVar tyvars uniqs, warns) } +cloneTyVarsDs tyvars us genv loc mod_and_grp warns + = case uniqsFromSupply (length tyvars) us of { uniqs -> + (zipWithEqual "cloneTyVarsDs" setTyVarUnique tyvars uniqs, warns) } \end{code} \begin{code} newTyVarsDs :: [TyVar] -> DsM [TyVar] -newTyVarsDs tyvar_tmpls us loc mod_and_grp env warns - = case (getUniques (length tyvar_tmpls) us) of { uniqs -> - (zipWithEqual "newTyVarsDs" cloneTyVar tyvar_tmpls uniqs, warns) } +newTyVarsDs tyvar_tmpls us genv loc mod_and_grp warns + = case uniqsFromSupply (length tyvar_tmpls) us of { uniqs -> + (zipWithEqual "newTyVarsDs" setTyVarUnique tyvar_tmpls uniqs, warns) } \end{code} We can also reach out and either set/grab location information from @@ -175,48 +181,39 @@ the @SrcLoc@ being carried around. \begin{code} uniqSMtoDsM :: UniqSM a -> DsM a -uniqSMtoDsM u_action us loc mod_and_grp env warns - = (u_action us, warns) +uniqSMtoDsM u_action us genv loc mod_and_grp warns + = (initUs us u_action, warns) getSrcLocDs :: DsM SrcLoc -getSrcLocDs us loc mod_and_grp env warns +getSrcLocDs us genv loc mod_and_grp warns = (loc, warns) putSrcLocDs :: SrcLoc -> DsM a -> DsM a -putSrcLocDs new_loc expr us old_loc mod_and_grp env warns - = expr us new_loc mod_and_grp env warns +putSrcLocDs new_loc expr us genv old_loc mod_and_grp warns + = expr us genv new_loc mod_and_grp warns -dsShadowWarn :: DsMatchContext -> DsM () -dsShadowWarn cxt us loc mod_and_grp env warns - = ((), warns `snocBag` (Shadowed, cxt)) +dsWarn :: WarnMsg -> DsM () +dsWarn warn us genv loc mod_and_grp warns = ((), warns `snocBag` warn) -dsIncompleteWarn :: DsMatchContext -> DsM () -dsIncompleteWarn cxt us loc mod_and_grp env warns - = ((), warns `snocBag` (Incomplete, cxt)) \end{code} \begin{code} getModuleAndGroupDs :: DsM (FAST_STRING, FAST_STRING) -getModuleAndGroupDs us loc mod_and_grp env warns +getModuleAndGroupDs us genv loc mod_and_grp warns = (mod_and_grp, warns) \end{code} \begin{code} -type DsIdEnv = IdEnv Id - -extendEnvDs :: [(Id, Id)] -> DsM a -> DsM a - -extendEnvDs pairs then_do us loc mod_and_grp old_env warns - = then_do us loc mod_and_grp (growIdEnvList old_env pairs) warns - -lookupEnvDs :: Id -> DsM Id -lookupEnvDs id us loc mod_and_grp env warns - = (case (lookupIdEnv env id) of - Nothing -> id - Just xx -> xx, - warns) +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) + where + def = pprPanic "tcLookupGlobalValue:" (ppr name) \end{code} + %************************************************************************ %* * %* type synonym EquationInfo and access functions for its pieces * @@ -224,8 +221,6 @@ lookupEnvDs id us loc mod_and_grp env warns %************************************************************************ \begin{code} -data DsWarnFlavour = Shadowed | Incomplete deriving () - data DsMatchContext = DsMatchContext DsMatchKind [TypecheckedPat] SrcLoc | NoMatchContext @@ -237,45 +232,10 @@ data DsMatchKind | LambdaMatch | PatBindMatch | DoBindMatch + | ListCompMatch + | LetMatch deriving () -pprDsWarnings :: PprStyle -> DsWarnings -> Doc -pprDsWarnings sty warns - = vcat (map pp_warn (bagToList warns)) - where - pp_warn (flavour, NoMatchContext) = sep [ptext SLIT("Warning: Some match is"), - case flavour of - Shadowed -> ptext SLIT("shadowed") - Incomplete -> ptext SLIT("possibly incomplete")] - - pp_warn (flavour, DsMatchContext kind pats loc) - = hang (hcat [ppr (PprForUser opt_PprUserLength) loc, ptext SLIT(": ")]) - 4 (hang msg - 4 (pp_match kind pats)) - where - msg = case flavour of - Shadowed -> ptext SLIT("Warning: Pattern match(es) completely overlapped") - Incomplete -> ptext SLIT("Warning: Possibly incomplete patterns") - - pp_match (FunMatch fun) pats - = hsep [ptext SLIT("in the definition of function"), ppr sty fun] - - pp_match CaseMatch pats - = hang (ptext SLIT("in a group of case alternatives beginning:")) - 4 (ppr_pats pats) - - pp_match PatBindMatch pats - = hang (ptext SLIT("in a pattern binding:")) - 4 (ppr_pats pats) - - pp_match LambdaMatch pats - = hang (ptext SLIT("in a lambda abstraction:")) - 4 (ppr_pats pats) - - pp_match DoBindMatch pats - = hang (ptext SLIT("in a `do' pattern binding:")) - 4 (ppr_pats pats) - - ppr_pats pats = pprQuote sty $ \ sty -> - sep [sep (map (ppr sty) pats), ptext SLIT("-> ...")] +pprDsWarnings :: DsWarnings -> SDoc +pprDsWarnings warns = vcat (bagToList warns) \end{code}