[project @ 1997-05-19 00:12:10 by sof]
[ghc-hetmet.git] / ghc / compiler / deSugar / DsMonad.lhs
index 38e567a..a29cc5a 100644 (file)
@@ -16,12 +16,11 @@ module DsMonad (
        newFailLocalDs,
        getSrcLocDs, putSrcLocDs,
        getModuleAndGroupDs,
-       extendEnvDs, lookupEnvDs, lookupEnvWithDefaultDs,
+       extendEnvDs, lookupEnvDs, 
        SYN_IE(DsIdEnv),
-       lookupId,
 
        dsShadowWarn, dsIncompleteWarn,
-       DsWarnings(..),
+       SYN_IE(DsWarnings),
        DsMatchContext(..), DsMatchKind(..), pprDsWarnings,
         DsWarnFlavour -- Nuke with 1.4
 
@@ -29,23 +28,27 @@ module DsMonad (
 
 IMP_Ubiq()
 
-import Bag             ( emptyBag, snocBag, bagToList )
+import Bag             ( emptyBag, snocBag, bagToList, Bag )
 import CmdLineOpts     ( opt_SccGroup )
 import CoreSyn         ( SYN_IE(CoreExpr) )
 import CoreUtils       ( substCoreExpr )
 import HsSyn           ( OutPat )
 import Id              ( mkSysLocal, mkIdWithNewUniq,
-                         lookupIdEnv, growIdEnvList, GenId, SYN_IE(IdEnv)
+                         lookupIdEnv, growIdEnvList, GenId, SYN_IE(IdEnv),
+                         SYN_IE(Id)
                        )
 import PprType         ( GenType, GenTyVar )
 import PprStyle                ( PprStyle(..) )
+import Outputable      ( pprQuote, Outputable(..) )
 import Pretty
 import SrcLoc          ( noSrcLoc, SrcLoc )
 import TcHsSyn         ( SYN_IE(TypecheckedPat) )
-import TyVar           ( nullTyVarEnv, cloneTyVar, GenTyVar{-instance Eq-} )
+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) )
+                         mapUs, thenUs, returnUs, SYN_IE(UniqSM),
+                         UniqSupply )
 import Util            ( assoc, mapAccumL, zipWithEqual, panic )
 
 infixr 9 `thenDs`
@@ -128,18 +131,18 @@ mapAndUnzipDs f (x:xs)
 
 zipWithDs :: (a -> b -> DsM c) -> [a] -> [b] -> DsM [c]
 
-zipWithDs f []    [] = returnDs []
+zipWithDs f []    ys = returnDs []
 zipWithDs f (x:xs) (y:ys)
   = f x y              `thenDs` \ r  ->
     zipWithDs f xs ys  `thenDs` \ rs ->
     returnDs (r:rs)
--- Note: crashes if lists not equal length (like zipWithEqual)
 \end{code}
 
 And all this mysterious stuff is so we can occasionally reach out and
 grab one or more names.  @newLocalDs@ isn't exported---exported
 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
@@ -201,41 +204,19 @@ getModuleAndGroupDs us loc mod_and_grp env warns
 \end{code}
 
 \begin{code}
-type DsIdEnv = IdEnv CoreExpr
+type DsIdEnv = IdEnv Id
 
-extendEnvDs :: [(Id, CoreExpr)] -> DsM a -> DsM a
+extendEnvDs :: [(Id, Id)] -> DsM a -> DsM a
 
 extendEnvDs pairs then_do us loc mod_and_grp old_env warns
-  = case splitUniqSupply us        of { (s1, s2) ->
-    let
-       revised_pairs = subst_all pairs s1
-    in
-    then_do s2 loc mod_and_grp (growIdEnvList old_env revised_pairs) warns
-    }
-  where
-    subst_all pairs = mapUs subst pairs
-
-    subst (v, expr)
-      = substCoreExpr old_env nullTyVarEnv expr `thenUs` \ new_expr ->
-       returnUs (v, new_expr)
+  = then_do us loc mod_and_grp (growIdEnvList old_env pairs) warns
 
-lookupEnvDs :: Id -> DsM (Maybe CoreExpr)
+lookupEnvDs :: Id -> DsM Id
 lookupEnvDs id us loc mod_and_grp env warns
-  = (lookupIdEnv env id, warns)
-  -- Note: we don't assert anything about the Id
-  -- being looked up.  There's not really anything
-  -- much to say about it. (WDP 94/06)
-
-lookupEnvWithDefaultDs :: Id -> CoreExpr -> DsM CoreExpr
-lookupEnvWithDefaultDs id deflt us loc mod_and_grp env warns
   = (case (lookupIdEnv env id) of
-      Nothing -> deflt
+      Nothing -> id
       Just xx -> xx,
      warns)
-
-lookupId :: [(Id, a)] -> Id -> a
-lookupId env id
-  = assoc "lookupId" env id
 \end{code}
 
 %************************************************************************
@@ -260,42 +241,43 @@ data DsMatchKind
   | DoBindMatch
   deriving ()
 
-pprDsWarnings :: PprStyle -> DsWarnings -> Pretty
+pprDsWarnings :: PprStyle -> DsWarnings -> Doc
 pprDsWarnings sty warns
-  = ppAboves (map pp_warn (bagToList warns))
+  = vcat (map pp_warn (bagToList warns))
   where
-    pp_warn (flavour, NoMatchContext) = ppSep [ppPStr SLIT("Warning: Some match is"), 
+    pp_warn (flavour, NoMatchContext) = sep [ptext SLIT("Warning: Some match is"), 
                                               case flavour of
-                                                       Shadowed   -> ppPStr SLIT("shadowed")
-                                                       Incomplete -> ppPStr SLIT("possibly incomplete")]
+                                                       Shadowed   -> ptext SLIT("shadowed")
+                                                       Incomplete -> ptext SLIT("possibly incomplete")]
 
     pp_warn (flavour, DsMatchContext kind pats loc)
-       = ppHang (ppBesides [ppr PprForUser loc, ppPStr SLIT(": ")])
-            4 (ppHang msg
+       = hang (hcat [ppr PprForUser loc, ptext SLIT(": ")])
+            4 (hang msg
                     4 (pp_match kind pats))
        where
        msg = case flavour of
-               Shadowed   -> ppPStr SLIT("Warning: Pattern match(es) completely overlapped")     
-               Incomplete -> ppPStr SLIT("Warning: Possibly incomplete patterns")
+               Shadowed   -> ptext SLIT("Warning: Pattern match(es) completely overlapped")     
+               Incomplete -> ptext SLIT("Warning: Possibly incomplete patterns")
 
     pp_match (FunMatch fun) pats
-      = ppCat [ppPStr SLIT("in the definition of function"), ppQuote (ppr sty fun)]
+      = hsep [ptext SLIT("in the definition of function"), ppr sty fun]
 
     pp_match CaseMatch pats
-      = ppHang (ppPStr SLIT("in a group of case alternative beginning:"))
-       4 (ppSep [ppSep (map (ppr sty) pats), pp_arrow_dotdotdot])
+      = hang (ptext SLIT("in a group of case alternatives beginning:"))
+       4 (ppr_pats pats)
 
     pp_match PatBindMatch pats
-      = ppHang (ppPStr SLIT("in a pattern binding:"))
-       4 (ppSep [ppSep (map (ppr sty) pats), pp_arrow_dotdotdot])
+      = hang (ptext SLIT("in a pattern binding:"))
+       4 (ppr_pats pats)
 
     pp_match LambdaMatch pats
-      = ppHang (ppPStr SLIT("in a lambda abstraction:"))
-       4 (ppSep [ppSep (map (ppr sty) pats), pp_arrow_dotdotdot])
+      = hang (ptext SLIT("in a lambda abstraction:"))
+       4 (ppr_pats pats)
 
     pp_match DoBindMatch pats
-      = ppHang (ppPStr SLIT("in a `do' pattern binding:"))
-       4 (ppSep [ppSep (map (ppr sty) pats), pp_arrow_dotdotdot])
+      = hang (ptext SLIT("in a `do' pattern binding:"))
+       4 (ppr_pats pats)
 
-    pp_arrow_dotdotdot = ppPStr SLIT("-> ...")
+    ppr_pats pats = pprQuote sty $ \ sty ->
+                   sep [sep (map (ppr sty) pats), ptext SLIT("-> ...")]
 \end{code}