[project @ 2000-11-22 11:18:40 by simonmar]
[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, renameExpr, closeIfaceDecls, checkOldIface ) where
8
9 #include "HsVersions.h"
10
11 import HsSyn
12 import RdrHsSyn         ( RdrNameHsModule, RdrNameHsDecl, RdrNameDeprecation, RdrNameHsExpr,
13                           RdrNameTyClDecl, RdrNameRuleDecl, RdrNameInstDecl, RdrNameImportDecl
14                         )
15 import RnHsSyn          ( RenamedHsDecl, RenamedTyClDecl, RenamedRuleDecl, RenamedInstDecl,
16                           extractHsTyNames, RenamedHsExpr,
17                           instDeclFVs, tyClDeclFVs, ruleDeclFVs
18                         )
19
20 import CmdLineOpts      ( DynFlags, DynFlag(..) )
21 import RnMonad
22 import RnExpr           ( rnExpr )
23 import RnNames          ( getGlobalNames, exportsFromAvail )
24 import RnSource         ( rnSourceDecls, rnTyClDecl, rnIfaceRuleDecl, rnInstDecl )
25 import RnIfaces         ( slurpImpDecls, mkImportInfo, recordLocalSlurps,
26                           getInterfaceExports, closeDecls,
27                           RecompileRequired, outOfDate, recompileRequired
28                         )
29 import RnHiFiles        ( readIface, removeContext, loadInterface,
30                           loadExports, loadFixDecls, loadDeprecs,
31                           tryLoadInterface )
32 import RnEnv            ( availsToNameSet, availName, mkIfaceGlobalRdrEnv,
33                           emptyAvailEnv, unitAvailEnv, availEnvElts, 
34                           plusAvailEnv, groupAvails, warnUnusedImports, 
35                           warnUnusedLocalBinds, warnUnusedModules, 
36                           lookupOrigNames, lookupSrcName, 
37                           newGlobalName, unQualInScope
38                         )
39 import Module           ( Module, ModuleName, WhereFrom(..),
40                           moduleNameUserString, moduleName,
41                           moduleEnvElts, lookupModuleEnv
42                         )
43 import Name             ( Name, NamedThing(..), getSrcLoc,
44                           nameIsLocalOrFrom, nameOccName, nameModule,
45                         )
46 import Name             ( mkNameEnv, nameEnvElts, extendNameEnv )
47 import RdrName          ( elemRdrEnv, foldRdrEnv, isQual )
48 import OccName          ( occNameFlavour )
49 import NameSet
50 import TysWiredIn       ( unitTyCon, intTyCon, boolTyCon )
51 import PrelNames        ( mAIN_Name, pREL_MAIN_Name, pRELUDE_Name,
52                           ioTyCon_RDR, main_RDR_Unqual,
53                           unpackCString_RDR, unpackCStringFoldr_RDR, unpackCStringUtf8_RDR,
54                           eqString_RDR
55                         )
56 import PrelInfo         ( derivingOccurrences )
57 import Type             ( funTyCon )
58 import ErrUtils         ( dumpIfSet, dumpIfSet_dyn, showPass, 
59                           printErrorsAndWarnings, errorsFound )
60 import Bag              ( bagToList )
61 import FiniteMap        ( FiniteMap, fmToList, emptyFM, lookupFM, 
62                           addToFM_C, elemFM, addToFM
63                         )
64 import UniqFM           ( lookupUFM )
65 import Maybes           ( maybeToBool, catMaybes )
66 import Outputable
67 import IO               ( openFile, IOMode(..) )
68 import HscTypes         ( PersistentCompilerState, HomeIfaceTable, HomeSymbolTable, 
69                           ModIface(..), WhatsImported(..), 
70                           VersionInfo(..), ImportVersion, IsExported,
71                           IfaceDecls, mkIfaceDecls, dcl_tycl, dcl_rules, dcl_insts,
72                           GlobalRdrEnv, pprGlobalRdrEnv,
73                           AvailEnv, GenAvailInfo(..), AvailInfo, Avails,
74                           Provenance(..), ImportReason(..), initialVersionInfo,
75                           Deprecations(..), lookupDeprec, lookupIface
76                          )
77 import List             ( partition, nub )
78 \end{code}
79
80
81
82
83 %*********************************************************
84 %*                                                       *
85 \subsection{The two main wrappers}
86 %*                                                       *
87 %*********************************************************
88
89 \begin{code}
90 renameModule :: DynFlags
91              -> HomeIfaceTable -> HomeSymbolTable
92              -> PersistentCompilerState 
93              -> Module -> RdrNameHsModule 
94              -> IO (PersistentCompilerState, Maybe (PrintUnqualified, (IsExported, ModIface, [RenamedHsDecl])))
95         -- Nothing => some error occurred in the renamer
96
97 renameModule dflags hit hst pcs this_module rdr_module
98   = renameSource dflags hit hst pcs this_module $
99     rename this_module rdr_module
100 \end{code}
101
102
103 \begin{code}
104 renameExpr :: DynFlags
105            -> HomeIfaceTable -> HomeSymbolTable
106            -> PersistentCompilerState 
107            -> Module -> RdrNameHsExpr
108            -> IO ( PersistentCompilerState, 
109                    Maybe (PrintUnqualified, (RenamedHsExpr, [RenamedHsDecl]))
110                  )
111
112 renameExpr dflags hit hst pcs this_module expr
113   = do  { renameSource dflags hit hst pcs this_module $
114           tryLoadInterface doc (moduleName this_module) ImportByUser 
115                                                 `thenRn` \ (iface, maybe_err) ->
116           case maybe_err of {
117             Just msg -> ioToRnM (printErrs alwaysQualify 
118                                  (ptext SLIT("failed to load interface for") 
119                                   <+> quotes (ppr this_module) 
120                                   <>  char ':' <+> msg)) `thenRn_`
121                         returnRn Nothing;
122             Nothing -> 
123
124           let rdr_env      = mi_globals iface
125               print_unqual = unQualInScope rdr_env
126           in 
127  
128           initRnMS rdr_env emptyLocalFixityEnv SourceMode (rnExpr expr) 
129                                                 `thenRn` \ (e,fvs) -> 
130
131           checkErrsRn                           `thenRn` \ no_errs_so_far ->
132           if not no_errs_so_far then
133                 -- Found errors already, so exit now
134                 doDump e [] `thenRn_` 
135                 returnRn Nothing
136           else
137
138           lookupOrigNames implicit_occs         `thenRn` \ implicit_names ->
139           slurpImpDecls (fvs `plusFV` implicit_names) `thenRn` \ decls ->
140
141           doDump e decls  `thenRn_`
142           returnRn (Just (print_unqual, (e, decls)))
143         }}
144   where
145      implicit_occs = string_occs
146      doc = text "context for compiling expression"
147
148      doDump :: RenamedHsExpr -> [RenamedHsDecl] -> RnMG (Either IOError ())
149      doDump e decls = 
150         getDOptsRn  `thenRn` \ dflags ->
151         ioToRnM (dumpIfSet_dyn dflags Opt_D_dump_rn "Renamer:" 
152                         (vcat (ppr e : map ppr decls)))
153 \end{code}
154
155
156 %*********************************************************
157 %*                                                       *
158 \subsection{The main function: rename}
159 %*                                                       *
160 %*********************************************************
161
162 \begin{code}
163 renameSource :: DynFlags
164              -> HomeIfaceTable -> HomeSymbolTable
165              -> PersistentCompilerState 
166              -> Module 
167              -> RnMG (Maybe (PrintUnqualified, r))
168              -> IO (PersistentCompilerState, Maybe (PrintUnqualified, r))
169         -- Nothing => some error occurred in the renamer
170
171 renameSource dflags hit hst old_pcs this_module thing_inside
172   = do  { showPass dflags "Renamer"
173
174                 -- Initialise the renamer monad
175         ; (new_pcs, msgs, maybe_rn_stuff) <- initRn dflags hit hst old_pcs this_module thing_inside
176
177                 -- Print errors from renaming
178         ;  let print_unqual = case maybe_rn_stuff of
179                                 Just (unqual, _) -> unqual
180                                 Nothing          -> alwaysQualify
181
182         ;  printErrorsAndWarnings print_unqual msgs ;
183
184                 -- Return results.  No harm in updating the PCS
185         ; if errorsFound msgs then
186             return (new_pcs, Nothing)
187           else      
188             return (new_pcs, maybe_rn_stuff)
189     }
190 \end{code}
191
192 \begin{code}
193 rename :: Module -> RdrNameHsModule -> RnMG (Maybe (PrintUnqualified, (IsExported, ModIface, [RenamedHsDecl])))
194 rename this_module contents@(HsModule _ _ exports imports local_decls mod_deprec loc)
195   = pushSrcLocRn loc            $
196
197         -- FIND THE GLOBAL NAME ENVIRONMENT
198     getGlobalNames this_module contents         `thenRn` \ (gbl_env, local_gbl_env, all_avails@(_, global_avail_env)) ->
199
200         -- Exit if we've found any errors
201     checkErrsRn                         `thenRn` \ no_errs_so_far ->
202     if not no_errs_so_far then
203         -- Found errors already, so exit now
204         rnDump [] []            `thenRn_`
205         returnRn Nothing 
206     else
207         
208         -- PROCESS EXPORT LIST 
209     exportsFromAvail mod_name exports all_avails gbl_env        `thenRn` \ export_avails ->
210         
211     traceRn (text "Local top-level environment" $$ 
212              nest 4 (pprGlobalRdrEnv local_gbl_env))    `thenRn_`
213
214         -- DEAL WITH DEPRECATIONS
215     rnDeprecs local_gbl_env mod_deprec 
216               [d | DeprecD d <- local_decls]            `thenRn` \ my_deprecs ->
217
218         -- DEAL WITH LOCAL FIXITIES
219     fixitiesFromLocalDecls local_gbl_env local_decls    `thenRn` \ local_fixity_env ->
220
221         -- RENAME THE SOURCE
222     rnSourceDecls gbl_env local_fixity_env local_decls  `thenRn` \ (rn_local_decls, source_fvs) ->
223
224         -- CHECK THAT main IS DEFINED, IF REQUIRED
225     checkMain this_module local_gbl_env         `thenRn_`
226
227         -- EXIT IF ERRORS FOUND
228         -- We exit here if there are any errors in the source, *before*
229         -- we attempt to slurp the decls from the interfaces, otherwise
230         -- the slurped decls may get lost when we return up the stack
231         -- to hscMain/hscExpr.
232     checkErrsRn                                 `thenRn` \ no_errs_so_far ->
233     if not no_errs_so_far then
234         -- Found errors already, so exit now
235         rnDump [] rn_local_decls                `thenRn_` 
236         returnRn Nothing
237     else
238
239         -- SLURP IN ALL THE NEEDED DECLARATIONS
240     implicitFVs mod_name rn_local_decls         `thenRn` \ implicit_fvs -> 
241     let
242         slurp_fvs = implicit_fvs `plusFV` source_fvs
243                 -- It's important to do the "plus" this way round, so that
244                 -- when compiling the prelude, locally-defined (), Bool, etc
245                 -- override the implicit ones. 
246     in
247     traceRn (text "Source FVs:" <+> fsep (map ppr (nameSetToList slurp_fvs)))   `thenRn_`
248     slurpImpDecls slurp_fvs             `thenRn` \ rn_imp_decls ->
249
250     rnDump rn_imp_decls rn_local_decls          `thenRn_` 
251
252         -- GENERATE THE VERSION/USAGE INFO
253     mkImportInfo mod_name imports                       `thenRn` \ my_usages ->
254
255         -- BUILD THE MODULE INTERFACE
256     let
257         -- We record fixities even for things that aren't exported,
258         -- so that we can change into the context of this moodule easily
259         fixities = mkNameEnv [ (name, fixity)
260                              | FixitySig name fixity loc <- nameEnvElts local_fixity_env
261                              ]
262
263         -- Sort the exports to make them easier to compare for versions
264         my_exports = groupAvails this_module export_avails
265         
266         final_decls = rn_local_decls ++ rn_imp_decls
267         is_orphan   = any (isOrphanDecl this_module) rn_local_decls
268
269         mod_iface = ModIface {  mi_module   = this_module,
270                                 mi_version  = initialVersionInfo,
271                                 mi_usages   = my_usages,
272                                 mi_boot     = False,
273                                 mi_orphan   = is_orphan,
274                                 mi_exports  = my_exports,
275                                 mi_globals  = gbl_env,
276                                 mi_fixities = fixities,
277                                 mi_deprecs  = my_deprecs,
278                                 mi_decls    = panic "mi_decls"
279                     }
280
281         print_unqualified = unQualInScope gbl_env
282         is_exported name  = name `elemNameSet` exported_names
283         exported_names    = availsToNameSet export_avails
284     in
285
286         -- REPORT UNUSED NAMES, AND DEBUG DUMP 
287     reportUnusedNames mod_iface print_unqualified 
288                       imports global_avail_env
289                       source_fvs export_avails rn_imp_decls     `thenRn_`
290
291     returnRn (Just (print_unqualified, (is_exported, mod_iface, final_decls)))
292   where
293     mod_name = moduleName this_module
294 \end{code}
295
296 Checking that main is defined
297
298 \begin{code}
299 checkMain :: Module -> GlobalRdrEnv -> RnMG ()
300 checkMain this_mod local_env
301   | moduleName this_mod == mAIN_Name 
302   = checkRn (main_RDR_Unqual `elemRdrEnv` local_env) noMainErr
303   | otherwise
304   = returnRn ()
305 \end{code}
306
307 @implicitFVs@ forces the renamer to slurp in some things which aren't
308 mentioned explicitly, but which might be needed by the type checker.
309
310 \begin{code}
311 implicitFVs mod_name decls
312   = lookupOrigNames implicit_occs                       `thenRn` \ implicit_names ->
313     returnRn (mkNameSet (map getName default_tycons)    `plusFV`
314               implicit_names)
315   where
316         -- Add occurrences for Int, and (), because they
317         -- are the types to which ambigious type variables may be defaulted by
318         -- the type checker; so they won't always appear explicitly.
319         -- [The () one is a GHC extension for defaulting CCall results.]
320         -- ALSO: funTyCon, since it occurs implicitly everywhere!
321         --       (we don't want to be bothered with making funTyCon a
322         --        free var at every function application!)
323         -- Double is dealt with separately in getGates
324     default_tycons = [unitTyCon, funTyCon, boolTyCon, intTyCon]
325
326         -- Add occurrences for IO or PrimIO
327     implicit_main |  mod_name == mAIN_Name
328                   || mod_name == pREL_MAIN_Name = [ioTyCon_RDR]
329                   |  otherwise                  = []
330
331         -- Now add extra "occurrences" for things that
332         -- the deriving mechanism, or defaulting, will later need in order to
333         -- generate code
334     implicit_occs = string_occs ++ foldr ((++) . get) implicit_main decls
335
336
337     get (TyClD (TyData _ _ _ _ _ _ (Just deriv_classes) _ _ _))
338        = concat (map get_deriv deriv_classes)
339     get other = []
340
341     get_deriv cls = case lookupUFM derivingOccurrences cls of
342                         Nothing   -> []
343                         Just occs -> occs
344
345 -- Virtually every program has error messages in it somewhere
346 string_occs = [unpackCString_RDR, unpackCStringFoldr_RDR, 
347                unpackCStringUtf8_RDR, eqString_RDR]
348 \end{code}
349
350 \begin{code}
351 isOrphanDecl this_mod (InstD (InstDecl inst_ty _ _ _ _))
352   = not (foldNameSet ((||) . nameIsLocalOrFrom this_mod) False 
353                      (extractHsTyNames (removeContext inst_ty)))
354         -- The 'removeContext' is because of
355         --      instance Foo a => Baz T where ...
356         -- The decl is an orphan if Baz and T are both not locally defined,
357         --      even if Foo *is* locally defined
358
359 isOrphanDecl this_mod (RuleD (HsRule _ _ _ lhs _ _))
360   = check lhs
361   where
362         -- At the moment we just check for common LHS forms
363         -- Expand as necessary.  Getting it wrong just means
364         -- more orphans than necessary
365     check (HsVar v)       = not (nameIsLocalOrFrom this_mod v)
366     check (HsApp f a)     = check f && check a
367     check (HsLit _)       = False
368     check (HsOverLit _)   = False
369     check (OpApp l o _ r) = check l && check o && check r
370     check (NegApp e _)    = check e
371     check (HsPar e)       = check e
372     check (SectionL e o)  = check e && check o
373     check (SectionR o e)  = check e && check o
374
375     check other           = True        -- Safe fall through
376
377 isOrphanDecl _ _  = False
378 \end{code}
379
380
381 %*********************************************************
382 %*                                                       *
383 \subsection{Fixities}
384 %*                                                       *
385 %*********************************************************
386
387 \begin{code}
388 fixitiesFromLocalDecls :: GlobalRdrEnv -> [RdrNameHsDecl] -> RnMG LocalFixityEnv
389 fixitiesFromLocalDecls gbl_env decls
390   = foldlRn getFixities emptyNameEnv decls                              `thenRn` \ env -> 
391     traceRn (text "fixity env" <+> vcat (map ppr (nameEnvElts env)))    `thenRn_`
392     returnRn env
393   where
394     getFixities :: LocalFixityEnv -> RdrNameHsDecl -> RnMG LocalFixityEnv
395     getFixities acc (FixD fix)
396       = fix_decl acc fix
397
398     getFixities acc (TyClD (ClassDecl _ _ _ _ sigs _ _ _ ))
399       = foldlRn fix_decl acc [sig | FixSig sig <- sigs]
400                 -- Get fixities from class decl sigs too.
401     getFixities acc other_decl
402       = returnRn acc
403
404     fix_decl acc sig@(FixitySig rdr_name fixity loc)
405         =       -- Check for fixity decl for something not declared
406           pushSrcLocRn loc                      $
407           lookupSrcName gbl_env rdr_name        `thenRn` \ name ->
408
409                 -- Check for duplicate fixity decl
410           case lookupNameEnv acc name of
411             Just (FixitySig _ _ loc') -> addErrRn (dupFixityDecl rdr_name loc loc')     `thenRn_`
412                                          returnRn acc ;
413
414             Nothing                   -> returnRn (extendNameEnv acc name (FixitySig name fixity loc))
415 \end{code}
416
417
418 %*********************************************************
419 %*                                                       *
420 \subsection{Deprecations}
421 %*                                                       *
422 %*********************************************************
423
424 For deprecations, all we do is check that the names are in scope.
425 It's only imported deprecations, dealt with in RnIfaces, that we
426 gather them together.
427
428 \begin{code}
429 rnDeprecs :: GlobalRdrEnv -> Maybe DeprecTxt
430            -> [RdrNameDeprecation] -> RnMG Deprecations
431 rnDeprecs gbl_env Nothing []
432  = returnRn NoDeprecs
433
434 rnDeprecs gbl_env (Just txt) decls
435  = mapRn (addErrRn . badDeprec) decls   `thenRn_` 
436    returnRn (DeprecAll txt)
437
438 rnDeprecs gbl_env Nothing decls
439   = mapRn rn_deprec decls       `thenRn` \ pairs ->
440     returnRn (DeprecSome (mkNameEnv (catMaybes pairs)))
441  where
442    rn_deprec (Deprecation rdr_name txt loc)
443      = pushSrcLocRn loc                         $
444        lookupSrcName gbl_env rdr_name           `thenRn` \ name ->
445        returnRn (Just (name, (name,txt)))
446 \end{code}
447
448
449 %************************************************************************
450 %*                                                                      *
451 \subsection{Grabbing the old interface file and checking versions}
452 %*                                                                      *
453 %************************************************************************
454
455 \begin{code}
456 checkOldIface :: DynFlags
457               -> HomeIfaceTable -> HomeSymbolTable
458               -> PersistentCompilerState
459               -> FilePath
460               -> Bool                   -- Source unchanged
461               -> Maybe ModIface         -- Old interface from compilation manager, if any
462               -> IO (PersistentCompilerState, Bool, (RecompileRequired, Maybe ModIface))
463                                 -- True <=> errors happened
464
465 checkOldIface dflags hit hst pcs iface_path source_unchanged maybe_iface
466   = runRn dflags hit hst pcs (panic "Bogus module") $
467     case maybe_iface of
468        Just old_iface -> -- Use the one we already have
469                          setModuleRn (mi_module old_iface) (check_versions old_iface)
470
471        Nothing -- try and read it from a file
472           -> readIface iface_path       `thenRn` \ read_result ->
473              case read_result of
474                Left err -> -- Old interface file not found, or garbled; give up
475                            traceRn (text "Bad old interface file" $$ nest 4 err)        `thenRn_`
476                            returnRn (outOfDate, Nothing)
477
478                Right parsed_iface
479                       -> setModuleRn (pi_mod parsed_iface) $
480                          loadOldIface parsed_iface `thenRn` \ m_iface ->
481                          check_versions m_iface
482     where
483        check_versions :: ModIface -> RnMG (RecompileRequired, Maybe ModIface)
484        check_versions iface
485           = -- Check versions
486             recompileRequired iface_path source_unchanged iface
487                                                         `thenRn` \ recompile ->
488             returnRn (recompile, Just iface)
489 \end{code}
490
491 I think the following function should now have a more representative name,
492 but what?
493
494 \begin{code}
495 loadOldIface :: ParsedIface -> RnMG ModIface
496
497 loadOldIface parsed_iface
498   = let iface = parsed_iface 
499         mod = pi_mod iface
500     in
501     initIfaceRnMS mod (
502         loadHomeDecls (pi_decls iface)  `thenRn` \ decls ->
503         loadHomeRules (pi_rules iface)  `thenRn` \ rules -> 
504         loadHomeInsts (pi_insts iface)  `thenRn` \ insts ->
505         returnRn (decls, rules, insts)
506     )   
507         `thenRn` \ ((decls_vers, new_decls), (rule_vers, new_rules), new_insts) ->
508
509     mapRn loadHomeUsage (pi_usages iface)       `thenRn` \ usages ->
510     loadExports         (pi_exports iface)      `thenRn` \ (export_vers, avails) ->
511     loadFixDecls mod    (pi_fixity iface)       `thenRn` \ fix_env ->
512     loadDeprecs mod     (pi_deprecs iface)      `thenRn` \ deprec_env ->
513     let
514         version = VersionInfo { vers_module  = pi_vers iface, 
515                                 vers_exports = export_vers,
516                                 vers_rules   = rule_vers,
517                                 vers_decls   = decls_vers }
518
519         decls = mkIfaceDecls new_decls new_rules new_insts
520
521         mod_iface = ModIface { mi_module = mod, mi_version = version,
522                                mi_exports = avails, mi_usages  = usages,
523                                mi_boot = False, mi_orphan = pi_orphan iface, 
524                                mi_fixities = fix_env, mi_deprecs = deprec_env,
525                                mi_decls   = decls,
526                                mi_globals = mkIfaceGlobalRdrEnv avails
527                     }
528     in
529     returnRn mod_iface
530 \end{code}
531
532 \begin{code}
533 loadHomeDecls :: [(Version, RdrNameTyClDecl)]
534               -> RnMS (NameEnv Version, [RenamedTyClDecl])
535 loadHomeDecls decls = foldlRn loadHomeDecl (emptyNameEnv, []) decls
536
537 loadHomeDecl :: (NameEnv Version, [RenamedTyClDecl])
538              -> (Version, RdrNameTyClDecl)
539              -> RnMS (NameEnv Version, [RenamedTyClDecl])
540 loadHomeDecl (version_map, decls) (version, decl)
541   = rnTyClDecl decl     `thenRn` \ decl' ->
542     returnRn (extendNameEnv version_map (tyClDeclName decl') version, decl':decls)
543
544 ------------------
545 loadHomeRules :: (Version, [RdrNameRuleDecl])
546               -> RnMS (Version, [RenamedRuleDecl])
547 loadHomeRules (version, rules)
548   = mapRn rnIfaceRuleDecl rules `thenRn` \ rules' ->
549     returnRn (version, rules')
550
551 ------------------
552 loadHomeInsts :: [RdrNameInstDecl]
553               -> RnMS [RenamedInstDecl]
554 loadHomeInsts insts = mapRn rnInstDecl insts
555
556 ------------------
557 loadHomeUsage :: ImportVersion OccName
558               -> RnMG (ImportVersion Name)
559 loadHomeUsage (mod_name, orphans, is_boot, whats_imported)
560   = rn_imps whats_imported      `thenRn` \ whats_imported' ->
561     returnRn (mod_name, orphans, is_boot, whats_imported')
562   where
563     rn_imps NothingAtAll                  = returnRn NothingAtAll
564     rn_imps (Everything v)                = returnRn (Everything v)
565     rn_imps (Specifically mv ev items rv) = mapRn rn_imp items  `thenRn` \ items' ->
566                                             returnRn (Specifically mv ev items' rv)
567     rn_imp (occ,vers) = newGlobalName mod_name occ      `thenRn` \ name ->
568                         returnRn (name,vers)
569 \end{code}
570
571
572
573 %*********************************************************
574 %*                                                       *
575 \subsection{Closing up the interface decls}
576 %*                                                       *
577 %*********************************************************
578
579 Suppose we discover we don't need to recompile.   Then we start from the
580 IfaceDecls in the ModIface, and fluff them up by sucking in all the decls they need.
581
582 \begin{code}
583 closeIfaceDecls :: DynFlags
584                 -> HomeIfaceTable -> HomeSymbolTable
585                 -> PersistentCompilerState
586                 -> ModIface     -- Get the decls from here
587                 -> IO (PersistentCompilerState, Bool, [RenamedHsDecl])
588                                 -- True <=> errors happened
589 closeIfaceDecls dflags hit hst pcs
590                 mod_iface@(ModIface { mi_module = mod, mi_decls = iface_decls })
591   = runRn dflags hit hst pcs mod $
592
593     let
594         rule_decls = dcl_rules iface_decls
595         inst_decls = dcl_insts iface_decls
596         tycl_decls = dcl_tycl  iface_decls
597         decls = map RuleD rule_decls ++
598                 map InstD inst_decls ++
599                 map TyClD tycl_decls
600         needed = unionManyNameSets (map ruleDeclFVs rule_decls) `unionNameSets`
601                  unionManyNameSets (map instDeclFVs inst_decls) `unionNameSets`
602                  unionManyNameSets (map tyClDeclFVs tycl_decls)
603         local_names    = foldl add emptyNameSet tycl_decls
604         add names decl = addListToNameSet names (map fst (tyClDeclSysNames decl ++ tyClDeclNames decl))
605     in
606     recordLocalSlurps local_names       `thenRn_`
607     closeDecls decls needed
608 \end{code}
609
610 %*********************************************************
611 %*                                                       *
612 \subsection{Unused names}
613 %*                                                       *
614 %*********************************************************
615
616 \begin{code}
617 reportUnusedNames :: ModIface -> PrintUnqualified
618                   -> [RdrNameImportDecl] 
619                   -> AvailEnv
620                   -> NameSet            -- Used in this module
621                   -> Avails             -- Exported by this module
622                   -> [RenamedHsDecl] 
623                   -> RnMG ()
624 reportUnusedNames my_mod_iface unqual imports avail_env 
625                   source_fvs export_avails imported_decls
626   = warnUnusedModules unused_imp_mods                           `thenRn_`
627     warnUnusedLocalBinds bad_locals                             `thenRn_`
628     warnUnusedImports bad_imp_names                             `thenRn_`
629     printMinimalImports this_mod unqual minimal_imports         `thenRn_`
630     warnDeprecations this_mod export_avails my_deprecs 
631                      really_used_names
632
633   where
634     this_mod   = mi_module my_mod_iface
635     gbl_env    = mi_globals my_mod_iface
636     my_deprecs = mi_deprecs my_mod_iface
637     
638         -- The export_fvs make the exported names look just as if they
639         -- occurred in the source program.  
640     export_fvs = availsToNameSet export_avails
641     used_names = source_fvs `plusFV` export_fvs
642
643     -- Now, a use of C implies a use of T,
644     -- if C was brought into scope by T(..) or T(C)
645     really_used_names = used_names `unionNameSets`
646       mkNameSet [ parent_name
647                 | sub_name <- nameSetToList used_names
648     
649                 -- Usually, every used name will appear in avail_env, but there 
650                 -- is one time when it doesn't: tuples and other built in syntax.  When you
651                 -- write (a,b) that gives rise to a *use* of "(,)", so that the
652                 -- instances will get pulled in, but the tycon "(,)" isn't actually
653                 -- in scope.  Also, (-x) gives rise to an implicit use of 'negate'; 
654                 -- similarly,   3.5 gives rise to an implcit use of :%
655                 -- Hence the silent 'False' in all other cases
656               
657                 , Just parent_name <- [case lookupNameEnv avail_env sub_name of
658                                         Just (AvailTC n _) -> Just n
659                                         other              -> Nothing]
660             ]
661     
662         -- Collect the defined names from the in-scope environment
663         -- Look for the qualified ones only, else get duplicates
664     defined_names :: [(Name,Provenance)]
665     defined_names = foldRdrEnv add [] gbl_env
666     add rdr_name ns acc | isQual rdr_name = ns ++ acc
667                         | otherwise       = acc
668
669     defined_and_used, defined_but_not_used :: [(Name,Provenance)]
670     (defined_and_used, defined_but_not_used) = partition used defined_names
671     used (name,_)                            = name `elemNameSet` really_used_names
672     
673     -- Filter out the ones only defined implicitly
674     bad_locals :: [Name]
675     bad_locals     = [n     | (n,LocalDef) <- defined_but_not_used]
676     
677     bad_imp_names :: [(Name,Provenance)]
678     bad_imp_names  = [(n,p) | (n,p@(NonLocalDef (UserImport mod _ True))) <- defined_but_not_used,
679                               not (module_unused mod)]
680     
681     -- inst_mods are directly-imported modules that 
682     --  contain instance decl(s) that the renamer decided to suck in
683     -- It's not necessarily redundant to import such modules.
684     --
685     -- NOTE: Consider 
686     --        module This
687     --          import M ()
688     --
689     --   The import M() is not *necessarily* redundant, even if
690     --   we suck in no instance decls from M (e.g. it contains 
691     --   no instance decls, or This contains no code).  It may be 
692     --   that we import M solely to ensure that M's orphan instance 
693     --   decls (or those in its imports) are visible to people who 
694     --   import This.  Sigh. 
695     --   There's really no good way to detect this, so the error message 
696     --   in RnEnv.warnUnusedModules is weakened instead
697     inst_mods :: [ModuleName]
698     inst_mods = [m | InstD (InstDecl _ _ _ (Just dfun) _) <- imported_decls,
699                  let m = moduleName (nameModule dfun),
700                  m `elem` direct_import_mods
701             ]
702     
703     -- To figure out the minimal set of imports, start with the things
704     -- that are in scope (i.e. in gbl_env).  Then just combine them
705     -- into a bunch of avails, so they are properly grouped
706     minimal_imports :: FiniteMap ModuleName AvailEnv
707     minimal_imports0 = emptyFM
708     minimal_imports1 = foldr add_name     minimal_imports0 defined_and_used
709     minimal_imports  = foldr add_inst_mod minimal_imports1 inst_mods
710     
711     add_name (n,NonLocalDef (UserImport m _ _)) acc = addToFM_C plusAvailEnv acc (moduleName (nameModule n))
712                                                                 (unitAvailEnv (mk_avail n))
713     add_name (n,other_prov)                     acc = acc
714
715     mk_avail n = case lookupNameEnv avail_env n of
716                 Just (AvailTC m _) | n==m      -> AvailTC n [n]
717                                    | otherwise -> AvailTC m [n,m]
718                 Just avail         -> Avail n
719                 Nothing            -> pprPanic "mk_avail" (ppr n)
720     
721     add_inst_mod m acc 
722       | m `elemFM` acc = acc    -- We import something already
723       | otherwise      = addToFM acc m emptyAvailEnv
724         -- Add an empty collection of imports for a module
725         -- from which we have sucked only instance decls
726    
727     direct_import_mods :: [ModuleName]
728     direct_import_mods = nub [m | ImportDecl m _ _ _ _ _ <- imports]
729
730     -- unused_imp_mods are the directly-imported modules 
731     -- that are not mentioned in minimal_imports
732     unused_imp_mods = [m | m <- direct_import_mods,
733                        not (maybeToBool (lookupFM minimal_imports m)),
734                        m /= pRELUDE_Name]
735     
736     module_unused :: Module -> Bool
737     module_unused mod = moduleName mod `elem` unused_imp_mods
738
739 warnDeprecations this_mod export_avails my_deprecs used_names
740   = doptRn Opt_WarnDeprecations                         `thenRn` \ warn_drs ->
741     if not warn_drs then returnRn () else
742
743         -- The home modules for things in the export list
744         -- may not have been loaded yet; do it now, so 
745         -- that we can see their deprecations, if any
746     mapRn_ load_home export_mods                `thenRn_`
747
748     getIfacesRn                                 `thenRn` \ ifaces ->
749     getHomeIfaceTableRn                         `thenRn` \ hit ->
750     let
751         pit     = iPIT ifaces
752         deprecs = [ (n,txt)
753                   | n <- nameSetToList used_names,
754                     Just txt <- [lookup_deprec hit pit n] ]
755     in                    
756     mapRn_ warnDeprec deprecs
757
758   where
759     export_mods = nub [ moduleName (nameModule name) 
760                       | avail <- export_avails,
761                         let name = availName avail,
762                         not (nameIsLocalOrFrom this_mod name) ]
763   
764     load_home m = loadInterface (text "Check deprecations for" <+> ppr m) m ImportBySystem
765
766     lookup_deprec hit pit n
767         | nameIsLocalOrFrom this_mod n
768         = lookupDeprec my_deprecs n 
769         | otherwise
770         = case lookupIface hit pit n of
771                 Just iface -> lookupDeprec (mi_deprecs iface) n
772                 Nothing    -> pprPanic "warnDeprecations:" (ppr n)
773
774 -- ToDo: deal with original imports with 'qualified' and 'as M' clauses
775 printMinimalImports this_mod unqual imps
776   = doptRn Opt_D_dump_minimal_imports           `thenRn` \ dump_minimal ->
777     if not dump_minimal then returnRn () else
778
779     mapRn to_ies (fmToList imps)                `thenRn` \ mod_ies ->
780     ioToRnM (do { h <- openFile filename WriteMode ;
781                   printForUser h unqual (vcat (map ppr_mod_ie mod_ies))
782         })                                      `thenRn_`
783     returnRn ()
784   where
785     filename = moduleNameUserString (moduleName this_mod) ++ ".imports"
786     ppr_mod_ie (mod_name, ies) 
787         | mod_name == pRELUDE_Name 
788         = empty
789         | otherwise
790         = ptext SLIT("import") <+> ppr mod_name <> 
791                             parens (fsep (punctuate comma (map ppr ies)))
792
793     to_ies (mod, avail_env) = mapRn to_ie (availEnvElts avail_env)      `thenRn` \ ies ->
794                               returnRn (mod, ies)
795
796     to_ie :: AvailInfo -> RnMG (IE Name)
797     to_ie (Avail n)       = returnRn (IEVar n)
798     to_ie (AvailTC n [m]) = ASSERT( n==m ) 
799                             returnRn (IEThingAbs n)
800     to_ie (AvailTC n ns)  
801         = getInterfaceExports n_mod ImportBySystem              `thenRn` \ (_, avails_by_module) ->
802           case [xs | (m,as) <- avails_by_module,
803                      m == n_mod,
804                      AvailTC x xs <- as, 
805                      x == n] of
806               [xs] | all (`elem` ns) xs -> returnRn (IEThingAll n)
807                    | otherwise          -> returnRn (IEThingWith n (filter (/= n) ns))
808               other                     -> pprTrace "to_ie" (ppr n <+> ppr (nameModule n) <+> ppr other) $
809                                            returnRn (IEVar n)
810         where
811           n_mod = moduleName (nameModule n)
812
813 rnDump  :: [RenamedHsDecl]      -- Renamed imported decls
814         -> [RenamedHsDecl]      -- Renamed local decls
815         -> RnMG ()
816 rnDump imp_decls local_decls
817   = doptRn Opt_D_dump_rn_trace  `thenRn` \ dump_rn_trace ->
818     doptRn Opt_D_dump_rn_stats  `thenRn` \ dump_rn_stats ->
819     doptRn Opt_D_dump_rn        `thenRn` \ dump_rn ->
820     getIfacesRn                 `thenRn` \ ifaces ->
821
822     ioToRnM (do { dumpIfSet (dump_rn_trace || dump_rn_stats || dump_rn)
823                             "Renamer statistics"
824                             (getRnStats imp_decls ifaces) ;
825
826                   dumpIfSet dump_rn "Renamer:" 
827                             (vcat (map ppr (local_decls ++ imp_decls)))
828     })                          `thenRn_`
829
830     returnRn ()
831 \end{code}
832
833
834 %*********************************************************
835 %*                                                      *
836 \subsection{Statistics}
837 %*                                                      *
838 %*********************************************************
839
840 \begin{code}
841 getRnStats :: [RenamedHsDecl] -> Ifaces -> SDoc
842 getRnStats imported_decls ifaces
843   = hcat [text "Renamer stats: ", stats]
844   where
845     n_mods = length [() | _ <- moduleEnvElts (iPIT ifaces)]
846         -- This is really only right for a one-shot compile
847
848     (decls_map, n_decls_slurped) = iDecls ifaces
849     
850     n_decls_left   = length [decl | (avail, True, (_,decl)) <- nameEnvElts decls_map
851                         -- Data, newtype, and class decls are in the decls_fm
852                         -- under multiple names; the tycon/class, and each
853                         -- constructor/class op too.
854                         -- The 'True' selects just the 'main' decl
855                      ]
856     
857     (insts_left, n_insts_slurped) = iInsts ifaces
858     n_insts_left  = length (bagToList insts_left)
859     
860     (rules_left, n_rules_slurped) = iRules ifaces
861     n_rules_left  = length (bagToList rules_left)
862     
863     stats = vcat 
864         [int n_mods <+> text "interfaces read",
865          hsep [ int n_decls_slurped, text "type/class/variable imported, out of", 
866                 int (n_decls_slurped + n_decls_left), text "read"],
867          hsep [ int n_insts_slurped, text "instance decls imported, out of",  
868                 int (n_insts_slurped + n_insts_left), text "read"],
869          hsep [ int n_rules_slurped, text "rule decls imported, out of",  
870                 int (n_rules_slurped + n_rules_left), text "read"]
871         ]
872 \end{code}    
873
874
875 %************************************************************************
876 %*                                                                      *
877 \subsection{Errors and warnings}
878 %*                                                                      *
879 %************************************************************************
880
881 \begin{code}
882 warnDeprec :: (Name, DeprecTxt) -> RnM d ()
883 warnDeprec (name, txt)
884   = pushSrcLocRn (getSrcLoc name)       $
885     addWarnRn                           $
886     sep [ text (occNameFlavour (nameOccName name)) <+> ppr name <+>
887           text "is deprecated:", nest 4 (ppr txt) ]
888
889
890 dupFixityDecl rdr_name loc1 loc2
891   = vcat [ptext SLIT("Multiple fixity declarations for") <+> quotes (ppr rdr_name),
892           ptext SLIT("at ") <+> ppr loc1,
893           ptext SLIT("and") <+> ppr loc2]
894
895 badDeprec d
896   = sep [ptext SLIT("Illegal deprecation when whole module is deprecated"),
897          nest 4 (ppr d)]
898
899 noMainErr
900   = hsep [ptext SLIT("Module"), quotes (ppr mAIN_Name), 
901           ptext SLIT("must include a definition for"), quotes (ptext SLIT("main"))]
902 \end{code}
903
904