[project @ 2000-11-27 14:23:03 by sewardj]
[ghc-hetmet.git] / ghc / compiler / rename / Rename.lhs
index 3900bb3..be45b05 100644 (file)
@@ -4,54 +4,59 @@
 \section[Rename]{Renaming and dependency analysis passes}
 
 \begin{code}
-module Rename ( renameModule, closeIfaceDecls, checkOldIface ) where
+module Rename ( renameModule, renameExpr, closeIfaceDecls, checkOldIface ) where
 
 #include "HsVersions.h"
 
 import HsSyn
-import RdrHsSyn                ( RdrNameHsModule, RdrNameHsDecl, RdrNameDeprecation, 
+import RdrHsSyn                ( RdrNameHsModule, RdrNameHsDecl, RdrNameDeprecation, RdrNameHsExpr,
                          RdrNameTyClDecl, RdrNameRuleDecl, RdrNameInstDecl, RdrNameImportDecl
                        )
 import RnHsSyn         ( RenamedHsDecl, RenamedTyClDecl, RenamedRuleDecl, RenamedInstDecl,
-                         extractHsTyNames, 
+                         extractHsTyNames, RenamedHsExpr,
                          instDeclFVs, tyClDeclFVs, ruleDeclFVs
                        )
 
-import CmdLineOpts     ( DynFlags, DynFlag(..), dopt )
+import CmdLineOpts     ( DynFlags, DynFlag(..) )
 import RnMonad
-import RnNames         ( getGlobalNames )
+import RnExpr          ( rnExpr )
+import RnNames         ( getGlobalNames, exportsFromAvail )
 import RnSource                ( rnSourceDecls, rnTyClDecl, rnIfaceRuleDecl, rnInstDecl )
-import RnIfaces                ( slurpImpDecls, mkImportInfo, 
+import RnIfaces                ( slurpImpDecls, mkImportInfo, recordLocalSlurps,
                          getInterfaceExports, closeDecls,
                          RecompileRequired, outOfDate, recompileRequired
                        )
 import RnHiFiles       ( readIface, removeContext, loadInterface,
-                         loadExports, loadFixDecls, loadDeprecs )
-import RnEnv           ( availsToNameSet, availName,
-                         emptyAvailEnv, unitAvailEnv, availEnvElts, plusAvailEnv, groupAvails,
-                         warnUnusedImports, warnUnusedLocalBinds, warnUnusedModules,
-                         lookupOrigNames, lookupSrcName, newGlobalName
+                         loadExports, loadFixDecls, loadDeprecs,
+                         tryLoadInterface )
+import RnEnv           ( availsToNameSet, availName, mkIfaceGlobalRdrEnv,
+                         emptyAvailEnv, unitAvailEnv, availEnvElts, 
+                         plusAvailEnv, groupAvails, warnUnusedImports, 
+                         warnUnusedLocalBinds, warnUnusedModules, 
+                         lookupOrigNames, lookupSrcName, 
+                         newGlobalName, unQualInScope
                        )
 import Module           ( Module, ModuleName, WhereFrom(..),
                          moduleNameUserString, moduleName,
-                         mkModuleInThisPackage, mkModuleName, moduleEnvElts
+                         moduleEnvElts
                        )
 import Name            ( Name, NamedThing(..), getSrcLoc,
                          nameIsLocalOrFrom, nameOccName, nameModule,
                        )
 import Name            ( mkNameEnv, nameEnvElts, extendNameEnv )
-import RdrName         ( rdrEnvToList, elemRdrEnv, foldRdrEnv, isQual )
+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, dumpIfSet_dyn, showPass, 
+                         printErrorsAndWarnings, errorsFound )
 import Bag             ( bagToList )
 import FiniteMap       ( FiniteMap, fmToList, emptyFM, lookupFM, 
                          addToFM_C, elemFM, addToFM
@@ -62,9 +67,10 @@ import Outputable
 import IO              ( openFile, IOMode(..) )
 import HscTypes                ( PersistentCompilerState, HomeIfaceTable, HomeSymbolTable, 
                          ModIface(..), WhatsImported(..), 
-                         VersionInfo(..), ImportVersion, 
+                         VersionInfo(..), ImportVersion, IsExported,
                          IfaceDecls, mkIfaceDecls, dcl_tycl, dcl_rules, dcl_insts,
-                         GlobalRdrEnv, AvailEnv, GenAvailInfo(..), AvailInfo, Avails,
+                         GlobalRdrEnv, pprGlobalRdrEnv,
+                         AvailEnv, GenAvailInfo(..), AvailInfo, Avails,
                          Provenance(..), ImportReason(..), initialVersionInfo,
                          Deprecations(..), lookupDeprec, lookupIface
                         )
@@ -73,9 +79,10 @@ import List          ( partition, nub )
 
 
 
+
 %*********************************************************
 %*                                                      *
-\subsection{The main function: rename}
+\subsection{The two main wrappers}
 %*                                                      *
 %*********************************************************
 
@@ -84,31 +91,111 @@ renameModule :: DynFlags
             -> HomeIfaceTable -> HomeSymbolTable
             -> PersistentCompilerState 
             -> Module -> RdrNameHsModule 
-            -> IO (PersistentCompilerState, Maybe (ModIface, [RenamedHsDecl]))
+            -> IO (PersistentCompilerState, Maybe (PrintUnqualified, (IsExported, ModIface, [RenamedHsDecl])))
+       -- Nothing => some error occurred in the renamer
+
+renameModule dflags hit hst pcs this_module rdr_module
+  = renameSource dflags hit hst pcs this_module $
+    rename this_module rdr_module
+\end{code}
+
+
+\begin{code}
+renameExpr :: DynFlags
+          -> HomeIfaceTable -> HomeSymbolTable
+          -> PersistentCompilerState 
+          -> Module -> RdrNameHsExpr
+          -> IO ( PersistentCompilerState, 
+                  Maybe (PrintUnqualified, (RenamedHsExpr, [RenamedHsDecl]))
+                 )
+
+renameExpr dflags hit hst pcs this_module expr
+  = do { renameSource dflags hit hst pcs this_module $
+         tryLoadInterface doc (moduleName this_module) ImportByUser 
+                                               `thenRn` \ (iface, maybe_err) ->
+         case maybe_err of {
+           Just msg -> ioToRnM (printErrs alwaysQualify 
+                                (ptext SLIT("failed to load interface for") 
+                                 <+> quotes (ppr this_module) 
+                                 <>  char ':' <+> msg)) `thenRn_`
+                       returnRn Nothing;
+           Nothing -> 
+
+         let rdr_env      = mi_globals iface
+             print_unqual = unQualInScope rdr_env
+         in 
+         initRnMS rdr_env emptyLocalFixityEnv SourceMode (rnExpr expr) 
+                                               `thenRn` \ (e,fvs) -> 
+
+         checkErrsRn                           `thenRn` \ no_errs_so_far ->
+         if not no_errs_so_far then
+               -- Found errors already, so exit now
+               doDump e [] `thenRn_` 
+               returnRn Nothing
+         else
+
+         lookupOrigNames implicit_occs                 `thenRn` \ implicit_names ->
+         slurpImpDecls (fvs `plusFV` implicit_names)   `thenRn` \ decls ->
+
+         doDump e decls  `thenRn_`
+         returnRn (Just (print_unqual, (e, decls)))
+       }}
+  where
+     implicit_occs = string_occs
+     doc = text "context for compiling expression"
+
+     doDump :: RenamedHsExpr -> [RenamedHsDecl] -> RnMG (Either IOError ())
+     doDump e decls = 
+       getDOptsRn  `thenRn` \ dflags ->
+       ioToRnM (dumpIfSet_dyn dflags Opt_D_dump_rn "Renamer:" 
+                       (vcat (ppr e : map ppr decls)))
+\end{code}
+
+
+%*********************************************************
+%*                                                      *
+\subsection{The main function: rename}
+%*                                                      *
+%*********************************************************
+
+\begin{code}
+renameSource :: DynFlags
+            -> HomeIfaceTable -> HomeSymbolTable
+            -> PersistentCompilerState 
+            -> Module 
+            -> RnMG (Maybe (PrintUnqualified, r))
+            -> IO (PersistentCompilerState, Maybe (PrintUnqualified, r))
        -- 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) ;
+renameSource dflags hit hst old_pcs this_module thing_inside
+  = do { showPass dflags "Renamer"
+
+               -- Initialise the renamer monad
+       ; (new_pcs, msgs, maybe_rn_stuff) <- initRn dflags hit hst old_pcs this_module thing_inside
+
+               -- Print errors from renaming
+       ;  let print_unqual = case maybe_rn_stuff of
+                               Just (unqual, _) -> unqual
+                               Nothing          -> alwaysQualify
+
+       ;  printErrorsAndWarnings print_unqual msgs ;
 
-       -- Return results.  No harm in updating the PCS
-       if errors_found then
+               -- 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 this_module contents@(HsModule _ _ _ imports local_decls mod_deprec loc)
+rename :: Module -> RdrNameHsModule -> RnMG (Maybe (PrintUnqualified, (IsExported, ModIface, [RenamedHsDecl])))
+rename this_module contents@(HsModule _ _ exports imports local_decls mod_deprec loc)
   = pushSrcLocRn loc           $
 
        -- FIND THE GLOBAL NAME ENVIRONMENT
-    getGlobalNames this_module contents        `thenRn` \ (gbl_env, local_gbl_env, 
-                                                           export_avails, global_avail_env) ->
+    getGlobalNames this_module contents        `thenRn` \ (gbl_env, local_gbl_env, all_avails@(_, global_avail_env)) ->
 
        -- Exit if we've found any errors
     checkErrsRn                                `thenRn` \ no_errs_so_far ->
@@ -118,6 +205,12 @@ rename this_module contents@(HsModule _ _ _ imports local_decls mod_deprec loc)
        returnRn Nothing 
     else
        
+       -- PROCESS EXPORT LIST 
+    exportsFromAvail mod_name exports all_avails gbl_env       `thenRn` \ export_avails ->
+       
+    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,13 +219,23 @@ 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_`
 
+       -- EXIT IF ERRORS FOUND
+       -- We exit here if there are any errors in the source, *before*
+       -- we attempt to slurp the decls from the interfaces, otherwise
+       -- the slurped decls may get lost when we return up the stack
+       -- to hscMain/hscExpr.
+    checkErrsRn                                        `thenRn` \ no_errs_so_far ->
+    if not no_errs_so_far then
+       -- Found errors already, so exit now
+        rnDump [] rn_local_decls               `thenRn_` 
+       returnRn Nothing
+    else
+
        -- SLURP IN ALL THE NEEDED DECLARATIONS
     implicitFVs mod_name rn_local_decls        `thenRn` \ implicit_fvs -> 
     let
@@ -144,13 +247,7 @@ rename this_module contents@(HsModule _ _ _ imports local_decls mod_deprec loc)
     traceRn (text "Source FVs:" <+> fsep (map ppr (nameSetToList slurp_fvs)))  `thenRn_`
     slurpImpDecls slurp_fvs            `thenRn` \ rn_imp_decls ->
 
-       -- EXIT IF ERRORS FOUND
     rnDump rn_imp_decls rn_local_decls         `thenRn_` 
-    checkErrsRn                                        `thenRn` \ no_errs_so_far ->
-    if not no_errs_so_far then
-       -- Found errors already, so exit now
-       returnRn Nothing
-    else
 
        -- GENERATE THE VERSION/USAGE INFO
     mkImportInfo mod_name imports                      `thenRn` \ my_usages ->
@@ -171,7 +268,7 @@ rename this_module contents@(HsModule _ _ _ imports local_decls mod_deprec loc)
 
        mod_iface = ModIface {  mi_module   = this_module,
                                mi_version  = initialVersionInfo,
-                               mi_usages = my_usages,
+                               mi_usages   = my_usages,
                                mi_boot     = False,
                                mi_orphan   = is_orphan,
                                mi_exports  = my_exports,
@@ -180,13 +277,18 @@ 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
+       is_exported name  = name `elemNameSet` exported_names
+       exported_names    = availsToNameSet export_avails
     in
 
        -- REPORT UNUSED NAMES, AND DEBUG DUMP 
-    reportUnusedNames mod_iface imports global_avail_env
+    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, (is_exported, mod_iface, final_decls)))
   where
     mod_name = moduleName this_module
 \end{code}
@@ -197,7 +299,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}
@@ -231,17 +333,17 @@ implicitFVs mod_name decls
        -- generate code
     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]
 
-    get (TyClD (TyData _ _ _ _ _ _ (Just deriv_classes) _ _ _))
-       = concat (map get_deriv deriv_classes)
-    get other = []
+    get (TyClD (TyData {tcdDerivs = Just deriv_classes})) = concat (map get_deriv deriv_classes)
+    get other                                            = []
 
     get_deriv cls = case lookupUFM derivingOccurrences cls of
                        Nothing   -> []
                        Just occs -> occs
+
+-- Virtually every program has error messages in it somewhere
+string_occs = [unpackCString_RDR, unpackCStringFoldr_RDR, 
+              unpackCStringUtf8_RDR, eqString_RDR]
 \end{code}
 
 \begin{code}
@@ -292,7 +394,7 @@ fixitiesFromLocalDecls gbl_env decls
     getFixities acc (FixD fix)
       = fix_decl acc fix
 
-    getFixities acc (TyClD (ClassDecl _ _ _ _ sigs _ _ _ ))
+    getFixities acc (TyClD (ClassDecl { tcdSigs = sigs}))
       = foldlRn fix_decl acc [sig | FixSig sig <- sigs]
                -- Get fixities from class decl sigs too.
     getFixities acc other_decl
@@ -360,18 +462,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
@@ -381,10 +485,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,
@@ -422,7 +522,7 @@ loadOldIface parsed_iface
                               mi_boot = False, mi_orphan = pi_orphan iface, 
                               mi_fixities = fix_env, mi_deprecs = deprec_env,
                               mi_decls   = decls,
-                              mi_globals = panic "No mi_globals in old interface"
+                              mi_globals = mkIfaceGlobalRdrEnv avails
                    }
     in
     returnRn mod_iface
@@ -487,7 +587,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
@@ -499,8 +599,21 @@ closeIfaceDecls dflags hit hst pcs
        needed = unionManyNameSets (map ruleDeclFVs rule_decls) `unionNameSets`
                 unionManyNameSets (map instDeclFVs inst_decls) `unionNameSets`
                 unionManyNameSets (map tyClDeclFVs tycl_decls)
+       local_names    = foldl add emptyNameSet tycl_decls
+       add names decl = addListToNameSet names (map fst (tyClDeclSysNames decl ++ tyClDeclNames decl))
     in
-    closeDecls decls needed
+       -- Record that we have now got declarations for local_names
+    recordLocalSlurps local_names      `thenRn_`
+
+       -- Do the transitive closure
+    lookupOrigNames implicit_occs      `thenRn` \ implicit_names ->
+    closeDecls decls (needed `plusFV` implicit_names) `thenRn` \closed_decls ->
+    rnDump [] closed_decls `thenRn_`
+    returnRn closed_decls
+  where
+    implicit_occs = string_occs        -- Data type decls with record selectors,
+                               -- which may appear in the decls, need unpackCString
+                               -- and friends. It's easier to just grab them right now.
 \end{code}
 
 %*********************************************************
@@ -510,18 +623,19 @@ closeIfaceDecls dflags hit hst pcs
 %*********************************************************
 
 \begin{code}
-reportUnusedNames :: ModIface -> [RdrNameImportDecl] 
+reportUnusedNames :: ModIface -> PrintUnqualified
+                 -> [RdrNameImportDecl] 
                  -> AvailEnv
                  -> NameSet            -- Used in this module
                  -> Avails             -- Exported by this module
                  -> [RenamedHsDecl] 
                  -> RnMG ()
-reportUnusedNames my_mod_iface imports avail_env 
+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_`
+    printMinimalImports this_mod unqual minimal_imports                `thenRn_`
     warnDeprecations this_mod export_avails my_deprecs 
                     really_used_names
 
@@ -570,7 +684,7 @@ reportUnusedNames my_mod_iface imports avail_env
     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 
@@ -603,9 +717,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]
@@ -662,18 +776,18 @@ warnDeprecations this_mod export_avails my_deprecs used_names
        | nameIsLocalOrFrom this_mod n
        = lookupDeprec my_deprecs n 
        | otherwise
-       = case lookupIface hit pit this_mod n of
+       = case lookupIface hit pit 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 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
@@ -764,19 +878,6 @@ getRnStats imported_decls ifaces
         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, 
-     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]
 \end{code}