[project @ 2000-11-07 13:12:21 by simonpj]
[ghc-hetmet.git] / ghc / compiler / rename / Rename.lhs
index 539c256..75a8f6f 100644 (file)
@@ -17,28 +17,31 @@ import RnHsSyn              ( RenamedHsDecl, RenamedTyClDecl, RenamedRuleDecl, RenamedInstDe
                          instDeclFVs, tyClDeclFVs, ruleDeclFVs
                        )
 
-import CmdLineOpts     ( DynFlags, DynFlag(..) )
+import CmdLineOpts     ( DynFlags, DynFlag(..), dopt )
 import RnMonad
 import RnNames         ( getGlobalNames )
 import RnSource                ( rnSourceDecls, rnTyClDecl, rnIfaceRuleDecl, rnInstDecl )
 import RnIfaces                ( slurpImpDecls, mkImportInfo, 
                          getInterfaceExports, closeDecls,
-                         RecompileRequired, recompileRequired
+                         RecompileRequired, outOfDate, recompileRequired
                        )
-import RnHiFiles       ( findAndReadIface, removeContext, loadExports, loadFixDecls, loadDeprecs )
-import RnEnv           ( availName, 
+import RnHiFiles       ( readIface, removeContext, 
+                         loadExports, loadFixDecls, loadDeprecs )
+import RnEnv           ( availsToNameSet,
                          emptyAvailEnv, unitAvailEnv, availEnvElts, plusAvailEnv, groupAvails,
                          warnUnusedImports, warnUnusedLocalBinds, warnUnusedModules,
-                         lookupOrigNames, lookupGlobalRn, newGlobalName
+                         lookupOrigNames, lookupSrcName, newGlobalName
                        )
 import Module           ( Module, ModuleName, WhereFrom(..),
-                         moduleNameUserString, moduleName
+                         moduleNameUserString, moduleName,
+                         mkModuleInThisPackage, mkModuleName, moduleEnvElts
                        )
-import Name            ( Name, isLocallyDefined, NamedThing(..), getSrcLoc,
+import Name            ( Name, NamedThing(..), getSrcLoc,
+                         nameIsLocalOrFrom,
                          nameOccName, nameModule,
-                         mkNameEnv, nameEnvElts, extendNameEnv
                        )
-import RdrName         ( elemRdrEnv )
+import Name            ( mkNameEnv, nameEnvElts, extendNameEnv )
+import RdrName         ( elemRdrEnv, foldRdrEnv, isQual )
 import OccName         ( occNameFlavour )
 import NameSet
 import TysWiredIn      ( unitTyCon, intTyCon, boolTyCon )
@@ -51,7 +54,7 @@ import PrelInfo               ( derivingOccurrences )
 import Type            ( funTyCon )
 import ErrUtils                ( dumpIfSet )
 import Bag             ( bagToList )
-import FiniteMap       ( FiniteMap, eltsFM, fmToList, emptyFM, lookupFM, 
+import FiniteMap       ( FiniteMap, fmToList, emptyFM, lookupFM, 
                          addToFM_C, elemFM, addToFM
                        )
 import UniqFM          ( lookupUFM )
@@ -60,10 +63,11 @@ import Outputable
 import IO              ( openFile, IOMode(..) )
 import HscTypes                ( PersistentCompilerState, HomeIfaceTable, HomeSymbolTable, 
                          ModIface(..), WhatsImported(..), 
-                         VersionInfo(..), ImportVersion, IfaceDecls(..),
+                         VersionInfo(..), ImportVersion, 
+                         IfaceDecls, mkIfaceDecls, dcl_tycl, dcl_rules, dcl_insts,
                          GlobalRdrEnv, AvailEnv, GenAvailInfo(..), AvailInfo, 
                          Provenance(..), ImportReason(..), initialVersionInfo,
-                         Deprecations(..), lookupDeprec, lookupTable
+                         Deprecations(..), lookupDeprec, lookupIface
                         )
 import List            ( partition, nub )
 \end{code}
@@ -133,19 +137,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
@@ -157,11 +154,9 @@ rename this_module contents@(HsModule _ _ _ imports local_decls mod_deprec loc)
     else
 
        -- GENERATE THE VERSION/USAGE INFO
-    mkImportInfo mod_name imports      `thenRn` \ my_usages ->
+    mkImportInfo mod_name imports                      `thenRn` \ my_usages ->
 
-       -- RETURN THE RENAMED MODULE
-    getNameSupplyRn                    `thenRn` \ name_supply ->
-    getIfacesRn                        `thenRn` \ ifaces ->
+       -- BUILD THE MODULE INTERFACE
     let
        -- We record fixities even for things that aren't exported,
        -- so that we can change into the context of this moodule easily
@@ -169,27 +164,36 @@ rename this_module contents@(HsModule _ _ _ imports local_decls mod_deprec loc)
                             | FixitySig name fixity loc <- nameEnvElts local_fixity_env
                             ]
 
-
        -- Sort the exports to make them easier to compare for versions
        my_exports = groupAvails this_module export_avails
        
+       final_decls = rn_local_decls ++ rn_imp_decls
+       is_orphan   = any (isOrphanDecl this_module) rn_local_decls
+
        mod_iface = ModIface {  mi_module   = this_module,
                                mi_version  = initialVersionInfo,
-                               mi_orphan   = any isOrphanDecl rn_local_decls,
+                               mi_usages = my_usages,
+                               mi_boot     = False,
+                               mi_orphan   = is_orphan,
                                mi_exports  = my_exports,
                                mi_globals  = gbl_env,
-                               mi_usages   = my_usages,
                                mi_fixities = fixities,
                                mi_deprecs  = my_deprecs,
                                mi_decls    = panic "mi_decls"
                    }
 
-       final_decls = rn_local_decls ++ rn_imp_decls
+               -- The export_fvs make the exported names look just as if they
+               -- occurred in the source program.  
+               -- We only need the 'parent name' of the avail;
+               -- that's enough to suck in the declaration.
+       export_fvs = availsToNameSet export_avails
+       used_vars  = source_fvs `plusFV` export_fvs
+
     in
 
        -- REPORT UNUSED NAMES, AND DEBUG DUMP 
     reportUnusedNames mod_iface imports global_avail_env
-                     real_source_fvs rn_imp_decls      `thenRn_`
+                     used_vars rn_imp_decls                    `thenRn_`
 
     returnRn (Just (mod_iface, final_decls))
   where
@@ -237,8 +241,8 @@ implicitFVs mod_name decls
     implicit_occs = string_occs ++ foldr ((++) . get) implicit_main decls
 
        -- Virtually every program has error messages in it somewhere
-    string_occs = [unpackCString_RDR, unpackCStringFoldr_RDR, unpackCStringUtf8_RDR,
-                  eqString_RDR]
+    string_occs = [unpackCString_RDR, unpackCStringFoldr_RDR, 
+                  unpackCStringUtf8_RDR, eqString_RDR]
 
     get (TyClD (TyData _ _ _ _ _ _ (Just deriv_classes) _ _ _))
        = concat (map get_deriv deriv_classes)
@@ -250,20 +254,21 @@ implicitFVs mod_name decls
 \end{code}
 
 \begin{code}
-isOrphanDecl (InstD (InstDecl inst_ty _ _ _ _))
-  = not (foldNameSet ((||) . isLocallyDefined) False (extractHsTyNames (removeContext inst_ty)))
+isOrphanDecl this_mod (InstD (InstDecl inst_ty _ _ _ _))
+  = not (foldNameSet ((||) . nameIsLocalOrFrom this_mod) False 
+                    (extractHsTyNames (removeContext inst_ty)))
        -- The 'removeContext' is because of
        --      instance Foo a => Baz T where ...
        -- The decl is an orphan if Baz and T are both not locally defined,
        --      even if Foo *is* locally defined
 
-isOrphanDecl (RuleD (HsRule _ _ _ lhs _ _))
+isOrphanDecl this_mod (RuleD (HsRule _ _ _ lhs _ _))
   = check lhs
   where
        -- At the moment we just check for common LHS forms
        -- Expand as necessary.  Getting it wrong just means
        -- more orphans than necessary
-    check (HsVar v)      = not (isLocallyDefined v)
+    check (HsVar v)      = not (nameIsLocalOrFrom this_mod v)
     check (HsApp f a)    = check f && check a
     check (HsLit _)      = False
     check (HsOverLit _)          = False
@@ -275,7 +280,7 @@ isOrphanDecl (RuleD (HsRule _ _ _ lhs _ _))
 
     check other                  = True        -- Safe fall through
 
-isOrphanDecl other = False
+isOrphanDecl _ _  = False
 \end{code}
 
 
@@ -288,39 +293,31 @@ isOrphanDecl other = 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}
 
 
@@ -349,11 +346,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}
 
 
@@ -367,50 +362,62 @@ rnDeprecs gbl_env Nothing decls
 checkOldIface :: DynFlags
              -> HomeIfaceTable -> HomeSymbolTable
              -> PersistentCompilerState
-             -> Module 
+             -> FilePath
              -> Bool                   -- Source unchanged
              -> Maybe ModIface         -- Old interface from compilation manager, if any
              -> IO (PersistentCompilerState, Bool, (RecompileRequired, Maybe ModIface))
                                -- True <=> errors happened
 
-checkOldIface dflags hit hst pcs mod source_unchanged maybe_iface
-  = initRn dflags hit hst pcs mod $
-       
-       -- Load the old interface file, if we havn't already got it
-    loadOldIface mod maybe_iface                       `thenRn` \ maybe_iface ->
-
-       -- Check versions
-    recompileRequired mod source_unchanged maybe_iface `thenRn` \ recompile ->
-
-    returnRn (recompile, maybe_iface)
+checkOldIface dflags hit hst pcs iface_path source_unchanged maybe_iface
+  = case maybe_iface of
+       Just old_iface -> -- Use the one we already have
+                         startRn (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) $
+                         loadOldIface parsed_iface `thenRn` \ m_iface ->
+                         check_versions m_iface
+    where
+       check_versions :: ModIface -> RnMG (RecompileRequired, Maybe ModIface)
+       check_versions iface
+          = -- Check versions
+            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,
+but what?
 
 \begin{code}
-loadOldIface :: Module -> Maybe ModIface -> RnMG (Maybe ModIface)
-loadOldIface mod (Just iface) 
-  = returnRn (Just iface)
-
-loadOldIface mod Nothing
-  =    -- LOAD THE OLD INTERFACE FILE
-    findAndReadIface doc_str (moduleName mod) False {- Not hi-boot -}  `thenRn` \ read_result ->
-    case read_result of {
-       Left err ->     -- Old interface file not found, or garbled, so we'd better bail out
-                   traceRn (vcat [ptext SLIT("No old interface file:"), err])  `thenRn_`
-                   returnRn Nothing ;
-
-       Right (_, iface) ->
+loadOldIface :: ParsedIface -> RnMG ModIface
 
-       -- RENAME IT
+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
+    in
     initIfaceRnMS mod (
        loadHomeDecls (pi_decls iface)  `thenRn` \ decls ->
        loadHomeRules (pi_rules iface)  `thenRn` \ rules -> 
        loadHomeInsts (pi_insts iface)  `thenRn` \ insts ->
        returnRn (decls, rules, insts)
-    )                          `thenRn` \ ((decls_vers, new_decls), (rule_vers, new_rules), new_insts) ->
+    )  
+       `thenRn` \ ((decls_vers, new_decls), (rule_vers, new_rules), new_insts) ->
 
     mapRn loadHomeUsage        (pi_usages iface)       `thenRn` \ usages ->
-    loadExports        (pi_exports iface)      `thenRn` \ (export_vers, avails) ->
+    loadExports         (pi_exports iface)     `thenRn` \ (export_vers, avails) ->
     loadFixDecls mod   (pi_fixity iface)       `thenRn` \ fix_env ->
     loadDeprecs mod    (pi_deprecs iface)      `thenRn` \ deprec_env ->
     let
@@ -419,24 +426,17 @@ loadOldIface mod Nothing
                                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_orphan = pi_orphan iface,
+                              mi_exports = avails, mi_usages  = usages,
+                              mi_boot = False, mi_orphan = pi_orphan iface, 
                               mi_fixities = fix_env, mi_deprecs = deprec_env,
-                              mi_usages  = usages,
                               mi_decls   = decls,
                               mi_globals = panic "No mi_globals in old interface"
                    }
     in
-    returnRn (Just mod_iface)
-    }
-
-    
-  where
-    doc_str = ptext SLIT("need usage info from") <+> ppr mod
+    returnRn mod_iface
 \end{code}
 
 \begin{code}
@@ -531,12 +531,15 @@ reportUnusedNames my_mod_iface imports avail_env
   = warnUnusedModules unused_imp_mods                          `thenRn_`
     warnUnusedLocalBinds bad_locals                            `thenRn_`
     warnUnusedImports bad_imp_names                            `thenRn_`
-    printMinimalImports my_mod_iface minimal_imports           `thenRn_`
-    warnDeprecations my_mod_iface really_used_names            `thenRn_`
+    printMinimalImports this_mod minimal_imports               `thenRn_`
+    warnDeprecations this_mod my_deprecs really_used_names     `thenRn_`
+    traceRn (text "Used" <+> fsep (map ppr (nameSetToList used_names)))        `thenRn_`
     returnRn ()
 
   where
+    this_mod   = mi_module my_mod_iface
     gbl_env    = mi_globals my_mod_iface
+    my_deprecs = mi_deprecs my_mod_iface
     
     -- Now, a use of C implies a use of T,
     -- if C was brought into scope by T(..) or T(C)
@@ -557,10 +560,16 @@ 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]
@@ -629,7 +638,7 @@ reportUnusedNames my_mod_iface imports avail_env
     module_unused mod = moduleName mod `elem` unused_imp_mods
 
 
-warnDeprecations my_mod_iface used_names
+warnDeprecations this_mod my_deprecs used_names
   = doptRn Opt_WarnDeprecations                                `thenRn` \ warn_drs ->
     if not warn_drs then returnRn () else
 
@@ -644,15 +653,16 @@ warnDeprecations my_mod_iface used_names
     mapRn_ warnDeprec deprecs
 
   where
-    my_deprecs = mi_deprecs my_mod_iface
-    lookup_deprec hit pit n 
-       | isLocallyDefined n = lookupDeprec my_deprecs n
-       | otherwise          = case lookupTable hit pit n of
-                                Just iface -> lookupDeprec (mi_deprecs iface) n
-                                Nothing    -> pprPanic "warnDeprecations:" (ppr n)
+    lookup_deprec hit pit n
+       | nameIsLocalOrFrom this_mod n
+       = lookupDeprec my_deprecs n 
+       | otherwise
+       = case lookupIface hit pit this_mod n of
+               Just iface -> lookupDeprec (mi_deprecs iface) n
+               Nothing    -> pprPanic "warnDeprecations:" (ppr n)
 
 -- ToDo: deal with original imports with 'qualified' and 'as M' clauses
-printMinimalImports my_mod_iface imps
+printMinimalImports this_mod imps
   = doptRn Opt_D_dump_minimal_imports          `thenRn` \ dump_minimal ->
     if not dump_minimal then returnRn () else
 
@@ -662,8 +672,7 @@ printMinimalImports my_mod_iface imps
        })                                      `thenRn_`
     returnRn ()
   where
-    filename = moduleNameUserString (moduleName (mi_module my_mod_iface)) 
-              ++ ".imports"
+    filename = moduleNameUserString (moduleName this_mod) ++ ".imports"
     ppr_mod_ie (mod_name, ies) 
        | mod_name == pRELUDE_Name 
        = empty
@@ -697,7 +706,7 @@ rnDump  :: [RenamedHsDecl]  -- Renamed imported decls
 rnDump imp_decls local_decls
   = doptRn Opt_D_dump_rn_trace         `thenRn` \ dump_rn_trace ->
     doptRn Opt_D_dump_rn_stats         `thenRn` \ dump_rn_stats ->
-    doptRn Opt_D_dump_rn               `thenRn` \ dump_rn ->
+    doptRn Opt_D_dump_rn       `thenRn` \ dump_rn ->
     getIfacesRn                        `thenRn` \ ifaces ->
 
     ioToRnM (do { dumpIfSet (dump_rn_trace || dump_rn_stats || dump_rn)
@@ -723,41 +732,33 @@ getRnStats :: [RenamedHsDecl] -> Ifaces -> SDoc
 getRnStats imported_decls ifaces
   = hcat [text "Renamer stats: ", stats]
   where
-    n_mods = length [() | (_, _, True) <- eltsFM (iImpModInfo ifaces)]
+    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
-                        not (isLocallyDefined (availName avail))
                     ]
     
-    (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])]
+        hsep [ int n_decls_slurped, text "class decls 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"]
+       ]
 
 count_decls decls
   = (class_decls, 
@@ -789,9 +790,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,