2 % (c) The GRASP/AQUA Project, Glasgow University, 1992-1996
4 \section[RnMonad]{The monad used by the renamer}
7 #include "HsVersions.h"
10 RnMonad(..), RnM(..), RnM_Fixes(..), RnDown, SST_R,
11 initRn, thenRn, thenRn_, andRn, returnRn,
14 addErrRn, addErrIfRn, addWarnRn, addWarnIfRn,
15 failButContinueRn, warnAndContinueRn,
16 setExtraRn, getExtraRn,
17 getModuleRn, pushSrcLocRn, getSrcLocRn,
18 getSourceRn, getOccurrenceUpRn,
19 getImplicitUpRn, ImplicitEnv(..),
20 rnGetUnique, rnGetUniques,
23 lookupValue, lookupValueMaybe,
24 lookupTyCon, lookupClass, lookupClassOp,
27 TyVarNamesEnv(..), mkTyVarNamesEnv, domTyVarNamesEnv,
28 lookupTyVarName, nullTyVarNamesEnv, catTyVarNamesEnvs
35 import HsSyn ( FixityDecl )
36 import RnHsSyn ( RnName, mkRnName, mkRnUnbound, mkRnImplicit,
37 mkRnImplicitTyCon, mkRnImplicitClass,
38 isRnLocal, isRnWired, isRnTyCon, isRnClass, isRnClassOp,
39 RenamedFixityDecl(..) )
40 import RnUtils ( RnEnv(..), extendLocalRnEnv,
41 lookupRnEnv, lookupTcRnEnv,
42 unknownNameErr, badClassOpErr, qualNameErr,
43 dupNamesErr, shadowedNameWarn )
45 import Bag ( Bag, emptyBag, isEmptyBag, snocBag )
46 import CmdLineOpts ( opt_WarnNameShadowing )
47 import ErrUtils ( Error(..), Warning(..) )
48 import FiniteMap ( FiniteMap, emptyFM, lookupFM, addToFM )
49 import Maybes ( assocMaybe )
50 import Name ( Module(..), RdrName(..), isQual,
51 Name, mkLocalName, mkImplicitName
53 import Outputable ( getOccName )
54 import PprStyle ( PprStyle )
55 import Pretty ( Pretty(..), PrettyRep )
56 import SrcLoc ( SrcLoc, mkUnknownSrcLoc )
57 import UniqFM ( UniqFM, emptyUFM )
58 import UniqSet ( UniqSet(..), mkUniqSet, minusUniqSet )
59 import UniqSupply ( UniqSupply, getUnique, getUniques, splitUniqSupply )
60 import Unique ( Unique )
63 infixr 9 `thenRn`, `thenRn_`
67 type RnM s r = RnMonad () s r
68 type RnM_Fixes s r = RnMonad (UniqFM RenamedFixityDecl) s r
70 type RnMonad x s r = RnDown x s -> SST s r
76 SrcLoc -- Source location
77 (RnMode s) -- Source or Iface
78 RnEnv -- Renaming environment
79 (MutableVar s UniqSupply) -- Unique supply
80 (MutableVar s (Bag Warning, -- Warnings and Errors
84 = RnSource (MutableVar s (Bag (RnName, RdrName)))
85 -- Renaming source; returning occurences
87 | RnIface (MutableVar s ImplicitEnv)
88 -- Renaming interface; creating and returning implicit names
89 -- One map for Values and one for TyCons/Classes.
91 type ImplicitEnv = (FiniteMap RdrName RnName, FiniteMap RdrName RnName)
94 -- With a builtin polymorphic type for _runSST the type for
95 -- initTc should use RnM s r instead of RnM _RealWorld r
97 initRn :: Bool -- True => Source; False => Iface
102 -> (r, Bag Error, Bag Warning)
104 initRn source mod env us do_rn
106 newMutVarSST emptyBag `thenSST` \ occ_var ->
107 newMutVarSST (emptyFM,emptyFM) `thenSST` \ imp_var ->
108 newMutVarSST us `thenSST` \ us_var ->
109 newMutVarSST (emptyBag,emptyBag) `thenSST` \ errs_var ->
111 mode = if source then
116 rn_down = RnDown () mod mkUnknownSrcLoc mode env us_var errs_var
119 do_rn rn_down `thenSST` \ res ->
121 -- grab errors and return
122 readMutVarSST errs_var `thenSST` \ (warns,errs) ->
123 returnSST (res, errs, warns)
126 {-# INLINE thenRn #-}
127 {-# INLINE thenRn_ #-}
128 {-# INLINE returnRn #-}
131 returnRn :: a -> RnMonad x s a
132 thenRn :: RnMonad x s a -> (a -> RnMonad x s b) -> RnMonad x s b
133 thenRn_ :: RnMonad x s a -> RnMonad x s b -> RnMonad x s b
134 andRn :: (a -> a -> a) -> RnMonad x s a -> RnMonad x s a -> RnMonad x s a
135 mapRn :: (a -> RnMonad x s b) -> [a] -> RnMonad x s [b]
136 mapAndUnzipRn :: (a -> RnMonad x s (b,c)) -> [a] -> RnMonad x s ([b],[c])
138 returnRn v down = returnSST v
139 thenRn m k down = m down `thenSST` \ r -> k r down
140 thenRn_ m k down = m down `thenSST_` k down
142 andRn combiner m1 m2 down
143 = m1 down `thenSST` \ res1 ->
144 m2 down `thenSST` \ res2 ->
145 returnSST (combiner res1 res2)
147 mapRn f [] = returnRn []
149 = f x `thenRn` \ r ->
150 mapRn f xs `thenRn` \ rs ->
153 mapAndUnzipRn f [] = returnRn ([],[])
154 mapAndUnzipRn f (x:xs)
155 = f x `thenRn` \ (r1, r2) ->
156 mapAndUnzipRn f xs `thenRn` \ (rs1, rs2) ->
157 returnRn (r1:rs1, r2:rs2)
160 For errors and warnings ...
162 failButContinueRn :: a -> Error -> RnMonad x s a
163 failButContinueRn res err (RnDown _ _ _ _ _ _ errs_var)
164 = readMutVarSST errs_var `thenSST` \ (warns,errs) ->
165 writeMutVarSST errs_var (warns, errs `snocBag` err) `thenSST_`
168 warnAndContinueRn :: a -> Warning -> RnMonad x s a
169 warnAndContinueRn res warn (RnDown _ _ _ _ _ _ errs_var)
170 = readMutVarSST errs_var `thenSST` \ (warns,errs) ->
171 writeMutVarSST errs_var (warns `snocBag` warn, errs) `thenSST_`
174 addErrRn :: Error -> RnMonad x s ()
175 addErrRn err = failButContinueRn () err
177 addErrIfRn :: Bool -> Error -> RnMonad x s ()
178 addErrIfRn True err = addErrRn err
179 addErrIfRn False err = returnRn ()
181 addWarnRn :: Warning -> RnMonad x s ()
182 addWarnRn warn = warnAndContinueRn () warn
184 addWarnIfRn :: Bool -> Warning -> RnMonad x s ()
185 addWarnIfRn True warn = addWarnRn warn
186 addWarnIfRn False warn = returnRn ()
191 setExtraRn :: x -> RnMonad x s r -> RnMonad y s r
192 setExtraRn x m (RnDown _ mod locn mode env us errs)
193 = m (RnDown x mod locn mode env us errs)
195 getExtraRn :: RnMonad x s x
196 getExtraRn (RnDown x _ _ _ _ _ _)
199 getModuleRn :: RnMonad x s Module
200 getModuleRn (RnDown _ mod _ _ _ _ _)
203 pushSrcLocRn :: SrcLoc -> RnMonad x s a -> RnMonad x s a
204 pushSrcLocRn locn m (RnDown x mod _ mode env us errs)
205 = m (RnDown x mod locn mode env us errs)
207 getSrcLocRn :: RnMonad x s SrcLoc
208 getSrcLocRn (RnDown _ _ locn _ _ _ _)
211 getSourceRn :: RnMonad x s Bool
212 getSourceRn (RnDown _ _ _ (RnSource _) _ _ _) = returnSST True
213 getSourceRn (RnDown _ _ _ (RnIface _) _ _ _) = returnSST False
215 getOccurrenceUpRn :: RnMonad x s (Bag (RnName, RdrName))
216 getOccurrenceUpRn (RnDown _ _ _ (RnSource occ_var) _ _ _)
217 = readMutVarSST occ_var
218 getOccurrenceUpRn (RnDown _ _ _ (RnIface _) _ _ _)
219 = panic "getOccurrenceUpRn:RnIface"
221 getImplicitUpRn :: RnMonad x s (FiniteMap RdrName RnName, FiniteMap RdrName RnName)
222 getImplicitUpRn (RnDown _ _ _ (RnIface imp_var) _ _ _)
223 = readMutVarSST imp_var
224 getImplicitUpRn (RnDown _ _ _(RnSource _) _ _ _)
225 = panic "getImplicitUpRn:RnIface"
229 rnGetUnique :: RnMonad x s Unique
230 rnGetUnique (RnDown _ _ _ _ _ us_var _)
233 rnGetUniques :: Int -> RnMonad x s [Unique]
234 rnGetUniques n (RnDown _ _ _ _ _ us_var _)
235 = get_uniques n us_var
239 = readMutVarSST us_var `thenSST` \ uniq_supply ->
241 (new_uniq_supply, uniq_s) = splitUniqSupply uniq_supply
242 uniq = getUnique uniq_s
244 writeMutVarSST us_var new_uniq_supply `thenSST_`
248 = readMutVarSST us_var `thenSST` \ uniq_supply ->
250 (new_uniq_supply, uniq_s) = splitUniqSupply uniq_supply
251 uniqs = getUniques n uniq_s
253 writeMutVarSST us_var new_uniq_supply `thenSST_`
256 snoc_bag_var add bag_var
257 = readMutVarSST bag_var `thenSST` \ bag ->
258 writeMutVarSST bag_var (bag `snocBag` add)
262 *********************************************************
264 \subsection{Making new names}
266 *********************************************************
268 @newLocalNames@ takes a bunch of RdrNames, which are defined together
269 in a group (eg a pattern or set of bindings), checks they are
270 unqualified and distinct, and creates new Names for them.
273 newLocalNames :: String -- Documentation string
274 -> [(RdrName, SrcLoc)]
275 -> RnMonad x s [RnName]
277 newLocalNames str names_w_loc
278 = mapRn (addErrRn . qualNameErr str) quals `thenRn_`
279 mapRn (addErrRn . dupNamesErr str) dups `thenRn_`
282 quals = filter (isQual.fst) names_w_loc
283 (these, dups) = removeDups cmp_fst names_w_loc
284 cmp_fst (a,_) (b,_) = cmp a b
288 mkLocalNames :: [(RdrName, SrcLoc)] -> RnMonad x s [RnName]
289 mkLocalNames names_w_locs
290 = rnGetUniques (length names_w_locs) `thenRn` \ uniqs ->
291 returnRn (zipWithEqual new_local uniqs names_w_locs)
293 new_local uniq (Unqual str, srcloc)
294 = mkRnName (mkLocalName uniq str srcloc)
298 *********************************************************
300 \subsection{Looking up values}
302 *********************************************************
304 Action to look up a value depends on the RnMode.
307 Lookup value in RnEnv, recording occurrence for non-local values found.
308 If not found report error and return Unbound name.
310 Lookup value in RnEnv. If not found lookup in implicit name env.
311 If not found create new implicit name, adding it to the implicit env.
315 lookupValue :: RdrName -> RnMonad x s RnName
316 lookupClassOp :: RnName -> RdrName -> RnMonad x s RnName
319 = lookup_val rdr (\ rn -> True) (unknownNameErr "value")
321 lookupClassOp cls rdr
322 = lookup_val rdr (isRnClassOp cls) (badClassOpErr cls)
325 lookup_val rdr check do_err down@(RnDown _ _ locn (RnSource occ_var) env _ _)
326 = case lookupRnEnv env rdr of
327 Just name | check name -> succ name
332 succ name = if isRnLocal name || isRnWired name then
335 snoc_bag_var (name,rdr) occ_var `thenSST_`
337 fail = failButContinueRn (mkRnUnbound rdr) (do_err rdr locn) down
339 lookup_val rdr check do_err down@(RnDown _ _ locn (RnIface imp_var) env us_var _)
340 = case lookupRnEnv env rdr of
341 Just name | check name -> returnSST name
342 | otherwise -> failButContinueRn (mkRnUnbound rdr) (do_err rdr locn) down
343 Nothing -> lookup_or_create_implicit_val imp_var us_var rdr
345 lookup_or_create_implicit_val imp_var us_var rdr
346 = readMutVarSST imp_var `thenSST` \ (implicit_val_fm, implicit_tc_fm)->
347 case lookupFM implicit_val_fm rdr of
348 Just implicit -> returnSST implicit
350 get_unique us_var `thenSST` \ uniq ->
352 implicit = mkRnImplicit (mkImplicitName uniq rdr)
353 new_val_fm = addToFM implicit_val_fm rdr implicit
355 writeMutVarSST imp_var (new_val_fm, implicit_tc_fm) `thenSST_`
359 lookupValueMaybe :: RdrName -> RnMonad x s (Maybe RnName)
360 lookupValueMaybe rdr down@(RnDown _ _ _ (RnSource _) env _ _)
361 = returnSST (lookupRnEnv env rdr)
366 lookupTyCon :: RdrName -> RnMonad x s RnName
367 lookupClass :: RdrName -> RnMonad x s RnName
370 = lookup_tc rdr isRnTyCon mkRnImplicitTyCon "type constructor"
373 = lookup_tc rdr isRnClass mkRnImplicitClass "class"
376 lookup_tc rdr check mk_implicit err_str down@(RnDown _ _ locn (RnSource occ_var) env _ _)
377 = case lookupTcRnEnv env rdr of
378 Just name | check name -> succ name
382 succ name = snoc_bag_var (name,rdr) occ_var `thenSST_`
384 fail = failButContinueRn (mkRnUnbound rdr) (unknownNameErr err_str rdr locn) down
386 lookup_tc rdr check mk_implicit err_str down@(RnDown _ _ locn (RnIface imp_var) env us_var _)
387 = case lookupTcRnEnv env rdr of
388 Just name | check name -> returnSST name
390 Nothing -> lookup_or_create_implicit_tc check mk_implicit fail imp_var us_var rdr
392 fail = failButContinueRn (mkRnUnbound rdr) (unknownNameErr err_str rdr locn) down
394 lookup_or_create_implicit_tc check mk_implicit fail imp_var us_var rdr
395 = readMutVarSST imp_var `thenSST` \ (implicit_val_fm, implicit_tc_fm)->
396 case lookupFM implicit_tc_fm rdr of
397 Just implicit | check implicit -> returnSST implicit
400 get_unique us_var `thenSST` \ uniq ->
402 implicit = mk_implicit (mkImplicitName uniq rdr)
403 new_tc_fm = addToFM implicit_tc_fm rdr implicit
405 writeMutVarSST imp_var (implicit_val_fm, new_tc_fm) `thenSST_`
410 @extendSS@ extends the scope; @extendSS2@ also removes the newly bound
411 free vars from the result.
414 extendSS :: [RnName] -- Newly bound names
418 extendSS binders m down@(RnDown x mod locn mode env us errs)
419 = (mapRn (addErrRn . shadowedNameWarn locn) dups `thenRn_`
420 m) (RnDown x mod locn mode new_env us errs)
422 (new_env,dups) = extendLocalRnEnv opt_WarnNameShadowing env binders
424 extendSS2 :: [RnName] -- Newly bound names
425 -> RnMonad x s (a, UniqSet RnName)
426 -> RnMonad x s (a, UniqSet RnName)
429 = extendSS binders m `thenRn` \ (r, fvs) ->
430 returnRn (r, fvs `minusUniqSet` (mkUniqSet binders))
433 The free var set returned by @(extendSS binders m)@ is that returned
434 by @m@, {\em minus} binders.
437 *********************************************************
439 \subsection{TyVarNamesEnv}
441 *********************************************************
444 type TyVarNamesEnv = [(RdrName, RnName)]
446 nullTyVarNamesEnv :: TyVarNamesEnv
447 nullTyVarNamesEnv = []
449 catTyVarNamesEnvs :: TyVarNamesEnv -> TyVarNamesEnv -> TyVarNamesEnv
450 catTyVarNamesEnvs e1 e2 = e1 ++ e2
452 domTyVarNamesEnv :: TyVarNamesEnv -> [RdrName]
453 domTyVarNamesEnv env = map fst env
456 @mkTyVarNamesEnv@ checks for duplicates, and complains if so.
461 -> [RdrName] -- The type variables
462 -> RnMonad x s (TyVarNamesEnv,[RnName]) -- Environment and renamed tyvars
464 mkTyVarNamesEnv src_loc tyvars
465 = newLocalNames "type variable"
466 (tyvars `zip` repeat src_loc) `thenRn` \ rn_tyvars ->
468 -- rn_tyvars may not be in the same order as tyvars, so we need some
469 -- jiggery pokery to build the right tyvar env, and return the
470 -- renamed tyvars in the original order.
471 let tv_occ_name_pairs = map tv_occ_name_pair rn_tyvars
472 tv_env = map (lookup_occ_name tv_occ_name_pairs) tyvars
473 rn_tyvars_in_orig_order = map snd tv_env
475 returnRn (tv_env, rn_tyvars_in_orig_order)
477 tv_occ_name_pair :: RnName -> (RdrName, RnName)
478 tv_occ_name_pair rn_name = (getOccName rn_name, rn_name)
480 lookup_occ_name :: [(RdrName, RnName)] -> RdrName -> (RdrName, RnName)
481 lookup_occ_name pairs tyvar_occ
482 = (tyvar_occ, assoc "mkTyVarNamesEnv" pairs tyvar_occ)
486 lookupTyVarName :: TyVarNamesEnv -> RdrName -> RnMonad x s RnName
487 lookupTyVarName env occ
488 = case (assocMaybe env occ) of
489 Just name -> returnRn name
490 Nothing -> getSrcLocRn `thenRn` \ loc ->
491 failButContinueRn (mkRnUnbound occ)
492 (unknownNameErr "type variable" occ loc)