[project @ 2000-11-10 15:12:50 by simonpj]
[ghc-hetmet.git] / ghc / compiler / rename / Rename.lhs
index a54934d..ad60177 100644 (file)
@@ -17,7 +17,7 @@ import RnHsSyn                ( RenamedHsDecl, RenamedTyClDecl, RenamedRuleDecl, RenamedInstDe
                          instDeclFVs, tyClDeclFVs, ruleDeclFVs
                        )
 
-import CmdLineOpts     ( DynFlags, DynFlag(..), dopt )
+import CmdLineOpts     ( DynFlags, DynFlag(..) )
 import RnMonad
 import RnNames         ( getGlobalNames )
 import RnSource                ( rnSourceDecls, rnTyClDecl, rnIfaceRuleDecl, rnInstDecl )
@@ -25,34 +25,33 @@ import RnIfaces             ( slurpImpDecls, mkImportInfo,
                          getInterfaceExports, closeDecls,
                          RecompileRequired, outOfDate, recompileRequired
                        )
-import RnHiFiles       ( readIface, removeContext, 
+import RnHiFiles       ( readIface, removeContext, loadInterface,
                          loadExports, loadFixDecls, loadDeprecs )
-import RnEnv           ( availName, 
+import RnEnv           ( availsToNameSet, availName, 
                          emptyAvailEnv, unitAvailEnv, availEnvElts, plusAvailEnv, groupAvails,
                          warnUnusedImports, warnUnusedLocalBinds, warnUnusedModules,
-                         lookupOrigNames, lookupGlobalRn, newGlobalName
+                         lookupOrigNames, lookupSrcName, newGlobalName, unQualInScope
                        )
 import Module           ( Module, ModuleName, WhereFrom(..),
                          moduleNameUserString, moduleName,
-                         mkModuleInThisPackage, mkModuleName, moduleEnvElts
+                         moduleEnvElts
                        )
 import Name            ( Name, NamedThing(..), getSrcLoc,
-                         nameIsLocalOrFrom,
-                         nameOccName, nameModule,
+                         nameIsLocalOrFrom, nameOccName, nameModule,
                        )
 import Name            ( mkNameEnv, nameEnvElts, extendNameEnv )
-import RdrName         ( elemRdrEnv )
+import RdrName         ( elemRdrEnv, foldRdrEnv, isQual )
 import OccName         ( occNameFlavour )
 import NameSet
 import TysWiredIn      ( unitTyCon, intTyCon, boolTyCon )
 import PrelNames       ( mAIN_Name, pREL_MAIN_Name, pRELUDE_Name,
-                         ioTyCon_RDR, main_RDR,
+                         ioTyCon_RDR, main_RDR_Unqual,
                          unpackCString_RDR, unpackCStringFoldr_RDR, unpackCStringUtf8_RDR,
                          eqString_RDR
                        )
 import PrelInfo                ( derivingOccurrences )
 import Type            ( funTyCon )
-import ErrUtils                ( dumpIfSet )
+import ErrUtils                ( dumpIfSet, showPass, printErrorsAndWarnings, errorsFound )
 import Bag             ( bagToList )
 import FiniteMap       ( FiniteMap, fmToList, emptyFM, lookupFM, 
                          addToFM_C, elemFM, addToFM
@@ -63,8 +62,10 @@ import Outputable
 import IO              ( openFile, IOMode(..) )
 import HscTypes                ( PersistentCompilerState, HomeIfaceTable, HomeSymbolTable, 
                          ModIface(..), WhatsImported(..), 
-                         VersionInfo(..), ImportVersion, IfaceDecls(..),
-                         GlobalRdrEnv, AvailEnv, GenAvailInfo(..), AvailInfo, 
+                         VersionInfo(..), ImportVersion, 
+                         IfaceDecls, mkIfaceDecls, dcl_tycl, dcl_rules, dcl_insts,
+                         GlobalRdrEnv, pprGlobalRdrEnv,
+                         AvailEnv, GenAvailInfo(..), AvailInfo, Avails,
                          Provenance(..), ImportReason(..), initialVersionInfo,
                          Deprecations(..), lookupDeprec, lookupIface
                         )
@@ -84,25 +85,35 @@ renameModule :: DynFlags
             -> HomeIfaceTable -> HomeSymbolTable
             -> PersistentCompilerState 
             -> Module -> RdrNameHsModule 
-            -> IO (PersistentCompilerState, Maybe (ModIface, [RenamedHsDecl]))
+            -> IO (PersistentCompilerState, Maybe (PrintUnqualified, ModIface, [RenamedHsDecl]))
        -- Nothing => some error occurred in the renamer
 
 renameModule dflags hit hst old_pcs this_module rdr_module
-  =    -- Initialise the renamer monad
-    do {
-       (new_pcs, errors_found, maybe_rn_stuff) 
-          <- initRn dflags hit hst old_pcs this_module (rename this_module rdr_module) ;
+  = do { showPass dflags "Renamer"
 
-       -- Return results.  No harm in updating the PCS
-       if errors_found then
+               -- Initialise the renamer monad
+       ; (new_pcs, msgs, maybe_rn_stuff) <- initRn dflags hit hst old_pcs this_module 
+                                                   (rename this_module rdr_module)
+
+       ; let print_unqualified :: Name -> Bool -- Is this chap in scope unqualified?
+             print_unqualified = case maybe_rn_stuff of
+                                   Just (unqual, _, _) -> unqual
+                                   Nothing             -> alwaysQualify
+
+
+               -- Print errors from renaming
+       ;  printErrorsAndWarnings print_unqualified msgs ;
+
+               -- Return results.  No harm in updating the PCS
+       ; if errorsFound msgs then
            return (new_pcs, Nothing)
-        else
+          else     
            return (new_pcs, maybe_rn_stuff)
     }
 \end{code}
 
 \begin{code}
-rename :: Module -> RdrNameHsModule -> RnMG (Maybe (ModIface, [RenamedHsDecl]))
+rename :: Module -> RdrNameHsModule -> RnMG (Maybe (PrintUnqualified, ModIface, [RenamedHsDecl]))
 rename this_module contents@(HsModule _ _ _ imports local_decls mod_deprec loc)
   = pushSrcLocRn loc           $
 
@@ -118,6 +129,9 @@ rename this_module contents@(HsModule _ _ _ imports local_decls mod_deprec loc)
        returnRn Nothing 
     else
        
+    traceRn (text "Local top-level environment" $$ 
+            nest 4 (pprGlobalRdrEnv local_gbl_env))    `thenRn_`
+
        -- DEAL WITH DEPRECATIONS
     rnDeprecs local_gbl_env mod_deprec 
              [d | DeprecD d <- local_decls]            `thenRn` \ my_deprecs ->
@@ -126,9 +140,7 @@ rename this_module contents@(HsModule _ _ _ imports local_decls mod_deprec loc)
     fixitiesFromLocalDecls local_gbl_env local_decls   `thenRn` \ local_fixity_env ->
 
        -- RENAME THE SOURCE
-    initRnMS gbl_env local_fixity_env SourceMode (
-       rnSourceDecls local_decls
-    )                                  `thenRn` \ (rn_local_decls, source_fvs) ->
+    rnSourceDecls gbl_env local_fixity_env local_decls `thenRn` \ (rn_local_decls, source_fvs) ->
 
        -- CHECK THAT main IS DEFINED, IF REQUIRED
     checkMain this_module local_gbl_env                `thenRn_`
@@ -136,19 +148,12 @@ rename this_module contents@(HsModule _ _ _ imports local_decls mod_deprec loc)
        -- SLURP IN ALL THE NEEDED DECLARATIONS
     implicitFVs mod_name rn_local_decls        `thenRn` \ implicit_fvs -> 
     let
-               -- The export_fvs make the exported names look just as if they
-               -- occurred in the source program.  For the reasoning, see the
-               -- comments with RnIfaces.getImportVersions.
-               -- We only need the 'parent name' of the avail;
-               -- that's enough to suck in the declaration.
-       export_fvs      = mkNameSet (map availName export_avails)
-       real_source_fvs = source_fvs `plusFV` export_fvs
-
-       slurp_fvs       = implicit_fvs `plusFV` real_source_fvs
+       slurp_fvs = implicit_fvs `plusFV` source_fvs
                -- It's important to do the "plus" this way round, so that
                -- when compiling the prelude, locally-defined (), Bool, etc
                -- override the implicit ones. 
     in
+    traceRn (text "Source FVs:" <+> fsep (map ppr (nameSetToList slurp_fvs)))  `thenRn_`
     slurpImpDecls slurp_fvs            `thenRn` \ rn_imp_decls ->
 
        -- EXIT IF ERRORS FOUND
@@ -187,13 +192,16 @@ rename this_module contents@(HsModule _ _ _ imports local_decls mod_deprec loc)
                                mi_deprecs  = my_deprecs,
                                mi_decls    = panic "mi_decls"
                    }
+
+       print_unqualified = unQualInScope gbl_env
     in
 
        -- REPORT UNUSED NAMES, AND DEBUG DUMP 
-    reportUnusedNames mod_iface imports global_avail_env
-                     real_source_fvs rn_imp_decls      `thenRn_`
+    reportUnusedNames mod_iface print_unqualified 
+                     imports global_avail_env
+                     source_fvs export_avails rn_imp_decls     `thenRn_`
 
-    returnRn (Just (mod_iface, final_decls))
+    returnRn (Just (print_unqualified, mod_iface, final_decls))
   where
     mod_name = moduleName this_module
 \end{code}
@@ -204,7 +212,7 @@ Checking that main is defined
 checkMain :: Module -> GlobalRdrEnv -> RnMG ()
 checkMain this_mod local_env
   | moduleName this_mod == mAIN_Name 
-  = checkRn (main_RDR `elemRdrEnv` local_env) noMainErr
+  = checkRn (main_RDR_Unqual `elemRdrEnv` local_env) noMainErr
   | otherwise
   = returnRn ()
 \end{code}
@@ -291,39 +299,31 @@ isOrphanDecl _ _  = False
 \begin{code}
 fixitiesFromLocalDecls :: GlobalRdrEnv -> [RdrNameHsDecl] -> RnMG LocalFixityEnv
 fixitiesFromLocalDecls gbl_env decls
-  = doptRn Opt_WarnUnusedBinds                           `thenRn` \ warn_unused ->
-    foldlRn (getFixities warn_unused) emptyNameEnv decls  `thenRn` \ env -> 
-    traceRn (text "fixity env" <+> vcat (map ppr (nameEnvElts env)))
-                                                         `thenRn_`
+  = foldlRn getFixities emptyNameEnv decls                             `thenRn` \ env -> 
+    traceRn (text "fixity env" <+> vcat (map ppr (nameEnvElts env)))   `thenRn_`
     returnRn env
   where
-    getFixities :: Bool -> LocalFixityEnv -> RdrNameHsDecl -> RnMG LocalFixityEnv
-    getFixities warn_uu acc (FixD fix)
-      = fix_decl warn_uu acc fix
+    getFixities :: LocalFixityEnv -> RdrNameHsDecl -> RnMG LocalFixityEnv
+    getFixities acc (FixD fix)
+      = fix_decl acc fix
 
-    getFixities warn_uu acc (TyClD (ClassDecl _ _ _ _ sigs _ _ _ ))
-      = foldlRn (fix_decl warn_uu) acc [sig | FixSig sig <- sigs]
+    getFixities acc (TyClD (ClassDecl _ _ _ _ sigs _ _ _ ))
+      = foldlRn fix_decl acc [sig | FixSig sig <- sigs]
                -- Get fixities from class decl sigs too.
-    getFixities warn_uu acc other_decl
+    getFixities acc other_decl
       = returnRn acc
 
-    fix_decl warn_uu acc sig@(FixitySig rdr_name fixity loc)
+    fix_decl acc sig@(FixitySig rdr_name fixity loc)
        =       -- Check for fixity decl for something not declared
          pushSrcLocRn loc                      $
-         lookupGlobalRn gbl_env rdr_name       `thenRn` \  maybe_name ->
-         case maybe_name of {
-           Nothing ->  checkRn (not warn_uu) (unusedFixityDecl rdr_name fixity)        `thenRn_` 
-                       returnRn acc ;
-
-           Just name ->
+         lookupSrcName gbl_env rdr_name        `thenRn` \ name ->
 
                -- Check for duplicate fixity decl
-         case lookupNameEnv acc name of {
-           Just (FixitySig _ _ loc') -> addErrRn (dupFixityDecl rdr_name loc loc')
-                                        `thenRn_` returnRn acc ;
+         case lookupNameEnv acc name of
+           Just (FixitySig _ _ loc') -> addErrRn (dupFixityDecl rdr_name loc loc')     `thenRn_`
+                                        returnRn acc ;
 
-           Nothing -> returnRn (extendNameEnv acc name (FixitySig name fixity loc))
-         }}
+           Nothing                   -> returnRn (extendNameEnv acc name (FixitySig name fixity loc))
 \end{code}
 
 
@@ -352,11 +352,9 @@ rnDeprecs gbl_env Nothing decls
     returnRn (DeprecSome (mkNameEnv (catMaybes pairs)))
  where
    rn_deprec (Deprecation rdr_name txt loc)
-     = pushSrcLocRn loc                        $
-       lookupGlobalRn gbl_env rdr_name `thenRn` \ maybe_name ->
-       case maybe_name of
-        Just n  -> returnRn (Just (n,(n,txt)))
-        Nothing -> returnRn Nothing
+     = pushSrcLocRn loc                                $
+       lookupSrcName gbl_env rdr_name          `thenRn` \ name ->
+       returnRn (Just (name, (name,txt)))
 \end{code}
 
 
@@ -377,18 +375,20 @@ checkOldIface :: DynFlags
                                -- True <=> errors happened
 
 checkOldIface dflags hit hst pcs iface_path source_unchanged maybe_iface
-  = case maybe_iface of
+  = runRn dflags hit hst pcs (panic "Bogus module") $
+    case maybe_iface of
        Just old_iface -> -- Use the one we already have
-                         startRn (mi_module old_iface) $ 
-                         check_versions old_iface
+                         setModuleRn (mi_module old_iface) (check_versions old_iface)
+
        Nothing -- try and read it from a file
-          -> do read_result <- readIface do_traceRn iface_path
-                case read_result of
-                   Left err -> -- Old interface file not found, or garbled; give up
-                              do { ioTraceRn (text "Bad old interface file" $$ nest 4 err) ;
-                                   return (pcs, False, (outOfDate, Nothing)) }
-                   Right parsed_iface
-                      -> startRn (pi_mod parsed_iface) $
+          -> readIface iface_path      `thenRn` \ read_result ->
+             case read_result of
+               Left err -> -- Old interface file not found, or garbled; give up
+                          traceRn (text "Bad old interface file" $$ nest 4 err)        `thenRn_`
+                          returnRn (outOfDate, Nothing)
+
+               Right parsed_iface
+                      -> setModuleRn (pi_mod parsed_iface) $
                          loadOldIface parsed_iface `thenRn` \ m_iface ->
                          check_versions m_iface
     where
@@ -398,10 +398,6 @@ checkOldIface dflags hit hst pcs iface_path source_unchanged maybe_iface
             recompileRequired iface_path source_unchanged iface
                                                        `thenRn` \ recompile ->
             returnRn (recompile, Just iface)
-
-       do_traceRn     = dopt Opt_D_dump_rn_trace dflags
-       ioTraceRn sdoc = if do_traceRn then printErrs sdoc else return ()
-       startRn mod     = initRn dflags hit hst pcs mod
 \end{code}
 
 I think the following function should now have a more representative name,
@@ -412,9 +408,7 @@ loadOldIface :: ParsedIface -> RnMG ModIface
 
 loadOldIface parsed_iface
   = let iface = parsed_iface 
-    in -- RENAME IT
-    let mod = pi_mod iface
-        doc_str = ptext SLIT("need usage info from") <+> ppr mod
+        mod = pi_mod iface
     in
     initIfaceRnMS mod (
        loadHomeDecls (pi_decls iface)  `thenRn` \ decls ->
@@ -434,9 +428,7 @@ loadOldIface parsed_iface
                                vers_rules   = rule_vers,
                                vers_decls   = decls_vers }
 
-       decls = IfaceDecls { dcl_tycl = new_decls,
-                            dcl_rules = new_rules,
-                            dcl_insts = new_insts }
+       decls = mkIfaceDecls new_decls new_rules new_insts
 
        mod_iface = ModIface { mi_module = mod, mi_version = version,
                               mi_exports = avails, mi_usages  = usages,
@@ -508,7 +500,7 @@ closeIfaceDecls :: DynFlags
                                -- True <=> errors happened
 closeIfaceDecls dflags hit hst pcs
                mod_iface@(ModIface { mi_module = mod, mi_decls = iface_decls })
-  = initRn dflags hit hst pcs mod $
+  = runRn dflags hit hst pcs mod $
 
     let
        rule_decls = dcl_rules iface_decls
@@ -531,25 +523,32 @@ closeIfaceDecls dflags hit hst pcs
 %*********************************************************
 
 \begin{code}
-reportUnusedNames :: ModIface -> [RdrNameImportDecl] 
+reportUnusedNames :: ModIface -> PrintUnqualified
+                 -> [RdrNameImportDecl] 
                  -> AvailEnv
-                 -> NameSet 
+                 -> NameSet            -- Used in this module
+                 -> Avails             -- Exported by this module
                  -> [RenamedHsDecl] 
                  -> RnMG ()
-reportUnusedNames my_mod_iface imports avail_env 
-                 used_names imported_decls
+reportUnusedNames my_mod_iface unqual imports avail_env 
+                 source_fvs export_avails imported_decls
   = warnUnusedModules unused_imp_mods                          `thenRn_`
     warnUnusedLocalBinds bad_locals                            `thenRn_`
     warnUnusedImports bad_imp_names                            `thenRn_`
-    printMinimalImports this_mod minimal_imports               `thenRn_`
-    warnDeprecations this_mod my_deprecs really_used_names     `thenRn_`
-    returnRn ()
+    printMinimalImports this_mod unqual minimal_imports                `thenRn_`
+    warnDeprecations this_mod export_avails my_deprecs 
+                    really_used_names
 
   where
     this_mod   = mi_module my_mod_iface
     gbl_env    = mi_globals my_mod_iface
     my_deprecs = mi_deprecs my_mod_iface
     
+       -- The export_fvs make the exported names look just as if they
+       -- occurred in the source program.  
+    export_fvs = availsToNameSet export_avails
+    used_names = source_fvs `plusFV` export_fvs
+
     -- Now, a use of C implies a use of T,
     -- if C was brought into scope by T(..) or T(C)
     really_used_names = used_names `unionNameSets`
@@ -569,17 +568,23 @@ reportUnusedNames my_mod_iface imports avail_env
                                        other              -> Nothing]
            ]
     
-    defined_names, defined_and_used, defined_but_not_used :: [(Name,Provenance)]
-    defined_names                           = concat (rdrEnvElts gbl_env)
+       -- Collect the defined names from the in-scope environment
+       -- Look for the qualified ones only, else get duplicates
+    defined_names :: [(Name,Provenance)]
+    defined_names = foldRdrEnv add [] gbl_env
+    add rdr_name ns acc | isQual rdr_name = ns ++ acc
+                       | otherwise       = acc
+
+    defined_and_used, defined_but_not_used :: [(Name,Provenance)]
     (defined_and_used, defined_but_not_used) = partition used defined_names
-    used (name,_)                           = not (name `elemNameSet` really_used_names)
+    used (name,_)                           = name `elemNameSet` really_used_names
     
     -- Filter out the ones only defined implicitly
     bad_locals :: [Name]
     bad_locals     = [n     | (n,LocalDef) <- defined_but_not_used]
     
     bad_imp_names :: [(Name,Provenance)]
-    bad_imp_names  = [(n,p) | (n,p@(NonLocalDef (UserImport mod _ True) _)) <- defined_but_not_used,
+    bad_imp_names  = [(n,p) | (n,p@(NonLocalDef (UserImport mod _ True))) <- defined_but_not_used,
                              not (module_unused mod)]
     
     -- inst_mods are directly-imported modules that 
@@ -612,9 +617,9 @@ reportUnusedNames my_mod_iface imports avail_env
     minimal_imports1 = foldr add_name     minimal_imports0 defined_and_used
     minimal_imports  = foldr add_inst_mod minimal_imports1 inst_mods
     
-    add_name (n,NonLocalDef (UserImport m _ _) _) acc = addToFM_C plusAvailEnv acc (moduleName (nameModule n))
-                                                                 (unitAvailEnv (mk_avail n))
-    add_name (n,other_prov)                      acc = acc
+    add_name (n,NonLocalDef (UserImport m _ _)) acc = addToFM_C plusAvailEnv acc (moduleName (nameModule n))
+                                                               (unitAvailEnv (mk_avail n))
+    add_name (n,other_prov)                    acc = acc
 
     mk_avail n = case lookupNameEnv avail_env n of
                Just (AvailTC m _) | n==m      -> AvailTC n [n]
@@ -640,13 +645,17 @@ reportUnusedNames my_mod_iface imports avail_env
     module_unused :: Module -> Bool
     module_unused mod = moduleName mod `elem` unused_imp_mods
 
-
-warnDeprecations this_mod my_deprecs used_names
+warnDeprecations this_mod export_avails my_deprecs used_names
   = doptRn Opt_WarnDeprecations                                `thenRn` \ warn_drs ->
     if not warn_drs then returnRn () else
 
-    getIfacesRn                                                `thenRn` \ ifaces ->
-    getHomeIfaceTableRn                                        `thenRn` \ hit ->
+       -- The home modules for things in the export list
+       -- may not have been loaded yet; do it now, so 
+       -- that we can see their deprecations, if any
+    mapRn_ load_home export_mods               `thenRn_`
+
+    getIfacesRn                                        `thenRn` \ ifaces ->
+    getHomeIfaceTableRn                                `thenRn` \ hit ->
     let
        pit     = iPIT ifaces
        deprecs = [ (n,txt)
@@ -656,6 +665,13 @@ warnDeprecations this_mod my_deprecs used_names
     mapRn_ warnDeprec deprecs
 
   where
+    export_mods = nub [ moduleName (nameModule name) 
+                     | avail <- export_avails,
+                       let name = availName avail,
+                       not (nameIsLocalOrFrom this_mod name) ]
+  
+    load_home m = loadInterface (text "Check deprecations for" <+> ppr m) m ImportBySystem
+
     lookup_deprec hit pit n
        | nameIsLocalOrFrom this_mod n
        = lookupDeprec my_deprecs n 
@@ -665,13 +681,13 @@ warnDeprecations this_mod my_deprecs used_names
                Nothing    -> pprPanic "warnDeprecations:" (ppr n)
 
 -- ToDo: deal with original imports with 'qualified' and 'as M' clauses
-printMinimalImports this_mod imps
+printMinimalImports this_mod unqual imps
   = doptRn Opt_D_dump_minimal_imports          `thenRn` \ dump_minimal ->
     if not dump_minimal then returnRn () else
 
     mapRn to_ies (fmToList imps)               `thenRn` \ mod_ies ->
     ioToRnM (do { h <- openFile filename WriteMode ;
-                 printForUser h (vcat (map ppr_mod_ie mod_ies))
+                 printForUser h unqual (vcat (map ppr_mod_ie mod_ies))
        })                                      `thenRn_`
     returnRn ()
   where
@@ -737,52 +753,31 @@ getRnStats imported_decls ifaces
   where
     n_mods = length [() | _ <- moduleEnvElts (iPIT ifaces)]
        -- This is really only right for a one-shot compile
+
+    (decls_map, n_decls_slurped) = iDecls ifaces
     
-    decls_read     = [decl | (avail, True, (_,decl)) <- nameEnvElts (iDecls ifaces)
+    n_decls_left   = length [decl | (avail, True, (_,decl)) <- nameEnvElts decls_map
                        -- Data, newtype, and class decls are in the decls_fm
                        -- under multiple names; the tycon/class, and each
                        -- constructor/class op too.
                        -- The 'True' selects just the 'main' decl
                     ]
     
-    (cd_rd, dd_rd, nd_rd, sd_rd, vd_rd)        = countTyClDecls decls_read
-    (cd_sp, dd_sp, nd_sp, sd_sp, vd_sp, id_sp) = count_decls imported_decls
+    (insts_left, n_insts_slurped) = iInsts ifaces
+    n_insts_left  = length (bagToList insts_left)
     
-    unslurped_insts       = iInsts ifaces
-    inst_decls_unslurped  = length (bagToList unslurped_insts)
-    inst_decls_read          = id_sp + inst_decls_unslurped
+    (rules_left, n_rules_slurped) = iRules ifaces
+    n_rules_left  = length (bagToList rules_left)
     
     stats = vcat 
        [int n_mods <+> text "interfaces read",
-        hsep [ int cd_sp, text "class decls imported, out of", 
-               int cd_rd, text "read"],
-        hsep [ int dd_sp, text "data decls imported, out of",  
-               int dd_rd, text "read"],
-        hsep [ int nd_sp, text "newtype decls imported, out of",  
-               int nd_rd, text "read"],
-        hsep [int sd_sp, text "type synonym decls imported, out of",  
-               int sd_rd, text "read"],
-        hsep [int vd_sp, text "value signatures imported, out of",  
-               int vd_rd, text "read"],
-        hsep [int id_sp, text "instance decls imported, out of",  
-               int inst_decls_read, text "read"],
-        text "cls dcls slurp" <+> fsep (map (ppr . tyClDeclName) 
-                                  [d | TyClD d <- imported_decls, isClassDecl d]),
-        text "cls dcls read"  <+> fsep (map (ppr . tyClDeclName) 
-                                          [d | d <- decls_read, isClassDecl d])]
-
-count_decls decls
-  = (class_decls, 
-     data_decls, 
-     newtype_decls,
-     syn_decls, 
-     val_decls, 
-     inst_decls)
-  where
-    tycl_decls = [d | TyClD d <- decls]
-    (class_decls, data_decls, newtype_decls, syn_decls, val_decls) = countTyClDecls tycl_decls
-
-    inst_decls    = length [() | InstD _  <- decls]
+        hsep [ int n_decls_slurped, text "type/class/variable imported, out of", 
+               int (n_decls_slurped + n_decls_left), text "read"],
+        hsep [ int n_insts_slurped, text "instance decls imported, out of",  
+               int (n_insts_slurped + n_insts_left), text "read"],
+        hsep [ int n_rules_slurped, text "rule decls imported, out of",  
+               int (n_rules_slurped + n_rules_left), text "read"]
+       ]
 \end{code}    
 
 
@@ -801,9 +796,6 @@ warnDeprec (name, txt)
           text "is deprecated:", nest 4 (ppr txt) ]
 
 
-unusedFixityDecl rdr_name fixity
-  = hsep [ptext SLIT("Unused fixity declaration for"), quotes (ppr rdr_name)]
-
 dupFixityDecl rdr_name loc1 loc2
   = vcat [ptext SLIT("Multiple fixity declarations for") <+> quotes (ppr rdr_name),
          ptext SLIT("at ") <+> ppr loc1,