2 % (c) The GRASP Project, Glasgow University, 1992-1998
4 \section[Rename]{Renaming and dependency analysis passes}
7 module Rename ( renameModule, renameExpr, closeIfaceDecls, checkOldIface ) where
9 #include "HsVersions.h"
12 import RdrHsSyn ( RdrNameHsModule, RdrNameHsDecl, RdrNameDeprecation, RdrNameHsExpr,
13 RdrNameTyClDecl, RdrNameRuleDecl, RdrNameInstDecl, RdrNameImportDecl
15 import RnHsSyn ( RenamedHsDecl, RenamedTyClDecl, RenamedRuleDecl, RenamedInstDecl,
16 extractHsTyNames, RenamedHsExpr,
17 instDeclFVs, tyClDeclFVs, ruleDeclFVs
20 import CmdLineOpts ( DynFlags, DynFlag(..) )
22 import RnExpr ( rnExpr )
23 import RnNames ( getGlobalNames, exportsFromAvail )
24 import RnSource ( rnSourceDecls, rnTyClDecl, rnIfaceRuleDecl, rnInstDecl )
25 import RnIfaces ( slurpImpDecls, mkImportInfo,
26 getInterfaceExports, closeDecls,
27 RecompileRequired, outOfDate, recompileRequired
29 import RnHiFiles ( readIface, removeContext, loadInterface,
30 loadExports, loadFixDecls, loadDeprecs )
31 import RnEnv ( availsToNameSet, availName,
32 emptyAvailEnv, unitAvailEnv, availEnvElts, plusAvailEnv, groupAvails,
33 warnUnusedImports, warnUnusedLocalBinds, warnUnusedModules,
34 lookupOrigNames, lookupSrcName, newGlobalName, unQualInScope
36 import Module ( Module, ModuleName, WhereFrom(..),
37 moduleNameUserString, moduleName,
38 moduleEnvElts, lookupModuleEnv
40 import Name ( Name, NamedThing(..), getSrcLoc,
41 nameIsLocalOrFrom, nameOccName, nameModule,
43 import Name ( mkNameEnv, nameEnvElts, extendNameEnv )
44 import RdrName ( elemRdrEnv, foldRdrEnv, isQual )
45 import OccName ( occNameFlavour )
47 import TysWiredIn ( unitTyCon, intTyCon, boolTyCon )
48 import PrelNames ( mAIN_Name, pREL_MAIN_Name, pRELUDE_Name,
49 ioTyCon_RDR, main_RDR_Unqual,
50 unpackCString_RDR, unpackCStringFoldr_RDR, unpackCStringUtf8_RDR,
53 import PrelInfo ( derivingOccurrences )
54 import Type ( funTyCon )
55 import ErrUtils ( dumpIfSet, showPass, printErrorsAndWarnings, errorsFound )
56 import Bag ( bagToList )
57 import FiniteMap ( FiniteMap, fmToList, emptyFM, lookupFM,
58 addToFM_C, elemFM, addToFM
60 import UniqFM ( lookupUFM )
61 import Maybes ( maybeToBool, catMaybes )
63 import IO ( openFile, IOMode(..) )
64 import HscTypes ( PersistentCompilerState, HomeIfaceTable, HomeSymbolTable,
65 ModIface(..), WhatsImported(..),
66 VersionInfo(..), ImportVersion, IsExported,
67 IfaceDecls, mkIfaceDecls, dcl_tycl, dcl_rules, dcl_insts,
68 GlobalRdrEnv, pprGlobalRdrEnv,
69 AvailEnv, GenAvailInfo(..), AvailInfo, Avails,
70 Provenance(..), ImportReason(..), initialVersionInfo,
71 Deprecations(..), lookupDeprec, lookupIface
73 import List ( partition, nub )
79 %*********************************************************
81 \subsection{The two main wrappers}
83 %*********************************************************
86 renameModule :: DynFlags
87 -> HomeIfaceTable -> HomeSymbolTable
88 -> PersistentCompilerState
89 -> Module -> RdrNameHsModule
90 -> IO (PersistentCompilerState, Maybe (PrintUnqualified, (IsExported, ModIface, [RenamedHsDecl])))
91 -- Nothing => some error occurred in the renamer
93 renameModule dflags hit hst pcs this_module rdr_module
94 = renameSource dflags hit hst pcs this_module $
95 rename this_module rdr_module
100 renameExpr :: DynFlags
101 -> HomeIfaceTable -> HomeSymbolTable
102 -> PersistentCompilerState
103 -> Module -> RdrNameHsExpr
104 -> IO (PersistentCompilerState, Maybe (PrintUnqualified, RenamedHsExpr))
106 renameExpr dflags hit hst pcs this_module expr
107 | Just iface <- lookupModuleEnv hit this_module
108 = do { let rdr_env = mi_globals iface
109 ; let print_unqual = unQualInScope rdr_env
111 ; renameSource dflags hit hst pcs this_module $
112 initRnMS rdr_env emptyLocalFixityEnv SourceMode $
113 ( rnExpr expr `thenRn` \ (e,_) ->
115 doptRn Opt_D_dump_rn `thenRn` \ dump_rn ->
116 ioToRnM (dumpIfSet dump_rn "Renamer:" (ppr e)) `thenRn_`
118 returnRn (Just (print_unqual, e)))
122 = do { printErrs alwaysQualify (ptext SLIT("renameExpr: Bad module context") <+> ppr this_module)
123 ; return (pcs, Nothing)
128 %*********************************************************
130 \subsection{The main function: rename}
132 %*********************************************************
135 renameSource :: DynFlags
136 -> HomeIfaceTable -> HomeSymbolTable
137 -> PersistentCompilerState
139 -> RnMG (Maybe (PrintUnqualified, r))
140 -> IO (PersistentCompilerState, Maybe (PrintUnqualified, r))
141 -- Nothing => some error occurred in the renamer
143 renameSource dflags hit hst old_pcs this_module thing_inside
144 = do { showPass dflags "Renamer"
146 -- Initialise the renamer monad
147 ; (new_pcs, msgs, maybe_rn_stuff) <- initRn dflags hit hst old_pcs this_module thing_inside
149 -- Print errors from renaming
150 ; let print_unqual = case maybe_rn_stuff of
151 Just (unqual, _) -> unqual
152 Nothing -> alwaysQualify
154 ; printErrorsAndWarnings print_unqual msgs ;
156 -- Return results. No harm in updating the PCS
157 ; if errorsFound msgs then
158 return (new_pcs, Nothing)
160 return (new_pcs, maybe_rn_stuff)
165 rename :: Module -> RdrNameHsModule -> RnMG (Maybe (PrintUnqualified, (IsExported, ModIface, [RenamedHsDecl])))
166 rename this_module contents@(HsModule _ _ exports imports local_decls mod_deprec loc)
169 -- FIND THE GLOBAL NAME ENVIRONMENT
170 getGlobalNames this_module contents `thenRn` \ (gbl_env, local_gbl_env, all_avails@(_, global_avail_env)) ->
172 -- Exit if we've found any errors
173 checkErrsRn `thenRn` \ no_errs_so_far ->
174 if not no_errs_so_far then
175 -- Found errors already, so exit now
176 rnDump [] [] `thenRn_`
180 -- PROCESS EXPORT LIST
181 exportsFromAvail mod_name exports all_avails gbl_env `thenRn` \ export_avails ->
183 traceRn (text "Local top-level environment" $$
184 nest 4 (pprGlobalRdrEnv local_gbl_env)) `thenRn_`
186 -- DEAL WITH DEPRECATIONS
187 rnDeprecs local_gbl_env mod_deprec
188 [d | DeprecD d <- local_decls] `thenRn` \ my_deprecs ->
190 -- DEAL WITH LOCAL FIXITIES
191 fixitiesFromLocalDecls local_gbl_env local_decls `thenRn` \ local_fixity_env ->
194 rnSourceDecls gbl_env local_fixity_env local_decls `thenRn` \ (rn_local_decls, source_fvs) ->
196 -- CHECK THAT main IS DEFINED, IF REQUIRED
197 checkMain this_module local_gbl_env `thenRn_`
199 -- SLURP IN ALL THE NEEDED DECLARATIONS
200 implicitFVs mod_name rn_local_decls `thenRn` \ implicit_fvs ->
202 slurp_fvs = implicit_fvs `plusFV` source_fvs
203 -- It's important to do the "plus" this way round, so that
204 -- when compiling the prelude, locally-defined (), Bool, etc
205 -- override the implicit ones.
207 traceRn (text "Source FVs:" <+> fsep (map ppr (nameSetToList slurp_fvs))) `thenRn_`
208 slurpImpDecls slurp_fvs `thenRn` \ rn_imp_decls ->
210 -- EXIT IF ERRORS FOUND
211 rnDump rn_imp_decls rn_local_decls `thenRn_`
212 checkErrsRn `thenRn` \ no_errs_so_far ->
213 if not no_errs_so_far then
214 -- Found errors already, so exit now
218 -- GENERATE THE VERSION/USAGE INFO
219 mkImportInfo mod_name imports `thenRn` \ my_usages ->
221 -- BUILD THE MODULE INTERFACE
223 -- We record fixities even for things that aren't exported,
224 -- so that we can change into the context of this moodule easily
225 fixities = mkNameEnv [ (name, fixity)
226 | FixitySig name fixity loc <- nameEnvElts local_fixity_env
229 -- Sort the exports to make them easier to compare for versions
230 my_exports = groupAvails this_module export_avails
232 final_decls = rn_local_decls ++ rn_imp_decls
233 is_orphan = any (isOrphanDecl this_module) rn_local_decls
235 mod_iface = ModIface { mi_module = this_module,
236 mi_version = initialVersionInfo,
237 mi_usages = my_usages,
239 mi_orphan = is_orphan,
240 mi_exports = my_exports,
241 mi_globals = gbl_env,
242 mi_fixities = fixities,
243 mi_deprecs = my_deprecs,
244 mi_decls = panic "mi_decls"
247 print_unqualified = unQualInScope gbl_env
248 is_exported name = name `elemNameSet` exported_names
249 exported_names = availsToNameSet export_avails
252 -- REPORT UNUSED NAMES, AND DEBUG DUMP
253 reportUnusedNames mod_iface print_unqualified
254 imports global_avail_env
255 source_fvs export_avails rn_imp_decls `thenRn_`
257 returnRn (Just (print_unqualified, (is_exported, mod_iface, final_decls)))
259 mod_name = moduleName this_module
262 Checking that main is defined
265 checkMain :: Module -> GlobalRdrEnv -> RnMG ()
266 checkMain this_mod local_env
267 | moduleName this_mod == mAIN_Name
268 = checkRn (main_RDR_Unqual `elemRdrEnv` local_env) noMainErr
273 @implicitFVs@ forces the renamer to slurp in some things which aren't
274 mentioned explicitly, but which might be needed by the type checker.
277 implicitFVs mod_name decls
278 = lookupOrigNames implicit_occs `thenRn` \ implicit_names ->
279 returnRn (mkNameSet (map getName default_tycons) `plusFV`
282 -- Add occurrences for Int, and (), because they
283 -- are the types to which ambigious type variables may be defaulted by
284 -- the type checker; so they won't always appear explicitly.
285 -- [The () one is a GHC extension for defaulting CCall results.]
286 -- ALSO: funTyCon, since it occurs implicitly everywhere!
287 -- (we don't want to be bothered with making funTyCon a
288 -- free var at every function application!)
289 -- Double is dealt with separately in getGates
290 default_tycons = [unitTyCon, funTyCon, boolTyCon, intTyCon]
292 -- Add occurrences for IO or PrimIO
293 implicit_main | mod_name == mAIN_Name
294 || mod_name == pREL_MAIN_Name = [ioTyCon_RDR]
297 -- Now add extra "occurrences" for things that
298 -- the deriving mechanism, or defaulting, will later need in order to
300 implicit_occs = string_occs ++ foldr ((++) . get) implicit_main decls
302 -- Virtually every program has error messages in it somewhere
303 string_occs = [unpackCString_RDR, unpackCStringFoldr_RDR,
304 unpackCStringUtf8_RDR, eqString_RDR]
306 get (TyClD (TyData _ _ _ _ _ _ (Just deriv_classes) _ _ _))
307 = concat (map get_deriv deriv_classes)
310 get_deriv cls = case lookupUFM derivingOccurrences cls of
316 isOrphanDecl this_mod (InstD (InstDecl inst_ty _ _ _ _))
317 = not (foldNameSet ((||) . nameIsLocalOrFrom this_mod) False
318 (extractHsTyNames (removeContext inst_ty)))
319 -- The 'removeContext' is because of
320 -- instance Foo a => Baz T where ...
321 -- The decl is an orphan if Baz and T are both not locally defined,
322 -- even if Foo *is* locally defined
324 isOrphanDecl this_mod (RuleD (HsRule _ _ _ lhs _ _))
327 -- At the moment we just check for common LHS forms
328 -- Expand as necessary. Getting it wrong just means
329 -- more orphans than necessary
330 check (HsVar v) = not (nameIsLocalOrFrom this_mod v)
331 check (HsApp f a) = check f && check a
332 check (HsLit _) = False
333 check (HsOverLit _) = False
334 check (OpApp l o _ r) = check l && check o && check r
335 check (NegApp e _) = check e
336 check (HsPar e) = check e
337 check (SectionL e o) = check e && check o
338 check (SectionR o e) = check e && check o
340 check other = True -- Safe fall through
342 isOrphanDecl _ _ = False
346 %*********************************************************
348 \subsection{Fixities}
350 %*********************************************************
353 fixitiesFromLocalDecls :: GlobalRdrEnv -> [RdrNameHsDecl] -> RnMG LocalFixityEnv
354 fixitiesFromLocalDecls gbl_env decls
355 = foldlRn getFixities emptyNameEnv decls `thenRn` \ env ->
356 traceRn (text "fixity env" <+> vcat (map ppr (nameEnvElts env))) `thenRn_`
359 getFixities :: LocalFixityEnv -> RdrNameHsDecl -> RnMG LocalFixityEnv
360 getFixities acc (FixD fix)
363 getFixities acc (TyClD (ClassDecl _ _ _ _ sigs _ _ _ ))
364 = foldlRn fix_decl acc [sig | FixSig sig <- sigs]
365 -- Get fixities from class decl sigs too.
366 getFixities acc other_decl
369 fix_decl acc sig@(FixitySig rdr_name fixity loc)
370 = -- Check for fixity decl for something not declared
372 lookupSrcName gbl_env rdr_name `thenRn` \ name ->
374 -- Check for duplicate fixity decl
375 case lookupNameEnv acc name of
376 Just (FixitySig _ _ loc') -> addErrRn (dupFixityDecl rdr_name loc loc') `thenRn_`
379 Nothing -> returnRn (extendNameEnv acc name (FixitySig name fixity loc))
383 %*********************************************************
385 \subsection{Deprecations}
387 %*********************************************************
389 For deprecations, all we do is check that the names are in scope.
390 It's only imported deprecations, dealt with in RnIfaces, that we
391 gather them together.
394 rnDeprecs :: GlobalRdrEnv -> Maybe DeprecTxt
395 -> [RdrNameDeprecation] -> RnMG Deprecations
396 rnDeprecs gbl_env Nothing []
399 rnDeprecs gbl_env (Just txt) decls
400 = mapRn (addErrRn . badDeprec) decls `thenRn_`
401 returnRn (DeprecAll txt)
403 rnDeprecs gbl_env Nothing decls
404 = mapRn rn_deprec decls `thenRn` \ pairs ->
405 returnRn (DeprecSome (mkNameEnv (catMaybes pairs)))
407 rn_deprec (Deprecation rdr_name txt loc)
409 lookupSrcName gbl_env rdr_name `thenRn` \ name ->
410 returnRn (Just (name, (name,txt)))
414 %************************************************************************
416 \subsection{Grabbing the old interface file and checking versions}
418 %************************************************************************
421 checkOldIface :: DynFlags
422 -> HomeIfaceTable -> HomeSymbolTable
423 -> PersistentCompilerState
425 -> Bool -- Source unchanged
426 -> Maybe ModIface -- Old interface from compilation manager, if any
427 -> IO (PersistentCompilerState, Bool, (RecompileRequired, Maybe ModIface))
428 -- True <=> errors happened
430 checkOldIface dflags hit hst pcs iface_path source_unchanged maybe_iface
431 = runRn dflags hit hst pcs (panic "Bogus module") $
433 Just old_iface -> -- Use the one we already have
434 setModuleRn (mi_module old_iface) (check_versions old_iface)
436 Nothing -- try and read it from a file
437 -> readIface iface_path `thenRn` \ read_result ->
439 Left err -> -- Old interface file not found, or garbled; give up
440 traceRn (text "Bad old interface file" $$ nest 4 err) `thenRn_`
441 returnRn (outOfDate, Nothing)
444 -> setModuleRn (pi_mod parsed_iface) $
445 loadOldIface parsed_iface `thenRn` \ m_iface ->
446 check_versions m_iface
448 check_versions :: ModIface -> RnMG (RecompileRequired, Maybe ModIface)
451 recompileRequired iface_path source_unchanged iface
452 `thenRn` \ recompile ->
453 returnRn (recompile, Just iface)
456 I think the following function should now have a more representative name,
460 loadOldIface :: ParsedIface -> RnMG ModIface
462 loadOldIface parsed_iface
463 = let iface = parsed_iface
467 loadHomeDecls (pi_decls iface) `thenRn` \ decls ->
468 loadHomeRules (pi_rules iface) `thenRn` \ rules ->
469 loadHomeInsts (pi_insts iface) `thenRn` \ insts ->
470 returnRn (decls, rules, insts)
472 `thenRn` \ ((decls_vers, new_decls), (rule_vers, new_rules), new_insts) ->
474 mapRn loadHomeUsage (pi_usages iface) `thenRn` \ usages ->
475 loadExports (pi_exports iface) `thenRn` \ (export_vers, avails) ->
476 loadFixDecls mod (pi_fixity iface) `thenRn` \ fix_env ->
477 loadDeprecs mod (pi_deprecs iface) `thenRn` \ deprec_env ->
479 version = VersionInfo { vers_module = pi_vers iface,
480 vers_exports = export_vers,
481 vers_rules = rule_vers,
482 vers_decls = decls_vers }
484 decls = mkIfaceDecls new_decls new_rules new_insts
486 mod_iface = ModIface { mi_module = mod, mi_version = version,
487 mi_exports = avails, mi_usages = usages,
488 mi_boot = False, mi_orphan = pi_orphan iface,
489 mi_fixities = fix_env, mi_deprecs = deprec_env,
491 mi_globals = panic "No mi_globals in old interface"
498 loadHomeDecls :: [(Version, RdrNameTyClDecl)]
499 -> RnMS (NameEnv Version, [RenamedTyClDecl])
500 loadHomeDecls decls = foldlRn loadHomeDecl (emptyNameEnv, []) decls
502 loadHomeDecl :: (NameEnv Version, [RenamedTyClDecl])
503 -> (Version, RdrNameTyClDecl)
504 -> RnMS (NameEnv Version, [RenamedTyClDecl])
505 loadHomeDecl (version_map, decls) (version, decl)
506 = rnTyClDecl decl `thenRn` \ decl' ->
507 returnRn (extendNameEnv version_map (tyClDeclName decl') version, decl':decls)
510 loadHomeRules :: (Version, [RdrNameRuleDecl])
511 -> RnMS (Version, [RenamedRuleDecl])
512 loadHomeRules (version, rules)
513 = mapRn rnIfaceRuleDecl rules `thenRn` \ rules' ->
514 returnRn (version, rules')
517 loadHomeInsts :: [RdrNameInstDecl]
518 -> RnMS [RenamedInstDecl]
519 loadHomeInsts insts = mapRn rnInstDecl insts
522 loadHomeUsage :: ImportVersion OccName
523 -> RnMG (ImportVersion Name)
524 loadHomeUsage (mod_name, orphans, is_boot, whats_imported)
525 = rn_imps whats_imported `thenRn` \ whats_imported' ->
526 returnRn (mod_name, orphans, is_boot, whats_imported')
528 rn_imps NothingAtAll = returnRn NothingAtAll
529 rn_imps (Everything v) = returnRn (Everything v)
530 rn_imps (Specifically mv ev items rv) = mapRn rn_imp items `thenRn` \ items' ->
531 returnRn (Specifically mv ev items' rv)
532 rn_imp (occ,vers) = newGlobalName mod_name occ `thenRn` \ name ->
538 %*********************************************************
540 \subsection{Closing up the interface decls}
542 %*********************************************************
544 Suppose we discover we don't need to recompile. Then we start from the
545 IfaceDecls in the ModIface, and fluff them up by sucking in all the decls they need.
548 closeIfaceDecls :: DynFlags
549 -> HomeIfaceTable -> HomeSymbolTable
550 -> PersistentCompilerState
551 -> ModIface -- Get the decls from here
552 -> IO (PersistentCompilerState, Bool, [RenamedHsDecl])
553 -- True <=> errors happened
554 closeIfaceDecls dflags hit hst pcs
555 mod_iface@(ModIface { mi_module = mod, mi_decls = iface_decls })
556 = runRn dflags hit hst pcs mod $
559 rule_decls = dcl_rules iface_decls
560 inst_decls = dcl_insts iface_decls
561 tycl_decls = dcl_tycl iface_decls
562 decls = map RuleD rule_decls ++
563 map InstD inst_decls ++
565 needed = unionManyNameSets (map ruleDeclFVs rule_decls) `unionNameSets`
566 unionManyNameSets (map instDeclFVs inst_decls) `unionNameSets`
567 unionManyNameSets (map tyClDeclFVs tycl_decls)
569 closeDecls decls needed
572 %*********************************************************
574 \subsection{Unused names}
576 %*********************************************************
579 reportUnusedNames :: ModIface -> PrintUnqualified
580 -> [RdrNameImportDecl]
582 -> NameSet -- Used in this module
583 -> Avails -- Exported by this module
586 reportUnusedNames my_mod_iface unqual imports avail_env
587 source_fvs export_avails imported_decls
588 = warnUnusedModules unused_imp_mods `thenRn_`
589 warnUnusedLocalBinds bad_locals `thenRn_`
590 warnUnusedImports bad_imp_names `thenRn_`
591 printMinimalImports this_mod unqual minimal_imports `thenRn_`
592 warnDeprecations this_mod export_avails my_deprecs
596 this_mod = mi_module my_mod_iface
597 gbl_env = mi_globals my_mod_iface
598 my_deprecs = mi_deprecs 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 :: [(Name,Provenance)]
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 :: [(Name,Provenance)]
632 (defined_and_used, defined_but_not_used) = partition used defined_names
633 used (name,_) = name `elemNameSet` really_used_names
635 -- Filter out the ones only defined implicitly
637 bad_locals = [n | (n,LocalDef) <- defined_but_not_used]
639 bad_imp_names :: [(Name,Provenance)]
640 bad_imp_names = [(n,p) | (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 add_name (n,NonLocalDef (UserImport m _ _)) acc = addToFM_C plusAvailEnv acc (moduleName (nameModule n))
674 (unitAvailEnv (mk_avail n))
675 add_name (n,other_prov) acc = acc
677 mk_avail n = case lookupNameEnv avail_env n of
678 Just (AvailTC m _) | n==m -> AvailTC n [n]
679 | otherwise -> AvailTC m [n,m]
680 Just avail -> Avail n
681 Nothing -> pprPanic "mk_avail" (ppr n)
684 | m `elemFM` acc = acc -- We import something already
685 | otherwise = addToFM acc m emptyAvailEnv
686 -- Add an empty collection of imports for a module
687 -- from which we have sucked only instance decls
689 direct_import_mods :: [ModuleName]
690 direct_import_mods = nub [m | ImportDecl m _ _ _ _ _ <- imports]
692 -- unused_imp_mods are the directly-imported modules
693 -- that are not mentioned in minimal_imports
694 unused_imp_mods = [m | m <- direct_import_mods,
695 not (maybeToBool (lookupFM minimal_imports m)),
698 module_unused :: Module -> Bool
699 module_unused mod = moduleName mod `elem` unused_imp_mods
701 warnDeprecations this_mod export_avails my_deprecs used_names
702 = doptRn Opt_WarnDeprecations `thenRn` \ warn_drs ->
703 if not warn_drs then returnRn () else
705 -- The home modules for things in the export list
706 -- may not have been loaded yet; do it now, so
707 -- that we can see their deprecations, if any
708 mapRn_ load_home export_mods `thenRn_`
710 getIfacesRn `thenRn` \ ifaces ->
711 getHomeIfaceTableRn `thenRn` \ hit ->
715 | n <- nameSetToList used_names,
716 Just txt <- [lookup_deprec hit pit n] ]
718 mapRn_ warnDeprec deprecs
721 export_mods = nub [ moduleName (nameModule name)
722 | avail <- export_avails,
723 let name = availName avail,
724 not (nameIsLocalOrFrom this_mod name) ]
726 load_home m = loadInterface (text "Check deprecations for" <+> ppr m) m ImportBySystem
728 lookup_deprec hit pit n
729 | nameIsLocalOrFrom this_mod n
730 = lookupDeprec my_deprecs n
732 = case lookupIface hit pit n of
733 Just iface -> lookupDeprec (mi_deprecs iface) n
734 Nothing -> pprPanic "warnDeprecations:" (ppr n)
736 -- ToDo: deal with original imports with 'qualified' and 'as M' clauses
737 printMinimalImports this_mod unqual imps
738 = doptRn Opt_D_dump_minimal_imports `thenRn` \ dump_minimal ->
739 if not dump_minimal then returnRn () else
741 mapRn to_ies (fmToList imps) `thenRn` \ mod_ies ->
742 ioToRnM (do { h <- openFile filename WriteMode ;
743 printForUser h unqual (vcat (map ppr_mod_ie mod_ies))
747 filename = moduleNameUserString (moduleName this_mod) ++ ".imports"
748 ppr_mod_ie (mod_name, ies)
749 | mod_name == pRELUDE_Name
752 = ptext SLIT("import") <+> ppr mod_name <>
753 parens (fsep (punctuate comma (map ppr ies)))
755 to_ies (mod, avail_env) = mapRn to_ie (availEnvElts avail_env) `thenRn` \ ies ->
758 to_ie :: AvailInfo -> RnMG (IE Name)
759 to_ie (Avail n) = returnRn (IEVar n)
760 to_ie (AvailTC n [m]) = ASSERT( n==m )
761 returnRn (IEThingAbs n)
763 = getInterfaceExports n_mod ImportBySystem `thenRn` \ (_, avails_by_module) ->
764 case [xs | (m,as) <- avails_by_module,
768 [xs] | all (`elem` ns) xs -> returnRn (IEThingAll n)
769 | otherwise -> returnRn (IEThingWith n (filter (/= n) ns))
770 other -> pprTrace "to_ie" (ppr n <+> ppr (nameModule n) <+> ppr other) $
773 n_mod = moduleName (nameModule n)
775 rnDump :: [RenamedHsDecl] -- Renamed imported decls
776 -> [RenamedHsDecl] -- Renamed local decls
778 rnDump imp_decls local_decls
779 = doptRn Opt_D_dump_rn_trace `thenRn` \ dump_rn_trace ->
780 doptRn Opt_D_dump_rn_stats `thenRn` \ dump_rn_stats ->
781 doptRn Opt_D_dump_rn `thenRn` \ dump_rn ->
782 getIfacesRn `thenRn` \ ifaces ->
784 ioToRnM (do { dumpIfSet (dump_rn_trace || dump_rn_stats || dump_rn)
786 (getRnStats imp_decls ifaces) ;
788 dumpIfSet dump_rn "Renamer:"
789 (vcat (map ppr (local_decls ++ imp_decls)))
796 %*********************************************************
798 \subsection{Statistics}
800 %*********************************************************
803 getRnStats :: [RenamedHsDecl] -> Ifaces -> SDoc
804 getRnStats imported_decls ifaces
805 = hcat [text "Renamer stats: ", stats]
807 n_mods = length [() | _ <- moduleEnvElts (iPIT ifaces)]
808 -- This is really only right for a one-shot compile
810 (decls_map, n_decls_slurped) = iDecls ifaces
812 n_decls_left = length [decl | (avail, True, (_,decl)) <- nameEnvElts decls_map
813 -- Data, newtype, and class decls are in the decls_fm
814 -- under multiple names; the tycon/class, and each
815 -- constructor/class op too.
816 -- The 'True' selects just the 'main' decl
819 (insts_left, n_insts_slurped) = iInsts ifaces
820 n_insts_left = length (bagToList insts_left)
822 (rules_left, n_rules_slurped) = iRules ifaces
823 n_rules_left = length (bagToList rules_left)
826 [int n_mods <+> text "interfaces read",
827 hsep [ int n_decls_slurped, text "type/class/variable imported, out of",
828 int (n_decls_slurped + n_decls_left), text "read"],
829 hsep [ int n_insts_slurped, text "instance decls imported, out of",
830 int (n_insts_slurped + n_insts_left), text "read"],
831 hsep [ int n_rules_slurped, text "rule decls imported, out of",
832 int (n_rules_slurped + n_rules_left), text "read"]
837 %************************************************************************
839 \subsection{Errors and warnings}
841 %************************************************************************
844 warnDeprec :: (Name, DeprecTxt) -> RnM d ()
845 warnDeprec (name, txt)
846 = pushSrcLocRn (getSrcLoc name) $
848 sep [ text (occNameFlavour (nameOccName name)) <+> ppr name <+>
849 text "is deprecated:", nest 4 (ppr txt) ]
852 dupFixityDecl rdr_name loc1 loc2
853 = vcat [ptext SLIT("Multiple fixity declarations for") <+> quotes (ppr rdr_name),
854 ptext SLIT("at ") <+> ppr loc1,
855 ptext SLIT("and") <+> ppr loc2]
858 = sep [ptext SLIT("Illegal deprecation when whole module is deprecated"),
862 = hsep [ptext SLIT("Module"), quotes (ppr mAIN_Name),
863 ptext SLIT("must include a definition for"), quotes (ptext SLIT("main"))]