[project @ 2000-10-11 16:45:53 by sewardj]
[ghc-hetmet.git] / ghc / compiler / rename / RnMonad.lhs
index c96b6fa..f5d4641 100644 (file)
@@ -6,10 +6,13 @@
 \begin{code}
 module RnMonad(
        module RnMonad,
+
+       module RdrName,         -- Re-exports
+       module Name,            -- from these two
+
        Module,
        FiniteMap,
        Bag,
-       Name,
        RdrNameHsDecl,
        RdrNameInstDecl,
        Version,
@@ -32,36 +35,30 @@ import IOExts               ( IORef, newIORef, readIORef, writeIORef, unsafePerformIO )
 import HsSyn           
 import RdrHsSyn
 import RnHsSyn         ( RenamedFixitySig )
-import BasicTypes      ( Version )
-import SrcLoc          ( noSrcLoc )
+import BasicTypes      ( Version, defaultFixity )
 import ErrUtils                ( addShortErrLocLine, addShortWarnLocLine,
                          pprBagOfErrors, ErrMsg, WarnMsg, Message
                        )
-import Name            ( Name, OccName, NamedThing(..),
-                         isLocallyDefinedName, nameModule, nameOccName,
-                         decode, mkLocalName
+import RdrName         ( RdrName, dummyRdrVarName, rdrNameModule, rdrNameOcc,
+                         RdrNameEnv, emptyRdrEnv, extendRdrEnv, 
+                         lookupRdrEnv, addListToRdrEnv, rdrEnvToList, rdrEnvElts
                        )
-import Module          ( Module, ModuleName, ModuleHiMap, SearchPath, WhereFrom,
-                         mkModuleHiMaps, moduleName, mkVanillaModule, mkSearchPath
+import Name            ( Name, OccName, NamedThing(..), getSrcLoc,
+                         isLocallyDefinedName, nameModule, nameOccName,
+                         decode, mkLocalName, mkUnboundName, mkKnownKeyGlobal,
+                         NameEnv, lookupNameEnv, emptyNameEnv, unitNameEnv, extendNameEnvList
                        )
+import Module          ( Module, ModuleName, WhereFrom, moduleName )
 import NameSet         
-import RdrName         ( RdrName, dummyRdrVarName, rdrNameOcc )
-import CmdLineOpts     ( opt_D_dump_rn_trace, opt_HiMap )
-import PrelInfo                ( builtinNames )
-import TysWiredIn      ( boolTyCon )
+import CmdLineOpts     ( DynFlags, dopt_D_dump_rn_trace )
+import PrelInfo                ( wiredInNames, knownKeyRdrNames )
 import SrcLoc          ( SrcLoc, mkGeneratedSrcLoc )
-import Unique          ( Unique, getUnique, unboundKey )
-import UniqFM          ( UniqFM )
-import FiniteMap       ( FiniteMap, emptyFM, bagToFM, lookupFM, addToFM, addListToFM, 
-                         addListToFM_C, addToFM_C, eltsFM, fmToList
-                       )
+import Unique          ( Unique )
+import FiniteMap       ( FiniteMap, emptyFM, listToFM, plusFM )
 import Bag             ( Bag, mapBag, emptyBag, isEmptyBag, snocBag )
-import Maybes          ( mapMaybe )
-import UniqSet
-import UniqFM
 import UniqSupply
-import Util
 import Outputable
+import CmFind          ( Finder )
 
 infixr 9 `thenRn`, `thenRn_`
 \end{code}
@@ -80,8 +77,9 @@ ioToRnM io rn_down g_down = (io >>= \ ok -> return (Right ok))
                            (\ err -> return (Left err))
            
 traceRn :: SDoc -> RnM d ()
-traceRn msg | opt_D_dump_rn_trace = putDocRn msg
-           | otherwise           = returnRn ()
+traceRn msg
+   = doptsRn dopt_D_dump_rn_trace `thenRn` \b ->
+     if b then putDocRn msg else returnRn ()
 
 putDocRn :: SDoc -> RnM d ()
 putDocRn msg = ioToRnM (printErrs msg) `thenRn_`
@@ -105,23 +103,27 @@ type RnMS r  = RnM SDown r                -- Renaming source
 type RnMG r  = RnM ()    r             -- Getting global names etc
 
        -- Common part
-data RnDown = RnDown {
-                 rn_mod     :: ModuleName,
-                 rn_loc     :: SrcLoc,
-                 rn_ns      :: IORef RnNameSupply,
-                 rn_errs    :: IORef (Bag WarnMsg, Bag ErrMsg),
-                 rn_ifaces  :: IORef Ifaces,
-                 rn_hi_maps :: (ModuleHiMap,   -- for .hi files
-                                ModuleHiMap)   -- for .hi-boot files
-               }
+data RnDown
+  = RnDown {
+       rn_mod     :: Module,                   -- This module
+       rn_loc     :: SrcLoc,                   -- Current locn
+
+       rn_finder  :: Finder,
+       rn_dflags  :: DynFlags,
+       rn_gst     :: GlobalSymbolTable,        -- Both home modules and packages,
+                                               -- at the moment we started compiling 
+                                               -- this module
+
+       rn_errs    :: IORef (Bag WarnMsg, Bag ErrMsg),
+       rn_ns      :: IORef NameSupply,
+       rn_ifaces  :: IORef Ifaces
+    }
 
        -- For renaming source code
 data SDown = SDown {
                  rn_mode :: RnMode,
 
-                 rn_genv :: GlobalRdrEnv,
-                       --   Global envt; the fixity component gets extended
-                       --   with local fixity decls
+                 rn_genv :: GlobalRdrEnv,      -- Global envt
 
                  rn_lenv :: LocalRdrEnv,       -- Local name envt
                        --   Does *not* include global name envt; may shadow it
@@ -132,8 +134,9 @@ data SDown = SDown {
                        --   we can look up record field names
 
                  rn_fixenv :: FixityEnv        -- Local fixities
-                                               -- The global ones are held in the
-                                               -- rn_ifaces field
+                       -- The global fixities are held in the
+                       -- rn_ifaces field.  Why?  See the comments
+                       -- with RnIfaces.lookupFixity
                }
 
 data RnMode    = SourceMode                    -- Renaming source code
@@ -146,100 +149,31 @@ data RnMode      = SourceMode                    -- Renaming source code
 
 \begin{code}
 --------------------------------
-type RdrNameEnv a = FiniteMap RdrName a
 type GlobalRdrEnv = RdrNameEnv [Name]  -- The list is because there may be name clashes
                                        -- These only get reported on lookup,
                                        -- not on construction
 type LocalRdrEnv  = RdrNameEnv Name
 
-emptyRdrEnv  :: RdrNameEnv a
-lookupRdrEnv :: RdrNameEnv a -> RdrName -> Maybe a
-addListToRdrEnv :: RdrNameEnv a -> [(RdrName,a)] -> RdrNameEnv a
-extendRdrEnv   :: RdrNameEnv a -> RdrName -> a -> RdrNameEnv a
-
-emptyRdrEnv  = emptyFM
-lookupRdrEnv = lookupFM
-addListToRdrEnv = addListToFM
-rdrEnvElts     = eltsFM
-extendRdrEnv    = addToFM
-rdrEnvToList    = fmToList
-
---------------------------------
-type NameEnv a = UniqFM a      -- Domain is Name
-
-emptyNameEnv   :: NameEnv a
-nameEnvElts    :: NameEnv a -> [a]
-addToNameEnv_C :: (a->a->a) -> NameEnv a -> Name -> a -> NameEnv a
-addToNameEnv   :: NameEnv a -> Name -> a -> NameEnv a
-plusNameEnv    :: NameEnv a -> NameEnv a -> NameEnv a
-extendNameEnv  :: NameEnv a -> [(Name,a)] -> NameEnv a
-lookupNameEnv  :: NameEnv a -> Name -> Maybe a
-delFromNameEnv :: NameEnv a -> Name -> NameEnv a
-elemNameEnv    :: Name -> NameEnv a -> Bool
-
-emptyNameEnv   = emptyUFM
-nameEnvElts    = eltsUFM
-addToNameEnv_C = addToUFM_C
-addToNameEnv   = addToUFM
-plusNameEnv    = plusUFM
-extendNameEnv  = addListToUFM
-lookupNameEnv  = lookupUFM
-delFromNameEnv = delFromUFM
-elemNameEnv    = elemUFM
-
 --------------------------------
 type FixityEnv = NameEnv RenamedFixitySig
        -- We keep the whole fixity sig so that we
        -- can report line-number info when there is a duplicate
        -- fixity declaration
+
+lookupFixity :: FixityEnv -> Name -> Fixity
+lookupFixity env name
+  = case lookupNameEnv env name of 
+       Just (FixitySig _ fix _) -> fix
+       Nothing                  -> defaultFixity
 \end{code}
 
 \begin{code}
---------------------------------
-type RnNameSupply
- = ( UniqSupply
-
-   , FiniteMap String Int
-       -- This is used as a name supply for dictionary functions
-       -- From the inst decl we derive a string, usually by glomming together
-       -- the class and tycon name -- but it doesn't matter exactly how;
-       -- this map then gives a unique int for each inst decl with that
-       -- string.  (In Haskell 98 there can only be one,
-       -- but not so in more extended versions; also class CC type T
-       -- and class C type TT might both give the string CCT
-       --      
-       -- We could just use one Int for all the instance decls, but this
-       -- way the uniques change less when you add an instance decl,   
-       -- hence less recompilation
-
-   , FiniteMap (ModuleName, OccName) Name
-       -- Ensures that one (module,occname) pair gets one unique
-   )
-
-
---------------------------------
-data ExportEnv   = ExportEnv Avails Fixities
-type Avails      = [AvailInfo]
-type Fixities    = [(Name, Fixity)]
-
 type ExportAvails = (FiniteMap ModuleName Avails,
        -- Used to figure out "module M" export specifiers
        -- Includes avails only from *unqualified* imports
        -- (see 1.4 Report Section 5.1.1)
 
-       NameEnv AvailInfo)      -- Used to figure out all other export specifiers.
-                               -- Maps a Name to the AvailInfo that contains it
-
-
-data GenAvailInfo name = Avail name     -- An ordinary identifier
-                       | AvailTC name   -- The name of the type or class
-                                 [name] -- The available pieces of type/class.
-                                        -- NB: If the type or class is itself
-                                        -- to be in scope, it must be in this list.
-                                        -- Thus, typically: AvailTC Eq [Eq, ==, /=]
-
-type AvailInfo    = GenAvailInfo Name
-type RdrAvailInfo = GenAvailInfo OccName
+                    AvailEnv)  -- Used to figure out all other export specifiers.
 \end{code}
 
 %===================================================
@@ -248,9 +182,12 @@ type RdrAvailInfo = GenAvailInfo OccName
 
 \begin{code}
 type ExportItem                 = (ModuleName, [RdrAvailInfo])
-type VersionInfo name    = [ImportVersion name]
 
-type ImportVersion name  = (ModuleName, Version, WhetherHasOrphans, WhatsImported name)
+type ImportVersion name  = (ModuleName, WhetherHasOrphans, IsBootInterface, WhatsImported name)
+
+type ModVersionInfo    = (Version,             -- Version of the whole module
+                          Version,             -- Version number for all fixity decls together
+                          Version)             -- ...ditto all rules together
 
 type WhetherHasOrphans   = Bool
        -- An "orphan" is 
@@ -259,41 +196,58 @@ type WhetherHasOrphans   = Bool
        --      * a transformation rule in a module other than the one defining
        --              the function in the head of the rule.
 
-data WhatsImported name  = Everything 
-                        | Specifically [LocalVersion name] -- List guaranteed non-empty
+type IsBootInterface     = Bool
+
+data WhatsImported name  = NothingAtAll                                -- The module is below us in the
+                                                               -- hierarchy, but we import nothing
 
-    -- ("M", hif, ver, Everything) means there was a "module M" in 
-    -- this module's export list, so we just have to go by M's version, "ver",
-    -- not the list of LocalVersions.
+                        | Everything Version                   -- The module version
 
+                        | Specifically Version                 -- Module version
+                                       Version                 -- Fixity version
+                                       Version                 -- Rules version
+                                       [(name,Version)]        -- List guaranteed non-empty
+                        deriving( Eq )
+       -- 'Specifically' doesn't let you say "I imported f but none of the fixities in
+       -- the module". If you use anything in the module you get its fixity and rule version
+       -- So if the fixities or rules change, you'll recompile, even if you don't use either.
+       -- This is easy to implement, and it's safer: you might not have used the rules last
+       -- time round, but if someone has added a new rule you might need it this time
 
-type LocalVersion name   = (name, Version)
+       -- 'Everything' means there was a "module M" in 
+       -- this module's export list, so we just have to go by M's version,
+       -- not the list of (name,version) pairs
 
 data ParsedIface
   = ParsedIface {
-      pi_mod      :: Version,                          -- Module version number
+      pi_mod      :: Module,                           -- Complete with package info
+      pi_vers     :: Version,                          -- Module version number
       pi_orphan    :: WhetherHasOrphans,               -- Whether this module has orphans
       pi_usages           :: [ImportVersion OccName],          -- Usages
       pi_exports   :: [ExportItem],                    -- Exports
-      pi_decls    :: [(Version, RdrNameHsDecl)],       -- Local definitions
       pi_insts    :: [RdrNameInstDecl],                -- Local instance declarations
-      pi_rules    :: [RdrNameRuleDecl]                 -- Rules
+      pi_decls    :: [(Version, RdrNameHsDecl)],       -- Local definitions
+      pi_fixity           :: (Version, [RdrNameFixitySig]),    -- Local fixity declarations, with their version
+      pi_rules    :: (Version, [RdrNameRuleDecl]),     -- Rules, with their version
+      pi_deprecs   :: [RdrNameDeprecation]             -- Deprecations
     }
 
-type InterfaceDetails = (WhetherHasOrphans,
-                        VersionInfo Name, -- Version information for what this module imports
-                        ExportEnv)        -- What modules this one depends on
-
-
--- needed by Main to fish out the fixities assoc list.
-getIfaceFixities :: InterfaceDetails -> Fixities
-getIfaceFixities (_, _, ExportEnv _ fs) = fs
-
 
 type RdrNamePragma = ()                                -- Fudge for now
 -------------------
 
+\end{code}
+
+%************************************************************************
+%*                                                                     *
+\subsection{The renamer state}
+%*                                                                     *
+%************************************************************************
+
+\begin{code}
 data Ifaces = Ifaces {
+
+       -- PERSISTENT FIELDS
                iImpModInfo :: ImportedModuleInfo,
                                -- Modules this one depends on: that is, the union 
                                -- of the modules its *direct* imports depend on.
@@ -301,33 +255,47 @@ data Ifaces = Ifaces {
                                -- dependencies (direct or not) of the imported module.
 
                iDecls :: DeclsMap,     -- A single, global map of Names to decls
+                                       -- we can get away with importing them abstractly
 
-               iFixes :: FixityEnv,    -- A single, global map of Names to fixities
+               iInsts :: IfaceInsts,
+               -- The as-yet un-slurped instance decls; this bag is depleted when we
+               -- slurp an instance decl so that we don't slurp the same one twice.
+               -- Each is 'gated' by the names that must be available before
+               -- this instance decl is needed.
+
+               iRules :: IfaceRules,
+               -- Similar to instance decls, only for rules
+
+       -- SEMI-EPHEMERAL FIELDS
+               -- iFixes and iDeprecs are accumulated here while one module
+               -- is compiled, but are transferred to the package symbol table
+               -- at the end.  We don't add them to the table as we encounter them
+               -- because doing so would require us to have a mutable symbol table
+               -- which is yukky.
+
+               iFixes :: FixityEnv,            -- A single, global map of Names to fixities
+                                               -- See comments with RnIfaces.lookupFixity
+               iDeprecs :: DeprecationEnv,
+
+       -- EPHEMERAL FIELDS
+       -- These fields persist during the compilation of a single module only
 
                iSlurp :: NameSet,
                -- All the names (whether "big" or "small", whether wired-in or not,
                -- whether locally defined or not) that have been slurped in so far.
 
-               iVSlurp :: [(Name,Version)],
+               iVSlurp :: [(Name,Version)]
                -- All the (a) non-wired-in (b) "big" (c) non-locally-defined 
                -- names that have been slurped in so far, with their versions.
                -- This is used to generate the "usage" information for this module.
                -- Subset of the previous field.
-
-               iInsts :: Bag GatedDecl,
-               -- The as-yet un-slurped instance decls; this bag is depleted when we
-               -- slurp an instance decl so that we don't slurp the same one twice.
-               -- Each is 'gated' by the names that must be available before
-               -- this instance decl is needed.
-
-               iRules :: Bag GatedDecl
-                       -- Ditto transformation rules
        }
 
-type GatedDecl = (NameSet, (Module, RdrNameHsDecl))
-
 type ImportedModuleInfo 
-     = FiniteMap ModuleName (Version, Bool, Maybe (Module, Bool, Avails))
+     = FiniteMap ModuleName (WhetherHasOrphans, IsBootInterface, 
+                            Maybe (Module, Version, Version, Version, WhereFrom, Avails))
+                               -- The three Versions are module version, fixity version, rules version
+
                -- Suppose the domain element is module 'A'
                --
                -- The first Bool is True if A contains 
@@ -346,11 +314,6 @@ type ImportedModuleInfo
                -- A.hi or A.hi-boot when importing A.f.
                -- Basically, we look for A.hi if A is in the map, and A.hi-boot
                -- otherwise
-
-type DeclsMap = NameEnv (Version, AvailInfo, Bool, (Module, RdrNameHsDecl))
-               -- A DeclsMap contains a binding for each Name in the declaration
-               -- including the constructors of a type decl etc.
-               -- The Bool is True just for the 'main' Name.
 \end{code}
 
 
@@ -361,21 +324,27 @@ type DeclsMap = NameEnv (Version, AvailInfo, Bool, (Module, RdrNameHsDecl))
 %************************************************************************
 
 \begin{code}
-initRn :: ModuleName -> UniqSupply -> SearchPath -> SrcLoc
-       -> RnMG r
-       -> IO (r, Bag ErrMsg, Bag WarnMsg)
+initRn :: DynFlags -> Finder -> GlobalSymbolTable
+       -> PersistentRenamerState
+       -> Module -> SrcLoc
 
-initRn mod us dirs loc do_rn = do
+initRn dflags finder gst prs mod loc do_rn = do
   himaps    <- mkModuleHiMaps dirs
-  names_var <- newIORef (us, emptyFM, builtins)
+  names_var <- newIORef (prsNS pcs)
   errs_var  <- newIORef (emptyBag,emptyBag)
-  iface_var <- newIORef emptyIfaces 
+  iface_var <- newIORef (initIfaces prs)
   let
-        rn_down = RnDown { rn_loc = loc, rn_ns = names_var, 
-                          rn_errs = errs_var, 
-                          rn_hi_maps = himaps, 
+        rn_down = RnDown { rn_mod = mod,
+                          rn_loc = loc, 
+
+                          rn_finder = finder,
+                          rn_dflags = dflags,
+                          rn_gst    = gst,
+                               
+                          rn_ns     = names_var, 
+                          rn_errs   = errs_var, 
                           rn_ifaces = iface_var,
-                          rn_mod = mod }
+                 }
 
        -- do the business
   res <- do_rn rn_down ()
@@ -386,6 +355,25 @@ initRn mod us dirs loc do_rn = do
   return (res, errs, warns)
 
 
+initIfaces :: PersistentRenamerState -> Ifaces
+initIfaces prs
+  = Ifaces { iDecls = prsDecls prs,
+            iInsts = prsInsts prs,
+            iRules = prsRules rules,
+
+            iFixes   = emptyNameEnv,
+            iDeprecs = emptyNameEnv,
+
+            iImpModInfo = emptyFM,
+            iDeferred   = emptyNameSet,
+            iSlurp      = unitNameSet (mkUnboundName dummyRdrVarName),
+                       -- Pretend that the dummy unbound name has already been
+                       -- slurped.  This is what's returned for an out-of-scope name,
+                       -- and we don't want thereby to try to suck it in!
+            iVSlurp = []
+      }
+
+
 initRnMS :: GlobalRdrEnv -> FixityEnv -> RnMode -> RnMS r -> RnM d r
 initRnMS rn_env fixity_env mode thing_inside rn_down g_down
   = let
@@ -397,34 +385,16 @@ initRnMS rn_env fixity_env mode thing_inside rn_down g_down
 initIfaceRnMS :: Module -> RnMS r -> RnM d r
 initIfaceRnMS mod thing_inside 
   = initRnMS emptyRdrEnv emptyNameEnv InterfaceMode $
-    setModuleRn (moduleName mod) thing_inside
-
-emptyIfaces :: Ifaces
-emptyIfaces = Ifaces { iImpModInfo = emptyFM,
-                      iDecls = emptyNameEnv,
-                      iFixes = emptyNameEnv,
-                      iSlurp = unitNameSet (mkUnboundName dummyRdrVarName),
-                       -- Pretend that the dummy unbound name has already been
-                       -- slurped.  This is what's returned for an out-of-scope name,
-                       -- and we don't want thereby to try to suck it in!
-                      iVSlurp = [],
-                      iInsts = emptyBag,
-                      iRules = emptyBag
-             }
-
--- mkUnboundName makes a place-holder Name; it shouldn't be looked at except possibly
--- during compiler debugging.
-mkUnboundName :: RdrName -> Name
-mkUnboundName rdr_name = mkLocalName unboundKey (rdrNameOcc rdr_name) noSrcLoc
-
-isUnboundName :: Name -> Bool
-isUnboundName name = getUnique name == unboundKey
+    setModuleRn mod thing_inside
 
 builtins :: FiniteMap (ModuleName,OccName) Name
-builtins = 
-   bagToFM (
-   mapBag (\ name ->  ((moduleName (nameModule name), nameOccName name), name))
-         builtinNames)
+builtins = listToFM wired_in `plusFM` listToFM known_key
+        where
+          wired_in = [ ((moduleName (nameModule name), nameOccName name), name)
+                     | name <- wiredInNames ]
+
+          known_key = [ ((rdrNameModule rdr_name, rdrNameOcc rdr_name), mkKnownKeyGlobal rdr_name uniq) 
+                      | (rdr_name, uniq) <- knownKeyRdrNames ]
 \end{code}
 
 @renameSourceCode@ is used to rename stuff ``out-of-line'';
@@ -432,28 +402,31 @@ that is, not as part of the main renamer.
 Sole examples: derived definitions,
 which are only generated in the type checker.
 
-The @RnNameSupply@ includes a @UniqueSupply@, so if you call it more than
+The @NameSupply@ includes a @UniqueSupply@, so if you call it more than
 once you must either split it, or install a fresh unique supply.
 
 \begin{code}
-renameSourceCode :: ModuleName
+renameSourceCode :: DynFlags 
+                -> Module
                 -> RnNameSupply
                 -> RnMS r
                 -> r
 
-renameSourceCode mod_name name_supply m
+renameSourceCode dflags mod name_supply m
   = unsafePerformIO (
        -- It's not really unsafe!  When renaming source code we
        -- only do any I/O if we need to read in a fixity declaration;
        -- and that doesn't happen in pragmas etc
 
-        mkModuleHiMaps (mkSearchPath opt_HiMap) >>= \ himaps ->
        newIORef name_supply            >>= \ names_var ->
        newIORef (emptyBag,emptyBag)    >>= \ errs_var ->
        let
-           rn_down = RnDown { rn_loc = mkGeneratedSrcLoc, rn_ns = names_var,
-                              rn_errs = errs_var, rn_hi_maps = himaps,
-                              rn_mod = mod_name }
+           rn_down = RnDown { rn_dflags = dflags,
+                              rn_loc = mkGeneratedSrcLoc, rn_ns = names_var,
+                              rn_errs = errs_var, 
+                              rn_mod = mod, 
+                              rn_ifaces = panic "rnameSourceCode: rn_ifaces"  -- Not required
+                            }
            s_down = SDown { rn_mode = InterfaceMode,
                               -- So that we can refer to PrelBase.True etc
                             rn_genv = emptyRdrEnv, rn_lenv = emptyRdrEnv,
@@ -489,6 +462,7 @@ andRn    :: (a -> a -> a) -> RnM d a -> RnM d a -> RnM d a
 mapRn    :: (a -> RnM d b) -> [a] -> RnM d [b]
 mapRn_   :: (a -> RnM d b) -> [a] -> RnM d ()
 mapMaybeRn :: (a -> RnM d (Maybe b)) -> [a] -> RnM d [b]
+flatMapRn  :: (a -> RnM d [b])       -> [a] -> RnM d [b]
 sequenceRn :: [RnM d a] -> RnM d [a]
 foldlRn :: (b  -> a -> RnM d b) -> b -> [a] -> RnM d b
 mapAndUnzipRn :: (a -> RnM d (b,c)) -> [a] -> RnM d ([b],[c])
@@ -541,6 +515,11 @@ mapMaybeRn f (x:xs) = f x          `thenRn` \ maybe_r ->
                      case maybe_r of
                        Nothing -> returnRn rs
                        Just r  -> returnRn (r:rs)
+
+flatMapRn f []     = returnRn []
+flatMapRn f (x:xs) = f x               `thenRn` \ r ->
+                    flatMapRn f xs     `thenRn` \ rs ->
+                    returnRn (r ++ rs)
 \end{code}
 
 
@@ -591,6 +570,10 @@ checkErrsRn :: RnM d Bool          -- True <=> no errors so far
 checkErrsRn (RnDown {rn_errs = errs_var}) l_down
   = readIORef  errs_var                                        >>=  \ (warns,errs) ->
     return (isEmptyBag errs)
+
+doptsRn :: (DynFlags -> Bool) -> RnM d Bool
+doptsRn dopt (RnDown { rn_dflags = dflags}) l_down
+   = return (dopt dflags)
 \end{code}
 
 
@@ -613,34 +596,21 @@ getSrcLocRn down l_down
 %=====================
 
 \begin{code}
-getNameSupplyRn :: RnM d RnNameSupply
+getNameSupplyRn :: RnM d NameSupply
 getNameSupplyRn rn_down l_down
   = readIORef (rn_ns rn_down)
 
-setNameSupplyRn :: RnNameSupply -> RnM d ()
+setNameSupplyRn :: NameSupply -> RnM d ()
 setNameSupplyRn names' (RnDown {rn_ns = names_var}) l_down
   = writeIORef names_var names'
 
--- See comments with RnNameSupply above.
-newInstUniq :: String -> RnM d Int
-newInstUniq key (RnDown {rn_ns = names_var}) l_down
-  = readIORef names_var                                >>= \ (us, mapInst, cache) ->
-    let
-       uniq = case lookupFM mapInst key of
-                  Just x  -> x+1
-                  Nothing -> 0
-       mapInst' = addToFM mapInst key uniq
-    in
-    writeIORef names_var (us, mapInst', cache) >>
-    return uniq
-
 getUniqRn :: RnM d Unique
 getUniqRn (RnDown {rn_ns = names_var}) l_down
- = readIORef names_var >>= \ (us, mapInst, cache) ->
+ = readIORef names_var >>= \ (us, cache, ipcache) ->
    let
      (us1,us') = splitUniqSupply us
    in
-   writeIORef names_var (us', mapInst, cache)  >>
+   writeIORef names_var (us', cache, ipcache)  >>
    return (uniqFromSupply us1)
 \end{code}
 
@@ -649,11 +619,11 @@ getUniqRn (RnDown {rn_ns = names_var}) l_down
 %=====================
 
 \begin{code}
-getModuleRn :: RnM d ModuleName
-getModuleRn (RnDown {rn_mod = mod_name}) l_down
-  = return mod_name
+getModuleRn :: RnM d Module
+getModuleRn (RnDown {rn_mod = mod}) l_down
+  = return mod
 
-setModuleRn :: ModuleName -> RnM d a -> RnM d a
+setModuleRn :: Module -> RnM d a -> RnM d a
 setModuleRn new_mod enclosed_thing rn_down l_down
   = enclosed_thing (rn_down {rn_mod = new_mod}) l_down
 \end{code}
@@ -678,6 +648,10 @@ getLocalNameEnv :: RnMS LocalRdrEnv
 getLocalNameEnv rn_down (SDown {rn_lenv = local_env})
   = return local_env
 
+getGlobalNameEnv :: RnMS GlobalRdrEnv
+getGlobalNameEnv rn_down (SDown {rn_genv = global_env})
+  = return global_env
+
 setLocalNameEnv :: LocalRdrEnv -> RnMS a -> RnMS a
 setLocalNameEnv local_env' m rn_down l_down
   = m rn_down (l_down {rn_lenv = local_env'})
@@ -690,7 +664,7 @@ extendFixityEnv :: [(Name, RenamedFixitySig)] -> RnMS a -> RnMS a
 extendFixityEnv fixes enclosed_scope
                rn_down l_down@(SDown {rn_fixenv = fixity_env})
   = let
-       new_fixity_env = extendNameEnv fixity_env fixes
+       new_fixity_env = extendNameEnvList fixity_env fixes
     in
     enclosed_scope rn_down (l_down {rn_fixenv = new_fixity_env})
 \end{code}
@@ -724,18 +698,4 @@ getIfacesRn (RnDown {rn_ifaces = iface_var}) _
 setIfacesRn :: Ifaces -> RnM d ()
 setIfacesRn ifaces (RnDown {rn_ifaces = iface_var}) _
   = writeIORef iface_var ifaces
-
-getHiMaps :: RnM d (ModuleHiMap, ModuleHiMap)
-getHiMaps (RnDown {rn_hi_maps = himaps}) _ 
-  = return himaps
-\end{code}
-
-\begin{code}
-lookupModuleRn :: ModuleName -> RnM d Module
-lookupModuleRn x = 
-  getHiMaps `thenRn` \ (himap, _) ->
-  case lookupFM himap x of
-    Nothing    -> returnRn (mkVanillaModule x)
-    Just (_,x) -> returnRn x
-
 \end{code}