[project @ 2000-11-24 09:24:40 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, 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         -- Record that we have now got declarations for local_names
607     recordLocalSlurps local_names       `thenRn_`
608
609         -- Do the transitive closure
610     lookupOrigNames implicit_occs       `thenRn` \ implicit_names ->
611     closeDecls decls (needed `plusFV` implicit_names)
612   where
613     implicit_occs = string_occs -- Data type decls with record selectors,
614                                 -- which may appear in the decls, need unpackCString
615                                 -- and friends. It's easier to just grab them right now.
616 \end{code}
617
618 %*********************************************************
619 %*                                                       *
620 \subsection{Unused names}
621 %*                                                       *
622 %*********************************************************
623
624 \begin{code}
625 reportUnusedNames :: ModIface -> PrintUnqualified
626                   -> [RdrNameImportDecl] 
627                   -> AvailEnv
628                   -> NameSet            -- Used in this module
629                   -> Avails             -- Exported by this module
630                   -> [RenamedHsDecl] 
631                   -> RnMG ()
632 reportUnusedNames my_mod_iface unqual imports avail_env 
633                   source_fvs export_avails imported_decls
634   = warnUnusedModules unused_imp_mods                           `thenRn_`
635     warnUnusedLocalBinds bad_locals                             `thenRn_`
636     warnUnusedImports bad_imp_names                             `thenRn_`
637     printMinimalImports this_mod unqual minimal_imports         `thenRn_`
638     warnDeprecations this_mod export_avails my_deprecs 
639                      really_used_names
640
641   where
642     this_mod   = mi_module my_mod_iface
643     gbl_env    = mi_globals my_mod_iface
644     my_deprecs = mi_deprecs my_mod_iface
645     
646         -- The export_fvs make the exported names look just as if they
647         -- occurred in the source program.  
648     export_fvs = availsToNameSet export_avails
649     used_names = source_fvs `plusFV` export_fvs
650
651     -- Now, a use of C implies a use of T,
652     -- if C was brought into scope by T(..) or T(C)
653     really_used_names = used_names `unionNameSets`
654       mkNameSet [ parent_name
655                 | sub_name <- nameSetToList used_names
656     
657                 -- Usually, every used name will appear in avail_env, but there 
658                 -- is one time when it doesn't: tuples and other built in syntax.  When you
659                 -- write (a,b) that gives rise to a *use* of "(,)", so that the
660                 -- instances will get pulled in, but the tycon "(,)" isn't actually
661                 -- in scope.  Also, (-x) gives rise to an implicit use of 'negate'; 
662                 -- similarly,   3.5 gives rise to an implcit use of :%
663                 -- Hence the silent 'False' in all other cases
664               
665                 , Just parent_name <- [case lookupNameEnv avail_env sub_name of
666                                         Just (AvailTC n _) -> Just n
667                                         other              -> Nothing]
668             ]
669     
670         -- Collect the defined names from the in-scope environment
671         -- Look for the qualified ones only, else get duplicates
672     defined_names :: [(Name,Provenance)]
673     defined_names = foldRdrEnv add [] gbl_env
674     add rdr_name ns acc | isQual rdr_name = ns ++ acc
675                         | otherwise       = acc
676
677     defined_and_used, defined_but_not_used :: [(Name,Provenance)]
678     (defined_and_used, defined_but_not_used) = partition used defined_names
679     used (name,_)                            = name `elemNameSet` really_used_names
680     
681     -- Filter out the ones only defined implicitly
682     bad_locals :: [Name]
683     bad_locals     = [n     | (n,LocalDef) <- defined_but_not_used]
684     
685     bad_imp_names :: [(Name,Provenance)]
686     bad_imp_names  = [(n,p) | (n,p@(NonLocalDef (UserImport mod _ True))) <- defined_but_not_used,
687                               not (module_unused mod)]
688     
689     -- inst_mods are directly-imported modules that 
690     --  contain instance decl(s) that the renamer decided to suck in
691     -- It's not necessarily redundant to import such modules.
692     --
693     -- NOTE: Consider 
694     --        module This
695     --          import M ()
696     --
697     --   The import M() is not *necessarily* redundant, even if
698     --   we suck in no instance decls from M (e.g. it contains 
699     --   no instance decls, or This contains no code).  It may be 
700     --   that we import M solely to ensure that M's orphan instance 
701     --   decls (or those in its imports) are visible to people who 
702     --   import This.  Sigh. 
703     --   There's really no good way to detect this, so the error message 
704     --   in RnEnv.warnUnusedModules is weakened instead
705     inst_mods :: [ModuleName]
706     inst_mods = [m | InstD (InstDecl _ _ _ (Just dfun) _) <- imported_decls,
707                  let m = moduleName (nameModule dfun),
708                  m `elem` direct_import_mods
709             ]
710     
711     -- To figure out the minimal set of imports, start with the things
712     -- that are in scope (i.e. in gbl_env).  Then just combine them
713     -- into a bunch of avails, so they are properly grouped
714     minimal_imports :: FiniteMap ModuleName AvailEnv
715     minimal_imports0 = emptyFM
716     minimal_imports1 = foldr add_name     minimal_imports0 defined_and_used
717     minimal_imports  = foldr add_inst_mod minimal_imports1 inst_mods
718     
719     add_name (n,NonLocalDef (UserImport m _ _)) acc = addToFM_C plusAvailEnv acc (moduleName (nameModule n))
720                                                                 (unitAvailEnv (mk_avail n))
721     add_name (n,other_prov)                     acc = acc
722
723     mk_avail n = case lookupNameEnv avail_env n of
724                 Just (AvailTC m _) | n==m      -> AvailTC n [n]
725                                    | otherwise -> AvailTC m [n,m]
726                 Just avail         -> Avail n
727                 Nothing            -> pprPanic "mk_avail" (ppr n)
728     
729     add_inst_mod m acc 
730       | m `elemFM` acc = acc    -- We import something already
731       | otherwise      = addToFM acc m emptyAvailEnv
732         -- Add an empty collection of imports for a module
733         -- from which we have sucked only instance decls
734    
735     direct_import_mods :: [ModuleName]
736     direct_import_mods = nub [m | ImportDecl m _ _ _ _ _ <- imports]
737
738     -- unused_imp_mods are the directly-imported modules 
739     -- that are not mentioned in minimal_imports
740     unused_imp_mods = [m | m <- direct_import_mods,
741                        not (maybeToBool (lookupFM minimal_imports m)),
742                        m /= pRELUDE_Name]
743     
744     module_unused :: Module -> Bool
745     module_unused mod = moduleName mod `elem` unused_imp_mods
746
747 warnDeprecations this_mod export_avails my_deprecs used_names
748   = doptRn Opt_WarnDeprecations                         `thenRn` \ warn_drs ->
749     if not warn_drs then returnRn () else
750
751         -- The home modules for things in the export list
752         -- may not have been loaded yet; do it now, so 
753         -- that we can see their deprecations, if any
754     mapRn_ load_home export_mods                `thenRn_`
755
756     getIfacesRn                                 `thenRn` \ ifaces ->
757     getHomeIfaceTableRn                         `thenRn` \ hit ->
758     let
759         pit     = iPIT ifaces
760         deprecs = [ (n,txt)
761                   | n <- nameSetToList used_names,
762                     Just txt <- [lookup_deprec hit pit n] ]
763     in                    
764     mapRn_ warnDeprec deprecs
765
766   where
767     export_mods = nub [ moduleName (nameModule name) 
768                       | avail <- export_avails,
769                         let name = availName avail,
770                         not (nameIsLocalOrFrom this_mod name) ]
771   
772     load_home m = loadInterface (text "Check deprecations for" <+> ppr m) m ImportBySystem
773
774     lookup_deprec hit pit n
775         | nameIsLocalOrFrom this_mod n
776         = lookupDeprec my_deprecs n 
777         | otherwise
778         = case lookupIface hit pit n of
779                 Just iface -> lookupDeprec (mi_deprecs iface) n
780                 Nothing    -> pprPanic "warnDeprecations:" (ppr n)
781
782 -- ToDo: deal with original imports with 'qualified' and 'as M' clauses
783 printMinimalImports this_mod unqual imps
784   = doptRn Opt_D_dump_minimal_imports           `thenRn` \ dump_minimal ->
785     if not dump_minimal then returnRn () else
786
787     mapRn to_ies (fmToList imps)                `thenRn` \ mod_ies ->
788     ioToRnM (do { h <- openFile filename WriteMode ;
789                   printForUser h unqual (vcat (map ppr_mod_ie mod_ies))
790         })                                      `thenRn_`
791     returnRn ()
792   where
793     filename = moduleNameUserString (moduleName this_mod) ++ ".imports"
794     ppr_mod_ie (mod_name, ies) 
795         | mod_name == pRELUDE_Name 
796         = empty
797         | otherwise
798         = ptext SLIT("import") <+> ppr mod_name <> 
799                             parens (fsep (punctuate comma (map ppr ies)))
800
801     to_ies (mod, avail_env) = mapRn to_ie (availEnvElts avail_env)      `thenRn` \ ies ->
802                               returnRn (mod, ies)
803
804     to_ie :: AvailInfo -> RnMG (IE Name)
805     to_ie (Avail n)       = returnRn (IEVar n)
806     to_ie (AvailTC n [m]) = ASSERT( n==m ) 
807                             returnRn (IEThingAbs n)
808     to_ie (AvailTC n ns)  
809         = getInterfaceExports n_mod ImportBySystem              `thenRn` \ (_, avails_by_module) ->
810           case [xs | (m,as) <- avails_by_module,
811                      m == n_mod,
812                      AvailTC x xs <- as, 
813                      x == n] of
814               [xs] | all (`elem` ns) xs -> returnRn (IEThingAll n)
815                    | otherwise          -> returnRn (IEThingWith n (filter (/= n) ns))
816               other                     -> pprTrace "to_ie" (ppr n <+> ppr (nameModule n) <+> ppr other) $
817                                            returnRn (IEVar n)
818         where
819           n_mod = moduleName (nameModule n)
820
821 rnDump  :: [RenamedHsDecl]      -- Renamed imported decls
822         -> [RenamedHsDecl]      -- Renamed local decls
823         -> RnMG ()
824 rnDump imp_decls local_decls
825   = doptRn Opt_D_dump_rn_trace  `thenRn` \ dump_rn_trace ->
826     doptRn Opt_D_dump_rn_stats  `thenRn` \ dump_rn_stats ->
827     doptRn Opt_D_dump_rn        `thenRn` \ dump_rn ->
828     getIfacesRn                 `thenRn` \ ifaces ->
829
830     ioToRnM (do { dumpIfSet (dump_rn_trace || dump_rn_stats || dump_rn)
831                             "Renamer statistics"
832                             (getRnStats imp_decls ifaces) ;
833
834                   dumpIfSet dump_rn "Renamer:" 
835                             (vcat (map ppr (local_decls ++ imp_decls)))
836     })                          `thenRn_`
837
838     returnRn ()
839 \end{code}
840
841
842 %*********************************************************
843 %*                                                      *
844 \subsection{Statistics}
845 %*                                                      *
846 %*********************************************************
847
848 \begin{code}
849 getRnStats :: [RenamedHsDecl] -> Ifaces -> SDoc
850 getRnStats imported_decls ifaces
851   = hcat [text "Renamer stats: ", stats]
852   where
853     n_mods = length [() | _ <- moduleEnvElts (iPIT ifaces)]
854         -- This is really only right for a one-shot compile
855
856     (decls_map, n_decls_slurped) = iDecls ifaces
857     
858     n_decls_left   = length [decl | (avail, True, (_,decl)) <- nameEnvElts decls_map
859                         -- Data, newtype, and class decls are in the decls_fm
860                         -- under multiple names; the tycon/class, and each
861                         -- constructor/class op too.
862                         -- The 'True' selects just the 'main' decl
863                      ]
864     
865     (insts_left, n_insts_slurped) = iInsts ifaces
866     n_insts_left  = length (bagToList insts_left)
867     
868     (rules_left, n_rules_slurped) = iRules ifaces
869     n_rules_left  = length (bagToList rules_left)
870     
871     stats = vcat 
872         [int n_mods <+> text "interfaces read",
873          hsep [ int n_decls_slurped, text "type/class/variable imported, out of", 
874                 int (n_decls_slurped + n_decls_left), text "read"],
875          hsep [ int n_insts_slurped, text "instance decls imported, out of",  
876                 int (n_insts_slurped + n_insts_left), text "read"],
877          hsep [ int n_rules_slurped, text "rule decls imported, out of",  
878                 int (n_rules_slurped + n_rules_left), text "read"]
879         ]
880 \end{code}    
881
882
883 %************************************************************************
884 %*                                                                      *
885 \subsection{Errors and warnings}
886 %*                                                                      *
887 %************************************************************************
888
889 \begin{code}
890 warnDeprec :: (Name, DeprecTxt) -> RnM d ()
891 warnDeprec (name, txt)
892   = pushSrcLocRn (getSrcLoc name)       $
893     addWarnRn                           $
894     sep [ text (occNameFlavour (nameOccName name)) <+> ppr name <+>
895           text "is deprecated:", nest 4 (ppr txt) ]
896
897
898 dupFixityDecl rdr_name loc1 loc2
899   = vcat [ptext SLIT("Multiple fixity declarations for") <+> quotes (ppr rdr_name),
900           ptext SLIT("at ") <+> ppr loc1,
901           ptext SLIT("and") <+> ppr loc2]
902
903 badDeprec d
904   = sep [ptext SLIT("Illegal deprecation when whole module is deprecated"),
905          nest 4 (ppr d)]
906
907 noMainErr
908   = hsep [ptext SLIT("Module"), quotes (ppr mAIN_Name), 
909           ptext SLIT("must include a definition for"), quotes (ptext SLIT("main"))]
910 \end{code}
911
912