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 MkIface ( pprUsage )
34 import RnEnv ( availsToNameSet, mkIfaceGlobalRdrEnv,
35 emptyAvailEnv, unitAvailEnv, availEnvElts,
36 plusAvailEnv, groupAvails, warnUnusedImports,
37 warnUnusedLocalBinds, warnUnusedModules,
38 lookupSrcName, addImplicitFVs,
39 newGlobalName, unQualInScope,, ubiquitousNames
41 import Module ( Module, ModuleName, WhereFrom(..),
42 moduleNameUserString, moduleName,
45 import Name ( Name, nameIsLocalOrFrom, nameModule )
46 import Name ( mkNameEnv, nameEnvElts, extendNameEnv )
47 import RdrName ( foldRdrEnv, isQual )
49 import PrelNames ( SyntaxMap, pRELUDE_Name )
50 import ErrUtils ( dumpIfSet, dumpIfSet_dyn, showPass,
51 printErrorsAndWarnings, errorsFound )
52 import Bag ( bagToList )
53 import FiniteMap ( FiniteMap, fmToList, emptyFM, lookupFM,
54 addToFM_C, elemFM, addToFM
56 import Maybes ( maybeToBool, catMaybes )
58 import IO ( openFile, IOMode(..) )
59 import HscTypes ( PersistentCompilerState, HomeIfaceTable, HomeSymbolTable,
60 ModIface(..), WhatsImported(..),
61 VersionInfo(..), ImportVersion, IsExported,
62 IfaceDecls, mkIfaceDecls, dcl_tycl, dcl_rules, dcl_insts,
63 GlobalRdrEnv, GlobalRdrElt(..), pprGlobalRdrEnv,
64 AvailEnv, GenAvailInfo(..), AvailInfo, Avails,
65 Provenance(..), ImportReason(..), initialVersionInfo,
69 import CmStaticInfo ( GhciMode(..) )
70 import List ( partition, nub )
76 %*********************************************************
78 \subsection{The two main wrappers}
80 %*********************************************************
83 renameModule :: DynFlags
84 -> HomeIfaceTable -> HomeSymbolTable
85 -> PersistentCompilerState
86 -> Module -> RdrNameHsModule
87 -> IO (PersistentCompilerState, PrintUnqualified,
88 Maybe (IsExported, ModIface, (SyntaxMap, [RenamedHsDecl])))
89 -- Nothing => some error occurred in the renamer
91 renameModule dflags hit hst pcs this_module rdr_module
92 = renameSource dflags hit hst pcs this_module $
93 rename this_module rdr_module
98 renameStmt :: DynFlags
99 -> HomeIfaceTable -> HomeSymbolTable
100 -> PersistentCompilerState
101 -> Module -- current context (scope to compile in)
102 -> Module -- current module
103 -> LocalRdrEnv -- current context (temp bindings)
104 -> RdrNameStmt -- parsed stmt
105 -> IO ( PersistentCompilerState,
107 Maybe ([Name], (SyntaxMap, RenamedStmt, [RenamedHsDecl]))
110 renameStmt dflags hit hst pcs scope_module this_module local_env stmt
111 = renameSource dflags hit hst pcs this_module $
113 -- Load the interface for the context module, so
114 -- that we can get its top-level lexical environment
115 -- Bale out if we fail to do this
116 loadInterface doc (moduleName scope_module) ImportByUser `thenRn` \ iface ->
117 let rdr_env = mi_globals iface
118 print_unqual = unQualInScope rdr_env
120 checkErrsRn `thenRn` \ no_errs_so_far ->
121 if not no_errs_so_far then
122 returnRn (print_unqual, Nothing)
126 initRnMS rdr_env local_env emptyLocalFixityEnv CmdLineMode (
127 rnStmt stmt $ \ stmt' ->
128 returnRn (([], stmt'), emptyFVs)
129 ) `thenRn` \ ((binders, stmt), fvs) ->
131 -- Bale out if we fail
132 checkErrsRn `thenRn` \ no_errs_so_far ->
133 if not no_errs_so_far then
134 doDump [] stmt [] `thenRn_` returnRn (print_unqual, Nothing)
137 let filtered_fvs = fvs `delListFromNameSet` rdrEnvElts local_env in
139 -- Add implicit free vars, and close decls
140 addImplicitFVs rdr_env Nothing filtered_fvs
141 `thenRn` \ (slurp_fvs, syntax_map) ->
142 slurpImpDecls slurp_fvs `thenRn` \ decls ->
144 doDump binders stmt decls `thenRn_`
145 returnRn (print_unqual, Just (binders, (syntax_map, stmt, decls)))
148 doc = text "context for compiling expression"
150 doDump :: [Name] -> RenamedStmt -> [RenamedHsDecl] -> RnMG (Either IOError ())
151 doDump bndrs stmt decls
152 = getDOptsRn `thenRn` \ dflags ->
153 ioToRnM (dumpIfSet_dyn dflags Opt_D_dump_rn "Renamer:"
154 (vcat [text "Binders:" <+> ppr bndrs,
156 vcat (map ppr decls)]))
160 %*********************************************************
162 \subsection{The main function: rename}
164 %*********************************************************
167 renameSource :: DynFlags
168 -> HomeIfaceTable -> HomeSymbolTable
169 -> PersistentCompilerState
171 -> RnMG (PrintUnqualified, Maybe r)
172 -> IO (PersistentCompilerState, PrintUnqualified, Maybe r)
173 -- Nothing => some error occurred in the renamer
175 renameSource dflags hit hst old_pcs this_module thing_inside
176 = do { showPass dflags "Renamer"
178 -- Initialise the renamer monad
179 ; (new_pcs, msgs, (print_unqual, maybe_rn_stuff))
180 <- initRn dflags hit hst old_pcs this_module thing_inside
182 -- Print errors from renaming
183 ; printErrorsAndWarnings print_unqual msgs ;
185 -- Return results. No harm in updating the PCS
186 ; if errorsFound msgs then
187 return (new_pcs, print_unqual, Nothing)
189 return (new_pcs, print_unqual, maybe_rn_stuff)
194 rename :: Module -> RdrNameHsModule
195 -> RnMG (PrintUnqualified, Maybe (IsExported, ModIface, (SyntaxMap, [RenamedHsDecl])))
196 rename this_module contents@(HsModule _ _ exports imports local_decls mod_deprec loc)
199 -- FIND THE GLOBAL NAME ENVIRONMENT
200 getGlobalNames this_module contents `thenRn` \ (gbl_env, local_gbl_env, all_avails@(_, global_avail_env)) ->
202 print_unqualified = unQualInScope gbl_env
204 -- Exit if we've found any errors
205 checkErrsRn `thenRn` \ no_errs_so_far ->
206 if not no_errs_so_far then
207 -- Found errors already, so exit now
208 rnDump [] [] `thenRn_`
209 returnRn (print_unqualified, Nothing)
212 -- PROCESS EXPORT LIST
213 exportsFromAvail mod_name exports all_avails gbl_env `thenRn` \ export_avails ->
215 traceRn (text "Local top-level environment" $$
216 nest 4 (pprGlobalRdrEnv local_gbl_env)) `thenRn_`
218 -- DEAL WITH DEPRECATIONS
219 rnDeprecs local_gbl_env mod_deprec
220 [d | DeprecD d <- local_decls] `thenRn` \ my_deprecs ->
222 -- DEAL WITH LOCAL FIXITIES
223 fixitiesFromLocalDecls local_gbl_env local_decls `thenRn` \ local_fixity_env ->
226 rnSourceDecls gbl_env local_fixity_env local_decls `thenRn` \ (rn_local_decls, source_fvs) ->
228 -- EXIT IF ERRORS FOUND
229 -- We exit here if there are any errors in the source, *before*
230 -- we attempt to slurp the decls from the interfaces, otherwise
231 -- the slurped decls may get lost when we return up the stack
232 -- to hscMain/hscExpr.
233 checkErrsRn `thenRn` \ no_errs_so_far ->
234 if not no_errs_so_far then
235 -- Found errors already, so exit now
236 rnDump [] rn_local_decls `thenRn_`
237 returnRn (print_unqualified, Nothing)
240 -- SLURP IN ALL THE NEEDED DECLARATIONS
241 addImplicitFVs gbl_env (Just (mod_name, rn_local_decls))
242 source_fvs `thenRn` \ (slurp_fvs, sugar_map) ->
243 traceRn (text "Source FVs:" <+> fsep (map ppr (nameSetToList slurp_fvs))) `thenRn_`
244 slurpImpDecls slurp_fvs `thenRn` \ rn_imp_decls ->
246 rnDump rn_imp_decls rn_local_decls `thenRn_`
248 -- GENERATE THE VERSION/USAGE INFO
249 mkImportInfo mod_name imports `thenRn` \ my_usages ->
250 traceHiDiffsRn (vcat (map pprUsage my_usages)) `thenRn_`
252 -- BUILD THE MODULE INTERFACE
254 -- We record fixities even for things that aren't exported,
255 -- so that we can change into the context of this moodule easily
256 fixities = mkNameEnv [ (name, fixity)
257 | FixitySig name fixity loc <- nameEnvElts local_fixity_env
260 -- Sort the exports to make them easier to compare for versions
261 my_exports = groupAvails this_module export_avails
263 final_decls = rn_local_decls ++ rn_imp_decls
264 is_orphan = any (isOrphanDecl this_module) rn_local_decls
266 mod_iface = ModIface { mi_module = this_module,
267 mi_version = initialVersionInfo,
268 mi_usages = my_usages,
270 mi_orphan = is_orphan,
271 mi_exports = my_exports,
272 mi_globals = gbl_env,
273 mi_fixities = fixities,
274 mi_deprecs = my_deprecs,
275 mi_decls = panic "mi_decls"
278 is_exported name = name `elemNameSet` exported_names
279 exported_names = availsToNameSet export_avails
282 -- REPORT UNUSED NAMES, AND DEBUG DUMP
283 reportUnusedNames mod_iface print_unqualified
284 imports global_avail_env
285 source_fvs export_avails rn_imp_decls `thenRn_`
287 returnRn (print_unqualified, Just (is_exported, mod_iface, (sugar_map, final_decls)))
289 mod_name = moduleName this_module
293 isOrphanDecl this_mod (InstD (InstDecl inst_ty _ _ _ _))
294 = not (foldNameSet ((||) . nameIsLocalOrFrom this_mod) False
295 (extractHsTyNames (removeContext inst_ty)))
296 -- The 'removeContext' is because of
297 -- instance Foo a => Baz T where ...
298 -- The decl is an orphan if Baz and T are both not locally defined,
299 -- even if Foo *is* locally defined
301 isOrphanDecl this_mod (RuleD (HsRule _ _ _ lhs _ _))
304 -- At the moment we just check for common LHS forms
305 -- Expand as necessary. Getting it wrong just means
306 -- more orphans than necessary
307 check (HsVar v) = not (nameIsLocalOrFrom this_mod v)
308 check (HsApp f a) = check f && check a
309 check (HsLit _) = False
310 check (HsOverLit _) = False
311 check (OpApp l o _ r) = check l && check o && check r
312 check (NegApp e) = check e
313 check (HsPar e) = check e
314 check (SectionL e o) = check e && check o
315 check (SectionR o e) = check e && check o
317 check other = True -- Safe fall through
319 isOrphanDecl _ _ = False
323 %*********************************************************
325 \subsection{Fixities}
327 %*********************************************************
330 fixitiesFromLocalDecls :: GlobalRdrEnv -> [RdrNameHsDecl] -> RnMG LocalFixityEnv
331 fixitiesFromLocalDecls gbl_env decls
332 = foldlRn getFixities emptyNameEnv decls `thenRn` \ env ->
333 traceRn (text "fixity env" <+> vcat (map ppr (nameEnvElts env))) `thenRn_`
336 getFixities :: LocalFixityEnv -> RdrNameHsDecl -> RnMG LocalFixityEnv
337 getFixities acc (FixD fix)
340 getFixities acc (TyClD (ClassDecl { tcdSigs = sigs}))
341 = foldlRn fix_decl acc [sig | FixSig sig <- sigs]
342 -- Get fixities from class decl sigs too.
343 getFixities acc other_decl
346 fix_decl acc sig@(FixitySig rdr_name fixity loc)
347 = -- Check for fixity decl for something not declared
349 lookupSrcName gbl_env rdr_name `thenRn` \ name ->
351 -- Check for duplicate fixity decl
352 case lookupNameEnv acc name of
353 Just (FixitySig _ _ loc') -> addErrRn (dupFixityDecl rdr_name loc loc') `thenRn_`
356 Nothing -> returnRn (extendNameEnv acc name (FixitySig name fixity loc))
360 %*********************************************************
362 \subsection{Deprecations}
364 %*********************************************************
366 For deprecations, all we do is check that the names are in scope.
367 It's only imported deprecations, dealt with in RnIfaces, that we
368 gather them together.
371 rnDeprecs :: GlobalRdrEnv -> Maybe DeprecTxt
372 -> [RdrNameDeprecation] -> RnMG Deprecations
373 rnDeprecs gbl_env Nothing []
376 rnDeprecs gbl_env (Just txt) decls
377 = mapRn (addErrRn . badDeprec) decls `thenRn_`
378 returnRn (DeprecAll txt)
380 rnDeprecs gbl_env Nothing decls
381 = mapRn rn_deprec decls `thenRn` \ pairs ->
382 returnRn (DeprecSome (mkNameEnv (catMaybes pairs)))
384 rn_deprec (Deprecation rdr_name txt loc)
386 lookupSrcName gbl_env rdr_name `thenRn` \ name ->
387 returnRn (Just (name, (name,txt)))
391 %************************************************************************
393 \subsection{Grabbing the old interface file and checking versions}
395 %************************************************************************
398 checkOldIface :: GhciMode
400 -> HomeIfaceTable -> HomeSymbolTable
401 -> PersistentCompilerState
403 -> Bool -- Source unchanged
404 -> Maybe ModIface -- Old interface from compilation manager, if any
405 -> IO (PersistentCompilerState, Bool, (RecompileRequired, Maybe ModIface))
406 -- True <=> errors happened
408 checkOldIface ghci_mode dflags hit hst pcs iface_path source_unchanged maybe_iface
409 = runRn dflags hit hst pcs (panic "Bogus module") $
411 -- CHECK WHETHER THE SOURCE HAS CHANGED
412 ( if not source_unchanged then
413 traceHiDiffsRn (nest 4 (text "Source file changed or recompilation check turned off"))
414 else returnRn () ) `thenRn_`
416 -- If the source has changed and we're in interactive mode, avoid reading
417 -- an interface; just return the one we might have been supplied with.
418 if ghci_mode == Interactive && not source_unchanged then
419 returnRn (outOfDate, maybe_iface)
423 Just old_iface -> -- Use the one we already have
424 setModuleRn (mi_module old_iface) (check_versions old_iface)
426 Nothing -- try and read it from a file
427 -> readIface iface_path `thenRn` \ read_result ->
429 Left err -> -- Old interface file not found, or garbled; give up
430 traceRn (text "Bad old interface file" $$ nest 4 err) `thenRn_`
431 returnRn (outOfDate, Nothing)
434 -> setModuleRn (pi_mod parsed_iface) $
435 loadOldIface parsed_iface `thenRn` \ m_iface ->
436 check_versions m_iface
438 check_versions :: ModIface -> RnMG (RecompileRequired, Maybe ModIface)
440 | not source_unchanged
441 = returnRn (outOfDate, Just iface)
444 recompileRequired iface_path iface `thenRn` \ recompile ->
445 returnRn (recompile, Just iface)
448 I think the following function should now have a more representative name,
452 loadOldIface :: ParsedIface -> RnMG ModIface
454 loadOldIface parsed_iface
455 = let iface = parsed_iface
459 loadHomeDecls (pi_decls iface) `thenRn` \ decls ->
460 loadHomeRules (pi_rules iface) `thenRn` \ rules ->
461 loadHomeInsts (pi_insts iface) `thenRn` \ insts ->
462 returnRn (decls, rules, insts)
464 `thenRn` \ ((decls_vers, new_decls), (rule_vers, new_rules), new_insts) ->
466 mapRn loadHomeUsage (pi_usages iface) `thenRn` \ usages ->
467 loadExports (pi_exports iface) `thenRn` \ (export_vers, avails) ->
468 loadFixDecls mod (pi_fixity iface) `thenRn` \ fix_env ->
469 loadDeprecs mod (pi_deprecs iface) `thenRn` \ deprec_env ->
471 version = VersionInfo { vers_module = pi_vers iface,
472 vers_exports = export_vers,
473 vers_rules = rule_vers,
474 vers_decls = decls_vers }
476 decls = mkIfaceDecls new_decls new_rules new_insts
478 mod_iface = ModIface { mi_module = mod, mi_version = version,
479 mi_exports = avails, mi_usages = usages,
480 mi_boot = False, mi_orphan = pi_orphan iface,
481 mi_fixities = fix_env, mi_deprecs = deprec_env,
483 mi_globals = mkIfaceGlobalRdrEnv avails
490 loadHomeDecls :: [(Version, RdrNameTyClDecl)]
491 -> RnMS (NameEnv Version, [RenamedTyClDecl])
492 loadHomeDecls decls = foldlRn loadHomeDecl (emptyNameEnv, []) decls
494 loadHomeDecl :: (NameEnv Version, [RenamedTyClDecl])
495 -> (Version, RdrNameTyClDecl)
496 -> RnMS (NameEnv Version, [RenamedTyClDecl])
497 loadHomeDecl (version_map, decls) (version, decl)
498 = rnTyClDecl decl `thenRn` \ decl' ->
499 returnRn (extendNameEnv version_map (tyClDeclName decl') version, decl':decls)
502 loadHomeRules :: (Version, [RdrNameRuleDecl])
503 -> RnMS (Version, [RenamedRuleDecl])
504 loadHomeRules (version, rules)
505 = mapRn rnIfaceRuleDecl rules `thenRn` \ rules' ->
506 returnRn (version, rules')
509 loadHomeInsts :: [RdrNameInstDecl]
510 -> RnMS [RenamedInstDecl]
511 loadHomeInsts insts = mapRn rnInstDecl insts
514 loadHomeUsage :: ImportVersion OccName
515 -> RnMG (ImportVersion Name)
516 loadHomeUsage (mod_name, orphans, is_boot, whats_imported)
517 = rn_imps whats_imported `thenRn` \ whats_imported' ->
518 returnRn (mod_name, orphans, is_boot, whats_imported')
520 rn_imps NothingAtAll = returnRn NothingAtAll
521 rn_imps (Everything v) = returnRn (Everything v)
522 rn_imps (Specifically mv ev items rv) = mapRn rn_imp items `thenRn` \ items' ->
523 returnRn (Specifically mv ev items' rv)
524 rn_imp (occ,vers) = newGlobalName mod_name occ `thenRn` \ name ->
530 %*********************************************************
532 \subsection{Closing up the interface decls}
534 %*********************************************************
536 Suppose we discover we don't need to recompile. Then we start from the
537 IfaceDecls in the ModIface, and fluff them up by sucking in all the decls they need.
540 closeIfaceDecls :: DynFlags
541 -> HomeIfaceTable -> HomeSymbolTable
542 -> PersistentCompilerState
543 -> ModIface -- Get the decls from here
544 -> IO (PersistentCompilerState, Bool, [RenamedHsDecl])
545 -- True <=> errors happened
546 closeIfaceDecls dflags hit hst pcs
547 mod_iface@(ModIface { mi_module = mod, mi_decls = iface_decls })
548 = runRn dflags hit hst pcs mod $
551 rule_decls = dcl_rules iface_decls
552 inst_decls = dcl_insts iface_decls
553 tycl_decls = dcl_tycl iface_decls
554 decls = map RuleD rule_decls ++
555 map InstD inst_decls ++
557 needed = unionManyNameSets (map ruleDeclFVs rule_decls) `unionNameSets`
558 unionManyNameSets (map instDeclFVs inst_decls) `unionNameSets`
559 unionManyNameSets (map tyClDeclFVs tycl_decls)
560 local_names = foldl add emptyNameSet tycl_decls
561 add names decl = addListToNameSet names (map fst (tyClDeclSysNames decl ++ tyClDeclNames decl))
564 recordLocalSlurps local_names `thenRn_`
566 -- Do the transitive closure
567 closeDecls decls (needed `plusFV` implicit_fvs) `thenRn` \closed_decls ->
568 rnDump [] closed_decls `thenRn_`
569 returnRn closed_decls
571 implicit_fvs = ubiquitousNames -- Data type decls with record selectors,
572 -- which may appear in the decls, need unpackCString
573 -- and friends. It's easier to just grab them right now.
576 %*********************************************************
578 \subsection{Unused names}
580 %*********************************************************
583 reportUnusedNames :: ModIface -> PrintUnqualified
584 -> [RdrNameImportDecl]
586 -> NameSet -- Used in this module
587 -> Avails -- Exported by this module
590 reportUnusedNames my_mod_iface unqual imports avail_env
591 source_fvs export_avails imported_decls
592 = warnUnusedModules unused_imp_mods `thenRn_`
593 warnUnusedLocalBinds bad_locals `thenRn_`
594 warnUnusedImports bad_imp_names `thenRn_`
595 printMinimalImports this_mod unqual minimal_imports
597 this_mod = mi_module my_mod_iface
598 gbl_env = mi_globals my_mod_iface
600 -- The export_fvs make the exported names look just as if they
601 -- occurred in the source program.
602 export_fvs = availsToNameSet export_avails
603 used_names = source_fvs `plusFV` export_fvs
605 -- Now, a use of C implies a use of T,
606 -- if C was brought into scope by T(..) or T(C)
607 really_used_names = used_names `unionNameSets`
608 mkNameSet [ parent_name
609 | sub_name <- nameSetToList used_names
611 -- Usually, every used name will appear in avail_env, but there
612 -- is one time when it doesn't: tuples and other built in syntax. When you
613 -- write (a,b) that gives rise to a *use* of "(,)", so that the
614 -- instances will get pulled in, but the tycon "(,)" isn't actually
615 -- in scope. Also, (-x) gives rise to an implicit use of 'negate';
616 -- similarly, 3.5 gives rise to an implcit use of :%
617 -- Hence the silent 'False' in all other cases
619 , Just parent_name <- [case lookupNameEnv avail_env sub_name of
620 Just (AvailTC n _) -> Just n
624 -- Collect the defined names from the in-scope environment
625 -- Look for the qualified ones only, else get duplicates
626 defined_names :: [GlobalRdrElt]
627 defined_names = foldRdrEnv add [] gbl_env
628 add rdr_name ns acc | isQual rdr_name = ns ++ acc
631 defined_and_used, defined_but_not_used :: [GlobalRdrElt]
632 (defined_and_used, defined_but_not_used) = partition used defined_names
633 used (GRE name _ _) = name `elemNameSet` really_used_names
635 -- Filter out the ones only defined implicitly
637 bad_locals = [n | (GRE n LocalDef _) <- defined_but_not_used]
639 bad_imp_names :: [(Name,Provenance)]
640 bad_imp_names = [(n,p) | GRE n p@(NonLocalDef (UserImport mod _ True)) _ <- defined_but_not_used,
641 not (module_unused mod)]
643 -- inst_mods are directly-imported modules that
644 -- contain instance decl(s) that the renamer decided to suck in
645 -- It's not necessarily redundant to import such modules.
651 -- The import M() is not *necessarily* redundant, even if
652 -- we suck in no instance decls from M (e.g. it contains
653 -- no instance decls, or This contains no code). It may be
654 -- that we import M solely to ensure that M's orphan instance
655 -- decls (or those in its imports) are visible to people who
656 -- import This. Sigh.
657 -- There's really no good way to detect this, so the error message
658 -- in RnEnv.warnUnusedModules is weakened instead
659 inst_mods :: [ModuleName]
660 inst_mods = [m | InstD (InstDecl _ _ _ (Just dfun) _) <- imported_decls,
661 let m = moduleName (nameModule dfun),
662 m `elem` direct_import_mods
665 -- To figure out the minimal set of imports, start with the things
666 -- that are in scope (i.e. in gbl_env). Then just combine them
667 -- into a bunch of avails, so they are properly grouped
668 minimal_imports :: FiniteMap ModuleName AvailEnv
669 minimal_imports0 = emptyFM
670 minimal_imports1 = foldr add_name minimal_imports0 defined_and_used
671 minimal_imports = foldr add_inst_mod minimal_imports1 inst_mods
673 -- We've carefully preserved the provenance so that we can
674 -- construct minimal imports that import the name by (one of)
675 -- the same route(s) as the programmer originally did.
676 add_name (GRE n (NonLocalDef (UserImport m _ _)) _) acc = addToFM_C plusAvailEnv acc (moduleName m)
677 (unitAvailEnv (mk_avail n))
678 add_name (GRE n other_prov _) acc = acc
680 mk_avail n = case lookupNameEnv avail_env n of
681 Just (AvailTC m _) | n==m -> AvailTC n [n]
682 | otherwise -> AvailTC m [n,m]
683 Just avail -> Avail n
684 Nothing -> pprPanic "mk_avail" (ppr n)
687 | m `elemFM` acc = acc -- We import something already
688 | otherwise = addToFM acc m emptyAvailEnv
689 -- Add an empty collection of imports for a module
690 -- from which we have sucked only instance decls
692 direct_import_mods :: [ModuleName]
693 direct_import_mods = nub [m | ImportDecl m _ _ _ _ _ <- imports]
695 -- unused_imp_mods are the directly-imported modules
696 -- that are not mentioned in minimal_imports
697 unused_imp_mods = [m | m <- direct_import_mods,
698 not (maybeToBool (lookupFM minimal_imports m)),
701 module_unused :: Module -> Bool
702 module_unused mod = moduleName mod `elem` unused_imp_mods
705 -- ToDo: deal with original imports with 'qualified' and 'as M' clauses
706 printMinimalImports :: Module -- This module
708 -> FiniteMap ModuleName AvailEnv -- Minimal imports
710 printMinimalImports this_mod unqual imps
711 = doptRn Opt_D_dump_minimal_imports `thenRn` \ dump_minimal ->
712 if not dump_minimal then returnRn () else
714 mapRn to_ies (fmToList imps) `thenRn` \ mod_ies ->
715 ioToRnM (do { h <- openFile filename WriteMode ;
716 printForUser h unqual (vcat (map ppr_mod_ie mod_ies))
720 filename = moduleNameUserString (moduleName this_mod) ++ ".imports"
721 ppr_mod_ie (mod_name, ies)
722 | mod_name == pRELUDE_Name
725 = ptext SLIT("import") <+> ppr mod_name <>
726 parens (fsep (punctuate comma (map ppr ies)))
728 to_ies (mod, avail_env) = mapRn to_ie (availEnvElts avail_env) `thenRn` \ ies ->
731 to_ie :: AvailInfo -> RnMG (IE Name)
732 -- The main trick here is that if we're importing all the constructors
733 -- we want to say "T(..)", but if we're importing only a subset we want
734 -- to say "T(A,B,C)". So we have to find out what the module exports.
735 to_ie (Avail n) = returnRn (IEVar n)
736 to_ie (AvailTC n [m]) = ASSERT( n==m )
737 returnRn (IEThingAbs n)
739 = loadInterface (text "Compute minimal imports from" <+> ppr n_mod) n_mod ImportBySystem `thenRn` \ iface ->
740 case [xs | (m,as) <- mi_exports iface,
744 [xs] | all (`elem` ns) xs -> returnRn (IEThingAll n)
745 | otherwise -> returnRn (IEThingWith n (filter (/= n) ns))
746 other -> pprTrace "to_ie" (ppr n <+> ppr (nameModule n) <+> ppr other) $
749 n_mod = moduleName (nameModule n)
751 rnDump :: [RenamedHsDecl] -- Renamed imported decls
752 -> [RenamedHsDecl] -- Renamed local decls
754 rnDump imp_decls local_decls
755 = doptRn Opt_D_dump_rn_trace `thenRn` \ dump_rn_trace ->
756 doptRn Opt_D_dump_rn_stats `thenRn` \ dump_rn_stats ->
757 doptRn Opt_D_dump_rn `thenRn` \ dump_rn ->
758 getIfacesRn `thenRn` \ ifaces ->
760 ioToRnM (do { dumpIfSet (dump_rn_trace || dump_rn_stats || dump_rn)
762 (getRnStats imp_decls ifaces) ;
764 dumpIfSet dump_rn "Renamer:"
765 (vcat (map ppr (local_decls ++ imp_decls)))
772 %*********************************************************
774 \subsection{Statistics}
776 %*********************************************************
779 getRnStats :: [RenamedHsDecl] -> Ifaces -> SDoc
780 getRnStats imported_decls ifaces
781 = hcat [text "Renamer stats: ", stats]
783 n_mods = length [() | _ <- moduleEnvElts (iPIT ifaces)]
784 -- This is really only right for a one-shot compile
786 (decls_map, n_decls_slurped) = iDecls ifaces
788 n_decls_left = length [decl | (avail, True, (_,decl)) <- nameEnvElts decls_map
789 -- Data, newtype, and class decls are in the decls_fm
790 -- under multiple names; the tycon/class, and each
791 -- constructor/class op too.
792 -- The 'True' selects just the 'main' decl
795 (insts_left, n_insts_slurped) = iInsts ifaces
796 n_insts_left = length (bagToList insts_left)
798 (rules_left, n_rules_slurped) = iRules ifaces
799 n_rules_left = length (bagToList rules_left)
802 [int n_mods <+> text "interfaces read",
803 hsep [ int n_decls_slurped, text "type/class/variable imported, out of",
804 int (n_decls_slurped + n_decls_left), text "read"],
805 hsep [ int n_insts_slurped, text "instance decls imported, out of",
806 int (n_insts_slurped + n_insts_left), text "read"],
807 hsep [ int n_rules_slurped, text "rule decls imported, out of",
808 int (n_rules_slurped + n_rules_left), text "read"]
813 %************************************************************************
815 \subsection{Errors and warnings}
817 %************************************************************************
820 dupFixityDecl rdr_name loc1 loc2
821 = vcat [ptext SLIT("Multiple fixity declarations for") <+> quotes (ppr rdr_name),
822 ptext SLIT("at ") <+> ppr loc1,
823 ptext SLIT("and") <+> ppr loc2]
826 = sep [ptext SLIT("Illegal deprecation when whole module is deprecated"),