2 % (c) The GRASP/AQUA Project, Glasgow University, 1992-1998
4 \section[RnEnv]{Environment manipulation for the renamer monad}
7 module RnEnv where -- Export everything
9 #include "HsVersions.h"
11 import CmdLineOpts ( opt_WarnNameShadowing, opt_WarnUnusedMatches,
12 opt_WarnUnusedBinds, opt_WarnUnusedImports )
14 import RdrHsSyn ( RdrName(..), RdrNameIE,
15 rdrNameOcc, isQual, qual
17 import HsTypes ( getTyVarName, replaceTyVarName )
18 import BasicTypes ( Fixity(..), FixityDirection(..), IfaceFlavour(..) )
20 import Name ( Name, Provenance(..), ExportFlag(..), NamedThing(..),
21 ImportReason(..), getSrcLoc,
22 mkLocalName, mkGlobalName,
24 pprOccName, isLocalName, isLocallyDefined,
25 setNameProvenance, getNameProvenance, pprNameProvenance
28 import OccName ( OccName, mkModuleFS,
29 mkDFunOcc, tcOcc, varOcc, tvOcc,
30 isVarOcc, occNameFlavour, occNameString
32 import TyCon ( TyCon )
34 import Unique ( Unique, Uniquable(..), unboundKey )
35 import UniqFM ( emptyUFM, listToUFM, plusUFM_C )
37 import SrcLoc ( SrcLoc, noSrcLoc )
39 import Util ( removeDups )
41 import Char ( isAlphanum )
46 %*********************************************************
48 \subsection{Making new rdr names}
50 %*********************************************************
52 These functions make new RdrNames from stuff read from an interface file
55 ifaceQualTC (m,n,hif) = Qual (mkModuleFS m) (tcOcc n) hif
56 ifaceQualVar (m,n,hif) = Qual (mkModuleFS m) (varOcc n) hif
58 ifaceUnqualTC n = Unqual (tcOcc n)
59 ifaceUnqualVar n = Unqual (varOcc n)
60 ifaceUnqualTv n = Unqual (tvOcc n)
63 %*********************************************************
65 \subsection{Making new names}
67 %*********************************************************
70 newImportedGlobalName :: Module -> OccName -> IfaceFlavour
72 newImportedGlobalName mod occ hif
73 = -- First check the cache
74 getNameSupplyRn `thenRn` \ (us, inst_ns, cache) ->
77 prov = NonLocalDef ImplicitImport hif False
78 -- For in-scope things we improve the provenance in RnNames.qualifyImports
80 case lookupFM cache key of
82 -- A hit in the cache!
83 -- If it has no provenance at the moment then set its provenance
84 -- so that it has the right HiFlag component.
85 -- (This is necessary for known-key things.
86 -- For example, GHCmain.lhs imports as SOURCE
87 -- Main; but Main.main is a known-key thing.)
88 -- Don't fiddle with the provenance if it already has one
89 Just name -> case getNameProvenance name of
91 new_name = setNameProvenance name prov
92 new_cache = addToFM cache key new_name
94 setNameSupplyRn (us, inst_ns, new_cache) `thenRn_`
96 other -> returnRn name
98 Nothing -> -- Miss in the cache!
99 -- Build a new original name, and put it in the cache
101 (us', us1) = splitUniqSupply us
102 uniq = uniqFromSupply us1
103 name = mkGlobalName uniq mod occ prov
104 new_cache = addToFM cache key name
106 setNameSupplyRn (us', inst_ns, new_cache) `thenRn_`
110 newImportedGlobalFromRdrName (Qual mod_name occ hif)
111 = newImportedGlobalName mod_name occ hif
113 newImportedGlobalFromRdrName (Unqual occ)
114 = -- An Unqual is allowed; interface files contain
115 -- unqualified names for locally-defined things, such as
116 -- constructors of a data type.
117 getModuleRn `thenRn ` \ mod_name ->
118 newImportedGlobalName mod_name occ HiFile
121 newLocallyDefinedGlobalName :: Module -> OccName
122 -> (Name -> ExportFlag) -> SrcLoc
124 newLocallyDefinedGlobalName mod occ rec_exp_fn loc
125 = -- First check the cache
126 getNameSupplyRn `thenRn` \ (us, inst_ns, cache) ->
129 mk_prov name = LocalDef loc (rec_exp_fn name)
130 -- We must set the provenance of the thing in the cache
131 -- correctly, particularly whether or not it is locally defined.
133 -- Since newLocallyDefinedGlobalName is used only
134 -- at binding occurrences, we may as well get the provenance
135 -- dead right first time; hence the rec_exp_fn passed in
137 case lookupFM cache key of
139 -- A hit in the cache!
140 -- Overwrite whatever provenance is in the cache already;
141 -- this updates WiredIn things and known-key things,
142 -- which are there from the start, to LocalDef.
144 -- It also means that if there are two defns for the same thing
145 -- in a module, then each gets a separate SrcLoc
147 new_name = setNameProvenance name (mk_prov new_name)
148 new_cache = addToFM cache key new_name
150 setNameSupplyRn (us, inst_ns, new_cache) `thenRn_`
153 -- Miss in the cache!
154 -- Build a new original name, and put it in the cache
156 (us', us1) = splitUniqSupply us
157 uniq = uniqFromSupply us1
158 new_name = mkGlobalName uniq mod occ (mk_prov new_name)
159 new_cache = addToFM cache key new_name
161 setNameSupplyRn (us', inst_ns, new_cache) `thenRn_`
165 newLocalNames :: [(RdrName,SrcLoc)] -> RnM s d [Name]
166 newLocalNames rdr_names
167 = getNameSupplyRn `thenRn` \ (us, inst_ns, cache) ->
170 (us', us1) = splitUniqSupply us
171 uniqs = uniqsFromSupply n us1
172 locals = [ mkLocalName uniq (rdrNameOcc rdr_name)
173 | ((rdr_name,loc), uniq) <- rdr_names `zip` uniqs
176 setNameSupplyRn (us', inst_ns, cache) `thenRn_`
179 newDFunName cl_occ tycon_occ (Just n) src_loc -- Imported ones have "Just n"
180 = getModuleRn `thenRn` \ mod_name ->
181 newImportedGlobalName mod_name (rdrNameOcc n) HiFile {- Correct? -}
183 newDFunName cl_occ tycon_occ Nothing src_loc -- Local instance decls have a "Nothing"
184 = getModuleRn `thenRn` \ mod_name ->
185 newInstUniq (cl_occ, tycon_occ) `thenRn` \ inst_uniq ->
187 dfun_occ = mkDFunOcc cl_occ tycon_occ inst_uniq
189 newLocallyDefinedGlobalName mod_name dfun_occ (\_ -> Exported) src_loc
192 -- mkUnboundName makes a place-holder Name; it shouldn't be looked at except possibly
193 -- during compiler debugging.
194 mkUnboundName :: RdrName -> Name
195 mkUnboundName rdr_name = mkLocalName unboundKey (rdrNameOcc rdr_name)
197 isUnboundName :: Name -> Bool
198 isUnboundName name = getUnique name == unboundKey
202 -------------------------------------
203 bindLocatedLocalsRn :: SDoc -- Documentation string for error message
204 -> [(RdrName,SrcLoc)]
205 -> ([Name] -> RnMS s a)
207 bindLocatedLocalsRn doc_str rdr_names_w_loc enclosed_scope
208 = checkDupOrQualNames doc_str rdr_names_w_loc `thenRn_`
210 getLocalNameEnv `thenRn` \ name_env ->
211 (if opt_WarnNameShadowing
213 mapRn (check_shadow name_env) rdr_names_w_loc
218 newLocalNames rdr_names_w_loc `thenRn` \ names ->
220 new_name_env = addListToRdrEnv name_env (map fst rdr_names_w_loc `zip` names)
222 setLocalNameEnv new_name_env (enclosed_scope names)
224 check_shadow name_env (rdr_name,loc)
225 = case lookupRdrEnv name_env rdr_name of
226 Nothing -> returnRn ()
227 Just name -> pushSrcLocRn loc $
228 addWarnRn (shadowedNameWarn rdr_name)
231 -------------------------------------
232 bindLocalsRn doc_str rdr_names enclosed_scope
233 = getSrcLocRn `thenRn` \ loc ->
234 bindLocatedLocalsRn (text doc_str)
235 (rdr_names `zip` repeat loc)
238 -- binLocalsFVRn is the same as bindLocalsRn
239 -- except that it deals with free vars
240 bindLocalsFVRn doc_str rdr_names enclosed_scope
241 = bindLocalsRn doc_str rdr_names $ \ names ->
242 enclosed_scope names `thenRn` \ (thing, fvs) ->
243 returnRn (thing, delListFromNameSet fvs names)
245 -------------------------------------
246 extendTyVarEnvRn :: [HsTyVar Name] -> RnMS s a -> RnMS s a
247 -- This tiresome function is used only in rnDecl on InstDecl
248 extendTyVarEnvRn tyvars enclosed_scope
249 = getLocalNameEnv `thenRn` \ env ->
251 new_env = addListToRdrEnv env [ (Unqual (getOccName name), name)
253 let name = getTyVarName tyvar
256 setLocalNameEnv new_env enclosed_scope
258 bindTyVarsRn :: SDoc -> [HsTyVar RdrName]
259 -> ([HsTyVar Name] -> RnMS s a)
261 bindTyVarsRn doc_str tyvar_names enclosed_scope
262 = bindTyVars2Rn doc_str tyvar_names $ \ names tyvars ->
263 enclosed_scope tyvars
265 -- Gruesome name: return Names as well as HsTyVars
266 bindTyVars2Rn :: SDoc -> [HsTyVar RdrName]
267 -> ([Name] -> [HsTyVar Name] -> RnMS s a)
269 bindTyVars2Rn doc_str tyvar_names enclosed_scope
270 = getSrcLocRn `thenRn` \ loc ->
272 located_tyvars = [(getTyVarName tv, loc) | tv <- tyvar_names]
274 bindLocatedLocalsRn doc_str located_tyvars $ \ names ->
275 enclosed_scope names (zipWith replaceTyVarName tyvar_names names)
277 bindTyVarsFVRn :: SDoc -> [HsTyVar RdrName]
278 -> ([HsTyVar Name] -> RnMS s (a, FreeVars))
279 -> RnMS s (a, FreeVars)
280 bindTyVarsFVRn doc_str rdr_names enclosed_scope
281 = bindTyVars2Rn doc_str rdr_names $ \ names tyvars ->
282 enclosed_scope tyvars `thenRn` \ (thing, fvs) ->
283 returnRn (thing, delListFromNameSet fvs names)
285 bindTyVarsFV2Rn :: SDoc -> [HsTyVar RdrName]
286 -> ([Name] -> [HsTyVar Name] -> RnMS s (a, FreeVars))
287 -> RnMS s (a, FreeVars)
288 bindTyVarsFV2Rn doc_str rdr_names enclosed_scope
289 = bindTyVars2Rn doc_str rdr_names $ \ names tyvars ->
290 enclosed_scope names tyvars `thenRn` \ (thing, fvs) ->
291 returnRn (thing, delListFromNameSet fvs names)
294 -------------------------------------
295 checkDupOrQualNames, checkDupNames :: SDoc
296 -> [(RdrName, SrcLoc)]
298 -- Works in any variant of the renamer monad
300 checkDupOrQualNames doc_str rdr_names_w_loc
301 = -- Check for use of qualified names
302 mapRn (qualNameErr doc_str) quals `thenRn_`
303 checkDupNames doc_str rdr_names_w_loc
305 quals = filter (isQual.fst) rdr_names_w_loc
307 checkDupNames doc_str rdr_names_w_loc
308 = -- Check for dupicated names in a binding group
309 mapRn (dupNamesErr doc_str) dups `thenRn_`
312 (_, dups) = removeDups (\(n1,l1) (n2,l2) -> n1 `compare` n2) rdr_names_w_loc
316 ifaceFlavour name = case getNameProvenance name of
317 NonLocalDef _ hif _ -> hif
318 other -> HiFile -- Shouldn't happen
322 %*********************************************************
324 \subsection{Looking up names}
326 %*********************************************************
328 Looking up a name in the RnEnv.
331 checkUnboundRn :: RdrName -> Maybe Name -> RnMS s Name
332 checkUnboundRn rdr_name (Just name)
336 checkUnboundRn rdr_name Nothing
337 = -- Not found by lookup
338 getModeRn `thenRn` \ mode ->
340 -- Not found when processing source code; so fail
341 SourceMode -> failWithRn (mkUnboundName rdr_name)
342 (unknownNameErr rdr_name)
344 -- Not found when processing an imported declaration,
345 -- so we create a new name for the purpose
346 InterfaceMode _ -> newImportedGlobalFromRdrName rdr_name
348 lookupBndrRn rdr_name
349 = lookupNameRn rdr_name `thenRn` \ maybe_name ->
350 checkUnboundRn rdr_name maybe_name
352 -- Just like lookupRn except that we record the occurrence too
353 -- Perhaps surprisingly, even wired-in names are recorded.
354 -- Why? So that we know which wired-in names are referred to when
355 -- deciding which instance declarations to import.
356 lookupOccRn :: RdrName -> RnMS s Name
358 = lookupNameRn rdr_name `thenRn` \ maybe_name ->
359 checkUnboundRn rdr_name maybe_name `thenRn` \ name ->
361 name' = mungePrintUnqual rdr_name name
363 addOccurrenceName name'
365 -- lookupGlobalOccRn is like lookupOccRn, except that it looks in the global
366 -- environment. It's used only for
367 -- record field names
368 -- class op names in class and instance decls
369 lookupGlobalOccRn :: RdrName -> RnMS s Name
370 lookupGlobalOccRn rdr_name
371 = lookupGlobalNameRn rdr_name `thenRn` \ maybe_name ->
372 checkUnboundRn rdr_name maybe_name `thenRn` \ name ->
374 name' = mungePrintUnqual rdr_name name
376 addOccurrenceName name'
379 -- mungePrintUnqual is used to make *imported* *occurrences* print unqualified
380 -- if they were mentioned unqualified in the source code.
381 -- This improves error messages from the type checker.
382 -- NB: the binding site is treated differently; see lookupBndrRn
383 -- After the type checker all occurrences are replaced by the one
384 -- at the binding site.
385 mungePrintUnqual (Qual _ _ _) name = name
386 mungePrintUnqual (Unqual _) name
387 = case getNameProvenance name of
388 NonLocalDef imp hif False -> setNameProvenance name (NonLocalDef imp hif True)
391 -- lookupImplicitOccRn takes an RdrName representing an *original* name, and
392 -- adds it to the occurrence pool so that it'll be loaded later. This is
393 -- used when language constructs (such as monad comprehensions, overloaded literals,
394 -- or deriving clauses) require some stuff to be loaded that isn't explicitly
395 -- mentioned in the code.
397 -- This doesn't apply in interface mode, where everything is explicit, but
398 -- we don't check for this case: it does no harm to record an "extra" occurrence
399 -- and lookupImplicitOccRn isn't used much in interface mode (it's only the
400 -- Nothing clause of rnDerivs that calls it at all I think).
401 -- [Jan 98: this comment is wrong: rnHsType uses it quite a bit.]
403 -- For List and Tuple types it's important to get the correct
404 -- isLocallyDefined flag, which is used in turn when deciding
405 -- whether there are any instance decls in this module are "special".
406 -- The name cache should have the correct provenance, though.
408 lookupImplicitOccRn :: RdrName -> RnMS s Name
409 lookupImplicitOccRn (Qual mod occ hif)
410 = newImportedGlobalName mod occ hif `thenRn` \ name ->
411 addOccurrenceName name
413 addImplicitOccRn :: Name -> RnMS s Name
414 addImplicitOccRn name = addOccurrenceName name
416 addImplicitOccsRn :: [Name] -> RnMS s ()
417 addImplicitOccsRn names = addOccurrenceNames names
421 lookupFixity :: Name -> RnMS s Fixity
423 = getFixityEnv `thenRn` \ fixity_env ->
424 case lookupNameEnv fixity_env name of
425 Just (FixitySig _ fixity _) -> returnRn fixity
426 Nothing -> returnRn (Fixity 9 InfixL) -- Default case
429 mkPrintUnqualFn returns a function that takes a Name and tells whether
430 its unqualified name is in scope. This is put as a boolean flag in
431 the Name's provenance to guide whether or not to print the name qualified
435 mkPrintUnqualFn :: GlobalRdrEnv -> Name -> Bool
439 lookup name = case lookupRdrEnv env (Unqual (nameOccName name)) of
440 Just [name'] -> name == name'
444 %************************************************************************
446 \subsection{Envt utility functions}
448 %************************************************************************
450 =============== RnEnv ================
452 plusRnEnv (RnEnv n1 f1) (RnEnv n2 f2)
453 = RnEnv (n1 `plusGlobalRdrEnv` n2)
454 (f1 `plusNameEnv` f2)
458 =============== NameEnv ================
460 -- Look in global env only
461 lookupGlobalNameRn :: RdrName -> RnMS s (Maybe Name)
462 lookupGlobalNameRn rdr_name
463 = getNameEnvs `thenRn` \ (global_env, local_env) ->
464 lookup_global global_env rdr_name
466 -- Look in both local and global env
467 lookupNameRn :: RdrName -> RnMS s (Maybe Name)
468 lookupNameRn rdr_name
469 = getNameEnvs `thenRn` \ (global_env, local_env) ->
470 case lookupRdrEnv local_env rdr_name of
471 Just name -> returnRn (Just name)
472 Nothing -> lookup_global global_env rdr_name
474 lookup_global global_env rdr_name
475 = case lookupRdrEnv global_env rdr_name of
476 Just [name] -> returnRn (Just name)
477 Just stuff@(name:_) -> addNameClashErrRn rdr_name stuff `thenRn_`
479 Nothing -> returnRn Nothing
481 plusGlobalRdrEnv :: GlobalRdrEnv -> GlobalRdrEnv -> GlobalRdrEnv
482 plusGlobalRdrEnv env1 env2 = plusFM_C combine_globals env1 env2
484 addOneToGlobalRdrEnv :: GlobalRdrEnv -> RdrName -> Name -> GlobalRdrEnv
485 addOneToGlobalRdrEnv env rdr_name name = addToFM_C combine_globals env rdr_name [name]
487 delOneFromGlobalRdrEnv :: GlobalRdrEnv -> RdrName -> GlobalRdrEnv
488 delOneFromGlobalRdrEnv env rdr_name = delFromFM env rdr_name
490 combine_globals :: [Name] -- Old
493 combine_globals ns_old ns_new -- ns_new is often short
494 = foldr add ns_old ns_new
496 add n ns | all (no_conflict n) ns_old = map choose ns -- Eliminate duplicates
499 choose n' | n==n' && better_provenance n n' = n
502 -- Choose a user-imported thing over a non-user-imported thing
503 -- and an explicitly-imported thing over an implicitly imported thing
504 better_provenance n1 n2
505 = case (getNameProvenance n1, getNameProvenance n2) of
506 (NonLocalDef (UserImport _ _ True) _ _, _ ) -> True
507 (NonLocalDef (UserImport _ _ _ ) _ _, NonLocalDef ImplicitImport _ _) -> True
510 no_conflict :: Name -> Name -> Bool
511 no_conflict n1 n2 | isLocallyDefined n1 && isLocallyDefined n2 = False
512 | otherwise = n1 == n2
513 -- We complain of a conflict if one RdrName maps to two different Names,
514 -- OR if one RdrName maps to the same *locally-defined* Name. The latter
515 -- case is to catch two separate, local definitions of the same thing.
517 -- If a module imports itself then there might be a local defn and an imported
518 -- defn of the same name; in this case the names will compare as equal, but
519 -- will still have different provenances
524 =============== ExportAvails ================
526 mkEmptyExportAvails :: Module -> ExportAvails
527 mkEmptyExportAvails mod_name = (unitFM mod_name [], emptyUFM)
529 mkExportAvails :: Module -> Bool -> GlobalRdrEnv -> [AvailInfo] -> ExportAvails
530 mkExportAvails mod_name unqual_imp name_env avails
531 = (mod_avail_env, entity_avail_env)
533 mod_avail_env = unitFM mod_name unqual_avails
535 -- unqual_avails is the Avails that are visible in *unqualfied* form
536 -- (1.4 Report, Section 5.1.1)
538 -- import T hiding( f )
539 -- we delete f from avails
541 unqual_avails | not unqual_imp = [] -- Short cut when no unqualified imports
542 | otherwise = [prune avail | avail <- avails]
544 prune (Avail n) | unqual_in_scope n = Avail n
545 prune (Avail n) | otherwise = NotAvailable
546 prune (AvailTC n ns) = AvailTC n (filter unqual_in_scope ns)
548 unqual_in_scope n = Unqual (nameOccName n) `elemFM` name_env
550 entity_avail_env = listToUFM [ (name,avail) | avail <- avails,
551 name <- availNames avail]
553 plusExportAvails :: ExportAvails -> ExportAvails -> ExportAvails
554 plusExportAvails (m1, e1) (m2, e2)
555 = (plusFM_C (++) m1 m2, plusUFM_C plusAvail e1 e2)
556 -- ToDo: wasteful: we do this once for each constructor!
560 =============== AvailInfo ================
562 plusAvail (Avail n1) (Avail n2) = Avail n1
563 plusAvail (AvailTC n1 ns1) (AvailTC n2 ns2) = AvailTC n1 (nub (ns1 ++ ns2))
564 plusAvail a NotAvailable = a
565 plusAvail NotAvailable a = a
568 plusAvail a1 a2 = pprPanic "RnEnv.plusAvail" (hsep [pprAvail a1,pprAvail a2])
571 addAvailToNameSet :: NameSet -> AvailInfo -> NameSet
572 addAvailToNameSet names avail = addListToNameSet names (availNames avail)
574 availsToNameSet :: [AvailInfo] -> NameSet
575 availsToNameSet avails = foldl addAvailToNameSet emptyNameSet avails
577 availName :: AvailInfo -> Name
578 availName (Avail n) = n
579 availName (AvailTC n _) = n
581 availNames :: AvailInfo -> [Name]
582 availNames NotAvailable = []
583 availNames (Avail n) = [n]
584 availNames (AvailTC n ns) = ns
586 filterAvail :: RdrNameIE -- Wanted
587 -> AvailInfo -- Available
588 -> AvailInfo -- Resulting available;
589 -- NotAvailable if wanted stuff isn't there
591 filterAvail ie@(IEThingWith want wants) avail@(AvailTC n ns)
592 | sub_names_ok = AvailTC n (filter is_wanted ns)
595 pprTrace "filterAvail" (hsep [ppr ie, pprAvail avail]) $
599 is_wanted name = nameOccName name `elem` wanted_occs
600 sub_names_ok = all (`elem` avail_occs) wanted_occs
601 avail_occs = map nameOccName ns
602 wanted_occs = map rdrNameOcc (want:wants)
604 filterAvail (IEThingAbs _) (AvailTC n ns) = ASSERT( n `elem` ns )
607 filterAvail (IEThingAbs _) avail@(Avail n) = avail -- Type synonyms
609 filterAvail (IEVar _) avail@(Avail n) = avail
610 filterAvail (IEVar v) avail@(AvailTC n ns) = AvailTC n (filter wanted ns)
612 wanted n = nameOccName n == occ
614 -- The second equation happens if we import a class op, thus
616 -- where op is a class operation
618 filterAvail (IEThingAll _) avail@(AvailTC _ _) = avail
620 filterAvail ie avail = NotAvailable
623 -- In interfaces, pprAvail gets given the OccName of the "host" thing
624 pprAvail avail = getPprStyle $ \ sty ->
625 if ifaceStyle sty then
626 ppr_avail (pprOccName . nameOccName) avail
630 ppr_avail pp_name NotAvailable = ptext SLIT("NotAvailable")
631 ppr_avail pp_name (AvailTC n ns) = hsep [
633 parens $ hsep $ punctuate comma $
636 ppr_avail pp_name (Avail n) = pp_name n
642 %************************************************************************
644 \subsection{Free variable manipulation}
646 %************************************************************************
649 type FreeVars = NameSet
651 plusFV :: FreeVars -> FreeVars -> FreeVars
652 addOneFV :: FreeVars -> Name -> FreeVars
653 unitFV :: Name -> FreeVars
655 plusFVs :: [FreeVars] -> FreeVars
657 plusFV = unionNameSets
658 addOneFV = addOneToNameSet
660 emptyFVs = emptyNameSet
661 plusFVs = unionManyNameSets
665 %************************************************************************
667 \subsection{Envt utility functions}
669 %************************************************************************
673 warnUnusedBinds, warnUnusedMatches :: [Name] -> RnM s d ()
675 warnUnusedTopNames ns
676 | not opt_WarnUnusedBinds && not opt_WarnUnusedImports
677 = returnRn () -- Don't force ns unless necessary
679 warnUnusedTopNames (n:ns)
680 | is_local && opt_WarnUnusedBinds = warnUnusedNames ns
681 | not is_local && opt_WarnUnusedImports = warnUnusedNames ns
683 is_local = isLocallyDefined n
685 warnUnusedTopName other = returnRn ()
688 | not opt_WarnUnusedBinds = returnRn ()
689 | otherwise = warnUnusedNames ns
691 warnUnusedMatches names
692 | opt_WarnUnusedMatches = warnUnusedNames names
693 | otherwise = returnRn ()
695 warnUnusedNames :: [Name] -> RnM s d ()
699 warnUnusedNames names
701 sep [text "The following names are unused:",
702 nest 4 (vcat (map pp names))]
704 pp n = ppr n <> comma <+> pprNameProvenance n
707 addNameClashErrRn rdr_name names
708 {- NO LONGER NEEDED WITH LAZY NAME-CLASH REPORTING
709 | isClassDataConRdrName rdr_name
710 -- Nasty hack to prevent error messages complain about conflicts for ":C",
711 -- where "C" is a class. There'll be a message about C, and :C isn't
712 -- the programmer's business. There may be a better way to filter this
713 -- out, but I couldn't get up the energy to find it.
719 = addErrRn (vcat [ptext SLIT("Ambiguous occurrence") <+> quotes (ppr rdr_name),
720 ptext SLIT("It could refer to:") <+> vcat (map mk_ref names)])
722 mk_ref name = ppr name <> colon <+> pprNameProvenance name
724 fixityClashErr (rdr_name, ((_,how_in_scope1), (_, how_in_scope2)))
725 = hang (hsep [ptext SLIT("Conflicting fixities for"), quotes (ppr rdr_name)])
726 4 (vcat [ppr how_in_scope1,
729 shadowedNameWarn shadow
730 = hsep [ptext SLIT("This binding for"),
732 ptext SLIT("shadows an existing binding")]
735 = sep [text flavour, ptext SLIT("not in scope:"), quotes (ppr name)]
737 flavour = occNameFlavour (rdrNameOcc name)
739 qualNameErr descriptor (name,loc)
741 addErrRn (hsep [ ptext SLIT("Invalid use of qualified name"),
746 dupNamesErr descriptor ((name,loc) : dup_things)
748 addErrRn (hsep [ptext SLIT("Conflicting definitions for"),
750 ptext SLIT("in"), descriptor])