2 % (c) The GRASP Project, Glasgow University, 1992-1998
4 \section[Rename]{Renaming and dependency analysis passes}
7 module Rename ( renameModule, renameStmt, closeIfaceDecls, checkOldIface ) where
9 #include "HsVersions.h"
12 import RdrHsSyn ( RdrNameHsModule, RdrNameHsDecl, RdrNameDeprecation,
13 RdrNameTyClDecl, RdrNameRuleDecl, RdrNameInstDecl, RdrNameImportDecl,
16 import RnHsSyn ( RenamedHsDecl, RenamedTyClDecl, RenamedRuleDecl, RenamedInstDecl,
17 extractHsTyNames, RenamedStmt,
18 instDeclFVs, tyClDeclFVs, ruleDeclFVs
21 import CmdLineOpts ( DynFlags, DynFlag(..) )
23 import RnExpr ( rnStmt )
24 import RnNames ( getGlobalNames, exportsFromAvail )
25 import RnSource ( rnSourceDecls, rnTyClDecl, rnIfaceRuleDecl, rnInstDecl )
26 import RnIfaces ( slurpImpDecls, mkImportInfo, recordLocalSlurps,
28 RecompileRequired, outOfDate, recompileRequired
30 import RnHiFiles ( readIface, removeContext, loadInterface,
31 loadExports, loadFixDecls, loadDeprecs,
33 import RnEnv ( availsToNameSet, mkIfaceGlobalRdrEnv,
34 emptyAvailEnv, unitAvailEnv, availEnvElts,
35 plusAvailEnv, groupAvails, warnUnusedImports,
36 warnUnusedLocalBinds, warnUnusedModules,
37 lookupSrcName, addImplicitFVs,
38 newGlobalName, unQualInScope,, ubiquitousNames
40 import Module ( Module, ModuleName, WhereFrom(..),
41 moduleNameUserString, moduleName,
44 import Name ( Name, nameIsLocalOrFrom, nameModule )
47 import RdrName ( foldRdrEnv, isQual )
48 import PrelNames ( SyntaxMap, pRELUDE_Name )
49 import ErrUtils ( dumpIfSet, dumpIfSet_dyn, showPass,
50 printErrorsAndWarnings, errorsFound )
51 import Bag ( bagToList )
52 import FiniteMap ( FiniteMap, fmToList, emptyFM, lookupFM,
53 addToFM_C, elemFM, addToFM
55 import Maybes ( maybeToBool, catMaybes )
57 import IO ( openFile, IOMode(..) )
58 import HscTypes ( PersistentCompilerState, HomeIfaceTable, HomeSymbolTable,
59 ModIface(..), WhatsImported(..),
60 VersionInfo(..), ImportVersion, IsExported,
61 IfaceDecls, mkIfaceDecls, dcl_tycl, dcl_rules, dcl_insts,
62 GlobalRdrEnv, GlobalRdrElt(..), pprGlobalRdrEnv,
63 AvailEnv, GenAvailInfo(..), AvailInfo, Avails,
64 Provenance(..), ImportReason(..), initialVersionInfo,
68 import CmStaticInfo ( GhciMode(..) )
69 import List ( partition, nub )
75 %*********************************************************
77 \subsection{The two main wrappers}
79 %*********************************************************
82 renameModule :: DynFlags
83 -> HomeIfaceTable -> HomeSymbolTable
84 -> PersistentCompilerState
85 -> Module -> RdrNameHsModule
86 -> IO (PersistentCompilerState, PrintUnqualified,
87 Maybe (IsExported, ModIface, (SyntaxMap, [RenamedHsDecl])))
88 -- Nothing => some error occurred in the renamer
90 renameModule dflags hit hst pcs this_module rdr_module
91 = renameSource dflags hit hst pcs this_module $
92 rename this_module rdr_module
97 renameStmt :: DynFlags
98 -> HomeIfaceTable -> HomeSymbolTable
99 -> PersistentCompilerState
100 -> Module -- current context (scope to compile in)
101 -> Module -- current module
102 -> LocalRdrEnv -- current context (temp bindings)
103 -> RdrNameStmt -- parsed stmt
104 -> IO ( PersistentCompilerState,
106 Maybe ([Name], (SyntaxMap, RenamedStmt, [RenamedHsDecl]))
109 renameStmt dflags hit hst pcs scope_module this_module local_env stmt
110 = renameSource dflags hit hst pcs this_module $
112 -- Load the interface for the context module, so
113 -- that we can get its top-level lexical environment
114 -- Bale out if we fail to do this
115 loadInterface doc (moduleName scope_module) ImportByUser `thenRn` \ iface ->
116 let rdr_env = mi_globals iface
117 print_unqual = unQualInScope rdr_env
119 checkErrsRn `thenRn` \ no_errs_so_far ->
120 if not no_errs_so_far then
121 returnRn (print_unqual, Nothing)
125 initRnMS rdr_env local_env emptyLocalFixityEnv CmdLineMode (
126 rnStmt stmt $ \ stmt' ->
127 returnRn (([], stmt'), emptyFVs)
128 ) `thenRn` \ ((binders, stmt), fvs) ->
130 -- Bale out if we fail
131 checkErrsRn `thenRn` \ no_errs_so_far ->
132 if not no_errs_so_far then
133 doDump [] stmt [] `thenRn_` returnRn (print_unqual, Nothing)
136 let filtered_fvs = fvs `delListFromNameSet` rdrEnvElts local_env in
138 -- Add implicit free vars, and close decls
139 addImplicitFVs rdr_env Nothing filtered_fvs
140 `thenRn` \ (slurp_fvs, syntax_map) ->
141 slurpImpDecls slurp_fvs `thenRn` \ decls ->
143 doDump binders stmt decls `thenRn_`
144 returnRn (print_unqual, Just (binders, (syntax_map, stmt, decls)))
147 doc = text "context for compiling expression"
149 doDump :: [Name] -> RenamedStmt -> [RenamedHsDecl] -> RnMG (Either IOError ())
150 doDump bndrs stmt decls
151 = getDOptsRn `thenRn` \ dflags ->
152 ioToRnM (dumpIfSet_dyn dflags Opt_D_dump_rn "Renamer:"
153 (vcat [text "Binders:" <+> ppr bndrs,
155 vcat (map ppr decls)]))
159 %*********************************************************
161 \subsection{The main function: rename}
163 %*********************************************************
166 renameSource :: DynFlags
167 -> HomeIfaceTable -> HomeSymbolTable
168 -> PersistentCompilerState
170 -> RnMG (PrintUnqualified, Maybe r)
171 -> IO (PersistentCompilerState, PrintUnqualified, Maybe r)
172 -- Nothing => some error occurred in the renamer
174 renameSource dflags hit hst old_pcs this_module thing_inside
175 = do { showPass dflags "Renamer"
177 -- Initialise the renamer monad
178 ; (new_pcs, msgs, (print_unqual, maybe_rn_stuff))
179 <- initRn dflags hit hst old_pcs this_module thing_inside
181 -- Print errors from renaming
182 ; printErrorsAndWarnings print_unqual msgs ;
184 -- Return results. No harm in updating the PCS
185 ; if errorsFound msgs then
186 return (new_pcs, print_unqual, Nothing)
188 return (new_pcs, print_unqual, maybe_rn_stuff)
193 rename :: Module -> RdrNameHsModule
194 -> RnMG (PrintUnqualified, Maybe (IsExported, ModIface, (SyntaxMap, [RenamedHsDecl])))
195 rename this_module contents@(HsModule _ _ exports imports local_decls mod_deprec loc)
198 -- FIND THE GLOBAL NAME ENVIRONMENT
199 getGlobalNames this_module contents `thenRn` \ (gbl_env, local_gbl_env, all_avails@(_, global_avail_env)) ->
201 print_unqualified = unQualInScope gbl_env
203 -- Exit if we've found any errors
204 checkErrsRn `thenRn` \ no_errs_so_far ->
205 if not no_errs_so_far then
206 -- Found errors already, so exit now
207 rnDump [] [] `thenRn_`
208 returnRn (print_unqualified, Nothing)
211 -- PROCESS EXPORT LIST
212 exportsFromAvail mod_name exports all_avails gbl_env `thenRn` \ export_avails ->
214 traceRn (text "Local top-level environment" $$
215 nest 4 (pprGlobalRdrEnv local_gbl_env)) `thenRn_`
217 -- DEAL WITH DEPRECATIONS
218 rnDeprecs local_gbl_env mod_deprec
219 [d | DeprecD d <- local_decls] `thenRn` \ my_deprecs ->
221 -- DEAL WITH LOCAL FIXITIES
222 fixitiesFromLocalDecls local_gbl_env local_decls `thenRn` \ local_fixity_env ->
225 rnSourceDecls gbl_env local_fixity_env local_decls `thenRn` \ (rn_local_decls, source_fvs) ->
227 -- EXIT IF ERRORS FOUND
228 -- We exit here if there are any errors in the source, *before*
229 -- we attempt to slurp the decls from the interfaces, otherwise
230 -- the slurped decls may get lost when we return up the stack
231 -- to hscMain/hscExpr.
232 checkErrsRn `thenRn` \ no_errs_so_far ->
233 if not no_errs_so_far then
234 -- Found errors already, so exit now
235 rnDump [] rn_local_decls `thenRn_`
236 returnRn (print_unqualified, Nothing)
239 -- SLURP IN ALL THE NEEDED DECLARATIONS
240 addImplicitFVs gbl_env (Just (mod_name, rn_local_decls))
241 source_fvs `thenRn` \ (slurp_fvs, sugar_map) ->
242 traceRn (text "Source FVs:" <+> fsep (map ppr (nameSetToList slurp_fvs))) `thenRn_`
243 slurpImpDecls slurp_fvs `thenRn` \ rn_imp_decls ->
245 rnDump rn_imp_decls rn_local_decls `thenRn_`
247 -- GENERATE THE VERSION/USAGE INFO
248 mkImportInfo mod_name imports `thenRn` \ my_usages ->
250 -- BUILD THE MODULE INTERFACE
252 -- We record fixities even for things that aren't exported,
253 -- so that we can change into the context of this moodule easily
254 fixities = mkNameEnv [ (name, fixity)
255 | FixitySig name fixity loc <- nameEnvElts local_fixity_env
258 -- Sort the exports to make them easier to compare for versions
259 my_exports = groupAvails this_module export_avails
261 final_decls = rn_local_decls ++ rn_imp_decls
262 is_orphan = any (isOrphanDecl this_module) rn_local_decls
264 mod_iface = ModIface { mi_module = this_module,
265 mi_version = initialVersionInfo,
266 mi_usages = my_usages,
268 mi_orphan = is_orphan,
269 mi_exports = my_exports,
270 mi_globals = gbl_env,
271 mi_fixities = fixities,
272 mi_deprecs = my_deprecs,
273 mi_decls = panic "mi_decls"
276 is_exported name = name `elemNameSet` exported_names
277 exported_names = availsToNameSet export_avails
280 -- REPORT UNUSED NAMES, AND DEBUG DUMP
281 reportUnusedNames mod_iface print_unqualified
282 imports global_avail_env
283 source_fvs export_avails rn_imp_decls `thenRn_`
285 returnRn (print_unqualified, Just (is_exported, mod_iface, (sugar_map, final_decls)))
287 mod_name = moduleName this_module
291 isOrphanDecl this_mod (InstD (InstDecl inst_ty _ _ _ _))
292 = not (foldNameSet ((||) . nameIsLocalOrFrom this_mod) False
293 (extractHsTyNames (removeContext inst_ty)))
294 -- The 'removeContext' is because of
295 -- instance Foo a => Baz T where ...
296 -- The decl is an orphan if Baz and T are both not locally defined,
297 -- even if Foo *is* locally defined
299 isOrphanDecl this_mod (RuleD (HsRule _ _ _ lhs _ _))
302 -- At the moment we just check for common LHS forms
303 -- Expand as necessary. Getting it wrong just means
304 -- more orphans than necessary
305 check (HsVar v) = not (nameIsLocalOrFrom this_mod v)
306 check (HsApp f a) = check f && check a
307 check (HsLit _) = False
308 check (HsOverLit _) = False
309 check (OpApp l o _ r) = check l && check o && check r
310 check (NegApp e) = check e
311 check (HsPar e) = check e
312 check (SectionL e o) = check e && check o
313 check (SectionR o e) = check e && check o
315 check other = True -- Safe fall through
317 isOrphanDecl _ _ = False
321 %*********************************************************
323 \subsection{Fixities}
325 %*********************************************************
328 fixitiesFromLocalDecls :: GlobalRdrEnv -> [RdrNameHsDecl] -> RnMG LocalFixityEnv
329 fixitiesFromLocalDecls gbl_env decls
330 = foldlRn getFixities emptyNameEnv decls `thenRn` \ env ->
331 traceRn (text "fixity env" <+> vcat (map ppr (nameEnvElts env))) `thenRn_`
334 getFixities :: LocalFixityEnv -> RdrNameHsDecl -> RnMG LocalFixityEnv
335 getFixities acc (FixD fix)
338 getFixities acc (TyClD (ClassDecl { tcdSigs = sigs}))
339 = foldlRn fix_decl acc [sig | FixSig sig <- sigs]
340 -- Get fixities from class decl sigs too.
341 getFixities acc other_decl
344 fix_decl acc sig@(FixitySig rdr_name fixity loc)
345 = -- Check for fixity decl for something not declared
347 lookupSrcName gbl_env rdr_name `thenRn` \ name ->
349 -- Check for duplicate fixity decl
350 case lookupNameEnv acc name of
351 Just (FixitySig _ _ loc') -> addErrRn (dupFixityDecl rdr_name loc loc') `thenRn_`
354 Nothing -> returnRn (extendNameEnv acc name (FixitySig name fixity loc))
358 %*********************************************************
360 \subsection{Deprecations}
362 %*********************************************************
364 For deprecations, all we do is check that the names are in scope.
365 It's only imported deprecations, dealt with in RnIfaces, that we
366 gather them together.
369 rnDeprecs :: GlobalRdrEnv -> Maybe DeprecTxt
370 -> [RdrNameDeprecation] -> RnMG Deprecations
371 rnDeprecs gbl_env Nothing []
374 rnDeprecs gbl_env (Just txt) decls
375 = mapRn (addErrRn . badDeprec) decls `thenRn_`
376 returnRn (DeprecAll txt)
378 rnDeprecs gbl_env Nothing decls
379 = mapRn rn_deprec decls `thenRn` \ pairs ->
380 returnRn (DeprecSome (mkNameEnv (catMaybes pairs)))
382 rn_deprec (Deprecation rdr_name txt loc)
384 lookupSrcName gbl_env rdr_name `thenRn` \ name ->
385 returnRn (Just (name, (name,txt)))
389 %************************************************************************
391 \subsection{Grabbing the old interface file and checking versions}
393 %************************************************************************
396 checkOldIface :: GhciMode
398 -> HomeIfaceTable -> HomeSymbolTable
399 -> PersistentCompilerState
401 -> Bool -- Source unchanged
402 -> Maybe ModIface -- Old interface from compilation manager, if any
403 -> IO (PersistentCompilerState, Bool, (RecompileRequired, Maybe ModIface))
404 -- True <=> errors happened
406 checkOldIface ghci_mode dflags hit hst pcs iface_path source_unchanged maybe_iface
407 = runRn dflags hit hst pcs (panic "Bogus module") $
409 -- CHECK WHETHER THE SOURCE HAS CHANGED
410 ( if not source_unchanged then
411 traceHiDiffsRn (nest 4 (text "Source file changed or recompilation check turned off"))
412 else returnRn () ) `thenRn_`
414 -- If the source has changed and we're in interactive mode, avoid reading
415 -- an interface; just return the one we might have been supplied with.
416 if ghci_mode == Interactive && not source_unchanged then
417 returnRn (outOfDate, maybe_iface)
421 Just old_iface -> -- Use the one we already have
422 setModuleRn (mi_module old_iface) (check_versions old_iface)
424 Nothing -- try and read it from a file
425 -> readIface iface_path `thenRn` \ read_result ->
427 Left err -> -- Old interface file not found, or garbled; give up
428 traceRn (text "Bad old interface file" $$ nest 4 err) `thenRn_`
429 returnRn (outOfDate, Nothing)
432 -> setModuleRn (pi_mod parsed_iface) $
433 loadOldIface parsed_iface `thenRn` \ m_iface ->
434 check_versions m_iface
436 check_versions :: ModIface -> RnMG (RecompileRequired, Maybe ModIface)
438 | not source_unchanged
439 = returnRn (outOfDate, Just iface)
442 recompileRequired iface_path iface `thenRn` \ recompile ->
443 returnRn (recompile, Just iface)
446 I think the following function should now have a more representative name,
450 loadOldIface :: ParsedIface -> RnMG ModIface
452 loadOldIface parsed_iface
453 = let iface = parsed_iface
457 loadHomeDecls (pi_decls iface) `thenRn` \ decls ->
458 loadHomeRules (pi_rules iface) `thenRn` \ rules ->
459 loadHomeInsts (pi_insts iface) `thenRn` \ insts ->
460 returnRn (decls, rules, insts)
462 `thenRn` \ ((decls_vers, new_decls), (rule_vers, new_rules), new_insts) ->
464 mapRn loadHomeUsage (pi_usages iface) `thenRn` \ usages ->
465 loadExports (pi_exports iface) `thenRn` \ (export_vers, avails) ->
466 loadFixDecls mod (pi_fixity iface) `thenRn` \ fix_env ->
467 loadDeprecs mod (pi_deprecs iface) `thenRn` \ deprec_env ->
469 version = VersionInfo { vers_module = pi_vers iface,
470 vers_exports = export_vers,
471 vers_rules = rule_vers,
472 vers_decls = decls_vers }
474 decls = mkIfaceDecls new_decls new_rules new_insts
476 mod_iface = ModIface { mi_module = mod, mi_version = version,
477 mi_exports = avails, mi_usages = usages,
478 mi_boot = False, mi_orphan = pi_orphan iface,
479 mi_fixities = fix_env, mi_deprecs = deprec_env,
481 mi_globals = mkIfaceGlobalRdrEnv avails
488 loadHomeDecls :: [(Version, RdrNameTyClDecl)]
489 -> RnMS (NameEnv Version, [RenamedTyClDecl])
490 loadHomeDecls decls = foldlRn loadHomeDecl (emptyNameEnv, []) decls
492 loadHomeDecl :: (NameEnv Version, [RenamedTyClDecl])
493 -> (Version, RdrNameTyClDecl)
494 -> RnMS (NameEnv Version, [RenamedTyClDecl])
495 loadHomeDecl (version_map, decls) (version, decl)
496 = rnTyClDecl decl `thenRn` \ decl' ->
497 returnRn (extendNameEnv version_map (tyClDeclName decl') version, decl':decls)
500 loadHomeRules :: (Version, [RdrNameRuleDecl])
501 -> RnMS (Version, [RenamedRuleDecl])
502 loadHomeRules (version, rules)
503 = mapRn rnIfaceRuleDecl rules `thenRn` \ rules' ->
504 returnRn (version, rules')
507 loadHomeInsts :: [RdrNameInstDecl]
508 -> RnMS [RenamedInstDecl]
509 loadHomeInsts insts = mapRn rnInstDecl insts
512 loadHomeUsage :: ImportVersion OccName
513 -> RnMG (ImportVersion Name)
514 loadHomeUsage (mod_name, orphans, is_boot, whats_imported)
515 = rn_imps whats_imported `thenRn` \ whats_imported' ->
516 returnRn (mod_name, orphans, is_boot, whats_imported')
518 rn_imps NothingAtAll = returnRn NothingAtAll
519 rn_imps (Everything v) = returnRn (Everything v)
520 rn_imps (Specifically mv ev items rv) = mapRn rn_imp items `thenRn` \ items' ->
521 returnRn (Specifically mv ev items' rv)
522 rn_imp (occ,vers) = newGlobalName mod_name occ `thenRn` \ name ->
528 %*********************************************************
530 \subsection{Closing up the interface decls}
532 %*********************************************************
534 Suppose we discover we don't need to recompile. Then we start from the
535 IfaceDecls in the ModIface, and fluff them up by sucking in all the decls they need.
538 closeIfaceDecls :: DynFlags
539 -> HomeIfaceTable -> HomeSymbolTable
540 -> PersistentCompilerState
541 -> ModIface -- Get the decls from here
542 -> IO (PersistentCompilerState, Bool, [RenamedHsDecl])
543 -- True <=> errors happened
544 closeIfaceDecls dflags hit hst pcs
545 mod_iface@(ModIface { mi_module = mod, mi_decls = iface_decls })
546 = runRn dflags hit hst pcs mod $
549 rule_decls = dcl_rules iface_decls
550 inst_decls = dcl_insts iface_decls
551 tycl_decls = dcl_tycl iface_decls
552 decls = map RuleD rule_decls ++
553 map InstD inst_decls ++
555 needed = unionManyNameSets (map ruleDeclFVs rule_decls) `unionNameSets`
556 unionManyNameSets (map instDeclFVs inst_decls) `unionNameSets`
557 unionManyNameSets (map tyClDeclFVs tycl_decls)
558 local_names = foldl add emptyNameSet tycl_decls
559 add names decl = addListToNameSet names (map fst (tyClDeclSysNames decl ++ tyClDeclNames decl))
562 recordLocalSlurps local_names `thenRn_`
564 -- Do the transitive closure
565 closeDecls decls (needed `plusFV` implicit_fvs) `thenRn` \closed_decls ->
566 rnDump [] closed_decls `thenRn_`
567 returnRn closed_decls
569 implicit_fvs = ubiquitousNames -- Data type decls with record selectors,
570 -- which may appear in the decls, need unpackCString
571 -- and friends. It's easier to just grab them right now.
574 %*********************************************************
576 \subsection{Unused names}
578 %*********************************************************
581 reportUnusedNames :: ModIface -> PrintUnqualified
582 -> [RdrNameImportDecl]
584 -> NameSet -- Used in this module
585 -> Avails -- Exported by this module
588 reportUnusedNames my_mod_iface unqual imports avail_env
589 source_fvs export_avails imported_decls
590 = warnUnusedModules unused_imp_mods `thenRn_`
591 warnUnusedLocalBinds bad_locals `thenRn_`
592 warnUnusedImports bad_imp_names `thenRn_`
593 printMinimalImports this_mod unqual minimal_imports
595 this_mod = mi_module my_mod_iface
596 gbl_env = mi_globals my_mod_iface
598 -- The export_fvs make the exported names look just as if they
599 -- occurred in the source program.
600 export_fvs = availsToNameSet export_avails
601 used_names = source_fvs `plusFV` export_fvs
603 -- Now, a use of C implies a use of T,
604 -- if C was brought into scope by T(..) or T(C)
605 really_used_names = used_names `unionNameSets`
606 mkNameSet [ parent_name
607 | sub_name <- nameSetToList used_names
609 -- Usually, every used name will appear in avail_env, but there
610 -- is one time when it doesn't: tuples and other built in syntax. When you
611 -- write (a,b) that gives rise to a *use* of "(,)", so that the
612 -- instances will get pulled in, but the tycon "(,)" isn't actually
613 -- in scope. Also, (-x) gives rise to an implicit use of 'negate';
614 -- similarly, 3.5 gives rise to an implcit use of :%
615 -- Hence the silent 'False' in all other cases
617 , Just parent_name <- [case lookupNameEnv avail_env sub_name of
618 Just (AvailTC n _) -> Just n
622 -- Collect the defined names from the in-scope environment
623 -- Look for the qualified ones only, else get duplicates
624 defined_names :: [GlobalRdrElt]
625 defined_names = foldRdrEnv add [] gbl_env
626 add rdr_name ns acc | isQual rdr_name = ns ++ acc
629 defined_and_used, defined_but_not_used :: [GlobalRdrElt]
630 (defined_and_used, defined_but_not_used) = partition used defined_names
631 used (GRE name _ _) = name `elemNameSet` really_used_names
633 -- Filter out the ones only defined implicitly
635 bad_locals = [n | (GRE n LocalDef _) <- defined_but_not_used]
637 bad_imp_names :: [(Name,Provenance)]
638 bad_imp_names = [(n,p) | GRE n p@(NonLocalDef (UserImport mod _ True)) _ <- defined_but_not_used,
639 not (module_unused mod)]
641 -- inst_mods are directly-imported modules that
642 -- contain instance decl(s) that the renamer decided to suck in
643 -- It's not necessarily redundant to import such modules.
649 -- The import M() is not *necessarily* redundant, even if
650 -- we suck in no instance decls from M (e.g. it contains
651 -- no instance decls, or This contains no code). It may be
652 -- that we import M solely to ensure that M's orphan instance
653 -- decls (or those in its imports) are visible to people who
654 -- import This. Sigh.
655 -- There's really no good way to detect this, so the error message
656 -- in RnEnv.warnUnusedModules is weakened instead
657 inst_mods :: [ModuleName]
658 inst_mods = [m | InstD (InstDecl _ _ _ (Just dfun) _) <- imported_decls,
659 let m = moduleName (nameModule dfun),
660 m `elem` direct_import_mods
663 -- To figure out the minimal set of imports, start with the things
664 -- that are in scope (i.e. in gbl_env). Then just combine them
665 -- into a bunch of avails, so they are properly grouped
666 minimal_imports :: FiniteMap ModuleName AvailEnv
667 minimal_imports0 = emptyFM
668 minimal_imports1 = foldr add_name minimal_imports0 defined_and_used
669 minimal_imports = foldr add_inst_mod minimal_imports1 inst_mods
671 -- We've carefully preserved the provenance so that we can
672 -- construct minimal imports that import the name by (one of)
673 -- the same route(s) as the programmer originally did.
674 add_name (GRE n (NonLocalDef (UserImport m _ _)) _) acc = addToFM_C plusAvailEnv acc (moduleName m)
675 (unitAvailEnv (mk_avail n))
676 add_name (GRE n other_prov _) acc = acc
678 mk_avail n = case lookupNameEnv avail_env n of
679 Just (AvailTC m _) | n==m -> AvailTC n [n]
680 | otherwise -> AvailTC m [n,m]
681 Just avail -> Avail n
682 Nothing -> pprPanic "mk_avail" (ppr n)
685 | m `elemFM` acc = acc -- We import something already
686 | otherwise = addToFM acc m emptyAvailEnv
687 -- Add an empty collection of imports for a module
688 -- from which we have sucked only instance decls
690 direct_import_mods :: [ModuleName]
691 direct_import_mods = nub [m | ImportDecl m _ _ _ _ _ <- imports]
693 -- unused_imp_mods are the directly-imported modules
694 -- that are not mentioned in minimal_imports
695 unused_imp_mods = [m | m <- direct_import_mods,
696 not (maybeToBool (lookupFM minimal_imports m)),
699 module_unused :: Module -> Bool
700 module_unused mod = moduleName mod `elem` unused_imp_mods
703 -- ToDo: deal with original imports with 'qualified' and 'as M' clauses
704 printMinimalImports :: Module -- This module
706 -> FiniteMap ModuleName AvailEnv -- Minimal imports
708 printMinimalImports this_mod unqual imps
709 = doptRn Opt_D_dump_minimal_imports `thenRn` \ dump_minimal ->
710 if not dump_minimal then returnRn () else
712 mapRn to_ies (fmToList imps) `thenRn` \ mod_ies ->
713 ioToRnM (do { h <- openFile filename WriteMode ;
714 printForUser h unqual (vcat (map ppr_mod_ie mod_ies))
718 filename = moduleNameUserString (moduleName this_mod) ++ ".imports"
719 ppr_mod_ie (mod_name, ies)
720 | mod_name == pRELUDE_Name
723 = ptext SLIT("import") <+> ppr mod_name <>
724 parens (fsep (punctuate comma (map ppr ies)))
726 to_ies (mod, avail_env) = mapRn to_ie (availEnvElts avail_env) `thenRn` \ ies ->
729 to_ie :: AvailInfo -> RnMG (IE Name)
730 -- The main trick here is that if we're importing all the constructors
731 -- we want to say "T(..)", but if we're importing only a subset we want
732 -- to say "T(A,B,C)". So we have to find out what the module exports.
733 to_ie (Avail n) = returnRn (IEVar n)
734 to_ie (AvailTC n [m]) = ASSERT( n==m )
735 returnRn (IEThingAbs n)
737 = loadInterface (text "Compute minimal imports from" <+> ppr n_mod) n_mod ImportBySystem `thenRn` \ iface ->
738 case [xs | (m,as) <- mi_exports iface,
742 [xs] | all (`elem` ns) xs -> returnRn (IEThingAll n)
743 | otherwise -> returnRn (IEThingWith n (filter (/= n) ns))
744 other -> pprTrace "to_ie" (ppr n <+> ppr (nameModule n) <+> ppr other) $
747 n_mod = moduleName (nameModule n)
749 rnDump :: [RenamedHsDecl] -- Renamed imported decls
750 -> [RenamedHsDecl] -- Renamed local decls
752 rnDump imp_decls local_decls
753 = doptRn Opt_D_dump_rn_trace `thenRn` \ dump_rn_trace ->
754 doptRn Opt_D_dump_rn_stats `thenRn` \ dump_rn_stats ->
755 doptRn Opt_D_dump_rn `thenRn` \ dump_rn ->
756 getIfacesRn `thenRn` \ ifaces ->
758 ioToRnM (do { dumpIfSet (dump_rn_trace || dump_rn_stats || dump_rn)
760 (getRnStats imp_decls ifaces) ;
762 dumpIfSet dump_rn "Renamer:"
763 (vcat (map ppr (local_decls ++ imp_decls)))
770 %*********************************************************
772 \subsection{Statistics}
774 %*********************************************************
777 getRnStats :: [RenamedHsDecl] -> Ifaces -> SDoc
778 getRnStats imported_decls ifaces
779 = hcat [text "Renamer stats: ", stats]
781 n_mods = length [() | _ <- moduleEnvElts (iPIT ifaces)]
782 -- This is really only right for a one-shot compile
784 (decls_map, n_decls_slurped) = iDecls ifaces
786 n_decls_left = length [decl | (avail, True, (_,decl)) <- nameEnvElts decls_map
787 -- Data, newtype, and class decls are in the decls_fm
788 -- under multiple names; the tycon/class, and each
789 -- constructor/class op too.
790 -- The 'True' selects just the 'main' decl
793 (insts_left, n_insts_slurped) = iInsts ifaces
794 n_insts_left = length (bagToList insts_left)
796 (rules_left, n_rules_slurped) = iRules ifaces
797 n_rules_left = length (bagToList rules_left)
800 [int n_mods <+> text "interfaces read",
801 hsep [ int n_decls_slurped, text "type/class/variable imported, out of",
802 int (n_decls_slurped + n_decls_left), text "read"],
803 hsep [ int n_insts_slurped, text "instance decls imported, out of",
804 int (n_insts_slurped + n_insts_left), text "read"],
805 hsep [ int n_rules_slurped, text "rule decls imported, out of",
806 int (n_rules_slurped + n_rules_left), text "read"]
811 %************************************************************************
813 \subsection{Errors and warnings}
815 %************************************************************************
818 dupFixityDecl rdr_name loc1 loc2
819 = vcat [ptext SLIT("Multiple fixity declarations for") <+> quotes (ppr rdr_name),
820 ptext SLIT("at ") <+> ppr loc1,
821 ptext SLIT("and") <+> ppr loc2]
824 = sep [ptext SLIT("Illegal deprecation when whole module is deprecated"),