Added error checks & fixed bugs
[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, mkRdrEnvAndImports, importsFromLocalDecls,
9         rnExports, mkExportNameSet,
10         getLocalDeclBinders, extendRdrEnvRn,
11         reportUnusedNames, reportDeprecations
12     ) where
13
14 #include "HsVersions.h"
15
16 import DynFlags         ( DynFlag(..), GhcMode(..), DynFlags(..) )
17 import HsSyn            ( IE(..), ieName, ImportDecl(..), LImportDecl,
18                           ForeignDecl(..), HsGroup(..), HsValBinds(..),
19                           Sig(..), collectHsBindLocatedBinders, tyClDeclNames,
20                           instDeclATs, isIdxTyDecl,
21                           LIE )
22 import RnEnv
23 import IfaceEnv         ( ifaceExportNames )
24 import LoadIface        ( loadSrcInterface )
25 import TcRnMonad hiding (LIE)
26
27 import FiniteMap
28 import PrelNames
29 import Module
30 import Name             ( Name, nameSrcLoc, nameOccName, nameModule, isWiredInName,
31                           nameParent, nameParent_maybe, isExternalName,
32                           isBuiltInSyntax )
33 import NameSet
34 import NameEnv
35 import OccName          ( srcDataName, isTcOcc, pprNonVarNameSpace,
36                           occNameSpace,
37                           OccEnv, mkOccEnv, lookupOccEnv, emptyOccEnv,
38                           extendOccEnv )
39 import HscTypes         ( GenAvailInfo(..), AvailInfo,
40                           HomePackageTable, PackageIfaceTable, 
41                           mkPrintUnqualified,
42                           Deprecs(..), ModIface(..), Dependencies(..), 
43                           lookupIfaceByModule, ExternalPackageState(..)
44                         )
45 import RdrName          ( RdrName, rdrNameOcc, setRdrNameSpace, 
46                           GlobalRdrEnv, mkGlobalRdrEnv, GlobalRdrElt(..), 
47                           emptyGlobalRdrEnv, plusGlobalRdrEnv, globalRdrEnvElts,
48                           extendGlobalRdrEnv, lookupGlobalRdrEnv, unQualOK, lookupGRE_Name,
49                           Provenance(..), ImportSpec(..), ImpDeclSpec(..), ImpItemSpec(..), 
50                           importSpecLoc, importSpecModule, isLocalGRE, pprNameProvenance )
51 import Outputable
52 import UniqFM
53 import Maybes           ( isNothing, catMaybes, mapCatMaybes, seqMaybe, orElse )
54 import SrcLoc           ( Located(..), mkGeneralSrcSpan,
55                           unLoc, noLoc, srcLocSpan, SrcSpan )
56 import BasicTypes       ( DeprecTxt )
57 import DriverPhases     ( isHsBoot )
58 import Util             ( notNull )
59 import List             ( partition )
60 import IO               ( openFile, IOMode(..) )
61 import Monad            ( liftM )
62 \end{code}
63
64
65
66 %************************************************************************
67 %*                                                                      *
68                 rnImports
69 %*                                                                      *
70 %************************************************************************
71
72 \begin{code}
73 rnImports :: [LImportDecl RdrName] -> RnM [LImportDecl Name]
74 rnImports imports
75          -- PROCESS IMPORT DECLS
76          -- Do the non {- SOURCE -} ones first, so that we get a helpful
77          -- warning for {- SOURCE -} ones that are unnecessary
78     = do this_mod <- getModule
79          implicit_prelude <- doptM Opt_ImplicitPrelude
80          let all_imports               = mk_prel_imports this_mod implicit_prelude ++ imports
81              (source, ordinary) = partition is_source_import all_imports
82              is_source_import (L _ (ImportDecl _ is_boot _ _ _)) = is_boot
83              get_imports = rnImportDecl this_mod
84
85          stuff1 <- mapM get_imports ordinary
86          stuff2 <- mapM get_imports source
87          return (stuff1 ++ stuff2)
88     where
89 -- NB: opt_NoImplicitPrelude is slightly different to import Prelude ();
90 -- because the former doesn't even look at Prelude.hi for instance 
91 -- declarations, whereas the latter does.
92    mk_prel_imports this_mod implicit_prelude
93        |  this_mod == pRELUDE
94           || explicit_prelude_import
95           || not implicit_prelude
96            = []
97        | otherwise = [preludeImportDecl]
98    explicit_prelude_import
99        = notNull [ () | L _ (ImportDecl mod _ _ _ _) <- imports, 
100                    unLoc mod == pRELUDE_NAME ]
101
102 preludeImportDecl :: LImportDecl RdrName
103 preludeImportDecl
104   = L loc $
105         ImportDecl (L loc pRELUDE_NAME)
106                False {- Not a boot interface -}
107                False    {- Not qualified -}
108                Nothing  {- No "as" -}
109                Nothing  {- No import list -}
110   where
111     loc = mkGeneralSrcSpan FSLIT("Implicit import declaration")         
112
113 mkRdrEnvAndImports :: [LImportDecl Name] -> RnM (GlobalRdrEnv, ImportAvails)
114 mkRdrEnvAndImports imports
115   = do this_mod <- getModule
116        let get_imports = importsFromImportDecl this_mod
117        stuff <- mapM get_imports imports
118        let (imp_gbl_envs, imp_avails) = unzip stuff
119            gbl_env :: GlobalRdrEnv
120            gbl_env = foldr plusGlobalRdrEnv emptyGlobalRdrEnv imp_gbl_envs
121
122            all_avails :: ImportAvails
123            all_avails = foldr plusImportAvails emptyImportAvails imp_avails
124        -- ALL DONE
125        return (gbl_env, all_avails)
126
127 \end{code}
128         
129 \begin{code}
130 rnImportDecl :: Module
131              -> LImportDecl RdrName
132              -> RnM (LImportDecl Name)
133 rnImportDecl this_mod (L loc importDecl@(ImportDecl loc_imp_mod_name want_boot qual_only as_mod imp_details))
134     = setSrcSpan loc $
135       do iface <- loadSrcInterface doc imp_mod_name want_boot
136          let qual_mod_name = case as_mod of
137                                Nothing           -> imp_mod_name
138                                Just another_name -> another_name
139              imp_spec  = ImpDeclSpec { is_mod = imp_mod_name, is_qual = qual_only,  
140                                        is_dloc = loc, is_as = qual_mod_name }
141          total_avails <- ifaceExportNames (mi_exports iface)
142          importDecl' <- rnImportDecl' iface imp_spec importDecl total_avails
143          return (L loc importDecl')
144     where imp_mod_name = unLoc loc_imp_mod_name
145           doc = ppr imp_mod_name <+> ptext SLIT("is directly imported")
146
147 rnImportDecl' :: ModIface -> ImpDeclSpec -> ImportDecl RdrName -> NameSet -> RnM (ImportDecl Name)
148 rnImportDecl' iface decl_spec (ImportDecl mod_name want_boot qual_only as_mod Nothing) all_names
149     = return $ ImportDecl mod_name want_boot qual_only as_mod Nothing
150 rnImportDecl' iface decl_spec (ImportDecl mod_name want_boot qual_only as_mod (Just (want_hiding,import_items))) all_names
151     = do import_items_mbs <- mapM (srcSpanWrapper) import_items
152          let rn_import_items = concat . catMaybes $ import_items_mbs
153          return $ ImportDecl mod_name want_boot qual_only as_mod (Just (want_hiding,rn_import_items))
154     where
155     srcSpanWrapper (L span ieRdr)
156         = case get_item ieRdr of
157             Nothing
158                 -> do addErrAt span (badImportItemErr iface decl_spec ieRdr)
159                       return Nothing
160             Just ieNames
161                 -> return (Just [L span ie | ie <- ieNames])
162     occ_env :: OccEnv Name      -- Maps OccName to corresponding Name
163     occ_env = mkOccEnv [(nameOccName n, n) | n <- nameSetToList all_names]
164         -- This env will have entries for data constructors too,
165         -- they won't make any difference because naked entities like T
166         -- in an import list map to TcOccs, not VarOccs.
167
168     sub_env :: NameEnv [Name]
169     sub_env = mkSubNameEnv all_names
170
171     get_item :: IE RdrName -> Maybe [IE Name]
172         -- Empty result for a bad item.
173         -- Singleton result is typical case.
174         -- Can have two when we are hiding, and mention C which might be
175         --      both a class and a data constructor.  
176     get_item item@(IEModuleContents _) 
177         = Nothing
178     get_item (IEThingAll tc)
179         = do name <- check_name tc
180              return [IEThingAll name]
181     get_item (IEThingAbs tc)
182         | want_hiding   -- hiding ( C )
183                         -- Here the 'C' can be a data constructor 
184                         --  *or* a type/class, or even both
185             = case catMaybes [check_name tc, check_name (setRdrNameSpace tc srcDataName)] of
186                 []    -> Nothing
187                 names -> return [ IEThingAbs n | n <- names ]
188         | otherwise
189             = do name <- check_name tc
190                  return [IEThingAbs name]
191     get_item (IEThingWith n ns) -- import (C (A,B))
192         = do name <- check_name n
193              let env = mkOccEnv [(nameOccName s, s) | s <- subNames sub_env name]
194                  mb_names = map (lookupOccEnv env . rdrNameOcc) ns
195              names <- sequence mb_names
196              return [IEThingWith name names]
197     get_item (IEVar n)
198         = do name <- check_name n
199              return [IEVar name]
200
201     check_name :: RdrName -> Maybe Name
202     check_name rdrName
203         = lookupOccEnv occ_env (rdrNameOcc rdrName)
204
205
206 importsFromImportDecl :: Module
207                       -> LImportDecl Name
208                       -> RnM (GlobalRdrEnv, ImportAvails)
209
210 importsFromImportDecl this_mod
211         (L loc (ImportDecl loc_imp_mod_name want_boot qual_only as_mod imp_details))
212   = 
213     setSrcSpan loc $
214
215         -- If there's an error in loadInterface, (e.g. interface
216         -- file not found) we get lots of spurious errors from 'filterImports'
217     let
218         imp_mod_name = unLoc loc_imp_mod_name
219         doc = ppr imp_mod_name <+> ptext SLIT("is directly imported")
220     in
221     loadSrcInterface doc imp_mod_name want_boot `thenM` \ iface ->
222
223         -- Compiler sanity check: if the import didn't say
224         -- {-# SOURCE #-} we should not get a hi-boot file
225     WARN( not want_boot && mi_boot iface, ppr imp_mod_name )
226
227         -- Issue a user warning for a redundant {- SOURCE -} import
228         -- NB that we arrange to read all the ordinary imports before 
229         -- any of the {- SOURCE -} imports
230     warnIf (want_boot && not (mi_boot iface))
231            (warnRedundantSourceImport imp_mod_name)     `thenM_`
232
233     let
234         imp_mod = mi_module iface
235         deprecs = mi_deprecs iface
236         is_orph = mi_orphan iface 
237         deps    = mi_deps iface
238
239         filtered_exports = filter not_this_mod (mi_exports iface)
240         not_this_mod (mod,_) = mod /= this_mod
241         -- If the module exports anything defined in this module, just ignore it.
242         -- Reason: otherwise it looks as if there are two local definition sites
243         -- for the thing, and an error gets reported.  Easiest thing is just to
244         -- filter them out up front. This situation only arises if a module
245         -- imports itself, or another module that imported it.  (Necessarily,
246         -- this invoves a loop.)  
247         --
248         -- Tiresome consequence: if you say
249         --      module A where
250         --         import B( AType )
251         --         type AType = ...
252         --
253         --      module B( AType ) where
254         --         import {-# SOURCE #-} A( AType )
255         --
256         -- then you'll get a 'B does not export AType' message.  Oh well.
257
258         qual_mod_name = case as_mod of
259                           Nothing           -> imp_mod_name
260                           Just another_name -> another_name
261         imp_spec  = ImpDeclSpec { is_mod = imp_mod_name, is_qual = qual_only,  
262                                   is_dloc = loc, is_as = qual_mod_name }
263     in
264         -- Get the total imports, and filter them according to the import list
265     ifaceExportNames filtered_exports           `thenM` \ total_avails ->
266     filterImports iface imp_spec
267                   imp_details total_avails      `thenM` \ (avail_env, gbl_env) ->
268
269     getDOpts `thenM` \ dflags ->
270
271     let
272         -- Compute new transitive dependencies
273
274         orphans | is_orph   = ASSERT( not (imp_mod `elem` dep_orphs deps) )
275                               imp_mod : dep_orphs deps
276                 | otherwise = dep_orphs deps
277
278         pkg = modulePackageId (mi_module iface)
279
280         (dependent_mods, dependent_pkgs) 
281            | pkg == thisPackage dflags =
282                 -- Imported module is from the home package
283                 -- Take its dependent modules and add imp_mod itself
284                 -- Take its dependent packages unchanged
285                 --
286                 -- NB: (dep_mods deps) might include a hi-boot file
287                 -- for the module being compiled, CM. Do *not* filter
288                 -- this out (as we used to), because when we've
289                 -- finished dealing with the direct imports we want to
290                 -- know if any of them depended on CM.hi-boot, in
291                 -- which case we should do the hi-boot consistency
292                 -- check.  See LoadIface.loadHiBootInterface
293                   ((imp_mod_name, want_boot) : dep_mods deps, dep_pkgs deps)
294
295            | otherwise =
296                 -- Imported module is from another package
297                 -- Dump the dependent modules
298                 -- Add the package imp_mod comes from to the dependent packages
299                  ASSERT2( not (pkg `elem` dep_pkgs deps), ppr pkg <+> ppr (dep_pkgs deps) )
300                  ([], pkg : dep_pkgs deps)
301
302         -- True <=> import M ()
303         import_all = case imp_details of
304                         Just (is_hiding, ls) -> not is_hiding && null ls        
305                         other                -> False
306
307         -- unqual_avails is the Avails that are visible in *unqualified* form
308         -- We need to know this so we know what to export when we see
309         --      module M ( module P ) where ...
310         -- Then we must export whatever came from P unqualified.
311         imports   = ImportAvails { 
312                         imp_env      = unitUFM qual_mod_name avail_env,
313                         imp_mods     = unitModuleEnv imp_mod (imp_mod, import_all, loc),
314                         imp_orphs    = orphans,
315                         imp_dep_mods = mkModDeps dependent_mods,
316                         imp_dep_pkgs = dependent_pkgs }
317
318     in
319         -- Complain if we import a deprecated module
320     ifOptM Opt_WarnDeprecations (
321        case deprecs of  
322           DeprecAll txt -> addWarn (moduleDeprec imp_mod_name txt)
323           other         -> returnM ()
324     )                                                   `thenM_`
325
326     returnM (gbl_env, imports)
327
328 warnRedundantSourceImport mod_name
329   = ptext SLIT("Unnecessary {-# SOURCE #-} in the import of module")
330           <+> quotes (ppr mod_name)
331 \end{code}
332
333
334 %************************************************************************
335 %*                                                                      *
336                 importsFromLocalDecls
337 %*                                                                      *
338 %************************************************************************
339
340 From the top-level declarations of this module produce
341         * the lexical environment
342         * the ImportAvails
343 created by its bindings.  
344         
345 Complain about duplicate bindings
346
347 \begin{code}
348 importsFromLocalDecls :: HsGroup RdrName -> RnM TcGblEnv
349 importsFromLocalDecls group
350   = do  { gbl_env  <- getGblEnv
351
352         ; names <- getLocalDeclBinders gbl_env group
353
354         ; implicit_prelude <- doptM Opt_ImplicitPrelude
355         ; let {
356             -- Optimisation: filter out names for built-in syntax
357             -- They just clutter up the environment (esp tuples), and the parser
358             -- will generate Exact RdrNames for them, so the cluttered
359             -- envt is no use.  To avoid doing this filter all the time,
360             -- we use -fno-implicit-prelude as a clue that the filter is
361             -- worth while.  Really, it's only useful for GHC.Base and GHC.Tuple.
362             --
363             -- It's worth doing because it makes the environment smaller for
364             -- every module that imports the Prelude
365             --
366             -- Note: don't filter the gbl_env (hence all_names, not filered_all_names
367             -- in defn of gres above).      Stupid reason: when parsing 
368             -- data type decls, the constructors start as Exact tycon-names,
369             -- and then get turned into data con names by zapping the name space;
370             -- but that stops them being Exact, so they get looked up.  
371             -- Ditto in fixity decls; e.g.      infix 5 :
372             -- Sigh. It doesn't matter because it only affects the Data.Tuple really.
373             -- The important thing is to trim down the exports.
374               filtered_names 
375                 | implicit_prelude = names
376                 | otherwise        = filter (not . isBuiltInSyntax) names ;
377
378             ; this_mod = tcg_mod gbl_env
379             ; imports = emptyImportAvails {
380                           imp_env = unitUFM (moduleName this_mod) $
381                                     mkNameSet filtered_names
382                         }
383             }
384
385         ; rdr_env' <- extendRdrEnvRn (tcg_rdr_env gbl_env) names
386
387         ; returnM (gbl_env { tcg_rdr_env = rdr_env',
388                              tcg_imports = imports `plusImportAvails` tcg_imports gbl_env }) 
389         }
390
391 extendRdrEnvRn :: GlobalRdrEnv -> [Name] -> RnM GlobalRdrEnv
392 -- Add the new locally-bound names one by one, checking for duplicates as
393 -- we do so.  Remember that in Template Haskell the duplicates
394 -- might *already be* in the GlobalRdrEnv from higher up the module
395 extendRdrEnvRn rdr_env names
396   = foldlM add_local rdr_env names
397   where
398     add_local rdr_env name
399         | gres <- lookupGlobalRdrEnv rdr_env (nameOccName name)
400         , (dup_gre:_) <- filter isLocalGRE gres -- Check for existing *local* defns
401         = do { addDupDeclErr (gre_name dup_gre) name
402              ; return rdr_env }
403         | otherwise
404         = return (extendGlobalRdrEnv rdr_env new_gre)
405         where
406           new_gre = GRE {gre_name = name, gre_prov = LocalDef}
407 \end{code}
408
409 @getLocalDeclBinders@ returns the names for an @HsDecl@.  It's
410 used for source code.
411
412         *** See "THE NAMING STORY" in HsDecls ****
413
414 Associated data types: Instances declarations may contain definitions of
415 associated data types whose data constructors we need to collect, too.
416 However, we need to be careful with the handling of the data type constructor
417 of each asscociated type, as it is already defined in the corresponding
418 class.  We make a new name for it, but don't return it in the 'AvailInfo' (to
419 avoid raising a duplicate declaration error; see the helper
420 'unavail_main_name').
421
422 \begin{code}
423 getLocalDeclBinders :: TcGblEnv -> HsGroup RdrName -> RnM [Name]
424 getLocalDeclBinders gbl_env (HsGroup {hs_valds = ValBindsIn val_decls val_sigs, 
425                                       hs_tyclds = tycl_decls, 
426                                       hs_instds = inst_decls,
427                                       hs_fords = foreign_decls })
428   = do  { tc_names_s <- mappM new_tc tycl_decls
429         ; at_names_s <- mappM inst_ats inst_decls
430         ; val_names  <- mappM new_simple val_bndrs
431         ; return (foldr (++) val_names (tc_names_s ++ concat at_names_s)) }
432   where
433     mod        = tcg_mod gbl_env
434     is_hs_boot = isHsBoot (tcg_src gbl_env) ;
435     val_bndrs | is_hs_boot = sig_hs_bndrs
436               | otherwise  = for_hs_bndrs ++ val_hs_bndrs
437         -- In a hs-boot file, the value binders come from the
438         --  *signatures*, and there should be no foreign binders 
439
440     new_simple rdr_name = newTopSrcBinder mod Nothing rdr_name
441
442     sig_hs_bndrs = [nm | L _ (TypeSig nm _) <- val_sigs]
443     val_hs_bndrs = collectHsBindLocatedBinders val_decls
444     for_hs_bndrs = [nm | L _ (ForeignImport nm _ _) <- foreign_decls]
445
446     new_tc tc_decl 
447         = do { main_name <- newTopSrcBinder mod Nothing main_rdr
448              ; sub_names <- mappM (newTopSrcBinder mod (Just main_name)) sub_rdrs
449              ; if isIdxTyDecl (unLoc tc_decl)      -- index type definitions
450                then return (            sub_names) -- are usage occurences
451                else return (main_name : sub_names) }
452         where
453           (main_rdr : sub_rdrs) = tyClDeclNames (unLoc tc_decl)
454
455     inst_ats inst_decl 
456         = mappM new_tc (instDeclATs (unLoc inst_decl))
457 \end{code}
458
459
460 %************************************************************************
461 %*                                                                      *
462 \subsection{Filtering imports}
463 %*                                                                      *
464 %************************************************************************
465
466 @filterImports@ takes the @ExportEnv@ telling what the imported module makes
467 available, and filters it through the import spec (if any).
468
469 \begin{code}
470 filterImports :: ModIface
471               -> ImpDeclSpec                    -- The span for the entire import decl
472               -> Maybe (Bool, [LIE Name])       -- Import spec; True => hiding
473               -> NameSet                        -- What's available
474               -> RnM (NameSet,                  -- What's imported (qualified or unqualified)
475                       GlobalRdrEnv)             -- Same again, but in GRE form
476
477         -- Complains if import spec mentions things that the module doesn't export
478         -- Warns/informs if import spec contains duplicates.
479                         
480 mkGenericRdrEnv decl_spec names
481   = mkGlobalRdrEnv [ GRE { gre_name = name, gre_prov = Imported [imp_spec] }
482                    | name <- nameSetToList names ]
483   where
484     imp_spec = ImpSpec { is_decl = decl_spec, is_item = ImpAll }
485
486 filterImports iface decl_spec Nothing all_names
487   = return (all_names, mkGenericRdrEnv decl_spec all_names)
488
489 filterImports iface decl_spec (Just (want_hiding, import_items)) all_names
490   = mapM (addLocM get_item) import_items >>= \gres_s ->
491     let gres = concat gres_s
492         specified_names = mkNameSet (map gre_name gres)
493     in if not want_hiding then
494        return (specified_names, mkGlobalRdrEnv gres)
495     else let keep n = not (n `elemNameSet` specified_names)
496              pruned_avails = filterNameSet keep all_names
497          in return (pruned_avails, mkGenericRdrEnv decl_spec pruned_avails)
498   where
499     sub_env :: NameEnv [Name]   -- Classify each name by its parent
500     sub_env = mkSubNameEnv all_names
501
502     succeed_with :: Bool -> [Name] -> RnM [GlobalRdrElt]
503     succeed_with all_explicit names
504       = do { loc <- getSrcSpanM
505            ; returnM (map (mk_gre loc) names) }
506       where
507         mk_gre loc name = GRE { gre_name = name, 
508                                 gre_prov = Imported [imp_spec] }
509           where
510             imp_spec  = ImpSpec { is_decl = decl_spec, is_item = item_spec }
511             item_spec = ImpSome { is_explicit = explicit, is_iloc = loc }
512             explicit  = all_explicit || isNothing (nameParent_maybe name)
513
514     get_item :: IE Name -> RnM [GlobalRdrElt]
515         -- Empty result for a bad item.
516         -- Singleton result is typical case.
517         -- Can have two when we are hiding, and mention C which might be
518         --      both a class and a data constructor.  
519     get_item item@(IEModuleContents _) 
520         -- This case should be filtered out by 'rnImports'.
521         = panic "filterImports: IEModuleContents?" 
522
523     get_item (IEThingAll name)
524         = case subNames sub_env name of
525             [] ->       -- This occurs when you import T(..), but
526                         -- only export T abstractly.
527                   do ifOptM Opt_WarnDodgyImports (addWarn (dodgyImportWarn name))
528                      succeed_with False [name]
529             names -> succeed_with False (name:names)
530
531     get_item (IEThingAbs name)
532         = succeed_with True [name]
533
534     get_item (IEThingWith name names)
535         = succeed_with True (name:names)
536     get_item (IEVar name)
537         = succeed_with True [name]
538
539 \end{code}
540
541
542 %************************************************************************
543 %*                                                                      *
544 \subsection{Export list processing}
545 %*                                                                      *
546 %************************************************************************
547
548 Processing the export list.
549
550 You might think that we should record things that appear in the export
551 list as ``occurrences'' (using @addOccurrenceName@), but you'd be
552 wrong.  We do check (here) that they are in scope, but there is no
553 need to slurp in their actual declaration (which is what
554 @addOccurrenceName@ forces).
555
556 Indeed, doing so would big trouble when compiling @PrelBase@, because
557 it re-exports @GHC@, which includes @takeMVar#@, whose type includes
558 @ConcBase.StateAndSynchVar#@, and so on...
559
560 \begin{code}
561 type ExportAccum        -- The type of the accumulating parameter of
562                         -- the main worker function in rnExports
563      = ([ModuleName],           -- 'module M's seen so far
564         ExportOccMap,           -- Tracks exported occurrence names
565         NameSet)                -- The accumulated exported stuff
566 emptyExportAccum = ([], emptyOccEnv, emptyNameSet) 
567
568 type ExportOccMap = OccEnv (Name, IE RdrName)
569         -- Tracks what a particular exported OccName
570         --   in an export list refers to, and which item
571         --   it came from.  It's illegal to export two distinct things
572         --   that have the same occurrence name
573
574 rnExports :: Maybe [LIE RdrName]
575           -> RnM (Maybe [LIE Name])
576 rnExports Nothing = return Nothing
577 rnExports (Just exports)
578     = do TcGblEnv { tcg_imports = ImportAvails { imp_env = imp_env } } <- getGblEnv
579          let sub_env :: NameEnv [Name]  -- Classify each name by its parent
580              sub_env = mkSubNameEnv (foldUFM unionNameSets emptyNameSet imp_env)
581              rnExport (IEVar rdrName)
582                  = do name <- lookupGlobalOccRn rdrName
583                       return (IEVar name)
584              rnExport (IEThingAbs rdrName)
585                  = do name <- lookupGlobalOccRn rdrName
586                       return (IEThingAbs name)
587              rnExport (IEThingAll rdrName)
588                  = do name <- lookupGlobalOccRn rdrName
589                       return (IEThingAll name)
590              rnExport ie@(IEThingWith rdrName rdrNames)
591                  = do name <- lookupGlobalOccRn rdrName
592                       if isUnboundName name
593                          then return (IEThingWith name [])
594                          else do
595                       let env = mkOccEnv [(nameOccName s, s) | s <- subNames sub_env name]
596                           mb_names = map (lookupOccEnv env . rdrNameOcc) rdrNames
597                       if any isNothing mb_names
598                          then do addErr (exportItemErr ie)
599                                  return (IEThingWith name [])
600                          else return (IEThingWith name (catMaybes mb_names))
601              rnExport (IEModuleContents mod)
602                  = return (IEModuleContents mod)
603          rn_exports <- mapM (wrapLocM rnExport) exports
604          return (Just rn_exports)
605
606 mkExportNameSet :: Bool  -- False => no 'module M(..) where' header at all
607                 -> Maybe ([LIE Name], [LIE RdrName]) -- Nothing => no explicit export list
608                 -> RnM NameSet
609         -- Complains if two distinct exports have same OccName
610         -- Warns about identical exports.
611         -- Complains about exports items not in scope
612
613 mkExportNameSet explicit_mod exports
614  = do TcGblEnv { tcg_rdr_env = rdr_env, 
615                  tcg_imports = imports } <- getGblEnv
616
617         -- If the module header is omitted altogether, then behave
618         -- as if the user had written "module Main(main) where..."
619         -- EXCEPT in interactive mode, when we behave as if he had
620         -- written "module Main where ..."
621         -- Reason: don't want to complain about 'main' not in scope
622         --         in interactive mode
623       ghc_mode <- getGhcMode
624       real_exports <- case () of
625                         () | explicit_mod
626                                -> return exports
627                            | ghc_mode == Interactive
628                                -> return Nothing
629                            | otherwise
630                                -> do mainName <- lookupGlobalOccRn main_RDR_Unqual
631                                      return (Just ([noLoc (IEVar mainName)]
632                                                   ,[noLoc (IEVar main_RDR_Unqual)]))
633                 -- ToDo: the 'noLoc' here is unhelpful if 'main' turns out to be out of scope
634       exports_from_avail real_exports rdr_env imports
635
636
637 exports_from_avail Nothing rdr_env imports
638  =      -- Export all locally-defined things
639         -- We do this by filtering the global RdrEnv,
640         -- keeping only things that are locally-defined
641    return (mkNameSet [ gre_name gre 
642                      | gre <- globalRdrEnvElts rdr_env,
643                        isLocalGRE gre ])
644
645 exports_from_avail (Just (items,origItems)) rdr_env (ImportAvails { imp_env = imp_env }) 
646   = do (_, _, exports) <- foldlM do_litem emptyExportAccum (zip items origItems)
647        return exports
648   where
649     sub_env :: NameEnv [Name]   -- Classify each name by its parent
650     sub_env = mkSubNameEnv (foldUFM unionNameSets emptyNameSet imp_env)
651
652     do_litem :: ExportAccum -> (LIE Name, LIE RdrName) -> RnM ExportAccum
653     do_litem acc (ieName, ieRdr)
654         = addLocM (exports_from_item acc (unLoc ieRdr)) ieName
655
656     exports_from_item :: ExportAccum -> IE RdrName -> IE Name -> RnM ExportAccum
657     exports_from_item acc@(mods, occs, exports) ieRdr@(IEModuleContents mod) ie
658         | mod `elem` mods       -- Duplicate export of M
659         = do { warn_dup_exports <- doptM Opt_WarnDuplicateExports ;
660                warnIf warn_dup_exports (dupModuleExport mod) ;
661                returnM acc }
662
663         | otherwise
664         = case lookupUFM imp_env mod of
665             Nothing -> do addErr (modExportErr mod)
666                           return acc
667             Just names
668                 -> do let new_exports = filterNameSet (inScopeUnqual rdr_env) names
669                       -- This check_occs not only finds conflicts between this item
670                       -- and others, but also internally within this item.  That is,
671                       -- if 'M.x' is in scope in several ways, we'll have several
672                       -- members of mod_avails with the same OccName.
673                       occs' <- check_occs ieRdr occs (nameSetToList new_exports)
674                       return (mod:mods, occs', exports `unionNameSets` new_exports)
675
676     exports_from_item acc@(mods, occs, exports) ieRdr ie
677         = if isUnboundName (ieName ie)
678           then return acc       -- Avoid error cascade
679           else let new_exports = filterAvail ie sub_env in
680           do -- checkErr (not (null (drop 1 new_exports))) (exportItemErr ie)
681              checkForDodgyExport ie new_exports
682              occs' <- check_occs ieRdr occs new_exports
683              return (mods, occs', addListToNameSet exports new_exports)
684           
685 -------------------------------
686 filterAvail :: IE Name          -- Wanted
687             -> NameEnv [Name]   -- Maps type/class names to their sub-names
688             -> [Name]
689
690 filterAvail (IEVar n)          subs = [n]
691 filterAvail (IEThingAbs n)     subs = [n]
692 filterAvail (IEThingAll n)     subs = n : subNames subs n
693 filterAvail (IEThingWith n ns) subs = n : ns
694 filterAvail (IEModuleContents _) _  = panic "filterAvail"
695
696 subNames :: NameEnv [Name] -> Name -> [Name]
697 subNames env n = lookupNameEnv env n `orElse` []
698
699 mkSubNameEnv :: NameSet -> NameEnv [Name]
700 -- Maps types and classes to their constructors/classops respectively
701 -- This mapping just makes it easier to deal with A(..) export items
702 mkSubNameEnv names
703   = foldNameSet add_name emptyNameEnv names
704   where
705     add_name name env 
706         | Just parent <- nameParent_maybe name 
707         = extendNameEnv_C (\ns _ -> name:ns) env parent [name]
708         | otherwise = env
709
710 -------------------------------
711 inScopeUnqual :: GlobalRdrEnv -> Name -> Bool
712 -- Checks whether the Name is in scope unqualified, 
713 -- regardless of whether it's ambiguous or not
714 inScopeUnqual env n = any unQualOK (lookupGRE_Name env n)
715
716 -------------------------------
717 checkForDodgyExport :: IE Name -> [Name] -> RnM ()
718 checkForDodgyExport ie@(IEThingAll tc) [n] 
719   | isTcOcc (nameOccName n) = addWarn (dodgyExportWarn tc)
720         -- This occurs when you export T(..), but
721         -- only import T abstractly, or T is a synonym.  
722         -- The single [n] is the type or class itself
723   | otherwise = addErr (exportItemErr ie)
724         -- This happes if you export x(..), which is bogus
725 checkForDodgyExport _ _ = return ()
726
727 -------------------------------
728 check_occs :: IE RdrName -> ExportOccMap -> [Name] -> RnM ExportOccMap
729 check_occs ie occs names
730   = foldlM check occs names
731   where
732     check occs name
733       = case lookupOccEnv occs name_occ of
734           Nothing -> returnM (extendOccEnv occs name_occ (name, ie))
735
736           Just (name', ie') 
737             | name == name'     -- Duplicate export
738             ->  do { warn_dup_exports <- doptM Opt_WarnDuplicateExports ;
739                      warnIf warn_dup_exports (dupExportWarn name_occ ie ie') ;
740                      returnM occs }
741
742             | otherwise         -- Same occ name but different names: an error
743             ->  do { global_env <- getGlobalRdrEnv ;
744                      addErr (exportClashErr global_env name' name ie' ie) ;
745                      returnM occs }
746       where
747         name_occ = nameOccName name
748 \end{code}
749
750 %*********************************************************
751 %*                                                       *
752                 Deprecations
753 %*                                                       *
754 %*********************************************************
755
756 \begin{code}
757 reportDeprecations :: DynFlags -> TcGblEnv -> RnM ()
758 reportDeprecations dflags tcg_env
759   = ifOptM Opt_WarnDeprecations $
760     do  { (eps,hpt) <- getEpsAndHpt
761                 -- By this time, typechecking is complete, 
762                 -- so the PIT is fully populated
763         ; mapM_ (check hpt (eps_PIT eps)) all_gres }
764   where
765     used_names = allUses (tcg_dus tcg_env) 
766         -- Report on all deprecated uses; hence allUses
767     all_gres   = globalRdrEnvElts (tcg_rdr_env tcg_env)
768
769     check hpt pit (GRE {gre_name = name, gre_prov = Imported (imp_spec:_)})
770       | name `elemNameSet` used_names
771       , Just deprec_txt <- lookupDeprec dflags hpt pit name
772       = addWarnAt (importSpecLoc imp_spec)
773                   (sep [ptext SLIT("Deprecated use of") <+> 
774                         pprNonVarNameSpace (occNameSpace (nameOccName name)) <+> 
775                         quotes (ppr name),
776                       (parens imp_msg) <> colon,
777                       (ppr deprec_txt) ])
778         where
779           name_mod = nameModule name
780           imp_mod  = importSpecModule imp_spec
781           imp_msg  = ptext SLIT("imported from") <+> ppr imp_mod <> extra
782           extra | imp_mod == moduleName name_mod = empty
783                 | otherwise = ptext SLIT(", but defined in") <+> ppr name_mod
784
785     check hpt pit ok_gre = returnM ()   -- Local, or not used, or not deprectated
786             -- The Imported pattern-match: don't deprecate locally defined names
787             -- For a start, we may be exporting a deprecated thing
788             -- Also we may use a deprecated thing in the defn of another
789             -- deprecated things.  We may even use a deprecated thing in
790             -- the defn of a non-deprecated thing, when changing a module's 
791             -- interface
792
793 lookupDeprec :: DynFlags -> HomePackageTable -> PackageIfaceTable 
794              -> Name -> Maybe DeprecTxt
795 lookupDeprec dflags hpt pit n 
796   = case lookupIfaceByModule dflags hpt pit (nameModule n) of
797         Just iface -> mi_dep_fn iface n `seqMaybe`      -- Bleat if the thing, *or
798                       mi_dep_fn iface (nameParent n)    -- its parent*, is deprec'd
799         Nothing    
800           | isWiredInName n -> Nothing
801                 -- We have not necessarily loaded the .hi file for a 
802                 -- wired-in name (yet), although we *could*.
803                 -- And we never deprecate them
804
805          | otherwise -> pprPanic "lookupDeprec" (ppr n) 
806                 -- By now all the interfaces should have been loaded
807
808 gre_is_used :: NameSet -> GlobalRdrElt -> Bool
809 gre_is_used used_names gre = gre_name gre `elemNameSet` used_names
810 \end{code}
811
812 %*********************************************************
813 %*                                                       *
814                 Unused names
815 %*                                                       *
816 %*********************************************************
817
818 \begin{code}
819 reportUnusedNames :: Maybe [LIE RdrName]        -- Export list
820                   -> TcGblEnv -> RnM ()
821 reportUnusedNames export_decls gbl_env 
822   = do  { traceRn ((text "RUN") <+> (ppr (tcg_dus gbl_env)))
823         ; warnUnusedTopBinds   unused_locals
824         ; warnUnusedModules    unused_imp_mods
825         ; warnUnusedImports    unused_imports   
826         ; warnDuplicateImports defined_and_used
827         ; printMinimalImports  minimal_imports }
828   where
829     used_names, all_used_names :: NameSet
830     used_names = findUses (tcg_dus gbl_env) emptyNameSet
831         -- NB: currently, if f x = g, we only treat 'g' as used if 'f' is used
832         -- Hence findUses
833
834     all_used_names = used_names `unionNameSets` 
835                      mkNameSet (mapCatMaybes nameParent_maybe (nameSetToList used_names))
836                         -- A use of C implies a use of T,
837                         -- if C was brought into scope by T(..) or T(C)
838
839         -- Collect the defined names from the in-scope environment
840     defined_names :: [GlobalRdrElt]
841     defined_names = globalRdrEnvElts (tcg_rdr_env gbl_env)
842
843         -- Note that defined_and_used, defined_but_not_used
844         -- are both [GRE]; that's why we need defined_and_used
845         -- rather than just all_used_names
846     defined_and_used, defined_but_not_used :: [GlobalRdrElt]
847     (defined_and_used, defined_but_not_used) 
848         = partition (gre_is_used all_used_names) defined_names
849     
850         -- Filter out the ones that are 
851         --  (a) defined in this module, and
852         --  (b) not defined by a 'deriving' clause 
853         -- The latter have an Internal Name, so we can filter them out easily
854     unused_locals :: [GlobalRdrElt]
855     unused_locals = filter is_unused_local defined_but_not_used
856     is_unused_local :: GlobalRdrElt -> Bool
857     is_unused_local gre = isLocalGRE gre && isExternalName (gre_name gre)
858     
859     unused_imports :: [GlobalRdrElt]
860     unused_imports = filter unused_imp defined_but_not_used
861     unused_imp (GRE {gre_prov = Imported imp_specs}) 
862         = not (all (module_unused . importSpecModule) imp_specs)
863           && or [exp | ImpSpec { is_item = ImpSome { is_explicit = exp } } <- imp_specs]
864                 -- Don't complain about unused imports if we've already said the
865                 -- entire import is unused
866     unused_imp other = False
867     
868     -- To figure out the minimal set of imports, start with the things
869     -- that are in scope (i.e. in gbl_env).  Then just combine them
870     -- into a bunch of avails, so they are properly grouped
871     --
872     -- BUG WARNING: this does not deal properly with qualified imports!
873     minimal_imports :: FiniteMap ModuleName AvailEnv
874     minimal_imports0 = foldr add_expall   emptyFM          expall_mods
875     minimal_imports1 = foldr add_name     minimal_imports0 defined_and_used
876     minimal_imports  = foldr add_inst_mod minimal_imports1 direct_import_mods
877         -- The last line makes sure that we retain all direct imports
878         -- even if we import nothing explicitly.
879         -- It's not necessarily redundant to import such modules. Consider 
880         --            module This
881         --              import M ()
882         --
883         -- The import M() is not *necessarily* redundant, even if
884         -- we suck in no instance decls from M (e.g. it contains 
885         -- no instance decls, or This contains no code).  It may be 
886         -- that we import M solely to ensure that M's orphan instance 
887         -- decls (or those in its imports) are visible to people who 
888         -- import This.  Sigh. 
889         -- There's really no good way to detect this, so the error message 
890         -- in RnEnv.warnUnusedModules is weakened instead
891     
892         -- We've carefully preserved the provenance so that we can
893         -- construct minimal imports that import the name by (one of)
894         -- the same route(s) as the programmer originally did.
895     add_name (GRE {gre_name = n, gre_prov = Imported imp_specs}) acc 
896         = addToFM_C plusAvailEnv acc (importSpecModule (head imp_specs))
897                     (unitAvailEnv (mk_avail n (nameParent_maybe n)))
898     add_name other acc 
899         = acc
900
901         -- Modules mentioned as 'module M' in the export list
902     expall_mods = case export_decls of
903                     Nothing -> []
904                     Just es -> [m | L _ (IEModuleContents m) <- es]
905
906         -- This is really bogus.  The idea is that if we see 'module M' in 
907         -- the export list we must retain the import decls that drive it
908         -- If we aren't careful we might see
909         --      module A( module M ) where
910         --        import M
911         --        import N
912         -- and suppose that N exports everything that M does.  Then we 
913         -- must not drop the import of M even though N brings it all into
914         -- scope.
915         --
916         -- BUG WARNING: 'module M' exports aside, what if M.x is mentioned?!
917         --
918         -- The reason that add_expall is bogus is that it doesn't take
919         -- qualified imports into account.  But it's an improvement.
920     add_expall mod acc = addToFM_C plusAvailEnv acc mod emptyAvailEnv
921
922         -- n is the name of the thing, p is the name of its parent
923     mk_avail n (Just p)                          = AvailTC p [p,n]
924     mk_avail n Nothing | isTcOcc (nameOccName n) = AvailTC n [n]
925                        | otherwise               = Avail n
926     
927     add_inst_mod (mod,_,_) acc 
928       | mod_name `elemFM` acc = acc     -- We import something already
929       | otherwise             = addToFM acc mod_name emptyAvailEnv
930       where
931         mod_name = moduleName mod
932         -- Add an empty collection of imports for a module
933         -- from which we have sucked only instance decls
934    
935     imports = tcg_imports gbl_env
936
937     direct_import_mods :: [(Module, Bool, SrcSpan)]
938         -- See the type of the imp_mods for this triple
939     direct_import_mods = moduleEnvElts (imp_mods imports)
940
941     -- unused_imp_mods are the directly-imported modules 
942     -- that are not mentioned in minimal_imports1
943     -- [Note: not 'minimal_imports', because that includes directly-imported
944     --        modules even if we use nothing from them; see notes above]
945     --
946     -- BUG WARNING: does not deal correctly with multiple imports of the same module
947     --              becuase direct_import_mods has only one entry per module
948     unused_imp_mods = [(mod_name,loc) | (mod,no_imp,loc) <- direct_import_mods,
949                        let mod_name = moduleName mod,
950                        not (mod_name `elemFM` minimal_imports1),
951                        mod /= pRELUDE,
952                        not no_imp]
953         -- The not no_imp part is not to complain about
954         -- import M (), which is an idiom for importing
955         -- instance declarations
956     
957     module_unused :: ModuleName -> Bool
958     module_unused mod = any (((==) mod) . fst) unused_imp_mods
959
960 ---------------------
961 warnDuplicateImports :: [GlobalRdrElt] -> RnM ()
962 -- Given the GREs for names that are used, figure out which imports 
963 -- could be omitted without changing the top-level environment.
964 --
965 -- NB: Given import Foo( T )
966 --           import qualified Foo
967 -- we do not report a duplicate import, even though Foo.T is brought
968 -- into scope by both, because there's nothing you can *omit* without
969 -- changing the top-level environment.  So we complain only if it's
970 -- explicitly named in both imports or neither.
971 --
972 -- Furthermore, we complain about Foo.T only if 
973 -- there is no complaint about (unqualified) T
974
975 warnDuplicateImports gres
976   = ifOptM Opt_WarnUnusedImports $ 
977     sequenceM_  [ warn name pr
978                         -- The 'head' picks the first offending group
979                         -- for this particular name
980                 | GRE { gre_name = name, gre_prov = Imported imps } <- gres
981                 , pr <- redundants imps ]
982   where
983     warn name (red_imp, cov_imp)
984         = addWarnAt (importSpecLoc red_imp)
985             (vcat [ptext SLIT("Redundant import of:") <+> quotes pp_name,
986                    ptext SLIT("It is also") <+> ppr cov_imp])
987         where
988           pp_name | is_qual red_decl = ppr (is_as red_decl) <> dot <> ppr occ
989                   | otherwise       = ppr occ
990           occ = nameOccName name
991           red_decl = is_decl red_imp
992     
993     redundants :: [ImportSpec] -> [(ImportSpec,ImportSpec)]
994         -- The returned pair is (redundant-import, covering-import)
995     redundants imps 
996         = [ (red_imp, cov_imp) 
997           | red_imp <- imps
998           , cov_imp <- take 1 (filter (covers red_imp) imps) ]
999
1000         -- "red_imp" is a putative redundant import
1001         -- "cov_imp" potentially covers it
1002         -- This test decides whether red_imp could be dropped 
1003         --
1004         -- NOTE: currently the test does not warn about
1005         --              import M( x )
1006         --              imoprt N( x )
1007         -- even if the same underlying 'x' is involved, because dropping
1008         -- either import would change the qualified names in scope (M.x, N.x)
1009         -- But if the qualified names aren't used, the import is indeed redundant
1010         -- Sadly we don't know that.  Oh well.
1011     covers red_imp@(ImpSpec { is_decl = red_decl, is_item = red_item }) 
1012            cov_imp@(ImpSpec { is_decl = cov_decl, is_item = cov_item })
1013         | red_loc == cov_loc
1014         = False         -- Ignore diagonal elements
1015         | not (is_as red_decl == is_as cov_decl)
1016         = False         -- They bring into scope different qualified names
1017         | not (is_qual red_decl) && is_qual cov_decl
1018         = False         -- Covering one doesn't bring unqualified name into scope
1019         | red_selective
1020         = not cov_selective     -- Redundant one is selective and covering one isn't
1021           || red_later          -- Both are explicit; tie-break using red_later
1022         | otherwise             
1023         = not cov_selective     -- Neither import is selective
1024           && (is_mod red_decl == is_mod cov_decl)       -- They import the same module
1025           && red_later          -- Tie-break
1026         where
1027           red_loc   = importSpecLoc red_imp
1028           cov_loc   = importSpecLoc cov_imp
1029           red_later = red_loc > cov_loc
1030           cov_selective = selectiveImpItem cov_item
1031           red_selective = selectiveImpItem red_item
1032
1033 selectiveImpItem :: ImpItemSpec -> Bool
1034 selectiveImpItem ImpAll       = False
1035 selectiveImpItem (ImpSome {}) = True
1036
1037 -- ToDo: deal with original imports with 'qualified' and 'as M' clauses
1038 printMinimalImports :: FiniteMap ModuleName AvailEnv    -- Minimal imports
1039                     -> RnM ()
1040 printMinimalImports imps
1041  = ifOptM Opt_D_dump_minimal_imports $ do {
1042
1043    mod_ies  <-  mappM to_ies (fmToList imps) ;
1044    this_mod <- getModule ;
1045    rdr_env  <- getGlobalRdrEnv ;
1046    ioToTcRn (do { h <- openFile (mkFilename this_mod) WriteMode ;
1047                   printForUser h (mkPrintUnqualified rdr_env) 
1048                                  (vcat (map ppr_mod_ie mod_ies)) })
1049    }
1050   where
1051     mkFilename this_mod = moduleNameString (moduleName this_mod) ++ ".imports"
1052     ppr_mod_ie (mod_name, ies) 
1053         | mod_name == moduleName pRELUDE
1054         = empty
1055         | null ies      -- Nothing except instances comes from here
1056         = ptext SLIT("import") <+> ppr mod_name <> ptext SLIT("()    -- Instances only")
1057         | otherwise
1058         = ptext SLIT("import") <+> ppr mod_name <> 
1059                     parens (fsep (punctuate comma (map ppr ies)))
1060
1061     to_ies (mod, avail_env) = do ies <- mapM to_ie (availEnvElts avail_env)
1062                                  returnM (mod, ies)
1063
1064     to_ie :: AvailInfo -> RnM (IE Name)
1065         -- The main trick here is that if we're importing all the constructors
1066         -- we want to say "T(..)", but if we're importing only a subset we want
1067         -- to say "T(A,B,C)".  So we have to find out what the module exports.
1068     to_ie (Avail n)       = returnM (IEVar n)
1069     to_ie (AvailTC n [m]) = ASSERT( n==m ) 
1070                             returnM (IEThingAbs n)
1071     to_ie (AvailTC n ns)  
1072         = loadSrcInterface doc n_mod False                      `thenM` \ iface ->
1073           case [xs | (m,as) <- mi_exports iface,
1074                      moduleName m == n_mod,
1075                      AvailTC x xs <- as, 
1076                      x == nameOccName n] of
1077               [xs] | all_used xs -> returnM (IEThingAll n)
1078                    | otherwise   -> returnM (IEThingWith n (filter (/= n) ns))
1079               other              -> pprTrace "to_ie" (ppr n <+> ppr n_mod <+> ppr other) $
1080                                     returnM (IEVar n)
1081         where
1082           all_used avail_occs = all (`elem` map nameOccName ns) avail_occs
1083           doc = text "Compute minimal imports from" <+> ppr n
1084           n_mod = moduleName (nameModule n)
1085 \end{code}
1086
1087
1088 %************************************************************************
1089 %*                                                                      *
1090 \subsection{Errors}
1091 %*                                                                      *
1092 %************************************************************************
1093
1094 \begin{code}
1095 badImportItemErr iface decl_spec ie
1096   = sep [ptext SLIT("Module"), quotes (ppr (is_mod decl_spec)), source_import,
1097          ptext SLIT("does not export"), quotes (ppr ie)]
1098   where
1099     source_import | mi_boot iface = ptext SLIT("(hi-boot interface)")
1100                   | otherwise     = empty
1101
1102 dodgyImportWarn item = dodgyMsg (ptext SLIT("import")) item
1103 dodgyExportWarn item = dodgyMsg (ptext SLIT("export")) item
1104
1105 dodgyMsg kind tc
1106   = sep [ ptext SLIT("The") <+> kind <+> ptext SLIT("item") <+> quotes (ppr (IEThingAll tc)),
1107           ptext SLIT("suggests that") <+> quotes (ppr tc) <+> ptext SLIT("has constructor or class methods"),
1108           ptext SLIT("but it has none; it is a type synonym or abstract type or class") ]
1109           
1110 modExportErr mod
1111   = hsep [ ptext SLIT("Unknown module in export list: module"), quotes (ppr mod)]
1112
1113 exportItemErr export_item
1114   = sep [ ptext SLIT("The export item") <+> quotes (ppr export_item),
1115           ptext SLIT("attempts to export constructors or class methods that are not visible here") ]
1116
1117 exportClashErr global_env name1 name2 ie1 ie2
1118   = vcat [ ptext SLIT("Conflicting exports for") <+> quotes (ppr occ) <> colon
1119          , ppr_export ie1 name1 
1120          , ppr_export ie2 name2  ]
1121   where
1122     occ = nameOccName name1
1123     ppr_export ie name = nest 2 (quotes (ppr ie) <+> ptext SLIT("exports") <+> 
1124                                  quotes (ppr name) <+> pprNameProvenance (get_gre name))
1125
1126         -- get_gre finds a GRE for the Name, so that we can show its provenance
1127     get_gre name
1128         = case lookupGRE_Name global_env name of
1129              (gre:_) -> gre
1130              []      -> pprPanic "exportClashErr" (ppr name)
1131
1132 addDupDeclErr :: Name -> Name -> TcRn ()
1133 addDupDeclErr name_a name_b
1134   = addErrAt (srcLocSpan loc2) $
1135     vcat [ptext SLIT("Multiple declarations of") <+> quotes (ppr name1),
1136           ptext SLIT("Declared at:") <+> vcat [ppr (nameSrcLoc name1), ppr loc2]]
1137   where
1138     loc2 = nameSrcLoc name2
1139     (name1,name2) | nameSrcLoc name_a > nameSrcLoc name_b = (name_b,name_a)
1140                   | otherwise                             = (name_a,name_b)
1141         -- Report the error at the later location
1142
1143 dupExportWarn occ_name ie1 ie2
1144   = hsep [quotes (ppr occ_name), 
1145           ptext SLIT("is exported by"), quotes (ppr ie1),
1146           ptext SLIT("and"),            quotes (ppr ie2)]
1147
1148 dupModuleExport mod
1149   = hsep [ptext SLIT("Duplicate"),
1150           quotes (ptext SLIT("Module") <+> ppr mod), 
1151           ptext SLIT("in export list")]
1152
1153 moduleDeprec mod txt
1154   = sep [ ptext SLIT("Module") <+> quotes (ppr mod) <+> ptext SLIT("is deprecated:"), 
1155           nest 4 (ppr txt) ]      
1156 \end{code}