2 % (c) The GRASP Project, Glasgow University, 1992-1998
4 \section[Rename]{Renaming and dependency analysis passes}
7 module Rename ( renameModule ) where
9 #include "HsVersions.h"
12 import HsPragmas ( DataPragmas(..) )
13 import RdrHsSyn ( RdrNameHsModule, RdrNameHsDecl, RdrNameDeprecation )
14 import RnHsSyn ( RenamedHsModule, RenamedHsDecl,
15 extractHsTyNames, extractHsCtxtTyNames
18 import CmdLineOpts ( opt_HiMap, opt_D_dump_rn_trace, opt_D_dump_minimal_imports,
19 opt_D_dump_rn, opt_D_dump_rn_stats, opt_WarnDeprecations,
23 import RnNames ( getGlobalNames )
24 import RnSource ( rnSourceDecls, rnDecl )
25 import RnIfaces ( getImportedInstDecls, importDecl, mkImportExportInfo, getInterfaceExports,
26 getImportedRules, getSlurped, removeContext,
27 loadBuiltinRules, getDeferredDecls, ImportDeclResult(..)
29 import RnEnv ( availName, availsToNameSet,
30 emptyAvailEnv, unitAvailEnv, availEnvElts, plusAvailEnv,
31 warnUnusedImports, warnUnusedLocalBinds, warnUnusedModules,
32 lookupOrigNames, unknownNameErr,
33 FreeVars, plusFVs, plusFV, unitFV, emptyFVs, isEmptyFVs, addOneFV
35 import Module ( Module, ModuleName, WhereFrom(..),
36 moduleNameUserString, mkSearchPath, moduleName, mkThisModule
38 import Name ( Name, isLocallyDefined, NamedThing(..), getSrcLoc,
39 nameOccName, nameUnique, nameModule, maybeUserImportedFrom,
40 isUserImportedExplicitlyName, isUserImportedName,
41 maybeWiredInTyConName, maybeWiredInIdName,
42 isUserExportedName, toRdrName,
43 nameEnvElts, extendNameEnv
45 import OccName ( occNameFlavour, isValOcc )
47 import TyCon ( isSynTyCon, getSynTyConDefn )
49 import TysWiredIn ( unitTyCon, intTyCon, doubleTyCon, boolTyCon )
50 import PrelRules ( builtinRules )
51 import PrelNames ( mAIN_Name, pREL_MAIN_Name, pRELUDE_Name,
52 ioTyCon_RDR, unpackCString_RDR, unpackCStringFoldr_RDR, unpackCStringUtf8_RDR
54 import PrelInfo ( fractionalClassKeys, derivingOccurrences )
55 import Type ( namesOfType, funTyCon )
56 import ErrUtils ( printErrorsAndWarnings, dumpIfSet, ghcExit )
57 import BasicTypes ( Version, initialVersion )
58 import Bag ( isEmptyBag, bagToList )
59 import FiniteMap ( FiniteMap, eltsFM, fmToList, emptyFM, lookupFM,
60 addToFM_C, elemFM, addToFM
62 import UniqSupply ( UniqSupply )
63 import UniqFM ( lookupUFM )
64 import SrcLoc ( noSrcLoc )
65 import Maybes ( maybeToBool, expectJust )
67 import IO ( openFile, IOMode(..) )
73 type RenameResult = ( Module -- This module
74 , RenamedHsModule -- Renamed module
75 , Maybe ParsedIface -- The existing interface file, if any
76 , ParsedIface -- The new interface
77 , RnNameSupply -- Final env; for renaming derivings
78 , FixityEnv -- The fixity environment; for derivings
79 , [Module]) -- Imported modules
81 renameModule :: UniqSupply -> RdrNameHsModule -> IO (Maybe RenameResult)
82 renameModule us this_mod@(HsModule mod_name vers exports imports local_decls _ loc)
83 = -- Initialise the renamer monad
85 ((maybe_rn_stuff, dump_action), rn_errs_bag, rn_warns_bag)
86 <- initRn (mkThisModule mod_name) us
87 (mkSearchPath opt_HiMap) loc
91 printErrorsAndWarnings rn_errs_bag rn_warns_bag ;
93 -- Dump any debugging output
97 if not (isEmptyBag rn_errs_bag) then
98 do { ghcExit 1 ; return Nothing }
100 return maybe_rn_stuff
105 rename :: RdrNameHsModule -> RnMG (Maybe RenameResult, IO ())
106 rename this_mod@(HsModule mod_name vers exports imports local_decls mod_deprec loc)
107 = -- FIND THE GLOBAL NAME ENVIRONMENT
108 getGlobalNames this_mod `thenRn` \ maybe_stuff ->
110 -- CHECK FOR EARLY EXIT
111 case maybe_stuff of {
112 Nothing -> -- Everything is up to date; no need to recompile further
113 rnDump [] [] `thenRn` \ dump_action ->
114 returnRn (Nothing, dump_action) ;
116 Just (gbl_env, local_gbl_env, export_avails, global_avail_env, old_iface) ->
118 -- DEAL WITH DEPRECATIONS
119 rnDeprecs local_gbl_env mod_deprec local_decls `thenRn` \ my_deprecs ->
121 -- DEAL WITH LOCAL FIXITIES
122 fixitiesFromLocalDecls local_gbl_env local_decls `thenRn` \ local_fixity_env ->
125 initRnMS gbl_env local_fixity_env SourceMode (
126 rnSourceDecls local_decls
127 ) `thenRn` \ (rn_local_decls, source_fvs) ->
129 -- SLURP IN ALL THE NEEDED DECLARATIONS
130 implicitFVs mod_name rn_local_decls `thenRn` \ implicit_fvs ->
132 -- The export_fvs make the exported names look just as if they
133 -- occurred in the source program. For the reasoning, see the
134 -- comments with RnIfaces.getImportVersions.
135 -- We only need the 'parent name' of the avail;
136 -- that's enough to suck in the declaration.
137 export_fvs = mkNameSet (map availName export_avails)
138 real_source_fvs = source_fvs `plusFV` export_fvs
140 slurp_fvs = implicit_fvs `plusFV` real_source_fvs
141 -- It's important to do the "plus" this way round, so that
142 -- when compiling the prelude, locally-defined (), Bool, etc
143 -- override the implicit ones.
145 loadBuiltinRules builtinRules `thenRn_`
146 slurpImpDecls slurp_fvs `thenRn` \ rn_imp_decls ->
148 -- EXIT IF ERRORS FOUND
149 rnDump rn_imp_decls rn_local_decls `thenRn` \ dump_action ->
150 checkErrsRn `thenRn` \ no_errs_so_far ->
151 if not no_errs_so_far then
152 -- Found errors already, so exit now
153 returnRn (Nothing, dump_action)
156 -- GENERATE THE VERSION/USAGE INFO
157 mkImportExportInfo mod_name export_avails exports `thenRn` \ (my_exports, my_usages) ->
159 -- RETURN THE RENAMED MODULE
160 getNameSupplyRn `thenRn` \ name_supply ->
161 getIfacesRn `thenRn` \ ifaces ->
163 direct_import_mods :: [Module]
164 direct_import_mods = [m | (_, _, Just (m, _, _, _, imp, _))
165 <- eltsFM (iImpModInfo ifaces), user_import imp]
167 -- *don't* just pick the forward edges. It's entirely possible
168 -- that a module is only reachable via back edges.
169 user_import ImportByUser = True
170 user_import ImportByUserSource = True
171 user_import _ = False
173 this_module = mkThisModule mod_name
175 -- Export only those fixities that are for names that are
176 -- (a) defined in this module
179 = [ FixitySig (toRdrName name) fixity loc
180 | FixitySig name fixity loc <- nameEnvElts local_fixity_env,
181 isUserExportedName name
184 new_iface = ParsedIface { pi_mod = this_module
185 , pi_vers = initialVersion
186 , pi_orphan = any isOrphanDecl rn_local_decls
187 , pi_exports = my_exports
188 , pi_usages = my_usages
189 , pi_fixity = (initialVersion, exported_fixities)
190 , pi_deprecs = my_deprecs
191 -- These ones get filled in later
192 , pi_insts = [], pi_decls = []
193 , pi_rules = (initialVersion, [])
196 renamed_module = HsModule mod_name vers
197 trashed_exports trashed_imports
198 (rn_local_decls ++ rn_imp_decls)
202 result = (this_module, renamed_module,
203 old_iface, new_iface,
204 name_supply, local_fixity_env,
208 -- REPORT UNUSED NAMES, AND DEBUG DUMP
209 reportUnusedNames mod_name direct_import_mods
210 gbl_env global_avail_env
211 export_avails source_fvs
212 rn_imp_decls `thenRn_`
214 returnRn (Just result, dump_action) }
216 trashed_exports = {-trace "rnSource:trashed_exports"-} Nothing
217 trashed_imports = {-trace "rnSource:trashed_imports"-} []
220 @implicitFVs@ forces the renamer to slurp in some things which aren't
221 mentioned explicitly, but which might be needed by the type checker.
224 implicitFVs mod_name decls
225 = lookupOrigNames implicit_occs `thenRn` \ implicit_names ->
226 returnRn (mkNameSet (map getName default_tycons) `plusFV`
229 -- Add occurrences for Int, and (), because they
230 -- are the types to which ambigious type variables may be defaulted by
231 -- the type checker; so they won't always appear explicitly.
232 -- [The () one is a GHC extension for defaulting CCall results.]
233 -- ALSO: funTyCon, since it occurs implicitly everywhere!
234 -- (we don't want to be bothered with making funTyCon a
235 -- free var at every function application!)
236 -- Double is dealt with separately in getGates
237 default_tycons = [unitTyCon, funTyCon, boolTyCon, intTyCon]
239 -- Add occurrences for IO or PrimIO
240 implicit_main | mod_name == mAIN_Name
241 || mod_name == pREL_MAIN_Name = [ioTyCon_RDR]
244 -- Now add extra "occurrences" for things that
245 -- the deriving mechanism, or defaulting, will later need in order to
247 implicit_occs = string_occs ++ foldr ((++) . get) implicit_main decls
249 -- Virtually every program has error messages in it somewhere
250 string_occs = [unpackCString_RDR, unpackCStringFoldr_RDR, unpackCStringUtf8_RDR]
252 get (TyClD (TyData _ _ _ _ _ _ (Just deriv_classes) _ _ _ _))
253 = concat (map get_deriv deriv_classes)
256 get_deriv cls = case lookupUFM derivingOccurrences cls of
262 isOrphanDecl (InstD (InstDecl inst_ty _ _ _ _))
263 = not (foldNameSet ((||) . isLocallyDefined) False (extractHsTyNames (removeContext inst_ty)))
264 -- The 'removeContext' is because of
265 -- instance Foo a => Baz T where ...
266 -- The decl is an orphan if Baz and T are both not locally defined,
267 -- even if Foo *is* locally defined
269 isOrphanDecl (RuleD (HsRule _ _ _ lhs _ _))
272 -- At the moment we just check for common LHS forms
273 -- Expand as necessary. Getting it wrong just means
274 -- more orphans than necessary
275 check (HsVar v) = not (isLocallyDefined v)
276 check (HsApp f a) = check f && check a
277 check (HsLit _) = False
278 check (HsOverLit _) = False
279 check (OpApp l o _ r) = check l && check o && check r
280 check (NegApp e _) = check e
281 check (HsPar e) = check e
282 check (SectionL e o) = check e && check o
283 check (SectionR o e) = check e && check o
285 check other = True -- Safe fall through
287 isOrphanDecl other = False
292 dupDefaultDeclErrRn (DefaultDecl _ locn1 : dup_things)
293 = pushSrcLocRn locn1 $
296 msg = hang (ptext SLIT("Multiple default declarations"))
297 4 (vcat (map pp dup_things))
298 pp (DefaultDecl _ locn) = ptext SLIT("here was another default declaration") <+> ppr locn
302 %*********************************************************
304 \subsection{Slurping declarations}
306 %*********************************************************
309 -------------------------------------------------------
310 slurpImpDecls source_fvs
311 = traceRn (text "slurpImp" <+> fsep (map ppr (nameSetToList source_fvs))) `thenRn_`
313 -- The current slurped-set records all local things
314 getSlurped `thenRn` \ source_binders ->
315 slurpSourceRefs source_binders source_fvs `thenRn` \ (decls, needed) ->
317 -- Then get everything else
318 closeDecls decls needed `thenRn` \ decls1 ->
320 -- Finally, get any deferred data type decls
321 slurpDeferredDecls decls1 `thenRn` \ final_decls ->
325 -------------------------------------------------------
326 slurpSourceRefs :: NameSet -- Variables defined in source
327 -> FreeVars -- Variables referenced in source
328 -> RnMG ([RenamedHsDecl],
329 FreeVars) -- Un-satisfied needs
330 -- The declaration (and hence home module) of each gate has
331 -- already been loaded
333 slurpSourceRefs source_binders source_fvs
334 = go_outer [] -- Accumulating decls
335 emptyFVs -- Unsatisfied needs
336 emptyFVs -- Accumulating gates
337 (nameSetToList source_fvs) -- Things whose defn hasn't been loaded yet
339 -- The outer loop repeatedly slurps the decls for the current gates
340 -- and the instance decls
342 -- The outer loop is needed because consider
343 -- instance Foo a => Baz (Maybe a) where ...
344 -- It may be that @Baz@ and @Maybe@ are used in the source module,
345 -- but not @Foo@; so we need to chase @Foo@ too.
347 -- We also need to follow superclass refs. In particular, 'chasing @Foo@' must
348 -- include actually getting in Foo's class decl
349 -- class Wib a => Foo a where ..
350 -- so that its superclasses are discovered. The point is that Wib is a gate too.
351 -- We do this for tycons too, so that we look through type synonyms.
353 go_outer decls fvs all_gates []
354 = returnRn (decls, fvs)
356 go_outer decls fvs all_gates refs -- refs are not necessarily slurped yet
357 = traceRn (text "go_outer" <+> ppr refs) `thenRn_`
358 foldlRn go_inner (decls, fvs, emptyFVs) refs `thenRn` \ (decls1, fvs1, gates1) ->
359 getImportedInstDecls (all_gates `plusFV` gates1) `thenRn` \ inst_decls ->
360 rnInstDecls decls1 fvs1 gates1 inst_decls `thenRn` \ (decls2, fvs2, gates2) ->
361 go_outer decls2 fvs2 (all_gates `plusFV` gates2)
362 (nameSetToList (gates2 `minusNameSet` all_gates))
363 -- Knock out the all_gates because even if we don't slurp any new
364 -- decls we can get some apparently-new gates from wired-in names
366 go_inner (decls, fvs, gates) wanted_name
367 = importDecl wanted_name `thenRn` \ import_result ->
368 case import_result of
369 AlreadySlurped -> returnRn (decls, fvs, gates)
370 WiredIn -> returnRn (decls, fvs, gates `plusFV` getWiredInGates wanted_name)
371 Deferred -> returnRn (decls, fvs, gates `addOneFV` wanted_name) -- It's a type constructor
373 HereItIs decl -> rnIfaceDecl decl `thenRn` \ (new_decl, fvs1) ->
374 returnRn (new_decl : decls,
376 gates `plusFV` getGates source_fvs new_decl)
378 rnInstDecls decls fvs gates []
379 = returnRn (decls, fvs, gates)
380 rnInstDecls decls fvs gates (d:ds)
381 = rnIfaceDecl d `thenRn` \ (new_decl, fvs1) ->
382 rnInstDecls (new_decl:decls)
384 (gates `plusFV` getInstDeclGates new_decl)
390 -------------------------------------------------------
391 -- closeDecls keeps going until the free-var set is empty
392 closeDecls decls needed
393 | not (isEmptyFVs needed)
394 = slurpDecls decls needed `thenRn` \ (decls1, needed1) ->
395 closeDecls decls1 needed1
398 = getImportedRules `thenRn` \ rule_decls ->
400 [] -> returnRn decls -- No new rules, so we are done
401 other -> rnIfaceDecls decls emptyFVs rule_decls `thenRn` \ (decls1, needed1) ->
402 closeDecls decls1 needed1
405 -------------------------------------------------------
406 -- Augment decls with any decls needed by needed.
407 -- Return also free vars of the new decls (only)
408 slurpDecls decls needed
409 = go decls emptyFVs (nameSetToList needed)
411 go decls fvs [] = returnRn (decls, fvs)
412 go decls fvs (ref:refs) = slurpDecl decls fvs ref `thenRn` \ (decls1, fvs1) ->
415 -------------------------------------------------------
416 slurpDecl decls fvs wanted_name
417 = importDecl wanted_name `thenRn` \ import_result ->
418 case import_result of
419 -- Found a declaration... rename it
420 HereItIs decl -> rnIfaceDecl decl `thenRn` \ (new_decl, fvs1) ->
421 returnRn (new_decl:decls, fvs1 `plusFV` fvs)
423 -- No declaration... (wired in thing, or deferred, or already slurped)
424 other -> returnRn (decls, fvs)
427 -------------------------------------------------------
428 rnIfaceDecls :: [RenamedHsDecl] -> FreeVars
429 -> [(Module, RdrNameHsDecl)]
430 -> RnM d ([RenamedHsDecl], FreeVars)
431 rnIfaceDecls decls fvs [] = returnRn (decls, fvs)
432 rnIfaceDecls decls fvs (d:ds) = rnIfaceDecl d `thenRn` \ (new_decl, fvs1) ->
433 rnIfaceDecls (new_decl:decls) (fvs1 `plusFV` fvs) ds
435 rnIfaceDecl (mod, decl) = initIfaceRnMS mod (rnDecl decl)
439 %*********************************************************
441 \subsection{Deferred declarations}
443 %*********************************************************
445 The idea of deferred declarations is this. Suppose we have a function
450 Then we don't want to load T and all its constructors, and all
451 the types those constructors refer to, and all the types *those*
452 constructors refer to, and so on. That might mean loading many more
453 interface files than is really necessary. So we 'defer' loading T.
455 But f might be strict, and the calling convention for evaluating
456 values of type T depends on how many constructors T has, so
457 we do need to load T, but not the full details of the type T.
458 So we load the full decl for T, but only skeleton decls for A and B:
460 data T = {- 2 constructors -}
462 Whether all this is worth it is moot.
465 slurpDeferredDecls :: [RenamedHsDecl] -> RnMG [RenamedHsDecl]
466 slurpDeferredDecls decls
467 = getDeferredDecls `thenRn` \ def_decls ->
468 rnIfaceDecls decls emptyFVs (map stripDecl def_decls) `thenRn` \ (decls1, fvs) ->
469 ASSERT( isEmptyFVs fvs )
472 stripDecl (mod, TyClD (TyData dt _ tc tvs _ nconstrs _ _ loc name1 name2))
473 = (mod, TyClD (TyData dt [] tc tvs [] nconstrs Nothing NoDataPragmas loc
475 -- Nuke the context and constructors
476 -- But retain the *number* of constructors!
477 -- Also the tvs will have kinds on them.
481 %*********************************************************
483 \subsection{Extracting the `gates'}
485 %*********************************************************
487 When we import a declaration like
489 data T = T1 Wibble | T2 Wobble
491 we don't want to treat @Wibble@ and @Wobble@ as gates
492 {\em unless} @T1@, @T2@ respectively are mentioned by the user program.
493 If only @T@ is mentioned
494 we want only @T@ to be a gate;
495 that way we don't suck in useless instance
496 decls for (say) @Eq Wibble@, when they can't possibly be useful.
498 @getGates@ takes a newly imported (and renamed) decl, and the free
499 vars of the source program, and extracts from the decl the gate names.
502 getGates source_fvs (SigD (IfaceSig _ ty _ _))
503 = extractHsTyNames ty
505 getGates source_fvs (TyClD (ClassDecl ctxt cls tvs _ sigs _ _ _ _ ))
506 = (delListFromNameSet (foldr (plusFV . get) (extractHsCtxtTyNames ctxt) sigs)
508 `addOneToNameSet` cls)
509 `plusFV` maybe_double
511 get (ClassOpSig n _ ty _)
512 | n `elemNameSet` source_fvs = extractHsTyNames ty
513 | otherwise = emptyFVs
515 -- If we load any numeric class that doesn't have
516 -- Int as an instance, add Double to the gates.
517 -- This takes account of the fact that Double might be needed for
518 -- defaulting, but we don't want to load Double (and all its baggage)
519 -- if the more exotic classes aren't used at all.
520 maybe_double | nameUnique cls `elem` fractionalClassKeys
521 = unitFV (getName doubleTyCon)
525 getGates source_fvs (TyClD (TySynonym tycon tvs ty _))
526 = delListFromNameSet (extractHsTyNames ty)
528 -- A type synonym type constructor isn't a "gate" for instance decls
530 getGates source_fvs (TyClD (TyData _ ctxt tycon tvs cons _ _ _ _ _ _))
531 = delListFromNameSet (foldr (plusFV . get) (extractHsCtxtTyNames ctxt) cons)
533 `addOneToNameSet` tycon
535 get (ConDecl n _ tvs ctxt details _)
536 | n `elemNameSet` source_fvs
537 -- If the constructor is method, get fvs from all its fields
538 = delListFromNameSet (get_details details `plusFV`
539 extractHsCtxtTyNames ctxt)
541 get (ConDecl n _ tvs ctxt (RecCon fields) _)
542 -- Even if the constructor isn't mentioned, the fields
543 -- might be, as selectors. They can't mention existentially
544 -- bound tyvars (typechecker checks for that) so no need for
545 -- the deleteListFromNameSet part
546 = foldr (plusFV . get_field) emptyFVs fields
548 get other_con = emptyFVs
550 get_details (VanillaCon tys) = plusFVs (map get_bang tys)
551 get_details (InfixCon t1 t2) = get_bang t1 `plusFV` get_bang t2
552 get_details (RecCon fields) = plusFVs [get_bang t | (_, t) <- fields]
554 get_field (fs,t) | any (`elemNameSet` source_fvs) fs = get_bang t
555 | otherwise = emptyFVs
557 get_bang bty = extractHsTyNames (getBangType bty)
559 getGates source_fvs other_decl = emptyFVs
562 @getWiredInGates@ is just like @getGates@, but it sees a wired-in @Name@
563 rather than a declaration.
566 getWiredInGates :: Name -> FreeVars
567 getWiredInGates name -- No classes are wired in
568 | is_id = getWiredInGates_s (namesOfType (idType the_id))
569 | isSynTyCon the_tycon = getWiredInGates_s
570 (delListFromNameSet (namesOfType ty) (map getName tyvars))
571 | otherwise = unitFV name
573 maybe_wired_in_id = maybeWiredInIdName name
574 is_id = maybeToBool maybe_wired_in_id
575 maybe_wired_in_tycon = maybeWiredInTyConName name
576 Just the_id = maybe_wired_in_id
577 Just the_tycon = maybe_wired_in_tycon
578 (tyvars,ty) = getSynTyConDefn the_tycon
580 getWiredInGates_s names = foldr (plusFV . getWiredInGates) emptyFVs (nameSetToList names)
584 getInstDeclGates (InstD (InstDecl inst_ty _ _ _ _)) = extractHsTyNames inst_ty
585 getInstDeclGates other = emptyFVs
589 %*********************************************************
591 \subsection{Fixities}
593 %*********************************************************
596 fixitiesFromLocalDecls :: GlobalRdrEnv -> [RdrNameHsDecl] -> RnMG FixityEnv
597 fixitiesFromLocalDecls gbl_env decls
598 = foldlRn getFixities emptyNameEnv decls `thenRn` \ env ->
599 traceRn (text "fixity env" <+> vcat (map ppr (nameEnvElts env))) `thenRn_`
602 getFixities :: FixityEnv -> RdrNameHsDecl -> RnMG FixityEnv
603 getFixities acc (FixD fix)
606 getFixities acc (TyClD (ClassDecl _ _ _ _ sigs _ _ _ _ ))
607 = foldlRn fix_decl acc [sig | FixSig sig <- sigs]
608 -- Get fixities from class decl sigs too.
609 getFixities acc other_decl
612 fix_decl acc sig@(FixitySig rdr_name fixity loc)
613 = -- Check for fixity decl for something not declared
614 case lookupRdrEnv gbl_env rdr_name of {
615 Nothing | opt_WarnUnusedBinds
616 -> pushSrcLocRn loc (addWarnRn (unusedFixityDecl rdr_name fixity))
617 `thenRn_` returnRn acc
618 | otherwise -> returnRn acc ;
622 -- Check for duplicate fixity decl
623 case lookupNameEnv acc name of {
624 Just (FixitySig _ _ loc') -> addErrRn (dupFixityDecl rdr_name loc loc')
625 `thenRn_` returnRn acc ;
627 Nothing -> returnRn (extendNameEnv acc name (FixitySig name fixity loc))
632 %*********************************************************
634 \subsection{Deprecations}
636 %*********************************************************
638 For deprecations, all we do is check that the names are in scope.
639 It's only imported deprecations, dealt with in RnIfaces, that we
640 gather them together.
643 rnDeprecs :: GlobalRdrEnv -> Maybe DeprecTxt
644 -> [RdrNameHsDecl] -> RnMG [RdrNameDeprecation]
645 rnDeprecs gbl_env mod_deprec decls
646 = mapRn rn_deprec deprecs `thenRn_`
647 returnRn (extra_deprec ++ deprecs)
649 deprecs = [d | DeprecD d <- decls]
650 extra_deprec = case mod_deprec of
652 Just txt -> [Deprecation (IEModuleContents undefined) txt noSrcLoc]
654 rn_deprec (Deprecation ie txt loc)
656 mapRn check (ieNames ie)
658 check n = case lookupRdrEnv gbl_env n of
659 Nothing -> addErrRn (unknownNameErr n)
660 Just _ -> returnRn ()
664 %*********************************************************
666 \subsection{Unused names}
668 %*********************************************************
671 reportUnusedNames :: ModuleName -> [Module]
672 -> GlobalRdrEnv -> AvailEnv
673 -> Avails -> NameSet -> [RenamedHsDecl]
675 reportUnusedNames mod_name direct_import_mods
677 export_avails mentioned_names
680 used_names = mentioned_names `unionNameSets` availsToNameSet export_avails
682 -- Now, a use of C implies a use of T,
683 -- if C was brought into scope by T(..) or T(C)
684 really_used_names = used_names `unionNameSets`
685 mkNameSet [ availName parent_avail
686 | sub_name <- nameSetToList used_names
687 , isValOcc (getOccName sub_name)
689 -- Usually, every used name will appear in avail_env, but there
690 -- is one time when it doesn't: tuples and other built in syntax. When you
691 -- write (a,b) that gives rise to a *use* of "(,)", so that the
692 -- instances will get pulled in, but the tycon "(,)" isn't actually
693 -- in scope. Hence the isValOcc filter.
695 -- Also, (-x) gives rise to an implicit use of 'negate'; similarly,
696 -- 3.5 gives rise to an implcit use of :%
697 -- hence the isUserImportedName filter on the warning
700 = case lookupNameEnv avail_env sub_name of
702 Nothing -> WARN( isUserImportedName sub_name,
703 text "reportUnusedName: not in avail_env" <+>
707 , case parent_avail of { AvailTC _ _ -> True; other -> False }
710 defined_names = mkNameSet (concat (rdrEnvElts gbl_env))
711 defined_but_not_used =
712 nameSetToList (defined_names `minusNameSet` really_used_names)
714 -- Filter out the ones only defined implicitly
715 bad_locals = [n | n <- defined_but_not_used, isLocallyDefined n]
716 bad_imp_names = [n | n <- defined_but_not_used, isUserImportedExplicitlyName n,
717 not (module_unused n)]
719 deprec_used deprec_env = [ (n,txt)
720 | n <- nameSetToList mentioned_names,
721 not (isLocallyDefined n),
722 Just txt <- [lookupNameEnv deprec_env n] ]
724 -- inst_mods are directly-imported modules that
725 -- contain instance decl(s) that the renamer decided to suck in
726 -- It's not necessarily redundant to import such modules.
732 -- The import M() is not *necessarily* redundant, even if
733 -- we suck in no instance decls from M (e.g. it contains
734 -- no instance decls, or This contains no code). It may be
735 -- that we import M solely to ensure that M's orphan instance
736 -- decls (or those in its imports) are visible to people who
737 -- import This. Sigh.
738 -- There's really no good way to detect this, so the error message
739 -- in RnEnv.warnUnusedModules is weakened instead
740 inst_mods = [m | InstD (InstDecl _ _ _ (Just dfun) _) <- imported_decls,
741 let m = nameModule dfun,
742 m `elem` direct_import_mods
745 minimal_imports :: FiniteMap Module AvailEnv
746 minimal_imports0 = emptyFM
747 minimal_imports1 = foldNameSet add_name minimal_imports0 really_used_names
748 minimal_imports = foldr add_inst_mod minimal_imports1 inst_mods
750 add_name n acc = case maybeUserImportedFrom n of
752 Just m -> addToFM_C plusAvailEnv acc m
753 (unitAvailEnv (mk_avail n))
755 | m `elemFM` acc = acc -- We import something already
756 | otherwise = addToFM acc m emptyAvailEnv
757 -- Add an empty collection of imports for a module
758 -- from which we have sucked only instance decls
760 mk_avail n = case lookupNameEnv avail_env n of
761 Just (AvailTC m _) | n==m -> AvailTC n [n]
762 | otherwise -> AvailTC m [n,m]
763 Just avail -> Avail n
764 Nothing -> pprPanic "mk_avail" (ppr n)
766 -- unused_imp_mods are the directly-imported modules
767 -- that are not mentioned in minimal_imports
768 unused_imp_mods = [m | m <- direct_import_mods,
769 not (maybeToBool (lookupFM minimal_imports m)),
770 moduleName m /= pRELUDE_Name]
772 module_unused :: Name -> Bool
773 -- Name is imported from a module that's completely unused,
774 -- so don't report stuff about the name (the module covers it)
775 module_unused n = expectJust "module_unused" (maybeUserImportedFrom n)
776 `elem` unused_imp_mods
777 -- module_unused is only called if it's user-imported
779 warnUnusedModules unused_imp_mods `thenRn_`
780 warnUnusedLocalBinds bad_locals `thenRn_`
781 warnUnusedImports bad_imp_names `thenRn_`
782 printMinimalImports mod_name minimal_imports `thenRn_`
783 getIfacesRn `thenRn` \ ifaces ->
784 (if opt_WarnDeprecations
785 then mapRn_ warnDeprec (deprec_used (iDeprecs ifaces))
788 -- ToDo: deal with original imports with 'qualified' and 'as M' clauses
789 printMinimalImports mod_name imps
790 | not opt_D_dump_minimal_imports
793 = mapRn to_ies (fmToList imps) `thenRn` \ mod_ies ->
794 ioToRnM (do { h <- openFile filename WriteMode ;
795 printForUser h (vcat (map ppr_mod_ie mod_ies))
799 filename = moduleNameUserString mod_name ++ ".imports"
800 ppr_mod_ie (mod_name, ies)
801 | mod_name == pRELUDE_Name
804 = ptext SLIT("import") <+> ppr mod_name <>
805 parens (fsep (punctuate comma (map ppr ies)))
807 to_ies (mod, avail_env) = mapRn to_ie (availEnvElts avail_env) `thenRn` \ ies ->
808 returnRn (moduleName mod, ies)
810 to_ie :: AvailInfo -> RnMG (IE Name)
811 to_ie (Avail n) = returnRn (IEVar n)
812 to_ie (AvailTC n [m]) = ASSERT( n==m )
813 returnRn (IEThingAbs n)
814 to_ie (AvailTC n ns) = getInterfaceExports (moduleName (nameModule n))
815 ImportBySystem `thenRn` \ (_, avails) ->
816 case [ms | AvailTC m ms <- avails, m == n] of
817 [ms] | all (`elem` ns) ms -> returnRn (IEThingAll n)
818 | otherwise -> returnRn (IEThingWith n (filter (/= n) ns))
819 other -> pprTrace "to_ie" (ppr n <+> ppr (nameModule n) <+> ppr other) $
822 rnDump :: [RenamedHsDecl] -- Renamed imported decls
823 -> [RenamedHsDecl] -- Renamed local decls
825 rnDump imp_decls local_decls
826 | opt_D_dump_rn_trace ||
827 opt_D_dump_rn_stats ||
829 = getRnStats imp_decls `thenRn` \ stats_msg ->
831 returnRn (printErrs stats_msg >>
832 dumpIfSet opt_D_dump_rn "Renamer:"
833 (vcat (map ppr (local_decls ++ imp_decls))))
835 | otherwise = returnRn (return ())
839 %*********************************************************
841 \subsection{Statistics}
843 %*********************************************************
846 getRnStats :: [RenamedHsDecl] -> RnMG SDoc
847 getRnStats imported_decls
848 = getIfacesRn `thenRn` \ ifaces ->
850 n_mods = length [() | (_, _, Just _) <- eltsFM (iImpModInfo ifaces)]
852 decls_read = [decl | (_, avail, True, (_,decl)) <- nameEnvElts (iDecls ifaces),
853 -- Data, newtype, and class decls are in the decls_fm
854 -- under multiple names; the tycon/class, and each
855 -- constructor/class op too.
856 -- The 'True' selects just the 'main' decl
857 not (isLocallyDefined (availName avail))
860 (cd_rd, dd_rd, nd_rd, sd_rd, vd_rd, _) = count_decls decls_read
861 (cd_sp, dd_sp, nd_sp, sd_sp, vd_sp, id_sp) = count_decls imported_decls
863 unslurped_insts = iInsts ifaces
864 inst_decls_unslurped = length (bagToList unslurped_insts)
865 inst_decls_read = id_sp + inst_decls_unslurped
868 [int n_mods <+> text "interfaces read",
869 hsep [ int cd_sp, text "class decls imported, out of",
870 int cd_rd, text "read"],
871 hsep [ int dd_sp, text "data decls imported, out of",
872 int dd_rd, text "read"],
873 hsep [ int nd_sp, text "newtype decls imported, out of",
874 int nd_rd, text "read"],
875 hsep [int sd_sp, text "type synonym decls imported, out of",
876 int sd_rd, text "read"],
877 hsep [int vd_sp, text "value signatures imported, out of",
878 int vd_rd, text "read"],
879 hsep [int id_sp, text "instance decls imported, out of",
880 int inst_decls_read, text "read"],
881 text "cls dcls slurp" <+> fsep (map (ppr . tyClDeclName)
882 [d | TyClD d <- imported_decls, isClassDecl d]),
883 text "cls dcls read" <+> fsep (map (ppr . tyClDeclName)
884 [d | TyClD d <- decls_read, isClassDecl d])]
886 returnRn (hcat [text "Renamer stats: ", stats])
896 tycl_decls = [d | TyClD d <- decls]
897 (class_decls, data_decls, newtype_decls, syn_decls) = countTyClDecls tycl_decls
899 val_decls = length [() | SigD _ <- decls]
900 inst_decls = length [() | InstD _ <- decls]
904 %************************************************************************
906 \subsection{Errors and warnings}
908 %************************************************************************
911 warnDeprec :: (Name, DeprecTxt) -> RnM d ()
912 warnDeprec (name, txt)
913 = pushSrcLocRn (getSrcLoc name) $
915 sep [ text (occNameFlavour (nameOccName name)) <+> ppr name <+>
916 text "is deprecated:", nest 4 (ppr txt) ]
919 unusedFixityDecl rdr_name fixity
920 = hsep [ptext SLIT("Unused fixity declaration for"), quotes (ppr rdr_name)]
922 dupFixityDecl rdr_name loc1 loc2
923 = vcat [ptext SLIT("Multiple fixity declarations for") <+> quotes (ppr rdr_name),
924 ptext SLIT("at ") <+> ppr loc1,
925 ptext SLIT("and") <+> ppr loc2]