a7b84ebdefe86f4b7d7d38fe9432d86d2420f720
[ghc-hetmet.git] / compiler / rename / RnNames.lhs
1 %
2 % (c) The GRASP/AQUA Project, Glasgow University, 1992-1998
3 %
4 \section[RnNames]{Extracting imported and top-level names in scope}
5
6 \begin{code}
7 module RnNames (
8         rnImports, getLocalNonValBinders,
9         rnExports, extendGlobalRdrEnvRn,
10         reportUnusedNames, finishWarnings,
11     ) where
12
13 #include "HsVersions.h"
14
15 import DynFlags
16 import HsSyn
17 import TcEnv            ( isBrackStage )
18 import RnEnv
19 import RnHsDoc          ( rnHsDoc )
20 import IfaceEnv         ( ifaceExportNames )
21 import LoadIface        ( loadSrcInterface, loadSysInterface )
22 import TcRnMonad hiding (LIE)
23
24 import PrelNames
25 import Module
26 import Name
27 import NameEnv
28 import NameSet
29 import OccName
30 import HscTypes
31 import RdrName
32 import Outputable
33 import Maybes
34 import SrcLoc
35 import FiniteMap
36 import ErrUtils
37 import BasicTypes       ( WarningTxt(..) )
38 import DriverPhases     ( isHsBoot )
39 import Util
40 import FastString
41 import ListSetOps
42 import Data.List        ( partition, concatMap, (\\), delete )
43 import IO               ( openFile, IOMode(..) )
44 import Monad            ( when, mplus )
45 \end{code}
46
47
48
49 %************************************************************************
50 %*                                                                      *
51                 rnImports
52 %*                                                                      *
53 %************************************************************************
54
55 \begin{code}
56 rnImports :: [LImportDecl RdrName]
57            -> RnM ([LImportDecl Name], GlobalRdrEnv, ImportAvails,AnyHpcUsage)
58
59 rnImports imports
60          -- PROCESS IMPORT DECLS
61          -- Do the non {- SOURCE -} ones first, so that we get a helpful
62          -- warning for {- SOURCE -} ones that are unnecessary
63     = do this_mod <- getModule
64          implicit_prelude <- doptM Opt_ImplicitPrelude
65          let prel_imports       = mkPrelImports this_mod implicit_prelude imports
66              (source, ordinary) = partition is_source_import imports
67              is_source_import (L _ (ImportDecl _ _ is_boot _ _ _)) = is_boot
68
69          ifOptM Opt_WarnImplicitPrelude (
70             when (notNull prel_imports) $ addWarn (implicitPreludeWarn)
71           )
72
73          stuff1 <- mapM (rnImportDecl this_mod) (prel_imports ++ ordinary)
74          stuff2 <- mapM (rnImportDecl this_mod) source
75          let (decls, rdr_env, imp_avails,hpc_usage) = combine (stuff1 ++ stuff2)
76          return (decls, rdr_env, imp_avails,hpc_usage) 
77
78     where
79    combine :: [(LImportDecl Name,  GlobalRdrEnv, ImportAvails,AnyHpcUsage)]
80            -> ([LImportDecl Name], GlobalRdrEnv, ImportAvails,AnyHpcUsage)
81    combine = foldr plus ([], emptyGlobalRdrEnv, emptyImportAvails,False)
82         where plus (decl,  gbl_env1, imp_avails1,hpc_usage1)
83                    (decls, gbl_env2, imp_avails2,hpc_usage2)
84                 = (decl:decls, 
85                    gbl_env1 `plusGlobalRdrEnv` gbl_env2,
86                    imp_avails1 `plusImportAvails` imp_avails2,
87                    hpc_usage1 || hpc_usage2)
88
89 mkPrelImports :: Module -> Bool -> [LImportDecl RdrName] -> [LImportDecl RdrName]
90 -- Consruct the implicit declaration "import Prelude" (or not)
91 --
92 -- NB: opt_NoImplicitPrelude is slightly different to import Prelude ();
93 -- because the former doesn't even look at Prelude.hi for instance 
94 -- declarations, whereas the latter does.
95 mkPrelImports this_mod implicit_prelude import_decls
96   | this_mod == pRELUDE
97    || explicit_prelude_import
98    || not implicit_prelude
99   = []
100   | otherwise = [preludeImportDecl]
101   where
102       explicit_prelude_import
103        = notNull [ () | L _ (ImportDecl mod Nothing _ _ _ _) <- import_decls, 
104                    unLoc mod == pRELUDE_NAME ]
105
106       preludeImportDecl :: LImportDecl RdrName
107       preludeImportDecl
108         = L loc $
109           ImportDecl (L loc pRELUDE_NAME)
110                Nothing {- no specific package -}
111                False {- Not a boot interface -}
112                False    {- Not qualified -}
113                Nothing  {- No "as" -}
114                Nothing  {- No import list -}
115
116       loc = mkGeneralSrcSpan (fsLit "Implicit import declaration")         
117
118
119 rnImportDecl  :: Module
120               -> LImportDecl RdrName
121               -> RnM (LImportDecl Name, GlobalRdrEnv, ImportAvails,AnyHpcUsage)
122
123 rnImportDecl this_mod (L loc (ImportDecl loc_imp_mod_name mb_pkg want_boot
124                                          qual_only as_mod imp_details))
125   = 
126     setSrcSpan loc $ do
127
128     when (isJust mb_pkg) $ do
129         pkg_imports <- doptM Opt_PackageImports
130         when (not pkg_imports) $ addErr packageImportErr
131
132         -- If there's an error in loadInterface, (e.g. interface
133         -- file not found) we get lots of spurious errors from 'filterImports'
134     let
135         imp_mod_name = unLoc loc_imp_mod_name
136         doc = ppr imp_mod_name <+> ptext (sLit "is directly imported")
137
138     iface <- loadSrcInterface doc imp_mod_name want_boot mb_pkg
139
140         -- Compiler sanity check: if the import didn't say
141         -- {-# SOURCE #-} we should not get a hi-boot file
142     WARN( not want_boot && mi_boot iface, ppr imp_mod_name ) (do
143
144         -- Issue a user warning for a redundant {- SOURCE -} import
145         -- NB that we arrange to read all the ordinary imports before 
146         -- any of the {- SOURCE -} imports.
147         --
148         -- in --make and GHCi, the compilation manager checks for this,
149         -- and indeed we shouldn't do it here because the existence of
150         -- the non-boot module depends on the compilation order, which
151         -- is not deterministic.  The hs-boot test can show this up.
152     dflags <- getDOpts
153     warnIf (want_boot && not (mi_boot iface) && isOneShot (ghcMode dflags))
154            (warnRedundantSourceImport imp_mod_name)
155
156     let
157         imp_mod    = mi_module iface
158         warns      = mi_warns iface
159         orph_iface = mi_orphan iface 
160         has_finsts = mi_finsts iface 
161         deps       = mi_deps iface
162
163         filtered_exports = filter not_this_mod (mi_exports iface)
164         not_this_mod (mod,_) = mod /= this_mod
165         -- If the module exports anything defined in this module, just
166         -- ignore it.  Reason: otherwise it looks as if there are two
167         -- local definition sites for the thing, and an error gets
168         -- reported.  Easiest thing is just to filter them out up
169         -- front. This situation only arises if a module imports
170         -- itself, or another module that imported it.  (Necessarily,
171         -- this invoves a loop.)
172         --
173         -- Tiresome consequence: if you say
174         --      module A where
175         --         import B( AType )
176         --         type AType = ...
177         --
178         --      module B( AType ) where
179         --         import {-# SOURCE #-} A( AType )
180         --
181         -- then you'll get a 'B does not export AType' message.  Oh well.
182
183         qual_mod_name = case as_mod of
184                           Nothing           -> imp_mod_name
185                           Just another_name -> another_name
186         imp_spec  = ImpDeclSpec { is_mod = imp_mod_name, is_qual = qual_only,  
187                                   is_dloc = loc, is_as = qual_mod_name }
188     -- in
189
190         -- Get the total exports from this module
191     total_avails <- ifaceExportNames filtered_exports
192
193         -- filter the imports according to the import declaration
194     (new_imp_details, gbl_env) <- 
195         filterImports iface imp_spec imp_details total_avails
196
197     dflags <- getDOpts
198
199     let
200         -- Compute new transitive dependencies
201
202         orphans | orph_iface = ASSERT( not (imp_mod `elem` dep_orphs deps) )
203                                imp_mod : dep_orphs deps
204                 | otherwise  = dep_orphs deps
205
206         finsts | has_finsts = ASSERT( not (imp_mod `elem` dep_finsts deps) )
207                               imp_mod : dep_finsts deps
208                 | otherwise = dep_finsts deps
209
210         pkg = modulePackageId (mi_module iface)
211
212         (dependent_mods, dependent_pkgs) 
213            | pkg == thisPackage dflags =
214                 -- Imported module is from the home package
215                 -- Take its dependent modules and add imp_mod itself
216                 -- Take its dependent packages unchanged
217                 --
218                 -- NB: (dep_mods deps) might include a hi-boot file
219                 -- for the module being compiled, CM. Do *not* filter
220                 -- this out (as we used to), because when we've
221                 -- finished dealing with the direct imports we want to
222                 -- know if any of them depended on CM.hi-boot, in
223                 -- which case we should do the hi-boot consistency
224                 -- check.  See LoadIface.loadHiBootInterface
225                   ((imp_mod_name, want_boot) : dep_mods deps, dep_pkgs deps)
226
227            | otherwise =
228                 -- Imported module is from another package
229                 -- Dump the dependent modules
230                 -- Add the package imp_mod comes from to the dependent packages
231                  ASSERT2( not (pkg `elem` dep_pkgs deps), ppr pkg <+> ppr (dep_pkgs deps) )
232                  ([], pkg : dep_pkgs deps)
233
234         -- True <=> import M ()
235         import_all = case imp_details of
236                         Just (is_hiding, ls) -> not is_hiding && null ls        
237                         _                    -> False
238
239         imports   = ImportAvails { 
240                         imp_mods     = unitModuleEnv imp_mod [(qual_mod_name, import_all, loc)],
241                         imp_orphs    = orphans,
242                         imp_finsts   = finsts,
243                         imp_dep_mods = mkModDeps dependent_mods,
244                         imp_dep_pkgs = dependent_pkgs
245                    }
246
247         -- Complain if we import a deprecated module
248     ifOptM Opt_WarnWarningsDeprecations (
249        case warns of    
250           WarnAll txt -> addWarn (moduleWarn imp_mod_name txt)
251           _           -> return ()
252      )
253
254     let new_imp_decl = L loc (ImportDecl loc_imp_mod_name mb_pkg want_boot
255                                          qual_only as_mod new_imp_details)
256
257     return (new_imp_decl, gbl_env, imports, mi_hpc iface)
258     )
259
260 warnRedundantSourceImport :: ModuleName -> SDoc
261 warnRedundantSourceImport mod_name
262   = ptext (sLit "Unnecessary {-# SOURCE #-} in the import of module")
263           <+> quotes (ppr mod_name)
264 \end{code}
265
266
267 %************************************************************************
268 %*                                                                      *
269                 importsFromLocalDecls
270 %*                                                                      *
271 %************************************************************************
272
273 From the top-level declarations of this module produce
274         * the lexical environment
275         * the ImportAvails
276 created by its bindings.  
277         
278 Note [Top-level Names in Template Haskell decl quotes]
279 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
280 Consider a Template Haskell declaration quotation like this:
281       module M where
282         f x = h [d| f = 3 |]
283 When renaming the declarations inside [d| ...|], we treat the
284 top level binders specially in two ways
285
286 1.  We give them an Internal name, not (as usual) an External one.
287     Otherwise the NameCache gets confused by a second allocation of
288     M.f.  (We used to invent a fake module ThFake to avoid this, but
289     that had other problems, notably in getting the correct answer for
290     nameIsLocalOrFrom in lookupFixity. So we now leave tcg_module 
291     unaffected.)
292
293 2.  We make them *shadow* the outer bindings. If we don't do that,
294     we'll get a complaint when extending the GlobalRdrEnv, saying that
295     there are two bindings for 'f'.
296
297     This shadowing applies even if the binding for 'f' is in a
298     where-clause, and hence is in the *local* RdrEnv not the *global*
299     RdrEnv.
300
301 We find out whether we are inside a [d| ... |] by testing the TH
302 stage. This is a slight hack, because the stage field was really meant for
303 the type checker, and here we are not interested in the fields of Brack,
304 hence the error thunks in thRnBrack.
305
306 \begin{code}
307 extendGlobalRdrEnvRn :: [AvailInfo]
308                      -> MiniFixityEnv
309                      -> RnM (TcGblEnv, TcLclEnv)
310   -- Updates both the GlobalRdrEnv and the FixityEnv
311   -- We return a new TcLclEnv only becuase we might have to
312   -- delete some bindings from it; 
313   -- see Note [Top-level Names in Template Haskell decl quotes]
314
315 extendGlobalRdrEnvRn avails new_fixities
316   = do  { (gbl_env, lcl_env) <- getEnvs
317         ; stage <- getStage
318         ; let rdr_env = tcg_rdr_env gbl_env
319               fix_env = tcg_fix_env gbl_env
320
321                 -- Delete new_occs from global and local envs
322                 -- If we are in a TemplateHaskell decl bracket, 
323                 --    we are going to shadow them
324                 -- See Note [Top-level Names in Template Haskell decl quotes]
325               shadowP  = isBrackStage stage
326               new_occs = map (nameOccName . gre_name) gres
327               rdr_env1 = hideSomeUnquals rdr_env new_occs
328               lcl_env1 = lcl_env { tcl_rdr = delListFromOccEnv (tcl_rdr lcl_env) new_occs }
329               (rdr_env2, lcl_env2) | shadowP   = (rdr_env1, lcl_env1)
330                                    | otherwise = (rdr_env,  lcl_env)
331
332               rdr_env3 = foldl extendGlobalRdrEnv rdr_env2 gres
333               fix_env' = foldl extend_fix_env     fix_env  gres
334               (rdr_env', dups) = findLocalDupsRdrEnv rdr_env3 new_occs
335
336               gbl_env' = gbl_env { tcg_rdr_env = rdr_env', tcg_fix_env = fix_env' }
337               
338         ; mapM_ addDupDeclErr dups
339         
340         ; traceRn (text "extendGlobalRdrEnvRn" <+> (ppr new_fixities $$ ppr fix_env $$ ppr fix_env'))
341         ; return (gbl_env', lcl_env2) }
342   where
343     gres = gresFromAvails LocalDef avails
344
345         --  If there is a fixity decl for the gre, add it to the fixity env
346     extend_fix_env fix_env gre 
347       | Just (L _ fi) <- lookupFsEnv new_fixities (occNameFS occ)
348       = extendNameEnv fix_env name (FixItem occ fi)
349       | otherwise
350       = fix_env
351       where
352         name = gre_name gre
353         occ  = nameOccName name
354 \end{code}
355
356 @getLocalDeclBinders@ returns the names for an @HsDecl@.  It's
357 used for source code.
358
359         *** See "THE NAMING STORY" in HsDecls ****
360
361 Instances of type families
362 ~~~~~~~~~~~~~~~~~~~~~~~~~~
363 Indexed data/newtype instances contain data constructors that we need to
364 collect, too.  Moreover, we need to descend into the data/newtypes instances
365 of associated families.
366
367 We need to be careful with the handling of the type constructor of each type
368 instance as the family constructor is already defined, and we want to avoid
369 raising a duplicate declaration error.  So, we make a new name for it, but
370 don't return it in the 'AvailInfo'.
371
372 \begin{code}
373 getLocalNonValBinders :: HsGroup RdrName -> RnM [AvailInfo]
374 -- Get all the top-level binders bound the group *except* 
375 -- for value bindings, which are treated separately
376 -- Specificaly we return AvailInfo for
377 --      type decls
378 --      class decls
379 --      associated types
380 --      foreign imports
381 --      (in hs-boot files) value signatures
382
383 getLocalNonValBinders group
384   = do  { gbl_env <- getGblEnv
385         ; get_local_binders gbl_env group }
386
387 get_local_binders :: TcGblEnv -> HsGroup RdrName -> RnM [GenAvailInfo Name]
388 get_local_binders gbl_env (HsGroup {hs_valds  = ValBindsIn _ val_sigs,
389                                     hs_tyclds = tycl_decls, 
390                                     hs_instds = inst_decls,
391                                     hs_fords  = foreign_decls })
392   = do  { tc_names_s <- mapM new_tc tycl_decls
393         ; at_names_s <- mapM inst_ats inst_decls
394         ; val_names  <- mapM new_simple val_bndrs
395         ; return (val_names ++ tc_names_s ++ concat at_names_s) }
396   where
397     mod        = tcg_mod gbl_env
398     is_hs_boot = isHsBoot (tcg_src gbl_env) ;
399
400     for_hs_bndrs :: [Located RdrName]
401     for_hs_bndrs = [nm | L _ (ForeignImport nm _ _) <- foreign_decls]
402
403     -- In a hs-boot file, the value binders come from the
404     --  *signatures*, and there should be no foreign binders 
405     val_bndrs :: [Located RdrName]
406     val_bndrs | is_hs_boot = [nm | L _ (TypeSig nm _) <- val_sigs]
407               | otherwise  = for_hs_bndrs
408
409     new_simple :: Located RdrName -> RnM (GenAvailInfo Name)
410     new_simple rdr_name = do
411         nm <- newTopSrcBinder mod rdr_name
412         return (Avail nm)
413
414     new_tc tc_decl 
415       | isFamInstDecl (unLoc tc_decl)
416         = do { main_name <- lookupFamInstDeclBndr mod main_rdr
417              ; sub_names <- mapM (newTopSrcBinder mod) sub_rdrs
418              ; return (AvailTC main_name sub_names) }
419                         -- main_name is not bound here!
420       | otherwise
421         = do { main_name <- newTopSrcBinder mod main_rdr
422              ; sub_names <- mapM (newTopSrcBinder mod) sub_rdrs
423              ; return (AvailTC main_name (main_name : sub_names)) }
424       where
425         (main_rdr : sub_rdrs) = tyClDeclNames (unLoc tc_decl)
426
427     inst_ats inst_decl 
428         = mapM new_tc (instDeclATs (unLoc inst_decl))
429
430 get_local_binders _ g = pprPanic "get_local_binders" (ppr g)
431 \end{code}
432
433
434 %************************************************************************
435 %*                                                                      *
436 \subsection{Filtering imports}
437 %*                                                                      *
438 %************************************************************************
439
440 @filterImports@ takes the @ExportEnv@ telling what the imported module makes
441 available, and filters it through the import spec (if any).
442
443 \begin{code}
444 filterImports :: ModIface
445               -> ImpDeclSpec                    -- The span for the entire import decl
446               -> Maybe (Bool, [LIE RdrName])    -- Import spec; True => hiding
447               -> [AvailInfo]                    -- What's available
448               -> RnM (Maybe (Bool, [LIE Name]), -- Import spec w/ Names
449                       GlobalRdrEnv)             -- Same again, but in GRE form
450 filterImports _ decl_spec Nothing all_avails
451   = return (Nothing, mkGlobalRdrEnv (gresFromAvails prov all_avails))
452   where
453     prov = Imported [ImpSpec { is_decl = decl_spec, is_item = ImpAll }]
454
455
456 filterImports iface decl_spec (Just (want_hiding, import_items)) all_avails
457   = do   -- check for errors, convert RdrNames to Names
458         opt_typeFamilies <- doptM Opt_TypeFamilies
459         items1 <- mapM (lookup_lie opt_typeFamilies) import_items
460
461         let items2 :: [(LIE Name, AvailInfo)]
462             items2 = concat items1
463                 -- NB the AvailInfo may have duplicates, and several items
464                 --    for the same parent; e.g N(x) and N(y)
465
466             names  = availsToNameSet (map snd items2)
467             keep n = not (n `elemNameSet` names)
468             pruned_avails = filterAvails keep all_avails
469             hiding_prov = Imported [ImpSpec { is_decl = decl_spec, is_item = ImpAll }]
470
471             gres | want_hiding = gresFromAvails hiding_prov pruned_avails
472                  | otherwise   = concatMap (gresFromIE decl_spec) items2
473
474         return (Just (want_hiding, map fst items2), mkGlobalRdrEnv gres)
475   where
476         -- This environment is how we map names mentioned in the import
477         -- list to the actual Name they correspond to, and the name family
478         -- that the Name belongs to (the AvailInfo).  The situation is
479         -- complicated by associated families, which introduce a three-level
480         -- hierachy, where class = grand parent, assoc family = parent, and
481         -- data constructors = children.  The occ_env entries for associated
482         -- families needs to capture all this information; hence, we have the
483         -- third component of the environment that gives the class name (=
484         -- grand parent) in case of associated families.
485         --
486         -- This env will have entries for data constructors too,
487         -- they won't make any difference because naked entities like T
488         -- in an import list map to TcOccs, not VarOccs.
489     occ_env :: OccEnv (Name,        -- the name
490                        AvailInfo,   -- the export item providing the name
491                        Maybe Name)  -- the parent of associated types
492     occ_env = mkOccEnv_C combine [ (nameOccName n, (n, a, Nothing)) 
493                                  | a <- all_avails, n <- availNames a]
494       where
495         -- we know that (1) there are at most entries for one name, (2) their
496         -- first component is identical, (3) they are for tys/cls, and (4) one
497         -- entry has the name in its parent position (the other doesn't)
498         combine (name, AvailTC p1 subs1, Nothing)
499                 (_   , AvailTC p2 subs2, Nothing)
500           = let
501               (parent, subs) = if p1 == name then (p2, subs1) else (p1, subs2)
502             in
503             (name, AvailTC name subs, Just parent)
504         combine x y = pprPanic "filterImports/combine" (ppr x $$ ppr y)
505
506     lookup_lie :: Bool -> LIE RdrName -> TcRn [(LIE Name, AvailInfo)]
507     lookup_lie opt_typeFamilies (L loc ieRdr)
508         = do 
509              stuff <- setSrcSpan loc $ 
510                       case lookup_ie opt_typeFamilies ieRdr of
511                             Failed err  -> addErr err >> return []
512                             Succeeded a -> return a
513              checkDodgyImport stuff
514              return [ (L loc ie, avail) | (ie,avail) <- stuff ]
515         where
516                 -- Warn when importing T(..) if T was exported abstractly
517             checkDodgyImport stuff
518                 | IEThingAll n <- ieRdr, (_, AvailTC _ [_]):_ <- stuff
519                 = ifOptM Opt_WarnDodgyImports (addWarn (dodgyImportWarn n))
520                 -- NB. use the RdrName for reporting the warning
521             checkDodgyImport _
522                 = return ()
523
524         -- For each import item, we convert its RdrNames to Names,
525         -- and at the same time construct an AvailInfo corresponding
526         -- to what is actually imported by this item.
527         -- Returns Nothing on error.
528         -- We return a list here, because in the case of an import
529         -- item like C, if we are hiding, then C refers to *both* a
530         -- type/class and a data constructor.  Moreover, when we import
531         -- data constructors of an associated family, we need separate
532         -- AvailInfos for the data constructors and the family (as they have
533         -- different parents).  See the discussion at occ_env.
534     lookup_ie :: Bool -> IE RdrName -> MaybeErr Message [(IE Name,AvailInfo)]
535     lookup_ie opt_typeFamilies ie 
536       = let bad_ie = Failed (badImportItemErr iface decl_spec ie)
537
538             lookup_name rdrName = 
539                 case lookupOccEnv occ_env (rdrNameOcc rdrName) of
540                    Nothing -> bad_ie
541                    Just n  -> return n
542         in
543         case ie of
544          IEVar n -> do
545              (name, avail, _) <- lookup_name n
546              return [(IEVar name, trimAvail avail name)]
547
548          IEThingAll tc -> do
549              (name, avail@(AvailTC name2 subs), mb_parent) <- lookup_name tc
550              case mb_parent of
551                -- non-associated ty/cls
552                Nothing     -> return [(IEThingAll name, avail)]
553                -- associated ty
554                Just parent -> return [(IEThingAll name, 
555                                        AvailTC name2 (subs \\ [name])),
556                                       (IEThingAll name, AvailTC parent [name])]
557
558          IEThingAbs tc
559              | want_hiding   -- hiding ( C )
560                         -- Here the 'C' can be a data constructor 
561                         --  *or* a type/class, or even both
562              -> let tc_name = lookup_name tc
563                     dc_name = lookup_name (setRdrNameSpace tc srcDataName)
564                 in
565                 case catMaybeErr [ tc_name, dc_name ] of
566                   []    -> bad_ie
567                   names -> return [mkIEThingAbs name | name <- names]
568              | otherwise
569              -> do nameAvail <- lookup_name tc
570                    return [mkIEThingAbs nameAvail]
571
572          IEThingWith tc ns -> do
573             (name, AvailTC _ subnames, mb_parent) <- lookup_name tc
574             let 
575               env         = mkOccEnv [(nameOccName s, s) | s <- subnames]
576               mb_children = map (lookupOccEnv env . rdrNameOcc) ns
577             children <- if any isNothing mb_children
578                         then bad_ie
579                         else return (catMaybes mb_children)
580               -- check for proper import of type families
581             when (not opt_typeFamilies && any isTyConName children) $
582               Failed (typeItemErr (head . filter isTyConName $ children)
583                                   (text "in import list"))
584             case mb_parent of
585                -- non-associated ty/cls
586               Nothing     -> return [(IEThingWith name children, 
587                                       AvailTC name (name:children))]
588                -- associated ty
589               Just parent -> return [(IEThingWith name children, 
590                                       AvailTC name children),
591                                      (IEThingWith name children, 
592                                       AvailTC parent [name])]
593
594          _other -> Failed illegalImportItemErr
595          -- could be IEModuleContents, IEGroup, IEDoc, IEDocNamed
596          -- all errors.
597
598       where
599         mkIEThingAbs (n, av, Nothing    ) = (IEThingAbs n, trimAvail av n) 
600         mkIEThingAbs (n, _,  Just parent) = (IEThingAbs n, AvailTC parent [n]) 
601
602
603 catMaybeErr :: [MaybeErr err a] -> [a]
604 catMaybeErr ms =  [ a | Succeeded a <- ms ]
605 \end{code}
606
607 %************************************************************************
608 %*                                                                      *
609         Import/Export Utils
610 %*                                                                      *
611 %************************************************************************
612
613 \begin{code}
614 -- | make a 'GlobalRdrEnv' where all the elements point to the same
615 -- import declaration (useful for "hiding" imports, or imports with
616 -- no details).
617 gresFromAvails :: Provenance -> [AvailInfo] -> [GlobalRdrElt]
618 gresFromAvails prov avails
619   = concatMap (gresFromAvail (const prov)) avails
620
621 gresFromAvail :: (Name -> Provenance) -> AvailInfo -> [GlobalRdrElt]
622 gresFromAvail prov_fn avail
623   = [ GRE {gre_name = n, 
624            gre_par = availParent n avail, 
625            gre_prov = prov_fn n}
626     | n <- availNames avail ]
627   
628 greAvail :: GlobalRdrElt -> AvailInfo
629 greAvail gre = mkUnitAvail (gre_name gre) (gre_par gre)
630
631 mkUnitAvail :: Name -> Parent -> AvailInfo
632 mkUnitAvail me (ParentIs p)              = AvailTC p  [me]
633 mkUnitAvail me NoParent | isTyConName me = AvailTC me [me]
634                         | otherwise      = Avail me
635
636 plusAvail :: GenAvailInfo Name -> GenAvailInfo Name -> GenAvailInfo Name
637 plusAvail (Avail n1)      (Avail _)        = Avail n1
638 plusAvail (AvailTC _ ns1) (AvailTC n2 ns2) = AvailTC n2 (ns1 `unionLists` ns2)
639 plusAvail a1 a2 = pprPanic "RnEnv.plusAvail" (hsep [ppr a1,ppr a2])
640
641 availParent :: Name -> AvailInfo -> Parent
642 availParent _ (Avail _)                 = NoParent
643 availParent n (AvailTC m _) | n == m    = NoParent
644                             | otherwise = ParentIs m
645
646 trimAvail :: AvailInfo -> Name -> AvailInfo
647 trimAvail (Avail n)      _ = Avail n
648 trimAvail (AvailTC n ns) m = ASSERT( m `elem` ns) AvailTC n [m]
649
650 -- | filters 'AvailInfo's by the given predicate
651 filterAvails  :: (Name -> Bool) -> [AvailInfo] -> [AvailInfo]
652 filterAvails keep avails = foldr (filterAvail keep) [] avails
653
654 -- | filters an 'AvailInfo' by the given predicate
655 filterAvail :: (Name -> Bool) -> AvailInfo -> [AvailInfo] -> [AvailInfo]
656 filterAvail keep ie rest =
657   case ie of
658     Avail n | keep n    -> ie : rest
659             | otherwise -> rest
660     AvailTC tc ns ->
661         let left = filter keep ns in
662         if null left then rest else AvailTC tc left : rest
663
664 -- | Given an import\/export spec, construct the appropriate 'GlobalRdrElt's.
665 gresFromIE :: ImpDeclSpec -> (LIE Name, AvailInfo) -> [GlobalRdrElt]
666 gresFromIE decl_spec (L loc ie, avail)
667   = gresFromAvail prov_fn avail
668   where
669     is_explicit = case ie of
670                     IEThingAll name -> \n -> n == name
671                     _               -> \_ -> True
672     prov_fn name = Imported [imp_spec]
673         where
674           imp_spec  = ImpSpec { is_decl = decl_spec, is_item = item_spec }
675           item_spec = ImpSome { is_explicit = is_explicit name, is_iloc = loc }
676
677 mkChildEnv :: [GlobalRdrElt] -> NameEnv [Name]
678 mkChildEnv gres = foldr add emptyNameEnv gres
679     where
680         add (GRE { gre_name = n, gre_par = ParentIs p }) env = extendNameEnv_C (++) env p [n]
681         add _                                            env = env
682
683 findChildren :: NameEnv [Name] -> Name -> [Name]
684 findChildren env n = lookupNameEnv env n `orElse` []
685 \end{code}
686
687 ---------------------------------------
688         AvailEnv and friends
689
690 All this AvailEnv stuff is hardly used; only in a very small
691 part of RnNames.  Todo: remove?
692 ---------------------------------------
693
694 \begin{code}
695 type AvailEnv = NameEnv AvailInfo       -- Maps a Name to the AvailInfo that contains it
696
697 emptyAvailEnv :: AvailEnv
698 emptyAvailEnv = emptyNameEnv
699
700 unitAvailEnv :: AvailInfo -> AvailEnv
701 unitAvailEnv a = unitNameEnv (availName a) a
702
703 plusAvailEnv :: AvailEnv -> AvailEnv -> AvailEnv
704 plusAvailEnv = plusNameEnv_C plusAvail
705
706 availEnvElts :: AvailEnv -> [AvailInfo]
707 availEnvElts = nameEnvElts
708
709 addAvail :: AvailEnv -> AvailInfo -> AvailEnv
710 addAvail avails avail = extendNameEnv_C plusAvail avails (availName avail) avail
711
712 mkAvailEnv :: [AvailInfo] -> AvailEnv
713         -- 'avails' may have several items with the same availName
714         -- E.g  import Ix( Ix(..), index )
715         -- will give Ix(Ix,index,range) and Ix(index)
716         -- We want to combine these; addAvail does that
717 mkAvailEnv avails = foldl addAvail emptyAvailEnv avails
718
719 -- After combining the avails, we need to ensure that the parent name is the
720 -- first entry in the list of subnames, if it is included at all.  (Subsequent
721 -- functions rely on that.)
722 normaliseAvail :: AvailInfo -> AvailInfo
723 normaliseAvail avail@(Avail _)     = avail
724 normaliseAvail (AvailTC name subs) = AvailTC name subs'
725   where
726     subs' = if name `elem` subs then name : (delete name subs) else subs
727
728 -- | combines 'AvailInfo's from the same family
729 nubAvails :: [AvailInfo] -> [AvailInfo]
730 nubAvails avails = map normaliseAvail . nameEnvElts . mkAvailEnv $ avails
731 \end{code}
732
733
734 %************************************************************************
735 %*                                                                      *
736 \subsection{Export list processing}
737 %*                                                                      *
738 %************************************************************************
739
740 Processing the export list.
741
742 You might think that we should record things that appear in the export
743 list as ``occurrences'' (using @addOccurrenceName@), but you'd be
744 wrong.  We do check (here) that they are in scope, but there is no
745 need to slurp in their actual declaration (which is what
746 @addOccurrenceName@ forces).
747
748 Indeed, doing so would big trouble when compiling @PrelBase@, because
749 it re-exports @GHC@, which includes @takeMVar#@, whose type includes
750 @ConcBase.StateAndSynchVar#@, and so on...
751
752 \begin{code}
753 type ExportAccum        -- The type of the accumulating parameter of
754                         -- the main worker function in rnExports
755      = ([LIE Name],             -- Export items with Names
756         ExportOccMap,           -- Tracks exported occurrence names
757         [AvailInfo])            -- The accumulated exported stuff
758                                 --   Not nub'd!
759
760 emptyExportAccum :: ExportAccum
761 emptyExportAccum = ([], emptyOccEnv, []) 
762
763 type ExportOccMap = OccEnv (Name, IE RdrName)
764         -- Tracks what a particular exported OccName
765         --   in an export list refers to, and which item
766         --   it came from.  It's illegal to export two distinct things
767         --   that have the same occurrence name
768
769 rnExports :: Bool       -- False => no 'module M(..) where' header at all
770           -> Maybe [LIE RdrName]        -- Nothing => no explicit export list
771           -> TcGblEnv
772           -> RnM TcGblEnv
773
774         -- Complains if two distinct exports have same OccName
775         -- Warns about identical exports.
776         -- Complains about exports items not in scope
777
778 rnExports explicit_mod exports 
779           tcg_env@(TcGblEnv { tcg_mod     = this_mod,
780                               tcg_rdr_env = rdr_env, 
781                               tcg_imports = imports })
782  = do   {  
783         -- If the module header is omitted altogether, then behave
784         -- as if the user had written "module Main(main) where..."
785         -- EXCEPT in interactive mode, when we behave as if he had
786         -- written "module Main where ..."
787         -- Reason: don't want to complain about 'main' not in scope
788         --         in interactive mode
789         ; dflags <- getDOpts
790         ; let real_exports 
791                  | explicit_mod = exports
792                  | ghcLink dflags == LinkInMemory = Nothing
793                  | otherwise = Just ([noLoc (IEVar main_RDR_Unqual)])
794                         -- ToDo: the 'noLoc' here is unhelpful if 'main' 
795                         --       turns out to be out of scope
796
797         ; (rn_exports, avails) <- exports_from_avail real_exports rdr_env imports this_mod
798         ; let final_avails = nubAvails avails        -- Combine families
799         
800         ; return (tcg_env { tcg_exports    = final_avails,
801                             tcg_rn_exports = case tcg_rn_exports tcg_env of
802                                                 Nothing -> Nothing
803                                                 Just _  -> rn_exports,
804                             tcg_dus = tcg_dus tcg_env `plusDU` 
805                                       usesOnly (availsToNameSet final_avails) }) }
806
807
808 exports_from_avail :: Maybe [LIE RdrName]
809                          -- Nothing => no explicit export list
810                    -> GlobalRdrEnv
811                    -> ImportAvails
812                    -> Module
813                    -> RnM (Maybe [LIE Name], [AvailInfo])
814
815 exports_from_avail Nothing rdr_env _imports _this_mod
816  = -- The same as (module M) where M is the current module name,
817    -- so that's how we handle it.
818    let
819        avails = [ greAvail gre | gre <- globalRdrEnvElts rdr_env,
820                                  isLocalGRE gre ]
821    in
822    return (Nothing, avails)
823
824 exports_from_avail (Just rdr_items) rdr_env imports this_mod
825   = do (ie_names, _, exports) <- foldlM do_litem emptyExportAccum rdr_items
826
827        return (Just ie_names, exports)
828   where
829     do_litem :: ExportAccum -> LIE RdrName -> RnM ExportAccum
830     do_litem acc lie = setSrcSpan (getLoc lie) (exports_from_item acc lie)
831
832     kids_env :: NameEnv [Name]  -- Maps a parent to its in-scope children
833     kids_env = mkChildEnv (globalRdrEnvElts rdr_env)
834
835     imported_modules = [ qual_name
836                        | xs <- moduleEnvElts $ imp_mods imports,
837                          (qual_name, _, _) <- xs ]
838
839     exports_from_item :: ExportAccum -> LIE RdrName -> RnM ExportAccum
840     exports_from_item acc@(ie_names, occs, exports) 
841                       (L loc ie@(IEModuleContents mod))
842         | let earlier_mods = [ mod | (L _ (IEModuleContents mod)) <- ie_names ]
843         , mod `elem` earlier_mods       -- Duplicate export of M
844         = do { warn_dup_exports <- doptM Opt_WarnDuplicateExports ;
845                warnIf warn_dup_exports (dupModuleExport mod) ;
846                return acc }
847
848         | otherwise
849         = do { implicit_prelude <- doptM Opt_ImplicitPrelude
850          ; let { exportValid = (mod `elem` imported_modules)
851                             || (moduleName this_mod == mod)
852                ; gres = filter (isModuleExported implicit_prelude mod)
853                                (globalRdrEnvElts rdr_env)
854                }
855
856          ; checkErr exportValid (moduleNotImported mod)
857              ; warnIf (exportValid && null gres) (nullModuleExport mod)
858
859              ; occs' <- check_occs ie occs (map gre_name gres)
860                       -- This check_occs not only finds conflicts
861                       -- between this item and others, but also
862                       -- internally within this item.  That is, if
863                       -- 'M.x' is in scope in several ways, we'll have
864                       -- several members of mod_avails with the same
865                       -- OccName.
866              ; return (L loc (IEModuleContents mod) : ie_names,
867                        occs', map greAvail gres ++ exports) }
868
869     exports_from_item acc@(lie_names, occs, exports) (L loc ie)
870         | isDoc ie
871         = do new_ie <- lookup_doc_ie ie
872              return (L loc new_ie : lie_names, occs, exports)
873
874         | otherwise
875         = do (new_ie, avail) <- lookup_ie ie
876              if isUnboundName (ieName new_ie)
877                   then return acc       -- Avoid error cascade
878                   else do
879
880              occs' <- check_occs ie occs (availNames avail)
881
882              return (L loc new_ie : lie_names, occs', avail : exports)
883
884     -------------
885     lookup_ie :: IE RdrName -> RnM (IE Name, AvailInfo)
886     lookup_ie (IEVar rdr) 
887         = do gre <- lookupGreRn rdr
888              return (IEVar (gre_name gre), greAvail gre)
889
890     lookup_ie (IEThingAbs rdr) 
891         = do gre <- lookupGreRn rdr
892              let name = gre_name gre
893              case gre_par gre of
894                 NoParent   -> return (IEThingAbs name, 
895                                       AvailTC name [name])
896                 ParentIs p -> return (IEThingAbs name, 
897                                       AvailTC p [name])
898
899     lookup_ie ie@(IEThingAll rdr) 
900         = do name <- lookupGlobalOccRn rdr
901              let kids = findChildren kids_env name
902              when (null kids)
903                   (if (isTyConName name) then addWarn (dodgyExportWarn name)
904                                 -- This occurs when you export T(..), but
905                                 -- only import T abstractly, or T is a synonym.  
906                    else addErr (exportItemErr ie))
907                         
908              return (IEThingAll name, AvailTC name (name:kids))
909
910     lookup_ie ie@(IEThingWith rdr sub_rdrs)
911         = do name <- lookupGlobalOccRn rdr
912              if isUnboundName name
913                 then return (IEThingWith name [], AvailTC name [name])
914                 else do
915              let env = mkOccEnv [ (nameOccName s, s) 
916                                 | s <- findChildren kids_env name ]
917                  mb_names = map (lookupOccEnv env . rdrNameOcc) sub_rdrs
918              if any isNothing mb_names
919                 then do addErr (exportItemErr ie)
920                         return (IEThingWith name [], AvailTC name [name])
921                 else do let names = catMaybes mb_names
922                         optTyFam <- doptM Opt_TypeFamilies
923                         when (not optTyFam && any isTyConName names) $
924                           addErr (typeItemErr ( head
925                                               . filter isTyConName 
926                                               $ names )
927                                               (text "in export list"))
928                         return (IEThingWith name names, AvailTC name (name:names))
929
930     lookup_ie _ = panic "lookup_ie"     -- Other cases covered earlier
931
932     -------------
933     lookup_doc_ie :: IE RdrName -> RnM (IE Name)
934     lookup_doc_ie (IEGroup lev doc) = do rn_doc <- rnHsDoc doc
935                                          return (IEGroup lev rn_doc)
936     lookup_doc_ie (IEDoc doc)       = do rn_doc <- rnHsDoc doc
937                                          return (IEDoc rn_doc)
938     lookup_doc_ie (IEDocNamed str)  = return (IEDocNamed str)
939     lookup_doc_ie _ = panic "lookup_doc_ie"     -- Other cases covered earlier
940
941
942 isDoc :: IE RdrName -> Bool
943 isDoc (IEDoc _)      = True
944 isDoc (IEDocNamed _) = True
945 isDoc (IEGroup _ _)  = True
946 isDoc _ = False
947
948 -------------------------------
949 isModuleExported :: Bool -> ModuleName -> GlobalRdrElt -> Bool
950 -- True if the thing is in scope *both* unqualified, *and* with qualifier M
951 isModuleExported implicit_prelude mod (GRE { gre_name = name, gre_prov = prov })
952   | implicit_prelude && isBuiltInSyntax name = False
953         -- Optimisation: filter out names for built-in syntax
954         -- They just clutter up the environment (esp tuples), and the parser
955         -- will generate Exact RdrNames for them, so the cluttered
956         -- envt is no use.  To avoid doing this filter all the time,
957         -- we use -XNoImplicitPrelude as a clue that the filter is
958         -- worth while.  Really, it's only useful for GHC.Base and GHC.Tuple.
959         --
960         -- It's worth doing because it makes the environment smaller for
961         -- every module that imports the Prelude
962   | otherwise
963   = case prov of
964         LocalDef | Just name_mod <- nameModule_maybe name
965                  -> moduleName name_mod == mod
966                  | otherwise -> False
967         Imported is -> any unQualSpecOK is && any (qualSpecOK mod) is
968
969 -------------------------------
970 check_occs :: IE RdrName -> ExportOccMap -> [Name] -> RnM ExportOccMap
971 check_occs ie occs names
972   = foldlM check occs names
973   where
974     check occs name
975       = case lookupOccEnv occs name_occ of
976           Nothing -> return (extendOccEnv occs name_occ (name, ie))
977
978           Just (name', ie') 
979             | name == name'     -- Duplicate export
980             ->  do { warn_dup_exports <- doptM Opt_WarnDuplicateExports ;
981                      warnIf warn_dup_exports (dupExportWarn name_occ ie ie') ;
982                      return occs }
983
984             | otherwise         -- Same occ name but different names: an error
985             ->  do { global_env <- getGlobalRdrEnv ;
986                      addErr (exportClashErr global_env name' name ie' ie) ;
987                      return occs }
988       where
989         name_occ = nameOccName name
990 \end{code}
991
992 %*********************************************************
993 %*                                                       *
994                 Deprecations
995 %*                                                       *
996 %*********************************************************
997
998 \begin{code}
999 finishWarnings :: DynFlags -> Maybe WarningTxt 
1000                -> TcGblEnv -> RnM TcGblEnv
1001 -- (a) Report usage of imports that are deprecated or have other warnings
1002 -- (b) If the whole module is warned about or deprecated, update tcg_warns
1003 --     All this happens only once per module
1004 finishWarnings dflags mod_warn tcg_env
1005   = do  { (eps,hpt) <- getEpsAndHpt
1006         ; ifOptM Opt_WarnWarningsDeprecations $
1007           mapM_ (check hpt (eps_PIT eps)) all_gres
1008                 -- By this time, typechecking is complete, 
1009                 -- so the PIT is fully populated
1010
1011         -- Deal with a module deprecation; it overrides all existing warns
1012         ; let new_warns = case mod_warn of
1013                                 Just txt -> WarnAll txt
1014                                 Nothing  -> tcg_warns tcg_env
1015         ; return (tcg_env { tcg_warns = new_warns }) }
1016   where
1017     used_names = allUses (tcg_dus tcg_env) 
1018         -- Report on all deprecated uses; hence allUses
1019     all_gres   = globalRdrEnvElts (tcg_rdr_env tcg_env)
1020
1021     check hpt pit gre@(GRE {gre_name = name, gre_prov = Imported (imp_spec:_)})
1022       | name `elemNameSet` used_names
1023       , Just deprec_txt <- lookupImpDeprec dflags hpt pit gre
1024       = addWarnAt (importSpecLoc imp_spec)
1025                   (sep [ptext (sLit "In the use of") <+> 
1026                         pprNonVarNameSpace (occNameSpace (nameOccName name)) <+> 
1027                         quotes (ppr name),
1028                       (parens imp_msg) <> colon,
1029                       (ppr deprec_txt) ])
1030         where
1031           name_mod = ASSERT2( isExternalName name, ppr name ) nameModule name
1032           imp_mod  = importSpecModule imp_spec
1033           imp_msg  = ptext (sLit "imported from") <+> ppr imp_mod <> extra
1034           extra | imp_mod == moduleName name_mod = empty
1035                 | otherwise = ptext (sLit ", but defined in") <+> ppr name_mod
1036
1037     check _ _ _ = return ()     -- Local, or not used, or not deprectated
1038             -- The Imported pattern-match: don't deprecate locally defined names
1039             -- For a start, we may be exporting a deprecated thing
1040             -- Also we may use a deprecated thing in the defn of another
1041             -- deprecated things.  We may even use a deprecated thing in
1042             -- the defn of a non-deprecated thing, when changing a module's 
1043             -- interface
1044
1045 lookupImpDeprec :: DynFlags -> HomePackageTable -> PackageIfaceTable 
1046                 -> GlobalRdrElt -> Maybe WarningTxt
1047 -- The name is definitely imported, so look in HPT, PIT
1048 lookupImpDeprec dflags hpt pit gre
1049   = case lookupIfaceByModule dflags hpt pit mod of
1050         Just iface -> mi_warn_fn iface name `mplus`     -- Bleat if the thing, *or
1051                       case gre_par gre of       
1052                         ParentIs p -> mi_warn_fn iface p        -- its parent*, is warn'd
1053                         NoParent   -> Nothing
1054
1055         Nothing -> Nothing      -- See Note [Used names with interface not loaded]
1056   where
1057     name = gre_name gre
1058     mod = ASSERT2( isExternalName name, ppr name ) nameModule name
1059 \end{code}
1060
1061 Note [Used names with interface not loaded]
1062 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1063 By now all the interfaces should have been loaded,
1064 because reportDeprecations happens after typechecking.
1065 However, it's still (just) possible to to find a used 
1066 Name whose interface hasn't been loaded:
1067
1068 a) It might be a WiredInName; in that case we may not load 
1069    its interface (although we could).
1070
1071 b) It might be GHC.Real.fromRational, or GHC.Num.fromInteger
1072    These are seen as "used" by the renamer (if -XNoImplicitPrelude) 
1073    is on), but the typechecker may discard their uses 
1074    if in fact the in-scope fromRational is GHC.Read.fromRational,
1075    (see tcPat.tcOverloadedLit), and the typechecker sees that the type 
1076    is fixed, say, to GHC.Base.Float (see Inst.lookupSimpleInst).
1077    In that obscure case it won't force the interface in.
1078
1079 In both cases we simply don't permit deprecations; 
1080 this is, after all, wired-in stuff.
1081
1082
1083 %*********************************************************
1084 %*                                                       *
1085                 Unused names
1086 %*                                                       *
1087 %*********************************************************
1088
1089 \begin{code}
1090 reportUnusedNames :: Maybe [LIE RdrName]        -- Export list
1091                   -> TcGblEnv -> RnM ()
1092 reportUnusedNames export_decls gbl_env 
1093   = do  { traceRn ((text "RUN") <+> (ppr (tcg_dus gbl_env)))
1094         ; warnUnusedTopBinds   unused_locals
1095         ; warnUnusedModules    unused_imp_mods
1096         ; warnUnusedImports    unused_imports   
1097         ; warnDuplicateImports defined_and_used
1098         ; printMinimalImports  minimal_imports }
1099   where
1100     used_names :: NameSet
1101     used_names = findUses (tcg_dus gbl_env) emptyNameSet
1102         -- NB: currently, if f x = g, we only treat 'g' as used if 'f' is used
1103         -- Hence findUses
1104
1105         -- Collect the defined names from the in-scope environment
1106     defined_names :: [GlobalRdrElt]
1107     defined_names = globalRdrEnvElts (tcg_rdr_env gbl_env)
1108
1109         -- Note that defined_and_used, defined_but_not_used
1110         -- are both [GRE]; that's why we need defined_and_used
1111         -- rather than just used_names
1112     defined_and_used, defined_but_not_used :: [GlobalRdrElt]
1113     (defined_and_used, defined_but_not_used) 
1114         = partition (gre_is_used used_names) defined_names
1115     
1116     kids_env = mkChildEnv defined_names
1117         -- This is done in mkExports too; duplicated work
1118
1119     gre_is_used :: NameSet -> GlobalRdrElt -> Bool
1120     gre_is_used used_names (GRE {gre_name = name})
1121         = name `elemNameSet` used_names
1122           || any (`elemNameSet` used_names) (findChildren kids_env name)
1123                 -- A use of C implies a use of T,
1124                 -- if C was brought into scope by T(..) or T(C)
1125
1126         -- Filter out the ones that are 
1127         --  (a) defined in this module, and
1128         --  (b) not defined by a 'deriving' clause 
1129         -- The latter have an Internal Name, so we can filter them out easily
1130     unused_locals :: [GlobalRdrElt]
1131     unused_locals = filter is_unused_local defined_but_not_used
1132     is_unused_local :: GlobalRdrElt -> Bool
1133     is_unused_local gre = isLocalGRE gre && isExternalName (gre_name gre)
1134     
1135     unused_imports :: [GlobalRdrElt]    
1136     unused_imports = mapCatMaybes unused_imp defined_but_not_used
1137     unused_imp :: GlobalRdrElt -> Maybe GlobalRdrElt    -- Result has trimmed Imported provenances
1138     unused_imp (GRE {gre_prov = LocalDef}) = Nothing
1139     unused_imp gre@(GRE {gre_prov = Imported imp_specs}) 
1140         | null trimmed_specs = Nothing
1141         | otherwise          = Just (gre {gre_prov = Imported trimmed_specs})
1142         where
1143           trimmed_specs = filter report_if_unused imp_specs
1144     
1145     -- To figure out the minimal set of imports, start with the things
1146     -- that are in scope (i.e. in gbl_env).  Then just combine them
1147     -- into a bunch of avails, so they are properly grouped
1148     --
1149     -- BUG WARNING: this does not deal properly with qualified imports!
1150     minimal_imports :: FiniteMap ModuleName AvailEnv
1151     minimal_imports0 = foldr add_expall   emptyFM          expall_mods
1152     minimal_imports1 = foldr add_name     minimal_imports0 defined_and_used
1153     minimal_imports  = foldr add_inst_mod minimal_imports1 direct_import_mods
1154         -- The last line makes sure that we retain all direct imports
1155         -- even if we import nothing explicitly.
1156         -- It's not necessarily redundant to import such modules. Consider 
1157         --            module This
1158         --              import M ()
1159         --
1160         -- The import M() is not *necessarily* redundant, even if
1161         -- we suck in no instance decls from M (e.g. it contains 
1162         -- no instance decls, or This contains no code).  It may be 
1163         -- that we import M solely to ensure that M's orphan instance 
1164         -- decls (or those in its imports) are visible to people who 
1165         -- import This.  Sigh. 
1166         -- There's really no good way to detect this, so the error message 
1167         -- in RnEnv.warnUnusedModules is weakened instead
1168     
1169         -- We've carefully preserved the provenance so that we can
1170         -- construct minimal imports that import the name by (one of)
1171         -- the same route(s) as the programmer originally did.
1172     add_name gre@(GRE {gre_prov = Imported (imp_spec:_)}) acc 
1173         = addToFM_C plusAvailEnv acc 
1174                     (importSpecModule imp_spec) (unitAvailEnv (greAvail gre))
1175     add_name _ acc = acc        -- Local
1176
1177         -- Modules mentioned as 'module M' in the export list
1178     expall_mods = case export_decls of
1179                     Nothing -> []
1180                     Just es -> [m | L _ (IEModuleContents m) <- es]
1181
1182         -- This is really bogus.  The idea is that if we see 'module M' in 
1183         -- the export list we must retain the import decls that drive it
1184         -- If we aren't careful we might see
1185         --      module A( module M ) where
1186         --        import M
1187         --        import N
1188         -- and suppose that N exports everything that M does.  Then we 
1189         -- must not drop the import of M even though N brings it all into
1190         -- scope.
1191         --
1192         -- BUG WARNING: 'module M' exports aside, what if M.x is mentioned?!
1193         --
1194         -- The reason that add_expall is bogus is that it doesn't take
1195         -- qualified imports into account.  But it's an improvement.
1196     add_expall mod acc = addToFM_C plusAvailEnv acc mod emptyAvailEnv
1197
1198     add_inst_mod (mod, _) acc 
1199       | mod_name `elemFM` acc = acc     -- We import something already
1200       | otherwise             = addToFM acc mod_name emptyAvailEnv
1201       where
1202         mod_name = moduleName mod
1203         -- Add an empty collection of imports for a module
1204         -- from which we have sucked only instance decls
1205    
1206     imports = tcg_imports gbl_env
1207
1208     direct_import_mods :: [(Module, [(ModuleName, Bool, SrcSpan)])]
1209         -- See the type of the imp_mods for this triple
1210     direct_import_mods = fmToList (imp_mods imports)
1211
1212     -- unused_imp_mods are the directly-imported modules 
1213     -- that are not mentioned in minimal_imports1
1214     -- [Note: not 'minimal_imports', because that includes directly-imported
1215     --        modules even if we use nothing from them; see notes above]
1216     --
1217     -- BUG WARNING: this code is generally buggy
1218     unused_imp_mods :: [(ModuleName, SrcSpan)]
1219     unused_imp_mods = [(mod_name,loc)
1220                     | (mod, xs) <- direct_import_mods,
1221                       (_, no_imp, loc) <- xs,
1222                        let mod_name = moduleName mod,
1223                        not (mod_name `elemFM` minimal_imports1),
1224                        moduleName mod /= pRELUDE_NAME,
1225                              -- XXX not really correct, but we don't want
1226                              -- to generate warnings when compiling against
1227                              -- a compat version of base.
1228                        not no_imp]
1229         -- The not no_imp part is not to complain about
1230         -- import M (), which is an idiom for importing
1231         -- instance declarations
1232     
1233     module_unused :: ModuleName -> Bool
1234     module_unused mod = any (((==) mod) . fst) unused_imp_mods
1235
1236     report_if_unused :: ImportSpec -> Bool
1237         -- Do we want to report this as an unused import?  
1238     report_if_unused (ImpSpec {is_decl = d, is_item = i})
1239         = not (module_unused (is_mod d)) -- Not if we've already said entire import is unused
1240           && isExplicitItem i            -- Only if the import was explicit
1241                         
1242 ---------------------
1243 warnDuplicateImports :: [GlobalRdrElt] -> RnM ()
1244 -- Given the GREs for names that are used, figure out which imports 
1245 -- could be omitted without changing the top-level environment.
1246 --
1247 -- NB: Given import Foo( T )
1248 --           import qualified Foo
1249 -- we do not report a duplicate import, even though Foo.T is brought
1250 -- into scope by both, because there's nothing you can *omit* without
1251 -- changing the top-level environment.  So we complain only if it's
1252 -- explicitly named in both imports or neither.
1253 --
1254 -- Furthermore, we complain about Foo.T only if 
1255 -- there is no complaint about (unqualified) T
1256
1257 warnDuplicateImports gres
1258   = ifOptM Opt_WarnUnusedImports $ 
1259     sequence_   [ warn name pr
1260                 | GRE { gre_name = name, gre_prov = Imported imps } <- gres
1261                 , pr <- redundants imps ]
1262   where
1263     warn name (red_imp, cov_imp)
1264         = addWarnAt (importSpecLoc red_imp)
1265             (vcat [ptext (sLit "Redundant import of:") <+> quotes pp_name,
1266                    ptext (sLit "It is also") <+> ppr cov_imp])
1267         where
1268           pp_name | is_qual red_decl = ppr (is_as red_decl) <> dot <> ppr occ
1269                   | otherwise       = ppr occ
1270           occ = nameOccName name
1271           red_decl = is_decl red_imp
1272     
1273     redundants :: [ImportSpec] -> [(ImportSpec,ImportSpec)]
1274         -- The returned pair is (redundant-import, covering-import)
1275     redundants imps 
1276         = [ (red_imp, cov_imp) 
1277           | red_imp <- imps
1278           , isExplicitItem (is_item red_imp)
1279                 -- Complain only about redundant imports
1280                 -- mentioned explicitly by the user                             
1281           , cov_imp <- take 1 (filter (covers red_imp) imps) ]
1282                         -- The 'take 1' picks the first offending group
1283                         -- for this particular name
1284
1285         -- "red_imp" is a putative redundant import
1286         -- "cov_imp" potentially covers it
1287         -- This test decides whether red_imp could be dropped 
1288         --
1289         -- NOTE: currently the test does not warn about
1290         --              import M( x )
1291         --              import N( x )
1292         -- even if the same underlying 'x' is involved, because dropping
1293         -- either import would change the qualified names in scope (M.x, N.x)
1294         -- But if the qualified names aren't used, the import is indeed redundant
1295         -- Sadly we don't know that.  Oh well.
1296     covers red_imp@(ImpSpec { is_decl = red_decl }) 
1297            cov_imp@(ImpSpec { is_decl = cov_decl, is_item = cov_item })
1298         | red_loc == cov_loc
1299         = False         -- Ignore diagonal elements
1300         | not (is_as red_decl == is_as cov_decl)
1301         = False         -- They bring into scope different qualified names
1302         | not (is_qual red_decl) && is_qual cov_decl
1303         = False         -- Covering one doesn't bring unqualified name into scope
1304         | otherwise
1305         = not (isExplicitItem cov_item) -- Redundant one is selective and covering one isn't
1306           || red_later                  -- or both are explicit; tie-break using red_later
1307 {-
1308         | red_selective
1309         = not cov_selective     -- Redundant one is selective and covering one isn't
1310           || red_later          -- Both are explicit; tie-break using red_later
1311         | otherwise             
1312         = not cov_selective     -- Neither import is selective
1313           && (is_mod red_decl == is_mod cov_decl)       -- They import the same module
1314           && red_later          -- Tie-break
1315 -}
1316         where
1317           red_loc   = importSpecLoc red_imp
1318           cov_loc   = importSpecLoc cov_imp
1319           red_later = red_loc > cov_loc
1320
1321 -- ToDo: deal with original imports with 'qualified' and 'as M' clauses
1322 printMinimalImports :: FiniteMap ModuleName AvailEnv    -- Minimal imports
1323                     -> RnM ()
1324 printMinimalImports imps
1325  = ifOptM Opt_D_dump_minimal_imports $ do {
1326
1327    mod_ies  <-  initIfaceTcRn $ mapM to_ies (fmToList imps) ;
1328    this_mod <- getModule ;
1329    rdr_env  <- getGlobalRdrEnv ;
1330    dflags   <- getDOpts ;
1331    liftIO $ do h <- openFile (mkFilename this_mod) WriteMode
1332                printForUser h (mkPrintUnqualified dflags rdr_env)
1333                               (vcat (map ppr_mod_ie mod_ies))
1334    }
1335   where
1336     mkFilename this_mod = moduleNameString (moduleName this_mod) ++ ".imports"
1337     ppr_mod_ie (mod_name, ies) 
1338         | mod_name == moduleName pRELUDE
1339         = empty
1340         | null ies      -- Nothing except instances comes from here
1341         = ptext (sLit "import") <+> ppr mod_name <> ptext (sLit "()    -- Instances only")
1342         | otherwise
1343         = ptext (sLit "import") <+> ppr mod_name <> 
1344                     parens (fsep (punctuate comma (map ppr ies)))
1345
1346     to_ies (mod, avail_env) = do ies <- mapM to_ie (availEnvElts avail_env)
1347                                  return (mod, ies)
1348
1349     to_ie :: AvailInfo -> IfG (IE Name)
1350         -- The main trick here is that if we're importing all the constructors
1351         -- we want to say "T(..)", but if we're importing only a subset we want
1352         -- to say "T(A,B,C)".  So we have to find out what the module exports.
1353     to_ie (Avail n)       = return (IEVar n)
1354     to_ie (AvailTC n [m]) = ASSERT( n==m ) 
1355                             return (IEThingAbs n)
1356     to_ie (AvailTC n ns)  = do
1357           iface <- loadSysInterface doc n_mod
1358           case [xs | (m,as) <- mi_exports iface,
1359                      m == n_mod,
1360                      AvailTC x xs <- as, 
1361                      x == nameOccName n] of
1362               [xs] | all_used xs -> return (IEThingAll n)
1363                    | otherwise   -> return (IEThingWith n (filter (/= n) ns))
1364               other              -> pprTrace "to_ie" (ppr n <+> ppr n_mod <+> ppr other) $
1365                                     return (IEVar n)
1366         where
1367           all_used avail_occs = all (`elem` map nameOccName ns) avail_occs
1368           doc = text "Compute minimal imports from" <+> ppr n
1369           n_mod = ASSERT( isExternalName n ) nameModule n
1370 \end{code}
1371
1372
1373 %************************************************************************
1374 %*                                                                      *
1375 \subsection{Errors}
1376 %*                                                                      *
1377 %************************************************************************
1378
1379 \begin{code}
1380 badImportItemErr :: ModIface -> ImpDeclSpec -> IE RdrName -> SDoc
1381 badImportItemErr iface decl_spec ie
1382   = sep [ptext (sLit "Module"), quotes (ppr (is_mod decl_spec)), source_import,
1383          ptext (sLit "does not export"), quotes (ppr ie)]
1384   where
1385     source_import | mi_boot iface = ptext (sLit "(hi-boot interface)")
1386                   | otherwise     = empty
1387
1388 illegalImportItemErr :: SDoc
1389 illegalImportItemErr = ptext (sLit "Illegal import item")
1390
1391 dodgyImportWarn :: RdrName -> SDoc
1392 dodgyImportWarn item = dodgyMsg (ptext (sLit "import")) item
1393 dodgyExportWarn :: Name -> SDoc
1394 dodgyExportWarn item = dodgyMsg (ptext (sLit "export")) item
1395
1396 dodgyMsg :: OutputableBndr n => SDoc -> n -> SDoc
1397 dodgyMsg kind tc
1398   = sep [ ptext (sLit "The") <+> kind <+> ptext (sLit "item") <+> quotes (ppr (IEThingAll tc))
1399                 <+> ptext (sLit "suggests that"),
1400           quotes (ppr tc) <+> ptext (sLit "has (in-scope) constructors or class methods,"),
1401           ptext (sLit "but it has none") ]
1402
1403 exportItemErr :: IE RdrName -> SDoc
1404 exportItemErr export_item
1405   = sep [ ptext (sLit "The export item") <+> quotes (ppr export_item),
1406           ptext (sLit "attempts to export constructors or class methods that are not visible here") ]
1407
1408 typeItemErr :: Name -> SDoc -> SDoc
1409 typeItemErr name wherestr
1410   = sep [ ptext (sLit "Using 'type' tag on") <+> quotes (ppr name) <+> wherestr,
1411           ptext (sLit "Use -XTypeFamilies to enable this extension") ]
1412
1413 exportClashErr :: GlobalRdrEnv -> Name -> Name -> IE RdrName -> IE RdrName
1414                -> Message
1415 exportClashErr global_env name1 name2 ie1 ie2
1416   = vcat [ ptext (sLit "Conflicting exports for") <+> quotes (ppr occ) <> colon
1417          , ppr_export ie1' name1'
1418          , ppr_export ie2' name2' ]
1419   where
1420     occ = nameOccName name1
1421     ppr_export ie name = nest 2 (quotes (ppr ie) <+> ptext (sLit "exports") <+> 
1422                                  quotes (ppr name) <+> pprNameProvenance (get_gre name))
1423
1424         -- get_gre finds a GRE for the Name, so that we can show its provenance
1425     get_gre name
1426         = case lookupGRE_Name global_env name of
1427              (gre:_) -> gre
1428              []      -> pprPanic "exportClashErr" (ppr name)
1429     get_loc name = nameSrcLoc $ gre_name $ get_gre name
1430     (name1', ie1', name2', ie2') = if get_loc name1 < get_loc name2
1431                                    then (name1, ie1, name2, ie2)
1432                                    else (name2, ie2, name1, ie1)
1433
1434 addDupDeclErr :: [Name] -> TcRn ()
1435 addDupDeclErr []
1436   = panic "addDupDeclErr: empty list"
1437 addDupDeclErr names@(name : _)
1438   = addErrAt (getSrcSpan (last sorted_names)) $
1439         -- Report the error at the later location
1440     vcat [ptext (sLit "Multiple declarations of") <+> quotes (ppr name),
1441           ptext (sLit "Declared at:") <+> vcat (map (ppr . nameSrcLoc) sorted_names)]
1442   where
1443     sorted_names = sortWith nameSrcLoc names
1444
1445 dupExportWarn :: OccName -> IE RdrName -> IE RdrName -> SDoc
1446 dupExportWarn occ_name ie1 ie2
1447   = hsep [quotes (ppr occ_name), 
1448           ptext (sLit "is exported by"), quotes (ppr ie1),
1449           ptext (sLit "and"),            quotes (ppr ie2)]
1450
1451 dupModuleExport :: ModuleName -> SDoc
1452 dupModuleExport mod
1453   = hsep [ptext (sLit "Duplicate"),
1454           quotes (ptext (sLit "Module") <+> ppr mod), 
1455           ptext (sLit "in export list")]
1456
1457 moduleNotImported :: ModuleName -> SDoc
1458 moduleNotImported mod
1459   = ptext (sLit "The export item `module") <+> ppr mod <>
1460     ptext (sLit "' is not imported")
1461
1462 nullModuleExport :: ModuleName -> SDoc
1463 nullModuleExport mod
1464   = ptext (sLit "The export item `module") <+> ppr mod <> ptext (sLit "' exports nothing")
1465
1466 moduleWarn :: ModuleName -> WarningTxt -> SDoc
1467 moduleWarn mod (WarningTxt txt)
1468   = sep [ ptext (sLit "Module") <+> quotes (ppr mod) <> ptext (sLit ":"), 
1469           nest 4 (ppr txt) ]
1470 moduleWarn mod (DeprecatedTxt txt)
1471   = sep [ ptext (sLit "Module") <+> quotes (ppr mod)
1472                                 <+> ptext (sLit "is deprecated:"), 
1473           nest 4 (ppr txt) ]
1474
1475 implicitPreludeWarn :: SDoc
1476 implicitPreludeWarn
1477   = ptext (sLit "Module `Prelude' implicitly imported")
1478
1479 packageImportErr :: SDoc
1480 packageImportErr
1481   = ptext (sLit "Package-qualified imports are not enabled; use -XPackageImports")
1482 \end{code}