2 % (c) The GRASP/AQUA Project, Glasgow University, 1992-1996
4 \section[RnMonad4]{The monad used by the fourth renamer pass}
7 #include "HsVersions.h"
11 initRn4, thenRn4, thenRn4_, andRn4, returnRn4, mapRn4, mapAndUnzipRn4,
12 addErrRn4, failButContinueRn4, recoverQuietlyRn4,
15 lookupValue, lookupValueEvenIfInvisible,
16 lookupClassOp, lookupFixityOp,
17 lookupTyCon, lookupTyConEvenIfInvisible,
22 TyVarNamesEnv(..), mkTyVarNamesEnv, domTyVarNamesEnv,
23 lookupTyVarName, nullTyVarNamesEnv, catTyVarNamesEnvs
30 import Bag ( emptyBag, isEmptyBag, unionBags, snocBag, Bag )
31 import CmdLineOpts ( opt_ShowPragmaNameErrs, opt_NameShadowingNotOK )
33 import FiniteMap ( emptyFM, addListToFM, addToFM, lookupFM )
34 import Name ( invisibleName, isTyConName, isClassName,
35 isClassOpName, isUnboundName, Name(..)
37 import NameTypes ( mkShortName, ShortName{-instances-} )
38 import Outputable ( pprNonOp )
40 import ProtoName ( eqProtoName, cmpByLocalName, ProtoName(..) )
41 import RnUtils ( dupNamesErr, GlobalNameMappers(..) )
42 import SrcLoc ( mkUnknownSrcLoc, SrcLoc{-instance-} )
43 import UniqSet ( mkUniqSet, minusUniqSet, UniqSet(..) )
44 import UniqSupply ( getUniques, splitUniqSupply )
45 import Util ( assoc, removeDups, zipWithEqual, panic )
47 infixr 9 `thenRn4`, `thenRn4_`
50 %************************************************************************
52 \subsection[RnMonad4]{Plain @Rename@ monadery for pass~4}
54 %************************************************************************
57 type ScopeStack = FiniteMap FAST_STRING Name
65 -> (result, Bag Error)
68 {-# INLINE thenRn4 #-}
69 {-# INLINE thenLazilyRn4 #-}
70 {-# INLINE thenRn4_ #-}
71 {-# INLINE returnRn4 #-}
73 initRn4 :: GlobalNameMappers
76 -> (result, Bag Error)
78 initRn4 gnfs renamer init_us
79 = renamer gnfs emptyFM emptyBag init_us mkUnknownSrcLoc
81 thenRn4, thenLazilyRn4
82 :: Rn4M a -> (a -> Rn4M b) -> Rn4M b
83 thenRn4_ :: Rn4M a -> Rn4M b -> Rn4M b
84 andRn4 :: (a -> a -> a) -> Rn4M a -> Rn4M a -> Rn4M a
86 thenRn4 expr cont gnfs ss errs uniqs locn
87 = case (splitUniqSupply uniqs) of { (s1, s2) ->
88 case (expr gnfs ss errs s1 locn) of { (res1, errs1) ->
89 case (cont res1 gnfs ss errs1 s2 locn) of { (res2, errs2) ->
92 thenLazilyRn4 expr cont gnfs ss errs uniqs locn
94 (s1, s2) = splitUniqSupply uniqs
95 (res1, errs1) = expr gnfs ss errs s1 locn
96 (res2, errs2) = cont res1 gnfs ss errs1 s2 locn
100 thenRn4_ expr cont gnfs ss errs uniqs locn
101 = case (splitUniqSupply uniqs) of { (s1, s2) ->
102 case (expr gnfs ss errs s1 locn) of { (_, errs1) ->
103 case (cont gnfs ss errs1 s2 locn) of { (res2, errs2) ->
106 andRn4 combiner m1 m2 gnfs ss errs us locn
107 = case (splitUniqSupply us) of { (s1, s2) ->
108 case (m1 gnfs ss errs s1 locn) of { (res1, errs1) ->
109 case (m2 gnfs ss errs1 s2 locn) of { (res2, errs2) ->
110 (combiner res1 res2, errs2) }}}
112 returnRn4 :: a -> Rn4M a
113 returnRn4 result gnfs ss errs_so_far uniqs locn
114 = (result, errs_so_far)
116 failButContinueRn4 :: a -> Error -> Rn4M a
117 failButContinueRn4 res err gnfs ss errs_so_far uniqs locn
118 = (res, errs_so_far `snocBag` err)
120 addErrRn4 :: Error -> Rn4M ()
121 addErrRn4 err gnfs ss errs_so_far uniqs locn
122 = ((), errs_so_far `snocBag` err)
125 When we're looking at interface pragmas, we want to be able to recover
126 back to a ``I don't know anything pragmatic'' state if we encounter
127 some problem. @recoverQuietlyRn4@ is given a ``use-this-instead'' value,
128 as well as the action to perform. This code is intentionally very lazy,
129 returning a triple immediately, no matter what.
131 recoverQuietlyRn4 :: a -> Rn4M a -> Rn4M a
133 recoverQuietlyRn4 use_this_if_err action gnfs ss errs_so_far uniqs locn
136 = case (action gnfs ss emptyBag{-leav out errs-} uniqs locn) of
138 if isEmptyBag errs1 then -- all's well! (but retain incoming errs)
139 (result1, errs_so_far)
140 else -- give up; return *incoming* UniqueSupply...
142 if opt_ShowPragmaNameErrs
143 then errs_so_far `unionBags` errs1
144 else errs_so_far) -- toss errs, otherwise
150 mapRn4 :: (a -> Rn4M b) -> [a] -> Rn4M [b]
152 mapRn4 f [] = returnRn4 []
154 = f x `thenRn4` \ r ->
155 mapRn4 f xs `thenRn4` \ rs ->
158 mapAndUnzipRn4 :: (a -> Rn4M (b,c)) -> [a] -> Rn4M ([b],[c])
160 mapAndUnzipRn4 f [] = returnRn4 ([],[])
161 mapAndUnzipRn4 f (x:xs)
162 = f x `thenRn4` \ (r1, r2) ->
163 mapAndUnzipRn4 f xs `thenRn4` \ (rs1, rs2) ->
164 returnRn4 (r1:rs1, r2:rs2)
168 pushSrcLocRn4 :: SrcLoc -> Rn4M a -> Rn4M a
169 pushSrcLocRn4 locn exp gnfs ss errs_so_far uniq_supply old_locn
170 = exp gnfs ss errs_so_far uniq_supply locn
172 getSrcLocRn4 :: Rn4M SrcLoc
174 getSrcLocRn4 gnfs ss errs_so_far uniq_supply locn
175 = returnRn4 locn gnfs ss errs_so_far uniq_supply locn
179 getNextUniquesFromRn4 :: Int -> Rn4M [Unique]
180 getNextUniquesFromRn4 n gnfs ss errs_so_far us locn
181 = case (getUniques n us) of { next_uniques ->
182 (next_uniques, errs_so_far) }
185 *********************************************************
187 \subsection{Making new names}
189 *********************************************************
191 @namesFromProtoNames@ takes a bunch of protonames, which are defined
192 together in a group (eg a pattern or set of bindings), checks they
193 are distinct, and creates new full names for them.
196 namesFromProtoNames :: String -- Documentation string
197 -> [(ProtoName, SrcLoc)]
200 namesFromProtoNames kind pnames_w_src_loc gnfs ss errs_so_far us locn
201 = (mapRn4 (addErrRn4 . dupNamesErr kind) dups `thenRn4_`
203 ) {-Rn4-} gnfs ss errs_so_far us locn
205 (goodies, dups) = removeDups cmp pnames_w_src_loc
206 -- We want to compare their local names rather than their
207 -- full protonames. It probably doesn't matter here, but it
208 -- does in RnPass3.lhs!
209 cmp (a, _) (b, _) = cmpByLocalName a b
212 @mkNewNames@ assumes the names are unique.
215 mkNewNames :: [(ProtoName, SrcLoc)] -> Rn4M [Name]
216 mkNewNames pnames_w_locs
217 = getNextUniquesFromRn4 (length pnames_w_locs) `thenRn4` \ uniqs ->
218 returnRn4 (zipWithEqual new_short_name uniqs pnames_w_locs)
220 new_short_name uniq (Unk str, srcloc) -- gotta be an Unk...
221 = Short uniq (mkShortName str srcloc)
225 *********************************************************
227 \subsection{Local scope extension and lookup}
229 *********************************************************
231 If the input name is an @Imp@, @lookupValue@ looks it up in the GNF.
232 If it is an @Unk@, it looks it up first in the local environment
233 (scope stack), and if it isn't found there, then in the value GNF. If
234 it isn't found at all, @lookupValue@ adds an error message, and
235 returns an @Unbound@ name.
238 unboundName :: ProtoName -> Name
240 = Unbound (grab_string pn)
242 grab_string (Unk s) = s
243 grab_string (Qunk _ s) = s
244 grab_string (Imp _ _ _ s) = s
247 @lookupValue@ looks up a non-invisible value;
248 @lookupValueEvenIfInvisible@ gives a successful lookup even if the
249 value is not visible to the user (e.g., came out of a pragma).
250 @lookup_val@ is the help function to do the work.
253 lookupValue v {-Rn4-} gnfs ss errs_so_far us locn
254 = (lookup_val v `thenLazilyRn4` \ name ->
255 if invisibleName name
256 then failButContinueRn4 (unboundName v) (unknownNameErr "value" v mkUnknownSrcLoc)
258 ) {-Rn4-} gnfs ss errs_so_far us locn
260 lookupValueEvenIfInvisible v = lookup_val v
262 lookup_val :: ProtoName -> Rn4M Name
264 lookup_val pname@(Unk v) gnfs@(v_gnf, tc_gnf) ss a b locn
265 = case (lookupFM ss v) of
266 Just name -> returnRn4 name gnfs ss a b locn
267 Nothing -> case (v_gnf pname) of
268 Just name -> returnRn4 name gnfs ss a b locn
269 Nothing -> failButContinueRn4 (unboundName pname)
270 (unknownNameErr "value" pname locn)
273 lookup_val (Qunk _ _) _ _ _ _ _ = panic "RnMonad4:lookup_val:Qunk"
275 -- If it ain't an Unk it must be in the global name fun; that includes
277 lookup_val pname gnfs@(v_gnf, tc_gnf) ss a b locn
278 = case (v_gnf pname) of
279 Just name -> returnRn4 name gnfs ss a b locn
280 Nothing -> failButContinueRn4 (unboundName pname)
281 (unknownNameErr "value" pname locn)
285 Looking up the operators in a fixity decl is done differently. We
286 want to simply drop any fixity decls which refer to operators which
287 aren't in scope. Unfortunately, such fixity decls {\em will} appear
288 because the parser collects *all* the fixity decls from {\em all} the
289 imported interfaces (regardless of selective import), and dumps them
290 together as the module fixity decls. This is really a bug. In
294 We won't complain about fixity decls for operators which aren't
297 We won't attach the right fixity to something which has been renamed.
300 We're not going to export Prelude-related fixities (ToDo: correctly),
301 so we nuke those, too.
304 lookupFixityOp (Prel _) gnfs@(v_gnf, tc_gnf) = returnRn4 Nothing gnfs
305 lookupFixityOp pname gnfs@(v_gnf, tc_gnf) = returnRn4 (v_gnf pname) gnfs
309 lookupTyCon, lookupTyConEvenIfInvisible :: ProtoName -> Rn4M Name
310 -- The global name funs handle Prel things
312 lookupTyCon tc {-Rn4-} gnfs ss errs_so_far us locn
313 = (lookup_tycon tc `thenLazilyRn4` \ name ->
314 if invisibleName name
315 then failButContinueRn4 (unboundName tc) (unknownNameErr "type constructor" tc mkUnknownSrcLoc)
317 ) {-Rn4-} gnfs ss errs_so_far us locn
319 lookupTyConEvenIfInvisible tc = lookup_tycon tc
321 lookup_tycon (Prel name) gnfs ss a b locn = returnRn4 name gnfs ss a b locn
323 lookup_tycon pname gnfs@(v_gnf, tc_gnf) ss a b locn
324 = case (tc_gnf pname) of
325 Just name | isTyConName name -> returnRn4 name gnfs ss a b locn
326 _ -> failButContinueRn4 (unboundName pname)
327 (unknownNameErr "type constructor" pname locn)
332 lookupClass :: ProtoName -> Rn4M Name
334 lookupClass pname gnfs@(v_gnf, tc_gnf) ss a b locn
335 = case (tc_gnf pname) of
336 Just name | isClassName name -> returnRn4 name gnfs ss a b locn
337 _ -> failButContinueRn4 (unboundName pname)
338 (unknownNameErr "class" pname locn)
342 @lookupClassOp@ is used when looking up the lhs identifiers in a class
343 or instance decl. It checks that the name it finds really is a class
344 op, and that its class matches that of the class or instance decl
348 lookupClassOp :: Name -> ProtoName -> Rn4M Name
350 lookupClassOp class_name pname gnfs@(v_gnf, tc_gnf) ss a b locn
351 = case v_gnf pname of
352 Just op_name | isClassOpName class_name op_name
353 || isUnboundName class_name -- avoid spurious errors
354 -> returnRn4 op_name gnfs ss a b locn
356 other -> failButContinueRn4 (unboundName pname)
357 (badClassOpErr class_name pname locn)
361 @extendSS@ extends the scope; @extendSS2@ also removes the newly bound
362 free vars from the result.
365 extendSS :: [Name] -- Newly bound names
369 extendSS binders expr gnfs ss errs us locn
370 = case (extend binders ss gnfs ss errs us locn) of { (new_ss, new_errs) ->
371 expr gnfs new_ss new_errs us locn }
373 extend :: [Name] -> ScopeStack -> Rn4M ScopeStack
376 = if opt_NameShadowingNotOK then
378 else -- ignore shadowing; blast 'em in
380 addListToFM ss [ (getOccurrenceName x, n) | n@(Short _ x) <- names]
383 hard_way [] ss = returnRn4 ss
384 hard_way (name@(Short _ sname):names) ss
386 str = getOccurrenceName sname
388 (case (lookupFM ss str) of
389 Nothing -> returnRn4 (addToFM ss str name)
390 Just _ -> failButContinueRn4 ss (shadowedNameErr name locn)
392 ) `thenRn4` \ new_ss ->
393 hard_way names new_ss
395 extendSS2 :: [Name] -- Newly bound names
396 -> Rn4M (a, UniqSet Name)
397 -> Rn4M (a, UniqSet Name)
399 extendSS2 binders expr gnfs ss errs_so_far us locn
400 = case (extendSS binders expr gnfs ss errs_so_far us locn) of
401 ((e2, freevars), errs)
402 -> ((e2, freevars `minusUniqSet` (mkUniqSet binders)),
406 The free var set returned by @(extendSS binders m)@ is that returned
407 by @m@, {\em minus} binders.
409 *********************************************************
411 \subsection{mkTyVarNamesEnv}
413 *********************************************************
416 type TyVarNamesEnv = [(ProtoName, Name)]
418 nullTyVarNamesEnv :: TyVarNamesEnv
419 nullTyVarNamesEnv = []
421 catTyVarNamesEnvs :: TyVarNamesEnv -> TyVarNamesEnv -> TyVarNamesEnv
422 catTyVarNamesEnvs e1 e2 = e1 ++ e2
424 domTyVarNamesEnv :: TyVarNamesEnv -> [ProtoName]
425 domTyVarNamesEnv env = map fst env
428 @mkTyVarNamesEnv@ checks for duplicates, and complains if so.
433 -> [ProtoName] -- The type variables
434 -> Rn4M (TyVarNamesEnv,[Name]) -- Environment and renamed tyvars
436 mkTyVarNamesEnv src_loc tyvars {-Rn4-} gnfs ss errs_so_far us locn
437 = (namesFromProtoNames "type variable"
438 (tyvars `zip` repeat src_loc) `thenRn4` \ tyvars2 ->
440 -- tyvars2 may not be in the same order as tyvars, so we need some
441 -- jiggery pokery to build the right tyvar env, and return the
442 -- renamed tyvars in the original order.
443 let tv_string_name_pairs = extend tyvars2 []
444 tv_env = map (lookup tv_string_name_pairs) tyvars
445 tyvars2_in_orig_order = map snd tv_env
447 returnRn4 (tv_env, tyvars2_in_orig_order)
448 ) {-Rn4-} gnfs ss errs_so_far us locn
450 extend :: [Name] -> [(FAST_STRING, Name)] -> [(FAST_STRING, Name)]
452 extend (name@(Short _ sname):names) ss
453 = (getOccurrenceName sname, name) : extend names ss
455 lookup :: [(FAST_STRING, Name)] -> ProtoName -> (ProtoName, Name)
456 lookup pairs tyvar_pn
457 = (tyvar_pn, assoc "mkTyVarNamesEnv" pairs (getOccurrenceName tyvar_pn))
461 lookupTyVarName :: TyVarNamesEnv -> ProtoName -> Rn4M Name
462 lookupTyVarName env pname {-Rn4-} gnfs ss errs_so_far us locn
463 = (case (assoc_maybe env pname) of
464 Just name -> returnRn4 name
465 Nothing -> getSrcLocRn4 `thenRn4` \ loc ->
466 failButContinueRn4 (unboundName pname)
467 (unknownNameErr "type variable" pname loc)
468 ) {-Rn4-} gnfs ss errs_so_far us locn
470 assoc_maybe [] _ = Nothing
471 assoc_maybe ((tv,xxx) : tvs) key
472 = if tv `eqProtoName` key then Just xxx else assoc_maybe tvs key
475 %************************************************************************
477 \subsection{Error messages}
479 %************************************************************************
482 badClassOpErr clas op locn
483 = addErrLoc locn "" ( \ sty ->
484 ppBesides [ppChar '`', pprNonOp sty op, ppStr "' is not an operation of class `",
485 ppr sty clas, ppStr "'."] )
487 ----------------------------
488 -- dupNamesErr: from RnUtils
490 ---------------------------
491 shadowedNameErr shadow locn
492 = addShortErrLocLine locn ( \ sty ->
493 ppBesides [ppStr "more than one value with the same name (shadowing): ",
496 ------------------------------------------
497 unknownNameErr descriptor undef_thing locn
498 = addShortErrLocLine locn ( \ sty ->
499 ppBesides [ppStr "undefined ", ppStr descriptor, ppStr ": ",
500 pprNonOp sty undef_thing] )