Desugar multiple polymorphic bindings more intelligently
[ghc-hetmet.git] / compiler / deSugar / DsMonad.lhs
index 2cab8be..3bb1493 100644 (file)
@@ -6,16 +6,9 @@
 @DsMonad@: monadery used in desugaring
 
 \begin{code}
-{-# OPTIONS -w #-}
--- The above warning supression flag is a temporary kludge.
--- While working on this module you are encouraged to remove it and fix
--- any warnings in the module. See
---     http://hackage.haskell.org/trac/ghc/wiki/Commentary/CodingStyle#Warnings
--- for details
-
 module DsMonad (
        DsM, mapM, mapAndUnzipM,
-       initDs, initDsTc, fixDs, mapAndUnzipM,
+       initDs, initDsTc, fixDs,
        foldlM, foldrM, ifOptM,
        Applicative(..),(<$>),
 
@@ -41,8 +34,6 @@ module DsMonad (
        CanItFail(..), orFail
     ) where
 
-#include "HsVersions.h"
-
 import TcRnMonad
 import CoreSyn
 import HsSyn
@@ -66,6 +57,7 @@ import OccName
 import DynFlags
 import ErrUtils
 import MonadUtils
+import FastString
 
 import Data.IORef
 \end{code}
@@ -86,7 +78,11 @@ data EquationInfo
   = 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
 
 -- The semantics of (match vs (EqnInfo wrap pats rhs)) is the MatchResult
@@ -105,8 +101,9 @@ data MatchResult
 
 data CanItFail = CanFail | CantFail
 
+orFail :: CanItFail -> CanItFail -> CanItFail
 orFail CantFail CantFail = CantFail
-orFail _        _       = CanFail
+orFail _        _        = CanFail
 \end{code}
 
 
@@ -123,6 +120,7 @@ presumably include source-file location information:
 type DsM result = TcRnIf DsGblEnv DsLclEnv result
 
 -- Compatibility functions
+fixDs :: (a -> DsM a) -> DsM a
 fixDs    = fixM
 
 type DsWarning = (SrcSpan, SDoc)
@@ -197,10 +195,9 @@ initDsTc thing_inside
 
 mkDsEnvs :: DynFlags -> Module -> GlobalRdrEnv -> TypeEnv -> IORef Messages -> IO (DsGblEnv, DsLclEnv)
 mkDsEnvs dflags mod rdr_env type_env msg_var
-  = do 
-       sites_var <- newIORef []
+  = 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,
@@ -238,13 +235,14 @@ duplicateLocalDs old_local = do
 newSysLocalDs, newFailLocalDs :: Type -> DsM Id
 newSysLocalDs ty = do
     uniq <- newUnique
-    return (mkSysLocal FSLIT("ds") uniq ty)
+    return (mkSysLocal (fsLit "ds") uniq ty)
 
+newSysLocalsDs :: [Type] -> DsM [Id]
 newSysLocalsDs tys = mapM newSysLocalDs tys
 
 newFailLocalDs ty = do
     uniq <- newUnique
-    return (mkSysLocal FSLIT("fail") uniq ty)
+    return (mkSysLocal (fsLit "fail") uniq ty)
        -- The UserLocal bit just helps make the code a little clearer
 \end{code}
 
@@ -281,7 +279,7 @@ warnDs :: SDoc -> DsM ()
 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