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 ( RdrNameIE )
15 import RnHsSyn ( RenamedHsType )
16 import RdrName ( RdrName, rdrNameModule, rdrNameOcc, isQual, isUnqual,
17 mkRdrUnqual, qualifyRdrName
19 import HsTypes ( getTyVarName, replaceTyVarName )
22 import Name ( Name, Provenance(..), ExportFlag(..), NamedThing(..),
23 ImportReason(..), getSrcLoc,
24 mkLocalName, mkImportedLocalName, mkGlobalName, isSystemName,
25 nameOccName, setNameModule, nameModule,
26 pprOccName, isLocallyDefined, nameUnique, nameOccName,
28 setNameProvenance, getNameProvenance, pprNameProvenance
31 import OccName ( OccName,
32 mkDFunOcc, occNameUserString,
35 import TysWiredIn ( tupleTyCon, unboxedTupleTyCon, listTyCon )
36 import Type ( funTyCon )
37 import Module ( ModuleName, mkThisModule, mkVanillaModule, moduleName )
38 import TyCon ( TyCon )
40 import Unique ( Unique, Uniquable(..) )
41 import UniqFM ( emptyUFM, listToUFM, plusUFM_C )
43 import SrcLoc ( SrcLoc, noSrcLoc )
45 import Util ( removeDups, equivClasses, thenCmp )
47 import Maybes ( mapMaybe )
52 %*********************************************************
54 \subsection{Making new names}
56 %*********************************************************
59 newImportedGlobalName mod_name occ mod
60 = getNameSupplyRn `thenRn` \ (us, inst_ns, cache) ->
64 case lookupFM cache key of
65 Just name -> returnRn name
66 Nothing -> setNameSupplyRn (us', inst_ns, new_cache) `thenRn_`
69 (us', us1) = splitUniqSupply us
70 uniq = uniqFromSupply us1
71 name = mkGlobalName uniq mod occ (NonLocalDef ImplicitImport False)
72 new_cache = addToFM cache key name
74 updateProvenances :: [Name] -> RnM d ()
75 updateProvenances names
76 = getNameSupplyRn `thenRn` \ (us, inst_ns, cache) ->
77 setNameSupplyRn (us, inst_ns, update cache names)
79 update cache [] = cache
80 update cache (name:names) = WARN( not (key `elemFM` cache), ppr name )
81 update (addToFM cache key name) names
83 key = (moduleName (nameModule name), nameOccName name)
85 newImportedBinder :: Module -> RdrName -> RnM d Name
86 newImportedBinder mod rdr_name
87 = ASSERT2( isUnqual rdr_name, ppr rdr_name )
88 newImportedGlobalName (moduleName mod) (rdrNameOcc rdr_name) mod
90 -- Make an imported global name, checking first to see if it's in the cache
91 mkImportedGlobalName :: ModuleName -> OccName -> RnM d Name
92 mkImportedGlobalName mod_name occ
93 = newImportedGlobalName mod_name occ (mkVanillaModule mod_name)
95 mkImportedGlobalFromRdrName rdr_name
97 = mkImportedGlobalName (rdrNameModule rdr_name) (rdrNameOcc rdr_name)
100 = -- An Unqual is allowed; interface files contain
101 -- unqualified names for locally-defined things, such as
102 -- constructors of a data type.
103 getModuleRn `thenRn ` \ mod_name ->
104 mkImportedGlobalName mod_name (rdrNameOcc rdr_name)
107 newLocalTopBinder :: Module -> OccName
108 -> (Name -> ExportFlag) -> SrcLoc
110 newLocalTopBinder mod occ rec_exp_fn loc
111 = -- First check the cache
112 getNameSupplyRn `thenRn` \ (us, inst_ns, cache) ->
114 key = (moduleName mod,occ)
115 mk_prov name = LocalDef loc (rec_exp_fn name)
116 -- We must set the provenance of the thing in the cache
117 -- correctly, particularly whether or not it is locally defined.
119 -- Since newLocallyDefinedGlobalName is used only
120 -- at binding occurrences, we may as well get the provenance
121 -- dead right first time; hence the rec_exp_fn passed in
123 case lookupFM cache key of
125 -- A hit in the cache!
126 -- Overwrite whatever provenance is in the cache already;
127 -- this updates WiredIn things and known-key things,
128 -- which are there from the start, to LocalDef.
130 -- It also means that if there are two defns for the same thing
131 -- in a module, then each gets a separate SrcLoc
133 new_name = setNameProvenance name (mk_prov new_name)
134 new_cache = addToFM cache key new_name
136 setNameSupplyRn (us, inst_ns, new_cache) `thenRn_`
139 -- Miss in the cache!
140 -- Build a new original name, and put it in the cache
142 (us', us1) = splitUniqSupply us
143 uniq = uniqFromSupply us1
144 new_name = mkGlobalName uniq mod occ (mk_prov new_name)
145 new_cache = addToFM cache key new_name
147 setNameSupplyRn (us', inst_ns, new_cache) `thenRn_`
151 %*********************************************************
153 \subsection{Dfuns and default methods}
155 %*********************************************************
157 @newImplicitBinder@ is used for (a) dfuns
158 (b) default methods, defined in this module.
161 newImplicitBinder occ src_loc
162 = getModuleRn `thenRn` \ mod_name ->
163 newLocalTopBinder (mkThisModule mod_name) occ (\_ -> Exported) src_loc
166 Make a name for the dict fun for an instance decl
169 newDFunName :: (OccName, OccName) -> SrcLoc -> RnMS Name
170 newDFunName key@(cl_occ, tycon_occ) loc
171 = newInstUniq key `thenRn` \ inst_uniq ->
172 newImplicitBinder (mkDFunOcc cl_occ tycon_occ inst_uniq) loc
176 getDFunKey :: RenamedHsType -> (OccName, OccName) -- Used to manufacture DFun names
177 getDFunKey (HsForAllTy _ _ ty) = getDFunKey ty
178 getDFunKey (MonoFunTy _ ty) = getDFunKey ty
179 getDFunKey (MonoDictTy cls (ty:_)) = (nameOccName cls, get_tycon_key ty)
181 get_tycon_key (MonoTyVar tv) = nameOccName (getName tv)
182 get_tycon_key (MonoTyApp ty _) = get_tycon_key ty
183 get_tycon_key (MonoTupleTy tys True) = getOccName (tupleTyCon (length tys))
184 get_tycon_key (MonoTupleTy tys False) = getOccName (unboxedTupleTyCon (length tys))
185 get_tycon_key (MonoListTy _) = getOccName listTyCon
186 get_tycon_key (MonoFunTy _ _) = getOccName funTyCon
190 %*********************************************************
194 %*********************************************************
197 -------------------------------------
198 bindLocatedLocalsRn :: SDoc -- Documentation string for error message
199 -> [(RdrName,SrcLoc)]
200 -> ([Name] -> RnMS a)
202 bindLocatedLocalsRn doc_str rdr_names_w_loc enclosed_scope
203 = checkDupOrQualNames doc_str rdr_names_w_loc `thenRn_`
205 getLocalNameEnv `thenRn` \ name_env ->
206 (if opt_WarnNameShadowing
208 mapRn_ (check_shadow name_env) rdr_names_w_loc
213 getNameSupplyRn `thenRn` \ (us, inst_ns, cache) ->
214 getModeRn `thenRn` \ mode ->
216 n = length rdr_names_w_loc
217 (us', us1) = splitUniqSupply us
218 uniqs = uniqsFromSupply n us1
219 names = [ mk_name uniq (rdrNameOcc rdr_name) loc
220 | ((rdr_name,loc), uniq) <- rdr_names_w_loc `zip` uniqs
222 mk_name = case mode of
223 SourceMode -> mkLocalName
224 InterfaceMode -> mkImportedLocalName
225 -- Keep track of whether the name originally came from
226 -- an interface file.
228 setNameSupplyRn (us', inst_ns, cache) `thenRn_`
231 new_name_env = addListToRdrEnv name_env (map fst rdr_names_w_loc `zip` names)
233 setLocalNameEnv new_name_env (enclosed_scope names)
236 check_shadow name_env (rdr_name,loc)
237 = case lookupRdrEnv name_env rdr_name of
238 Nothing -> returnRn ()
239 Just name -> pushSrcLocRn loc $
240 addWarnRn (shadowedNameWarn rdr_name)
242 bindCoreLocalFVRn :: RdrName -> (Name -> RnMS (a, FreeVars))
243 -> RnMS (a, FreeVars)
244 -- A specialised variant when renaming stuff from interface
245 -- files (of which there is a lot)
247 -- * no checks for shadowing
249 -- * deal with free vars
250 bindCoreLocalFVRn rdr_name enclosed_scope
251 = getSrcLocRn `thenRn` \ loc ->
252 getLocalNameEnv `thenRn` \ name_env ->
253 getNameSupplyRn `thenRn` \ (us, inst_ns, cache) ->
255 (us', us1) = splitUniqSupply us
256 uniq = uniqFromSupply us1
257 name = mkImportedLocalName uniq (rdrNameOcc rdr_name) loc
259 setNameSupplyRn (us', inst_ns, cache) `thenRn_`
261 new_name_env = extendRdrEnv name_env rdr_name name
263 setLocalNameEnv new_name_env (enclosed_scope name) `thenRn` \ (result, fvs) ->
264 returnRn (result, delFromNameSet fvs name)
266 bindCoreLocalsFVRn [] thing_inside = thing_inside []
267 bindCoreLocalsFVRn (b:bs) thing_inside = bindCoreLocalFVRn b $ \ name' ->
268 bindCoreLocalsFVRn bs $ \ names' ->
269 thing_inside (name':names')
271 -------------------------------------
272 bindLocalRn doc rdr_name enclosed_scope
273 = getSrcLocRn `thenRn` \ loc ->
274 bindLocatedLocalsRn doc [(rdr_name,loc)] $ \ (n:ns) ->
278 bindLocalsRn doc rdr_names enclosed_scope
279 = getSrcLocRn `thenRn` \ loc ->
280 bindLocatedLocalsRn doc
281 (rdr_names `zip` repeat loc)
284 -- binLocalsFVRn is the same as bindLocalsRn
285 -- except that it deals with free vars
286 bindLocalsFVRn doc rdr_names enclosed_scope
287 = bindLocalsRn doc rdr_names $ \ names ->
288 enclosed_scope names `thenRn` \ (thing, fvs) ->
289 returnRn (thing, delListFromNameSet fvs names)
291 -------------------------------------
292 extendTyVarEnvFVRn :: [HsTyVar Name] -> RnMS (a, FreeVars) -> RnMS (a, FreeVars)
293 -- This tiresome function is used only in rnDecl on InstDecl
294 extendTyVarEnvFVRn tyvars enclosed_scope
295 = getLocalNameEnv `thenRn` \ env ->
297 tyvar_names = map getTyVarName tyvars
298 new_env = addListToRdrEnv env [ (mkRdrUnqual (getOccName name), name)
299 | name <- tyvar_names
302 setLocalNameEnv new_env enclosed_scope `thenRn` \ (thing, fvs) ->
303 returnRn (thing, delListFromNameSet fvs tyvar_names)
305 bindTyVarsRn :: SDoc -> [HsTyVar RdrName]
306 -> ([HsTyVar Name] -> RnMS a)
308 bindTyVarsRn doc_str tyvar_names enclosed_scope
309 = bindTyVars2Rn doc_str tyvar_names $ \ names tyvars ->
310 enclosed_scope tyvars
312 -- Gruesome name: return Names as well as HsTyVars
313 bindTyVars2Rn :: SDoc -> [HsTyVar RdrName]
314 -> ([Name] -> [HsTyVar Name] -> RnMS a)
316 bindTyVars2Rn doc_str tyvar_names enclosed_scope
317 = getSrcLocRn `thenRn` \ loc ->
319 located_tyvars = [(getTyVarName tv, loc) | tv <- tyvar_names]
321 bindLocatedLocalsRn doc_str located_tyvars $ \ names ->
322 enclosed_scope names (zipWith replaceTyVarName tyvar_names names)
324 bindTyVarsFVRn :: SDoc -> [HsTyVar RdrName]
325 -> ([HsTyVar Name] -> RnMS (a, FreeVars))
326 -> RnMS (a, FreeVars)
327 bindTyVarsFVRn doc_str rdr_names enclosed_scope
328 = bindTyVars2Rn doc_str rdr_names $ \ names tyvars ->
329 enclosed_scope tyvars `thenRn` \ (thing, fvs) ->
330 returnRn (thing, delListFromNameSet fvs names)
332 bindTyVarsFV2Rn :: SDoc -> [HsTyVar RdrName]
333 -> ([Name] -> [HsTyVar Name] -> RnMS (a, FreeVars))
334 -> RnMS (a, FreeVars)
335 bindTyVarsFV2Rn doc_str rdr_names enclosed_scope
336 = bindTyVars2Rn doc_str rdr_names $ \ names tyvars ->
337 enclosed_scope names tyvars `thenRn` \ (thing, fvs) ->
338 returnRn (thing, delListFromNameSet fvs names)
341 -------------------------------------
342 checkDupOrQualNames, checkDupNames :: SDoc
343 -> [(RdrName, SrcLoc)]
345 -- Works in any variant of the renamer monad
347 checkDupOrQualNames doc_str rdr_names_w_loc
348 = -- Check for use of qualified names
349 mapRn_ (qualNameErr doc_str) quals `thenRn_`
350 checkDupNames doc_str rdr_names_w_loc
352 quals = filter (isQual.fst) rdr_names_w_loc
354 checkDupNames doc_str rdr_names_w_loc
355 = -- Check for duplicated names in a binding group
356 mapRn_ (dupNamesErr doc_str) dups
358 (_, dups) = removeDups (\(n1,l1) (n2,l2) -> n1 `compare` n2) rdr_names_w_loc
362 %*********************************************************
364 \subsection{Looking up names}
366 %*********************************************************
368 Looking up a name in the RnEnv.
371 lookupBndrRn rdr_name
372 = getNameEnvs `thenRn` \ (global_env, local_env) ->
375 case lookupRdrEnv local_env rdr_name of {
376 Just name -> returnRn name ;
379 getModeRn `thenRn` \ mode ->
381 InterfaceMode -> -- Look in the global name cache
382 mkImportedGlobalFromRdrName rdr_name
384 SourceMode -> -- Source mode, so look up a *qualified* version
385 -- of the name, so that we get the right one even
386 -- if there are many with the same occ name
387 -- There must *be* a binding
388 getModuleRn `thenRn` \ mod ->
389 case lookupRdrEnv global_env (qualifyRdrName mod rdr_name) of
390 Just (name:rest) -> ASSERT( null rest )
392 Nothing -> pprPanic "lookupBndrRn" (ppr mod <+> ppr rdr_name)
395 -- Just like lookupRn except that we record the occurrence too
396 -- Perhaps surprisingly, even wired-in names are recorded.
397 -- Why? So that we know which wired-in names are referred to when
398 -- deciding which instance declarations to import.
399 lookupOccRn :: RdrName -> RnMS Name
401 = getNameEnvs `thenRn` \ (global_env, local_env) ->
402 lookup_occ global_env local_env rdr_name
404 -- lookupGlobalOccRn is like lookupOccRn, except that it looks in the global
405 -- environment. It's used only for
406 -- record field names
407 -- class op names in class and instance decls
408 lookupGlobalOccRn :: RdrName -> RnMS Name
409 lookupGlobalOccRn rdr_name
410 = getNameEnvs `thenRn` \ (global_env, local_env) ->
411 lookup_global_occ global_env rdr_name
413 -- Look in both local and global env
414 lookup_occ global_env local_env rdr_name
415 = case lookupRdrEnv local_env rdr_name of
416 Just name -> returnRn name
417 Nothing -> lookup_global_occ global_env rdr_name
419 -- Look in global env only
420 lookup_global_occ global_env rdr_name
421 = case lookupRdrEnv global_env rdr_name of
422 Just [name] -> returnRn name
423 Just stuff@(name:_) -> addNameClashErrRn rdr_name stuff `thenRn_`
425 Nothing -> getModeRn `thenRn` \ mode ->
427 -- Not found when processing source code; so fail
428 SourceMode -> failWithRn (mkUnboundName rdr_name)
429 (unknownNameErr rdr_name)
431 -- Not found when processing an imported declaration,
432 -- so we create a new name for the purpose
433 InterfaceMode -> mkImportedGlobalFromRdrName rdr_name
436 @lookupImplicitOccRn@ takes an RdrName representing an {\em original} name,
437 and adds it to the occurrence pool so that it'll be loaded later.
438 This is used when language constructs
439 (such as monad comprehensions, overloaded literals, or deriving clauses)
440 require some stuff to be loaded that isn't explicitly mentioned in the code.
442 This doesn't apply in interface mode, where everything is explicit,
443 but we don't check for this case:
444 it does no harm to record an ``extra'' occurrence
445 and @lookupImplicitOccRn@ isn't used much in interface mode
446 (it's only the @Nothing@ clause of @rnDerivs@ that calls it at all I think).
448 \fbox{{\em Jan 98: this comment is wrong: @rnHsType@ uses it quite a bit.}}
450 For List and Tuple types it's important to get the correct
451 @isLocallyDefined@ flag, which is used in turn when deciding
452 whether there are any instance decls in this module are ``special''.
453 The name cache should have the correct provenance, though.
456 lookupImplicitOccRn :: RdrName -> RnM d Name
457 lookupImplicitOccRn rdr_name = mkImportedGlobalFromRdrName rdr_name
460 @unQualInScope@ returns a function that takes a @Name@ and tells whether
461 its unqualified name is in scope. This is put as a boolean flag in
462 the @Name@'s provenance to guide whether or not to print the name qualified
466 unQualInScope :: GlobalRdrEnv -> Name -> Bool
470 lookup name = case lookupRdrEnv env (mkRdrUnqual (nameOccName name)) of
471 Just [name'] -> name == name'
475 %************************************************************************
477 \subsection{Envt utility functions}
479 %************************************************************************
481 \subsubsection{NameEnv}% ================
484 plusGlobalRdrEnv :: GlobalRdrEnv -> GlobalRdrEnv -> GlobalRdrEnv
485 plusGlobalRdrEnv env1 env2 = plusFM_C combine_globals env1 env2
487 addOneToGlobalRdrEnv :: GlobalRdrEnv -> RdrName -> Name -> GlobalRdrEnv
488 addOneToGlobalRdrEnv env rdr_name name = addToFM_C combine_globals env rdr_name [name]
490 delOneFromGlobalRdrEnv :: GlobalRdrEnv -> RdrName -> GlobalRdrEnv
491 delOneFromGlobalRdrEnv env rdr_name = delFromFM env rdr_name
493 combine_globals :: [Name] -- Old
496 combine_globals ns_old ns_new -- ns_new is often short
497 = foldr add ns_old ns_new
499 add n ns | any (is_duplicate n) ns_old = map choose ns -- Eliminate duplicates
502 choose n' | n==n' && better_provenance n n' = n
506 -- a local thing over an imported thing
507 -- a user-imported thing over a non-user-imported thing
508 -- an explicitly-imported thing over an implicitly imported thing
509 better_provenance n1 n2
510 = case (getNameProvenance n1, getNameProvenance n2) of
511 (LocalDef _ _, _ ) -> True
512 (NonLocalDef (UserImport _ _ True) _, _ ) -> True
513 (NonLocalDef (UserImport _ _ _ ) _, NonLocalDef ImplicitImport _) -> True
516 is_duplicate :: Name -> Name -> Bool
517 is_duplicate n1 n2 | isLocallyDefined n1 && isLocallyDefined n2 = False
518 | otherwise = n1 == n2
520 We treat two bindings of a locally-defined name as a duplicate,
521 because they might be two separate, local defns and we want to report
522 and error for that, {\em not} eliminate a duplicate.
524 On the other hand, if you import the same name from two different
525 import statements, we {\em d}* want to eliminate the duplicate, not report
528 If a module imports itself then there might be a local defn and an imported
529 defn of the same name; in this case the names will compare as equal, but
530 will still have different provenances.
534 \subsubsection{ExportAvails}% ================
537 mkEmptyExportAvails :: ModuleName -> ExportAvails
538 mkEmptyExportAvails mod_name = (unitFM mod_name [], emptyUFM)
540 mkExportAvails :: ModuleName -> Bool -> GlobalRdrEnv -> [AvailInfo] -> ExportAvails
541 mkExportAvails mod_name unqual_imp name_env avails
542 = (mod_avail_env, entity_avail_env)
544 mod_avail_env = unitFM mod_name unqual_avails
546 -- unqual_avails is the Avails that are visible in *unqualfied* form
547 -- (1.4 Report, Section 5.1.1)
549 -- import T hiding( f )
550 -- we delete f from avails
552 unqual_avails | not unqual_imp = [] -- Short cut when no unqualified imports
553 | otherwise = mapMaybe prune avails
555 prune (Avail n) | unqual_in_scope n = Just (Avail n)
556 prune (Avail n) | otherwise = Nothing
557 prune (AvailTC n ns) | null uqs = Nothing
558 | otherwise = Just (AvailTC n uqs)
560 uqs = filter unqual_in_scope ns
562 unqual_in_scope n = unQualInScope name_env n
564 entity_avail_env = listToUFM [ (name,avail) | avail <- avails,
565 name <- availNames avail]
567 plusExportAvails :: ExportAvails -> ExportAvails -> ExportAvails
568 plusExportAvails (m1, e1) (m2, e2)
569 = (plusFM_C (++) m1 m2, plusUFM_C plusAvail e1 e2)
570 -- ToDo: wasteful: we do this once for each constructor!
574 \subsubsection{AvailInfo}% ================
577 plusAvail (Avail n1) (Avail n2) = Avail n1
578 plusAvail (AvailTC n1 ns1) (AvailTC n2 ns2) = AvailTC n1 (nub (ns1 ++ ns2))
581 plusAvail a1 a2 = pprPanic "RnEnv.plusAvail" (hsep [pprAvail a1,pprAvail a2])
584 addAvailToNameSet :: NameSet -> AvailInfo -> NameSet
585 addAvailToNameSet names avail = addListToNameSet names (availNames avail)
587 availsToNameSet :: [AvailInfo] -> NameSet
588 availsToNameSet avails = foldl addAvailToNameSet emptyNameSet avails
590 availName :: AvailInfo -> Name
591 availName (Avail n) = n
592 availName (AvailTC n _) = n
594 availNames :: AvailInfo -> [Name]
595 availNames (Avail n) = [n]
596 availNames (AvailTC n ns) = ns
598 filterAvail :: RdrNameIE -- Wanted
599 -> AvailInfo -- Available
600 -> Maybe AvailInfo -- Resulting available;
601 -- Nothing if (any of the) wanted stuff isn't there
603 filterAvail ie@(IEThingWith want wants) avail@(AvailTC n ns)
604 | sub_names_ok = Just (AvailTC n (filter is_wanted ns))
605 | otherwise = Nothing
607 is_wanted name = nameOccName name `elem` wanted_occs
608 sub_names_ok = all (`elem` avail_occs) wanted_occs
609 avail_occs = map nameOccName ns
610 wanted_occs = map rdrNameOcc (want:wants)
612 filterAvail (IEThingAbs _) (AvailTC n ns) = ASSERT( n `elem` ns )
615 filterAvail (IEThingAbs _) avail@(Avail n) = Just avail -- Type synonyms
617 filterAvail (IEVar _) avail@(Avail n) = Just avail
618 filterAvail (IEVar v) avail@(AvailTC n ns) = Just (AvailTC n (filter wanted ns))
620 wanted n = nameOccName n == occ
622 -- The second equation happens if we import a class op, thus
624 -- where op is a class operation
626 filterAvail (IEThingAll _) avail@(AvailTC _ _) = Just avail
628 filterAvail ie avail = Nothing
631 -- In interfaces, pprAvail gets given the OccName of the "host" thing
632 pprAvail avail = getPprStyle $ \ sty ->
633 if ifaceStyle sty then
634 ppr_avail (pprOccName . nameOccName) avail
638 ppr_avail pp_name (AvailTC n ns) = hsep [
640 parens $ hsep $ punctuate comma $
643 ppr_avail pp_name (Avail n) = pp_name n
649 %************************************************************************
651 \subsection{Free variable manipulation}
653 %************************************************************************
656 type FreeVars = NameSet
658 plusFV :: FreeVars -> FreeVars -> FreeVars
659 addOneFV :: FreeVars -> Name -> FreeVars
660 unitFV :: Name -> FreeVars
662 plusFVs :: [FreeVars] -> FreeVars
664 isEmptyFVs = isEmptyNameSet
665 emptyFVs = emptyNameSet
666 plusFVs = unionManyNameSets
667 plusFV = unionNameSets
669 -- No point in adding implicitly imported names to the free-var set
670 addOneFV s n = addOneToNameSet s n
671 unitFV n = unitNameSet n
674 mapFvRn f xs = mapRn f xs `thenRn` \ stuff ->
676 (ys, fvs_s) = unzip stuff
678 returnRn (ys, plusFVs fvs_s)
682 %************************************************************************
684 \subsection{Envt utility functions}
686 %************************************************************************
690 warnUnusedLocalBinds, warnUnusedTopNames, warnUnusedMatches :: [Name] -> RnM d ()
692 warnUnusedTopNames names
693 | not opt_WarnUnusedBinds && not opt_WarnUnusedImports
694 = returnRn () -- Don't force ns unless necessary
696 = warnUnusedBinds (\ is_local -> not is_local) names
698 warnUnusedLocalBinds ns
699 | not opt_WarnUnusedBinds = returnRn ()
700 | otherwise = warnUnusedBinds (\ is_local -> is_local) ns
702 warnUnusedMatches names
703 | opt_WarnUnusedMatches = warnUnusedGroup (const True) names
704 | otherwise = returnRn ()
706 -------------------------
708 warnUnusedBinds :: (Bool -> Bool) -> [Name] -> RnM d ()
709 warnUnusedBinds warn_when_local names
710 = mapRn_ (warnUnusedGroup warn_when_local) groups
712 -- Group by provenance
713 groups = equivClasses cmp names
714 name1 `cmp` name2 = getNameProvenance name1 `cmp_prov` getNameProvenance name2
716 cmp_prov (LocalDef _ _) (NonLocalDef _ _) = LT
717 cmp_prov (LocalDef loc1 _) (LocalDef loc2 _) = loc1 `compare` loc2
718 cmp_prov (NonLocalDef (UserImport m1 loc1 _) _)
719 (NonLocalDef (UserImport m2 loc2 _) _) =
720 (m1 `compare` m2) `thenCmp` (loc1 `compare` loc2)
721 cmp_prov (NonLocalDef _ _) (LocalDef _ _) = GT
722 -- In-scope NonLocalDefs must have UserImport info on them
724 -------------------------
726 warnUnusedGroup :: (Bool -> Bool) -> [Name] -> RnM d ()
727 warnUnusedGroup emit_warning names
728 | null filtered_names = returnRn ()
729 | not (emit_warning is_local) = returnRn ()
731 = pushSrcLocRn def_loc $
733 sep [msg <> colon, nest 4 (fsep (punctuate comma (map ppr filtered_names)))]
735 filtered_names = filter reportable names
736 name1 = head filtered_names
737 (is_local, def_loc, msg)
738 = case getNameProvenance name1 of
739 LocalDef loc _ -> (True, loc, text "Defined but not used")
740 NonLocalDef (UserImport mod loc _) _ ->
741 (True, loc, text "Imported from" <+> quotes (ppr mod) <+>
743 other -> (False, getSrcLoc name1, text "Strangely defined but not used")
745 reportable name = case occNameUserString (nameOccName name) of
748 -- Haskell 98 encourages compilers to suppress warnings about
749 -- unused names in a pattern if they start with "_".
753 addNameClashErrRn rdr_name (name1:names)
754 = addErrRn (vcat [ptext SLIT("Ambiguous occurrence") <+> quotes (ppr rdr_name),
755 ptext SLIT("It could refer to") <+> vcat (msg1 : msgs)])
757 msg1 = ptext SLIT("either") <+> mk_ref name1
758 msgs = [ptext SLIT(" or") <+> mk_ref name | name <- names]
759 mk_ref name = quotes (ppr name) <> comma <+> pprNameProvenance name
761 fixityClashErr (rdr_name, ((_,how_in_scope1), (_, how_in_scope2)))
762 = hang (hsep [ptext SLIT("Conflicting fixities for"), quotes (ppr rdr_name)])
763 4 (vcat [ppr how_in_scope1,
766 shadowedNameWarn shadow
767 = hsep [ptext SLIT("This binding for"),
769 ptext SLIT("shadows an existing binding")]
772 = sep [text flavour, ptext SLIT("not in scope:"), quotes (ppr name)]
774 flavour = occNameFlavour (rdrNameOcc name)
776 qualNameErr descriptor (name,loc)
778 addErrRn (hsep [ ptext SLIT("Invalid use of qualified name"),
783 dupNamesErr descriptor ((name,loc) : dup_things)
785 addErrRn ((ptext SLIT("Conflicting definitions for") <+> quotes (ppr name))
787 (ptext SLIT("in") <+> descriptor))