[project @ 2000-10-23 16:43:42 by simonpj]
[ghc-hetmet.git] / ghc / compiler / rename / Rename.lhs
1 %
2 % (c) The GRASP Project, Glasgow University, 1992-1998
3 %
4 \section[Rename]{Renaming and dependency analysis passes}
5
6 \begin{code}
7 module Rename ( renameModule ) where
8
9 #include "HsVersions.h"
10
11 import HsSyn
12 import HsPragmas        ( DataPragmas(..) )
13 import RdrHsSyn         ( RdrNameHsModule, RdrNameHsDecl, RdrNameDeprecation )
14 import RnHsSyn          ( RenamedHsModule, RenamedHsDecl, 
15                           extractHsTyNames, extractHsCtxtTyNames
16                         )
17
18 import CmdLineOpts      ( DynFlags, DynFlag(..) )
19 import RnMonad
20 import RnNames          ( getGlobalNames )
21 import RnSource         ( rnSourceDecls, rnDecl )
22 import RnIfaces         ( getImportedInstDecls, importDecl, mkImportInfo, 
23                           getInterfaceExports,
24                           getImportedRules, getSlurped, removeContext,
25                           ImportDeclResult(..), findAndReadIface
26                         )
27 import RnEnv            ( availName, availsToNameSet, 
28                           emptyAvailEnv, unitAvailEnv, availEnvElts, plusAvailEnv, sortAvails,
29                           warnUnusedImports, warnUnusedLocalBinds, warnUnusedModules,
30                           lookupOrigNames, unknownNameErr,
31                           FreeVars, plusFVs, plusFV, unitFV, emptyFVs, isEmptyFVs, addOneFV
32                         )
33 import Module           ( Module, ModuleName, WhereFrom(..),
34                           moduleNameUserString, moduleName, mkModuleInThisPackage,
35                           lookupModuleEnv
36                         )
37 import Name             ( Name, isLocallyDefined, NamedThing(..), getSrcLoc,
38                           nameOccName, nameUnique, nameModule,
39                           isUserExportedName, toRdrName,
40                           mkNameEnv, nameEnvElts, extendNameEnv
41                         )
42 import OccName          ( occNameFlavour, isValOcc )
43 import Id               ( idType )
44 import TyCon            ( isSynTyCon, getSynTyConDefn )
45 import NameSet
46 import TysWiredIn       ( unitTyCon, intTyCon, doubleTyCon, boolTyCon )
47 import PrelNames        ( mAIN_Name, pREL_MAIN_Name, pRELUDE_Name,
48                           ioTyCon_RDR,
49                           unpackCString_RDR, unpackCStringFoldr_RDR, unpackCStringUtf8_RDR,
50                           eqString_RDR
51                         )
52 import PrelInfo         ( fractionalClassKeys, derivingOccurrences, wiredInThingEnv )
53 import Type             ( namesOfType, funTyCon )
54 import ErrUtils         ( printErrorsAndWarnings, dumpIfSet, ghcExit )
55 import BasicTypes       ( Version, initialVersion )
56 import Bag              ( isEmptyBag, bagToList )
57 import FiniteMap        ( FiniteMap, eltsFM, fmToList, emptyFM, lookupFM, 
58                           addToFM_C, elemFM, addToFM
59                         )
60 import UniqSupply       ( UniqSupply )
61 import UniqFM           ( lookupUFM )
62 import SrcLoc           ( noSrcLoc )
63 import Maybes           ( maybeToBool, expectJust )
64 import Outputable
65 import IO               ( openFile, IOMode(..) )
66 import HscTypes         ( Finder, PersistentCompilerState, HomeIfaceTable, HomeSymbolTable, 
67                           ModIface(..), TyThing(..),
68                           GlobalRdrEnv, AvailEnv, Avails, GenAvailInfo(..), AvailInfo, 
69                           Provenance(..), pprNameProvenance, ImportReason(..),
70                           lookupDeprec
71                          )
72 import List             ( partition, nub )
73 \end{code}
74
75
76
77 \begin{code}
78 renameModule :: DynFlags -> Finder 
79              -> HomeIfaceTable -> HomeSymbolTable
80              -> PersistentCompilerState 
81              -> Module -> RdrNameHsModule 
82              -> IO (PersistentCompilerState, Maybe ModIface)
83                         -- The mi_decls in the ModIface include
84                         -- ones imported from packages too
85
86 renameModule dflags finder hit hst old_pcs this_module 
87              this_mod@(HsModule _ _ _ _ _ _ loc)
88   =     -- Initialise the renamer monad
89     do {
90         ((maybe_rn_stuff, dump_action), (rn_warns_bag, rn_errs_bag), new_pcs) 
91            <- initRn dflags finder hit hst old_pcs this_module loc (rename this_module this_mod) ;
92
93         -- Check for warnings
94         printErrorsAndWarnings (rn_warns_bag, rn_errs_bag) ;
95
96         -- Dump any debugging output
97         dump_action ;
98
99         -- Return results
100         if not (isEmptyBag rn_errs_bag) then
101             return (old_pcs, Nothing)
102         else
103             return (new_pcs, maybe_rn_stuff)
104     }
105 \end{code}
106
107 \begin{code}
108 rename :: Module -> RdrNameHsModule -> RnMG (Maybe ModIface, IO ())
109 rename this_module this_mod@(HsModule mod_name vers exports imports local_decls mod_deprec loc)
110   =     -- FIND THE GLOBAL NAME ENVIRONMENT
111     getGlobalNames this_mod                     `thenRn` \ maybe_stuff ->
112
113         -- CHECK FOR EARLY EXIT
114     case maybe_stuff of {
115         Nothing ->      -- Everything is up to date; no need to recompile further
116                 rnDump [] []            `thenRn` \ dump_action ->
117                 returnRn (Nothing, dump_action) ;
118
119         Just (gbl_env, local_gbl_env, export_avails, global_avail_env) ->
120
121         -- DEAL WITH DEPRECATIONS
122     rnDeprecs local_gbl_env mod_deprec local_decls      `thenRn` \ my_deprecs ->
123
124         -- DEAL WITH LOCAL FIXITIES
125     fixitiesFromLocalDecls local_gbl_env local_decls    `thenRn` \ local_fixity_env ->
126
127         -- RENAME THE SOURCE
128     initRnMS gbl_env local_fixity_env SourceMode (
129         rnSourceDecls local_decls
130     )                                   `thenRn` \ (rn_local_decls, source_fvs) ->
131
132         -- SLURP IN ALL THE NEEDED DECLARATIONS
133     implicitFVs mod_name rn_local_decls         `thenRn` \ implicit_fvs -> 
134     let
135                 -- The export_fvs make the exported names look just as if they
136                 -- occurred in the source program.  For the reasoning, see the
137                 -- comments with RnIfaces.getImportVersions.
138                 -- We only need the 'parent name' of the avail;
139                 -- that's enough to suck in the declaration.
140         export_fvs      = mkNameSet (map availName export_avails)
141         real_source_fvs = source_fvs `plusFV` export_fvs
142
143         slurp_fvs       = implicit_fvs `plusFV` real_source_fvs
144                 -- It's important to do the "plus" this way round, so that
145                 -- when compiling the prelude, locally-defined (), Bool, etc
146                 -- override the implicit ones. 
147     in
148     slurpImpDecls slurp_fvs             `thenRn` \ rn_imp_decls ->
149
150         -- EXIT IF ERRORS FOUND
151     rnDump rn_imp_decls rn_local_decls          `thenRn` \ dump_action ->
152     checkErrsRn                                 `thenRn` \ no_errs_so_far ->
153     if not no_errs_so_far then
154         -- Found errors already, so exit now
155         returnRn (Nothing, dump_action)
156     else
157
158         -- GENERATE THE VERSION/USAGE INFO
159     mkImportInfo mod_name imports       `thenRn` \ my_usages ->
160
161         -- RETURN THE RENAMED MODULE
162     getNameSupplyRn                     `thenRn` \ name_supply ->
163     getIfacesRn                         `thenRn` \ ifaces ->
164     let
165         direct_import_mods :: [ModuleName]
166         direct_import_mods = nub [m | ImportDecl m _ _ _ _ _ <- imports]
167
168                 -- *don't* just pick the forward edges.  It's entirely possible
169                 -- that a module is only reachable via back edges.
170         user_import ImportByUser = True
171         user_import ImportByUserSource = True
172         user_import _ = False
173
174         -- Export only those fixities that are for names that are
175         --      (a) defined in this module
176         --      (b) exported
177         exported_fixities
178           = mkNameEnv [ (name, fixity)
179                       | FixitySig name fixity loc <- nameEnvElts local_fixity_env,
180                         isUserExportedName name
181                       ]
182
183
184         -- Sort the exports to make them easier to compare for versions
185         my_exports = sortAvails export_avails
186         
187         mod_iface = ModIface {  mi_module   = this_module,
188                                 mi_version  = panic "mi_version: not filled in yet",
189                                 mi_orphan   = any isOrphanDecl rn_local_decls,
190                                 mi_exports  = my_exports,
191                                 mi_usages   = my_usages,
192                                 mi_fixities = exported_fixities,
193                                 mi_deprecs  = my_deprecs,
194                                 mi_decls    = rn_local_decls ++ rn_imp_decls
195                     }
196     in
197
198         -- REPORT UNUSED NAMES, AND DEBUG DUMP 
199     reportUnusedNames mod_name direct_import_mods
200                       gbl_env global_avail_env
201                       export_avails source_fvs
202                       rn_imp_decls                      `thenRn_`
203
204     returnRn (Just mod_iface, dump_action) }
205   where
206     trashed_exports  = {-trace "rnSource:trashed_exports"-} Nothing
207     trashed_imports  = {-trace "rnSource:trashed_imports"-} []
208 \end{code}
209
210 @implicitFVs@ forces the renamer to slurp in some things which aren't
211 mentioned explicitly, but which might be needed by the type checker.
212
213 \begin{code}
214 implicitFVs mod_name decls
215   = lookupOrigNames implicit_occs                       `thenRn` \ implicit_names ->
216     returnRn (mkNameSet (map getName default_tycons)    `plusFV`
217               implicit_names)
218   where
219         -- Add occurrences for Int, and (), because they
220         -- are the types to which ambigious type variables may be defaulted by
221         -- the type checker; so they won't always appear explicitly.
222         -- [The () one is a GHC extension for defaulting CCall results.]
223         -- ALSO: funTyCon, since it occurs implicitly everywhere!
224         --       (we don't want to be bothered with making funTyCon a
225         --        free var at every function application!)
226         -- Double is dealt with separately in getGates
227     default_tycons = [unitTyCon, funTyCon, boolTyCon, intTyCon]
228
229         -- Add occurrences for IO or PrimIO
230     implicit_main |  mod_name == mAIN_Name
231                   || mod_name == pREL_MAIN_Name = [ioTyCon_RDR]
232                   |  otherwise                  = []
233
234         -- Now add extra "occurrences" for things that
235         -- the deriving mechanism, or defaulting, will later need in order to
236         -- generate code
237     implicit_occs = string_occs ++ foldr ((++) . get) implicit_main decls
238
239         -- Virtually every program has error messages in it somewhere
240     string_occs = [unpackCString_RDR, unpackCStringFoldr_RDR, unpackCStringUtf8_RDR,
241                    eqString_RDR]
242
243     get (TyClD (TyData _ _ _ _ _ _ (Just deriv_classes) _ _ _ _))
244        = concat (map get_deriv deriv_classes)
245     get other = []
246
247     get_deriv cls = case lookupUFM derivingOccurrences cls of
248                         Nothing   -> []
249                         Just occs -> occs
250 \end{code}
251
252 \begin{code}
253 isOrphanDecl (InstD (InstDecl inst_ty _ _ _ _))
254   = not (foldNameSet ((||) . isLocallyDefined) False (extractHsTyNames (removeContext inst_ty)))
255         -- The 'removeContext' is because of
256         --      instance Foo a => Baz T where ...
257         -- The decl is an orphan if Baz and T are both not locally defined,
258         --      even if Foo *is* locally defined
259
260 isOrphanDecl (RuleD (HsRule _ _ _ lhs _ _))
261   = check lhs
262   where
263         -- At the moment we just check for common LHS forms
264         -- Expand as necessary.  Getting it wrong just means
265         -- more orphans than necessary
266     check (HsVar v)       = not (isLocallyDefined v)
267     check (HsApp f a)     = check f && check a
268     check (HsLit _)       = False
269     check (HsOverLit _)   = False
270     check (OpApp l o _ r) = check l && check o && check r
271     check (NegApp e _)    = check e
272     check (HsPar e)       = check e
273     check (SectionL e o)  = check e && check o
274     check (SectionR o e)  = check e && check o
275
276     check other           = True        -- Safe fall through
277
278 isOrphanDecl other = False
279 \end{code}
280
281
282 \begin{code}
283 dupDefaultDeclErrRn (DefaultDecl _ locn1 : dup_things)
284   = pushSrcLocRn locn1  $
285     addErrRn msg
286   where
287     msg = hang (ptext SLIT("Multiple default declarations"))
288                4  (vcat (map pp dup_things))
289     pp (DefaultDecl _ locn) = ptext SLIT("here was another default declaration") <+> ppr locn
290 \end{code}
291
292
293 %*********************************************************
294 %*                                                       *
295 \subsection{Slurping declarations}
296 %*                                                       *
297 %*********************************************************
298
299 \begin{code}
300 -------------------------------------------------------
301 slurpImpDecls source_fvs
302   = traceRn (text "slurpImp" <+> fsep (map ppr (nameSetToList source_fvs))) `thenRn_`
303
304         -- The current slurped-set records all local things
305     getSlurped                                  `thenRn` \ source_binders ->
306     slurpSourceRefs source_binders source_fvs   `thenRn` \ (decls, needed) ->
307
308         -- Then get everything else
309     closeDecls decls needed                     `thenRn` \ decls1 ->
310
311         -- Finally, get any deferred data type decls
312     slurpDeferredDecls decls1                   `thenRn` \ final_decls -> 
313
314     returnRn final_decls
315
316 -------------------------------------------------------
317 slurpSourceRefs :: NameSet                      -- Variables defined in source
318                 -> FreeVars                     -- Variables referenced in source
319                 -> RnMG ([RenamedHsDecl],
320                          FreeVars)              -- Un-satisfied needs
321 -- The declaration (and hence home module) of each gate has
322 -- already been loaded
323
324 slurpSourceRefs source_binders source_fvs
325   = go_outer []                         -- Accumulating decls
326              emptyFVs                   -- Unsatisfied needs
327              emptyFVs                   -- Accumulating gates
328              (nameSetToList source_fvs) -- Things whose defn hasn't been loaded yet
329   where
330         -- The outer loop repeatedly slurps the decls for the current gates
331         -- and the instance decls 
332
333         -- The outer loop is needed because consider
334         --      instance Foo a => Baz (Maybe a) where ...
335         -- It may be that @Baz@ and @Maybe@ are used in the source module,
336         -- but not @Foo@; so we need to chase @Foo@ too.
337         --
338         -- We also need to follow superclass refs.  In particular, 'chasing @Foo@' must
339         -- include actually getting in Foo's class decl
340         --      class Wib a => Foo a where ..
341         -- so that its superclasses are discovered.  The point is that Wib is a gate too.
342         -- We do this for tycons too, so that we look through type synonyms.
343
344     go_outer decls fvs all_gates []     
345         = returnRn (decls, fvs)
346
347     go_outer decls fvs all_gates refs   -- refs are not necessarily slurped yet
348         = traceRn (text "go_outer" <+> ppr refs)                `thenRn_`
349           foldlRn go_inner (decls, fvs, emptyFVs) refs          `thenRn` \ (decls1, fvs1, gates1) ->
350           getImportedInstDecls (all_gates `plusFV` gates1)      `thenRn` \ inst_decls ->
351           rnInstDecls decls1 fvs1 gates1 inst_decls             `thenRn` \ (decls2, fvs2, gates2) ->
352           go_outer decls2 fvs2 (all_gates `plusFV` gates2)
353                                (nameSetToList (gates2 `minusNameSet` all_gates))
354                 -- Knock out the all_gates because even if we don't slurp any new
355                 -- decls we can get some apparently-new gates from wired-in names
356
357     go_inner (decls, fvs, gates) wanted_name
358         = importDecl wanted_name                `thenRn` \ import_result ->
359           case import_result of
360             AlreadySlurped -> returnRn (decls, fvs, gates)
361             WiredIn        -> returnRn (decls, fvs, gates `plusFV` getWiredInGates wanted_name)
362             Deferred       -> returnRn (decls, fvs, gates `addOneFV` wanted_name)       -- It's a type constructor
363                         
364             HereItIs decl -> rnIfaceDecl decl           `thenRn` \ (new_decl, fvs1) ->
365                              returnRn (new_decl : decls, 
366                                        fvs1 `plusFV` fvs,
367                                        gates `plusFV` getGates source_fvs new_decl)
368
369 rnInstDecls decls fvs gates []
370   = returnRn (decls, fvs, gates)
371 rnInstDecls decls fvs gates (d:ds) 
372   = rnIfaceDecl d               `thenRn` \ (new_decl, fvs1) ->
373     rnInstDecls (new_decl:decls) 
374                 (fvs1 `plusFV` fvs)
375                 (gates `plusFV` getInstDeclGates new_decl)
376                 ds
377 \end{code}
378
379
380 \begin{code}
381 -------------------------------------------------------
382 -- closeDecls keeps going until the free-var set is empty
383 closeDecls decls needed
384   | not (isEmptyFVs needed)
385   = slurpDecls decls needed     `thenRn` \ (decls1, needed1) ->
386     closeDecls decls1 needed1
387
388   | otherwise
389   = getImportedRules                    `thenRn` \ rule_decls ->
390     case rule_decls of
391         []    -> returnRn decls -- No new rules, so we are done
392         other -> rnIfaceDecls decls emptyFVs rule_decls         `thenRn` \ (decls1, needed1) ->
393                  closeDecls decls1 needed1
394                  
395
396 -------------------------------------------------------
397 -- Augment decls with any decls needed by needed.
398 -- Return also free vars of the new decls (only)
399 slurpDecls decls needed
400   = go decls emptyFVs (nameSetToList needed) 
401   where
402     go decls fvs []         = returnRn (decls, fvs)
403     go decls fvs (ref:refs) = slurpDecl decls fvs ref   `thenRn` \ (decls1, fvs1) ->
404                               go decls1 fvs1 refs
405
406 -------------------------------------------------------
407 slurpDecl decls fvs wanted_name
408   = importDecl wanted_name              `thenRn` \ import_result ->
409     case import_result of
410         -- Found a declaration... rename it
411         HereItIs decl -> rnIfaceDecl decl               `thenRn` \ (new_decl, fvs1) ->
412                          returnRn (new_decl:decls, fvs1 `plusFV` fvs)
413
414         -- No declaration... (wired in thing, or deferred, or already slurped)
415         other -> returnRn (decls, fvs)
416
417
418 -------------------------------------------------------
419 rnIfaceDecls :: [RenamedHsDecl] -> FreeVars
420              -> [(Module, RdrNameHsDecl)]
421              -> RnM d ([RenamedHsDecl], FreeVars)
422 rnIfaceDecls decls fvs []     = returnRn (decls, fvs)
423 rnIfaceDecls decls fvs (d:ds) = rnIfaceDecl d           `thenRn` \ (new_decl, fvs1) ->
424                                 rnIfaceDecls (new_decl:decls) (fvs1 `plusFV` fvs) ds
425
426 rnIfaceDecl (mod, decl) = initIfaceRnMS mod (rnDecl decl)       
427 \end{code}
428
429
430 %*********************************************************
431 %*                                                       *
432 \subsection{Deferred declarations}
433 %*                                                       *
434 %*********************************************************
435
436 The idea of deferred declarations is this.  Suppose we have a function
437         f :: T -> Int
438         data T = T1 A | T2 B
439         data A = A1 X | A2 Y
440         data B = B1 P | B2 Q
441 Then we don't want to load T and all its constructors, and all
442 the types those constructors refer to, and all the types *those*
443 constructors refer to, and so on.  That might mean loading many more
444 interface files than is really necessary.  So we 'defer' loading T.
445
446 But f might be strict, and the calling convention for evaluating
447 values of type T depends on how many constructors T has, so 
448 we do need to load T, but not the full details of the type T.
449 So we load the full decl for T, but only skeleton decls for A and B:
450         f :: T -> Int
451         data T = {- 2 constructors -}
452
453 Whether all this is worth it is moot.
454
455 \begin{code}
456 slurpDeferredDecls :: [RenamedHsDecl] -> RnMG [RenamedHsDecl]
457 slurpDeferredDecls decls = returnRn decls
458
459 {-      OMIT FOR NOW
460 slurpDeferredDecls :: [RenamedHsDecl] -> RnMG [RenamedHsDecl]
461 slurpDeferredDecls decls
462   = getDeferredDecls                                            `thenRn` \ def_decls ->
463     rnIfaceDecls decls emptyFVs (map stripDecl def_decls)       `thenRn` \ (decls1, fvs) ->
464     ASSERT( isEmptyFVs fvs )
465     returnRn decls1
466
467 stripDecl (mod, TyClD (TyData dt _ tc tvs _ nconstrs _ _ loc name1 name2))
468   = (mod, TyClD (TyData dt [] tc tvs [] nconstrs Nothing NoDataPragmas loc
469                 name1 name2))
470         -- Nuke the context and constructors
471         -- But retain the *number* of constructors!
472         -- Also the tvs will have kinds on them.
473 -}
474 \end{code}
475
476
477 %*********************************************************
478 %*                                                       *
479 \subsection{Extracting the `gates'}
480 %*                                                       *
481 %*********************************************************
482
483 When we import a declaration like
484 \begin{verbatim}
485         data T = T1 Wibble | T2 Wobble
486 \end{verbatim}
487 we don't want to treat @Wibble@ and @Wobble@ as gates
488 {\em unless} @T1@, @T2@ respectively are mentioned by the user program.
489 If only @T@ is mentioned
490 we want only @T@ to be a gate;
491 that way we don't suck in useless instance
492 decls for (say) @Eq Wibble@, when they can't possibly be useful.
493
494 @getGates@ takes a newly imported (and renamed) decl, and the free
495 vars of the source program, and extracts from the decl the gate names.
496
497 \begin{code}
498 getGates source_fvs (SigD (IfaceSig _ ty _ _))
499   = extractHsTyNames ty
500
501 getGates source_fvs (TyClD (ClassDecl ctxt cls tvs _ sigs _ _ _ _ ))
502   = (delListFromNameSet (foldr (plusFV . get) (extractHsCtxtTyNames ctxt) sigs)
503                         (hsTyVarNames tvs)
504      `addOneToNameSet` cls)
505     `plusFV` maybe_double
506   where
507     get (ClassOpSig n _ ty _) 
508         | n `elemNameSet` source_fvs = extractHsTyNames ty
509         | otherwise                  = emptyFVs
510
511         -- If we load any numeric class that doesn't have
512         -- Int as an instance, add Double to the gates. 
513         -- This takes account of the fact that Double might be needed for
514         -- defaulting, but we don't want to load Double (and all its baggage)
515         -- if the more exotic classes aren't used at all.
516     maybe_double | nameUnique cls `elem` fractionalClassKeys 
517                  = unitFV (getName doubleTyCon)
518                  | otherwise
519                  = emptyFVs
520
521 getGates source_fvs (TyClD (TySynonym tycon tvs ty _))
522   = delListFromNameSet (extractHsTyNames ty)
523                        (hsTyVarNames tvs)
524         -- A type synonym type constructor isn't a "gate" for instance decls
525
526 getGates source_fvs (TyClD (TyData _ ctxt tycon tvs cons _ _ _ _ _ _))
527   = delListFromNameSet (foldr (plusFV . get) (extractHsCtxtTyNames ctxt) cons)
528                        (hsTyVarNames tvs)
529     `addOneToNameSet` tycon
530   where
531     get (ConDecl n _ tvs ctxt details _)
532         | n `elemNameSet` source_fvs
533                 -- If the constructor is method, get fvs from all its fields
534         = delListFromNameSet (get_details details `plusFV` 
535                               extractHsCtxtTyNames ctxt)
536                              (hsTyVarNames tvs)
537     get (ConDecl n _ tvs ctxt (RecCon fields) _)
538                 -- Even if the constructor isn't mentioned, the fields
539                 -- might be, as selectors.  They can't mention existentially
540                 -- bound tyvars (typechecker checks for that) so no need for 
541                 -- the deleteListFromNameSet part
542         = foldr (plusFV . get_field) emptyFVs fields
543         
544     get other_con = emptyFVs
545
546     get_details (VanillaCon tys) = plusFVs (map get_bang tys)
547     get_details (InfixCon t1 t2) = get_bang t1 `plusFV` get_bang t2
548     get_details (RecCon fields)  = plusFVs [get_bang t | (_, t) <- fields]
549
550     get_field (fs,t) | any (`elemNameSet` source_fvs) fs = get_bang t
551                      | otherwise                         = emptyFVs
552
553     get_bang bty = extractHsTyNames (getBangType bty)
554
555 getGates source_fvs other_decl = emptyFVs
556 \end{code}
557
558 @getWiredInGates@ is just like @getGates@, but it sees a wired-in @Name@
559 rather than a declaration.
560
561 \begin{code}
562 getWiredInGates :: Name -> FreeVars
563 getWiredInGates name    -- No classes are wired in
564   = case lookupNameEnv wiredInThingEnv name of
565         Just (AnId the_id) -> getWiredInGates_s (namesOfType (idType the_id))
566
567         Just (ATyCon tc)
568           |  isSynTyCon tc
569           -> getWiredInGates_s (delListFromNameSet (namesOfType ty) (map getName tyvars))
570           where
571              (tyvars,ty)  = getSynTyConDefn tc
572
573         other -> unitFV name
574
575 getWiredInGates_s names = foldr (plusFV . getWiredInGates) emptyFVs (nameSetToList names)
576 \end{code}
577
578 \begin{code}
579 getInstDeclGates (InstD (InstDecl inst_ty _ _ _ _)) = extractHsTyNames inst_ty
580 getInstDeclGates other                              = emptyFVs
581 \end{code}
582
583
584 %*********************************************************
585 %*                                                       *
586 \subsection{Fixities}
587 %*                                                       *
588 %*********************************************************
589
590 \begin{code}
591 fixitiesFromLocalDecls :: GlobalRdrEnv -> [RdrNameHsDecl] -> RnMG LocalFixityEnv
592 fixitiesFromLocalDecls gbl_env decls
593   = doptRn Opt_WarnUnusedBinds                            `thenRn` \ warn_unused ->
594     foldlRn (getFixities warn_unused) emptyNameEnv decls  `thenRn` \ env -> 
595     traceRn (text "fixity env" <+> vcat (map ppr (nameEnvElts env)))
596                                                           `thenRn_`
597     returnRn env
598   where
599     getFixities :: Bool -> LocalFixityEnv -> RdrNameHsDecl -> RnMG LocalFixityEnv
600     getFixities warn_uu acc (FixD fix)
601       = fix_decl warn_uu acc fix
602
603     getFixities warn_uu acc (TyClD (ClassDecl _ _ _ _ sigs _ _ _ _ ))
604       = foldlRn (fix_decl warn_uu) acc [sig | FixSig sig <- sigs]
605                 -- Get fixities from class decl sigs too.
606     getFixities warn_uu acc other_decl
607       = returnRn acc
608
609     fix_decl warn_uu acc sig@(FixitySig rdr_name fixity loc)
610         =       -- Check for fixity decl for something not declared
611           case lookupRdrEnv gbl_env rdr_name of {
612             Nothing | warn_uu
613                     -> pushSrcLocRn loc (addWarnRn (unusedFixityDecl rdr_name fixity))
614                        `thenRn_` returnRn acc 
615                     | otherwise -> returnRn acc ;
616         
617             Just ((name,_):_) ->
618
619                 -- Check for duplicate fixity decl
620           case lookupNameEnv acc name of {
621             Just (FixitySig _ _ loc') -> addErrRn (dupFixityDecl rdr_name loc loc')
622                                          `thenRn_` returnRn acc ;
623
624             Nothing -> returnRn (extendNameEnv acc name (FixitySig name fixity loc))
625           }}
626 \end{code}
627
628
629 %*********************************************************
630 %*                                                       *
631 \subsection{Deprecations}
632 %*                                                       *
633 %*********************************************************
634
635 For deprecations, all we do is check that the names are in scope.
636 It's only imported deprecations, dealt with in RnIfaces, that we
637 gather them together.
638
639 \begin{code}
640 rnDeprecs :: GlobalRdrEnv -> Maybe DeprecTxt
641            -> [RdrNameHsDecl] -> RnMG [RdrNameDeprecation]
642 rnDeprecs gbl_env mod_deprec decls
643  = mapRn rn_deprec deprecs      `thenRn_` 
644    returnRn (extra_deprec ++ deprecs)
645  where
646    deprecs = [d | DeprecD d <- decls]
647    extra_deprec = case mod_deprec of
648                    Nothing  -> []
649                    Just txt -> [Deprecation (IEModuleContents undefined) txt noSrcLoc]
650
651    rn_deprec (Deprecation ie txt loc)
652      = pushSrcLocRn loc         $
653        mapRn check (ieNames ie)
654
655    check n = case lookupRdrEnv gbl_env n of
656                 Nothing -> addErrRn (unknownNameErr n)
657                 Just _  -> returnRn ()
658 \end{code}
659
660
661 %*********************************************************
662 %*                                                       *
663 \subsection{Unused names}
664 %*                                                       *
665 %*********************************************************
666
667 \begin{code}
668 reportUnusedNames :: ModuleName -> [ModuleName] 
669                   -> GlobalRdrEnv -> AvailEnv
670                   -> Avails -> NameSet -> [RenamedHsDecl] 
671                   -> RnMG ()
672 reportUnusedNames mod_name direct_import_mods 
673                   gbl_env avail_env 
674                   export_avails mentioned_names
675                   imported_decls
676   = warnUnusedModules unused_imp_mods                           `thenRn_`
677     warnUnusedLocalBinds bad_locals                             `thenRn_`
678     warnUnusedImports bad_imp_names                             `thenRn_`
679     printMinimalImports mod_name minimal_imports                `thenRn_`
680     warnDeprecations really_used_names                          `thenRn_`
681     returnRn ()
682
683   where
684     used_names = mentioned_names `unionNameSets` availsToNameSet export_avails
685     
686     -- Now, a use of C implies a use of T,
687     -- if C was brought into scope by T(..) or T(C)
688     really_used_names = used_names `unionNameSets`
689       mkNameSet [ parent_name
690                 | sub_name <- nameSetToList used_names
691     
692                 -- Usually, every used name will appear in avail_env, but there 
693                 -- is one time when it doesn't: tuples and other built in syntax.  When you
694                 -- write (a,b) that gives rise to a *use* of "(,)", so that the
695                 -- instances will get pulled in, but the tycon "(,)" isn't actually
696                 -- in scope.  Also, (-x) gives rise to an implicit use of 'negate'; 
697                 -- similarly,   3.5 gives rise to an implcit use of :%
698                 -- Hence the silent 'False' in all other cases
699               
700                 , Just parent_name <- [case lookupNameEnv avail_env sub_name of
701                                         Just (AvailTC n _) -> Just n
702                                         other              -> Nothing]
703             ]
704     
705     defined_names, defined_and_used, defined_but_not_used :: [(Name,Provenance)]
706     defined_names                            = concat (rdrEnvElts gbl_env)
707     (defined_and_used, defined_but_not_used) = partition used defined_names
708     used (name,_)                            = not (name `elemNameSet` really_used_names)
709     
710     -- Filter out the ones only defined implicitly
711     bad_locals :: [Name]
712     bad_locals     = [n     | (n,LocalDef) <- defined_but_not_used]
713     
714     bad_imp_names :: [(Name,Provenance)]
715     bad_imp_names  = [(n,p) | (n,p@(NonLocalDef (UserImport mod _ True) _)) <- defined_but_not_used,
716                               not (module_unused mod)]
717     
718     -- inst_mods are directly-imported modules that 
719     --  contain instance decl(s) that the renamer decided to suck in
720     -- It's not necessarily redundant to import such modules.
721     --
722     -- NOTE: Consider 
723     --        module This
724     --          import M ()
725     --
726     --   The import M() is not *necessarily* redundant, even if
727     --   we suck in no instance decls from M (e.g. it contains 
728     --   no instance decls, or This contains no code).  It may be 
729     --   that we import M solely to ensure that M's orphan instance 
730     --   decls (or those in its imports) are visible to people who 
731     --   import This.  Sigh. 
732     --   There's really no good way to detect this, so the error message 
733     --   in RnEnv.warnUnusedModules is weakened instead
734     inst_mods :: [ModuleName]
735     inst_mods = [m | InstD (InstDecl _ _ _ (Just dfun) _) <- imported_decls,
736                  let m = moduleName (nameModule dfun),
737                  m `elem` direct_import_mods
738             ]
739     
740     -- To figure out the minimal set of imports, start with the things
741     -- that are in scope (i.e. in gbl_env).  Then just combine them
742     -- into a bunch of avails, so they are properly grouped
743     minimal_imports :: FiniteMap ModuleName AvailEnv
744     minimal_imports0 = emptyFM
745     minimal_imports1 = foldr add_name     minimal_imports0 defined_and_used
746     minimal_imports  = foldr add_inst_mod minimal_imports1 inst_mods
747     
748     add_name (n,NonLocalDef (UserImport m _ _) _) acc = addToFM_C plusAvailEnv acc (moduleName (nameModule n))
749                                                                   (unitAvailEnv (mk_avail n))
750     add_name (n,other_prov)                       acc = acc
751
752     mk_avail n = case lookupNameEnv avail_env n of
753                 Just (AvailTC m _) | n==m      -> AvailTC n [n]
754                                    | otherwise -> AvailTC m [n,m]
755                 Just avail         -> Avail n
756                 Nothing            -> pprPanic "mk_avail" (ppr n)
757     
758     add_inst_mod m acc 
759       | m `elemFM` acc = acc    -- We import something already
760       | otherwise      = addToFM acc m emptyAvailEnv
761         -- Add an empty collection of imports for a module
762         -- from which we have sucked only instance decls
763     
764     -- unused_imp_mods are the directly-imported modules 
765     -- that are not mentioned in minimal_imports
766     unused_imp_mods = [m | m <- direct_import_mods,
767                        not (maybeToBool (lookupFM minimal_imports m)),
768                        m /= pRELUDE_Name]
769     
770     module_unused :: Module -> Bool
771     module_unused mod = moduleName mod `elem` unused_imp_mods
772
773
774 warnDeprecations used_names
775   = doptRn Opt_WarnDeprecations                         `thenRn` \ warn_drs ->
776     if not warn_drs then returnRn () else
777
778     getIfacesRn                                         `thenRn` \ ifaces ->
779     getHomeIfaceTableRn                                 `thenRn` \ hit ->
780     let
781         pit     = iPIT ifaces
782         deprecs = [ (n,txt)
783                   | n <- nameSetToList used_names,
784                     Just txt <- [lookup_deprec hit pit n] ]
785     in                    
786     mapRn_ warnDeprec deprecs
787
788   where
789     lookup_deprec hit pit n
790         = case lookupModuleEnv hit mod of
791                 Just iface -> lookupDeprec iface n
792                 Nothing    -> case lookupModuleEnv pit mod of
793                                 Just iface -> lookupDeprec iface n
794                                 Nothing    -> pprPanic "warnDeprecations:" (ppr n)
795         where
796           mod = nameModule n
797
798 -- ToDo: deal with original imports with 'qualified' and 'as M' clauses
799 printMinimalImports mod_name imps
800   = doptRn Opt_D_dump_minimal_imports           `thenRn` \ dump_minimal ->
801     if not dump_minimal then returnRn () else
802
803     mapRn to_ies (fmToList imps)                `thenRn` \ mod_ies ->
804     ioToRnM (do { h <- openFile filename WriteMode ;
805                   printForUser h (vcat (map ppr_mod_ie mod_ies))
806         })                                      `thenRn_`
807     returnRn ()
808   where
809     filename = moduleNameUserString mod_name ++ ".imports"
810     ppr_mod_ie (mod_name, ies) 
811         | mod_name == pRELUDE_Name 
812         = empty
813         | otherwise
814         = ptext SLIT("import") <+> ppr mod_name <> 
815                             parens (fsep (punctuate comma (map ppr ies)))
816
817     to_ies (mod, avail_env) = mapRn to_ie (availEnvElts avail_env)      `thenRn` \ ies ->
818                               returnRn (mod, ies)
819
820     to_ie :: AvailInfo -> RnMG (IE Name)
821     to_ie (Avail n)       = returnRn (IEVar n)
822     to_ie (AvailTC n [m]) = ASSERT( n==m ) 
823                             returnRn (IEThingAbs n)
824     to_ie (AvailTC n ns)  = getInterfaceExports (moduleName (nameModule n)) 
825                                                 ImportBySystem          `thenRn` \ (_, avails) ->
826                             case [ms | AvailTC m ms <- avails, m == n] of
827                               [ms] | all (`elem` ns) ms -> returnRn (IEThingAll n)
828                                    | otherwise          -> returnRn (IEThingWith n (filter (/= n) ns))
829                               other -> pprTrace "to_ie" (ppr n <+> ppr (nameModule n) <+> ppr other) $
830                                        returnRn (IEVar n)
831
832 rnDump  :: [RenamedHsDecl]      -- Renamed imported decls
833         -> [RenamedHsDecl]      -- Renamed local decls
834         -> RnMG (IO ())
835 rnDump imp_decls local_decls
836    = doptRn Opt_D_dump_rn_trace         `thenRn` \ dump_rn_trace ->
837      doptRn Opt_D_dump_rn_stats         `thenRn` \ dump_rn_stats ->
838      doptRn Opt_D_dump_rn               `thenRn` \ dump_rn ->
839      if dump_rn_trace || dump_rn_stats || dump_rn then
840         getRnStats imp_decls            `thenRn` \ stats_msg ->
841         returnRn (printErrs stats_msg >> 
842                   dumpIfSet dump_rn "Renamer:" 
843                             (vcat (map ppr (local_decls ++ imp_decls))))
844      else
845         returnRn (return ())
846 \end{code}
847
848
849 %*********************************************************
850 %*                                                      *
851 \subsection{Statistics}
852 %*                                                      *
853 %*********************************************************
854
855 \begin{code}
856 getRnStats :: [RenamedHsDecl] -> RnMG SDoc
857 getRnStats imported_decls
858   = getIfacesRn                 `thenRn` \ ifaces ->
859     let
860         n_mods = length [() | (_, _, True) <- eltsFM (iImpModInfo ifaces)]
861
862         decls_read     = [decl | (avail, True, (_,decl)) <- nameEnvElts (iDecls ifaces),
863                                 -- Data, newtype, and class decls are in the decls_fm
864                                 -- under multiple names; the tycon/class, and each
865                                 -- constructor/class op too.
866                                 -- The 'True' selects just the 'main' decl
867                                  not (isLocallyDefined (availName avail))
868                              ]
869
870         (cd_rd, dd_rd, nd_rd, sd_rd, vd_rd,     _) = count_decls decls_read
871         (cd_sp, dd_sp, nd_sp, sd_sp, vd_sp, id_sp) = count_decls imported_decls
872
873         unslurped_insts       = iInsts ifaces
874         inst_decls_unslurped  = length (bagToList unslurped_insts)
875         inst_decls_read       = id_sp + inst_decls_unslurped
876
877         stats = vcat 
878                 [int n_mods <+> text "interfaces read",
879                  hsep [ int cd_sp, text "class decls imported, out of", 
880                         int cd_rd, text "read"],
881                  hsep [ int dd_sp, text "data decls imported, out of",  
882                         int dd_rd, text "read"],
883                  hsep [ int nd_sp, text "newtype decls imported, out of",  
884                         int nd_rd, text "read"],
885                  hsep [int sd_sp, text "type synonym decls imported, out of",  
886                         int sd_rd, text "read"],
887                  hsep [int vd_sp, text "value signatures imported, out of",  
888                         int vd_rd, text "read"],
889                  hsep [int id_sp, text "instance decls imported, out of",  
890                         int inst_decls_read, text "read"],
891                  text "cls dcls slurp" <+> fsep (map (ppr . tyClDeclName) 
892                                            [d | TyClD d <- imported_decls, isClassDecl d]),
893                  text "cls dcls read"  <+> fsep (map (ppr . tyClDeclName) 
894                                            [d | TyClD d <- decls_read, isClassDecl d])]
895     in
896     returnRn (hcat [text "Renamer stats: ", stats])
897
898 count_decls decls
899   = (class_decls, 
900      data_decls, 
901      newtype_decls,
902      syn_decls, 
903      val_decls, 
904      inst_decls)
905   where
906     tycl_decls = [d | TyClD d <- decls]
907     (class_decls, data_decls, newtype_decls, syn_decls) = countTyClDecls tycl_decls
908
909     val_decls     = length [() | SigD _   <- decls]
910     inst_decls    = length [() | InstD _  <- decls]
911 \end{code}    
912
913
914 %************************************************************************
915 %*                                                                      *
916 \subsection{Errors and warnings}
917 %*                                                                      *
918 %************************************************************************
919
920 \begin{code}
921 warnDeprec :: (Name, DeprecTxt) -> RnM d ()
922 warnDeprec (name, txt)
923   = pushSrcLocRn (getSrcLoc name)       $
924     addWarnRn                           $
925     sep [ text (occNameFlavour (nameOccName name)) <+> ppr name <+>
926           text "is deprecated:", nest 4 (ppr txt) ]
927
928
929 unusedFixityDecl rdr_name fixity
930   = hsep [ptext SLIT("Unused fixity declaration for"), quotes (ppr rdr_name)]
931
932 dupFixityDecl rdr_name loc1 loc2
933   = vcat [ptext SLIT("Multiple fixity declarations for") <+> quotes (ppr rdr_name),
934           ptext SLIT("at ") <+> ppr loc1,
935           ptext SLIT("and") <+> ppr loc2]
936 \end{code}
937
938
939 %********************************************************
940 %*                                                      *
941 \subsection{Checking usage information}
942 %*                                                      *
943 %********************************************************
944
945 \begin{code}
946 {-
947 checkEarlyExit mod_name
948   = traceRn (text "Considering whether compilation is required...")     `thenRn_`
949
950         -- Read the old interface file, if any, for the module being compiled
951     findAndReadIface doc_str mod_name False {- Not hi-boot -}   `thenRn` \ maybe_iface ->
952
953         -- CHECK WHETHER WE HAVE IT ALREADY
954     case maybe_iface of
955         Left err ->     -- Old interface file not found, so we'd better bail out
956                     traceRn (vcat [ptext SLIT("No old interface file for") <+> ppr mod_name,
957                                    err])                        `thenRn_`
958                     returnRn (outOfDate, Nothing)
959
960         Right iface
961           | panic "checkEarlyExit: ???: not opt_SourceUnchanged"
962           ->    -- Source code changed
963              traceRn (nest 4 (text "source file changed or recompilation check turned off"))    `thenRn_` 
964              returnRn (False, Just iface)
965
966           | otherwise
967           ->    -- Source code unchanged and no errors yet... carry on 
968              checkModUsage (pi_usages iface)    `thenRn` \ up_to_date ->
969              returnRn (up_to_date, Just iface)
970   where
971         -- Only look in current directory, with suffix .hi
972     doc_str = sep [ptext SLIT("need usage info from"), ppr mod_name]
973 \end{code}
974         
975 \begin{code}
976 upToDate  = True
977 outOfDate = False
978
979 checkModUsage :: [ImportVersion OccName] -> RnMG Bool
980 -- Given the usage information extracted from the old
981 -- M.hi file for the module being compiled, figure out
982 -- whether M needs to be recompiled.
983
984 checkModUsage [] = returnRn upToDate            -- Yes!  Everything is up to date!
985
986 checkModUsage ((mod_name, _, _, NothingAtAll) : rest)
987         -- If CurrentModule.hi contains 
988         --      import Foo :: ;
989         -- then that simply records that Foo lies below CurrentModule in the
990         -- hierarchy, but CurrentModule doesn't depend in any way on Foo.
991         -- In this case we don't even want to open Foo's interface.
992   = traceRn (ptext SLIT("Nothing used from:") <+> ppr mod_name) `thenRn_`
993     checkModUsage rest  -- This one's ok, so check the rest
994
995 checkModUsage ((mod_name, _, _, whats_imported)  : rest)
996   = tryLoadInterface doc_str mod_name ImportBySystem    `thenRn` \ (ifaces, maybe_err) ->
997     case maybe_err of {
998         Just err -> out_of_date (sep [ptext SLIT("Can't find version number for module"), 
999                                       ppr mod_name]) ;
1000                 -- Couldn't find or parse a module mentioned in the
1001                 -- old interface file.  Don't complain -- it might just be that
1002                 -- the current module doesn't need that import and it's been deleted
1003
1004         Nothing -> 
1005     let
1006         (_, new_mod_vers, new_fix_vers, new_rule_vers, _, _) 
1007                 = case lookupFM (iImpModInfo ifaces) mod_name of
1008                            Just (_, _, Just stuff) -> stuff
1009
1010         old_mod_vers = case whats_imported of
1011                          Everything v        -> v
1012                          Specifically v _ _ _ -> v
1013                          -- NothingAtAll case dealt with by previous eqn for checkModUsage
1014     in
1015         -- If the module version hasn't changed, just move on
1016     if new_mod_vers == old_mod_vers then
1017         traceRn (sep [ptext SLIT("Module version unchanged:"), ppr mod_name])
1018         `thenRn_` checkModUsage rest
1019     else
1020     traceRn (sep [ptext SLIT("Module version has changed:"), ppr mod_name])
1021     `thenRn_`
1022         -- Module version changed, so check entities inside
1023
1024         -- If the usage info wants to say "I imported everything from this module"
1025         --     it does so by making whats_imported equal to Everything
1026         -- In that case, we must recompile
1027     case whats_imported of {    -- NothingAtAll dealt with earlier
1028         
1029       Everything _ 
1030         -> out_of_date (ptext SLIT("...and I needed the whole module")) ;
1031
1032       Specifically _ old_fix_vers old_rule_vers old_local_vers ->
1033
1034     if old_fix_vers /= new_fix_vers then
1035         out_of_date (ptext SLIT("Fixities changed"))
1036     else if old_rule_vers /= new_rule_vers then
1037         out_of_date (ptext SLIT("Rules changed"))
1038     else        
1039         -- Non-empty usage list, so check item by item
1040     checkEntityUsage mod_name (iDecls ifaces) old_local_vers    `thenRn` \ up_to_date ->
1041     if up_to_date then
1042         traceRn (ptext SLIT("...but the bits I use haven't."))  `thenRn_`
1043         checkModUsage rest      -- This one's ok, so check the rest
1044     else
1045         returnRn outOfDate      -- This one failed, so just bail out now
1046     }}
1047   where
1048     doc_str = sep [ptext SLIT("need version info for"), ppr mod_name]
1049
1050
1051 checkEntityUsage mod decls [] 
1052   = returnRn upToDate   -- Yes!  All up to date!
1053
1054 checkEntityUsage mod decls ((occ_name,old_vers) : rest)
1055   = newGlobalName mod occ_name  `thenRn` \ name ->
1056     case lookupNameEnv decls name of
1057
1058         Nothing       ->        -- We used it before, but it ain't there now
1059                           out_of_date (sep [ptext SLIT("No longer exported:"), ppr name])
1060
1061         Just (new_vers,_,_,_)   -- It's there, but is it up to date?
1062                 | new_vers == old_vers
1063                         -- Up to date, so check the rest
1064                 -> checkEntityUsage mod decls rest
1065
1066                 | otherwise
1067                         -- Out of date, so bale out
1068                 -> out_of_date (sep [ptext SLIT("Out of date:"), ppr name])
1069
1070 out_of_date msg = traceRn msg `thenRn_` returnRn outOfDate
1071 -}
1072 \end{code}
1073
1074