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,
54 import Pretty ( Pretty(..), PrettyRep )
55 import SrcLoc ( SrcLoc, mkUnknownSrcLoc )
56 import UniqFM ( UniqFM, emptyUFM )
57 import UniqSet ( UniqSet(..), mkUniqSet, minusUniqSet )
58 import UniqSupply ( UniqSupply, getUnique, getUniques, splitUniqSupply )
59 import Unique ( Unique )
62 infixr 9 `thenRn`, `thenRn_`
66 type RnM s r = RnMonad () s r
67 type RnM_Fixes s r = RnMonad (UniqFM RenamedFixityDecl) s r
69 type RnMonad x s r = RnDown x s -> SST s r
75 SrcLoc -- Source location
76 (RnMode s) -- Source or Iface
77 RnEnv -- Renaming environment
78 (MutableVar s UniqSupply) -- Unique supply
79 (MutableVar s (Bag Warning, -- Warnings and Errors
83 = RnSource (MutableVar s (Bag (RnName, RdrName)))
84 -- Renaming source; returning occurences
86 | RnIface (MutableVar s ImplicitEnv)
87 -- Renaming interface; creating and returning implicit names
88 -- One map for Values and one for TyCons/Classes.
90 type ImplicitEnv = (FiniteMap RdrName RnName, FiniteMap RdrName RnName)
93 -- With a builtin polymorphic type for _runSST the type for
94 -- initTc should use RnM s r instead of RnM _RealWorld r
96 initRn :: Bool -- True => Source; False => Iface
101 -> (r, Bag Error, Bag Warning)
103 initRn source mod env us do_rn
105 newMutVarSST emptyBag `thenSST` \ occ_var ->
106 newMutVarSST (emptyFM,emptyFM) `thenSST` \ imp_var ->
107 newMutVarSST us `thenSST` \ us_var ->
108 newMutVarSST (emptyBag,emptyBag) `thenSST` \ errs_var ->
110 mode = if source then
115 rn_down = RnDown () mod mkUnknownSrcLoc mode env us_var errs_var
118 do_rn rn_down `thenSST` \ res ->
120 -- grab errors and return
121 readMutVarSST errs_var `thenSST` \ (warns,errs) ->
122 returnSST (res, errs, warns)
125 {-# INLINE thenRn #-}
126 {-# INLINE thenRn_ #-}
127 {-# INLINE returnRn #-}
130 returnRn :: a -> RnMonad x s a
131 thenRn :: RnMonad x s a -> (a -> RnMonad x s b) -> RnMonad x s b
132 thenRn_ :: RnMonad x s a -> RnMonad x s b -> RnMonad x s b
133 andRn :: (a -> a -> a) -> RnMonad x s a -> RnMonad x s a -> RnMonad x s a
134 mapRn :: (a -> RnMonad x s b) -> [a] -> RnMonad x s [b]
135 mapAndUnzipRn :: (a -> RnMonad x s (b,c)) -> [a] -> RnMonad x s ([b],[c])
137 returnRn v down = returnSST v
138 thenRn m k down = m down `thenSST` \ r -> k r down
139 thenRn_ m k down = m down `thenSST_` k down
141 andRn combiner m1 m2 down
142 = m1 down `thenSST` \ res1 ->
143 m2 down `thenSST` \ res2 ->
144 returnSST (combiner res1 res2)
146 mapRn f [] = returnRn []
148 = f x `thenRn` \ r ->
149 mapRn f xs `thenRn` \ rs ->
152 mapAndUnzipRn f [] = returnRn ([],[])
153 mapAndUnzipRn f (x:xs)
154 = f x `thenRn` \ (r1, r2) ->
155 mapAndUnzipRn f xs `thenRn` \ (rs1, rs2) ->
156 returnRn (r1:rs1, r2:rs2)
159 For errors and warnings ...
161 failButContinueRn :: a -> Error -> RnMonad x s a
162 failButContinueRn res err (RnDown _ _ _ _ _ _ errs_var)
163 = readMutVarSST errs_var `thenSST` \ (warns,errs) ->
164 writeMutVarSST errs_var (warns, errs `snocBag` err) `thenSST_`
167 warnAndContinueRn :: a -> Warning -> RnMonad x s a
168 warnAndContinueRn res warn (RnDown _ _ _ _ _ _ errs_var)
169 = readMutVarSST errs_var `thenSST` \ (warns,errs) ->
170 writeMutVarSST errs_var (warns `snocBag` warn, errs) `thenSST_`
173 addErrRn :: Error -> RnMonad x s ()
174 addErrRn err = failButContinueRn () err
176 addErrIfRn :: Bool -> Error -> RnMonad x s ()
177 addErrIfRn True err = addErrRn err
178 addErrIfRn False err = returnRn ()
180 addWarnRn :: Warning -> RnMonad x s ()
181 addWarnRn warn = warnAndContinueRn () warn
183 addWarnIfRn :: Bool -> Warning -> RnMonad x s ()
184 addWarnIfRn True warn = addWarnRn warn
185 addWarnIfRn False warn = returnRn ()
190 setExtraRn :: x -> RnMonad x s r -> RnMonad y s r
191 setExtraRn x m (RnDown _ mod locn mode env us errs)
192 = m (RnDown x mod locn mode env us errs)
194 getExtraRn :: RnMonad x s x
195 getExtraRn (RnDown x _ _ _ _ _ _)
198 getModuleRn :: RnMonad x s Module
199 getModuleRn (RnDown _ mod _ _ _ _ _)
202 pushSrcLocRn :: SrcLoc -> RnMonad x s a -> RnMonad x s a
203 pushSrcLocRn locn m (RnDown x mod _ mode env us errs)
204 = m (RnDown x mod locn mode env us errs)
206 getSrcLocRn :: RnMonad x s SrcLoc
207 getSrcLocRn (RnDown _ _ locn _ _ _ _)
210 getSourceRn :: RnMonad x s Bool
211 getSourceRn (RnDown _ _ _ (RnSource _) _ _ _) = returnSST True
212 getSourceRn (RnDown _ _ _ (RnIface _) _ _ _) = returnSST False
214 getOccurrenceUpRn :: RnMonad x s (Bag (RnName, RdrName))
215 getOccurrenceUpRn (RnDown _ _ _ (RnSource occ_var) _ _ _)
216 = readMutVarSST occ_var
217 getOccurrenceUpRn (RnDown _ _ _ (RnIface _) _ _ _)
218 = panic "getOccurrenceUpRn:RnIface"
220 getImplicitUpRn :: RnMonad x s (FiniteMap RdrName RnName, FiniteMap RdrName RnName)
221 getImplicitUpRn (RnDown _ _ _ (RnIface imp_var) _ _ _)
222 = readMutVarSST imp_var
223 getImplicitUpRn (RnDown _ _ _(RnSource _) _ _ _)
224 = panic "getImplicitUpRn:RnIface"
228 rnGetUnique :: RnMonad x s Unique
229 rnGetUnique (RnDown _ _ _ _ _ us_var _)
232 rnGetUniques :: Int -> RnMonad x s [Unique]
233 rnGetUniques n (RnDown _ _ _ _ _ us_var _)
234 = get_uniques n us_var
238 = readMutVarSST us_var `thenSST` \ uniq_supply ->
240 (new_uniq_supply, uniq_s) = splitUniqSupply uniq_supply
241 uniq = getUnique uniq_s
243 writeMutVarSST us_var new_uniq_supply `thenSST_`
247 = readMutVarSST us_var `thenSST` \ uniq_supply ->
249 (new_uniq_supply, uniq_s) = splitUniqSupply uniq_supply
250 uniqs = getUniques n uniq_s
252 writeMutVarSST us_var new_uniq_supply `thenSST_`
255 snoc_bag_var add bag_var
256 = readMutVarSST bag_var `thenSST` \ bag ->
257 writeMutVarSST bag_var (bag `snocBag` add)
261 *********************************************************
263 \subsection{Making new names}
265 *********************************************************
267 @newLocalNames@ takes a bunch of RdrNames, which are defined together
268 in a group (eg a pattern or set of bindings), checks they are
269 unqualified and distinct, and creates new Names for them.
272 newLocalNames :: String -- Documentation string
273 -> [(RdrName, SrcLoc)]
274 -> RnMonad x s [RnName]
276 newLocalNames str names_w_loc
277 = mapRn (addErrRn . qualNameErr str) quals `thenRn_`
278 mapRn (addErrRn . dupNamesErr str) dups `thenRn_`
281 quals = filter (isQual.fst) names_w_loc
282 (these, dups) = removeDups cmp_fst names_w_loc
283 cmp_fst (a,_) (b,_) = cmp a b
287 mkLocalNames :: [(RdrName, SrcLoc)] -> RnMonad x s [RnName]
288 mkLocalNames names_w_locs
289 = rnGetUniques (length names_w_locs) `thenRn` \ uniqs ->
290 returnRn (zipWithEqual new_local uniqs names_w_locs)
292 new_local uniq (Unqual str, srcloc)
293 = mkRnName (mkLocalName uniq str srcloc)
297 *********************************************************
299 \subsection{Looking up values}
301 *********************************************************
303 Action to look up a value depends on the RnMode.
306 Lookup value in RnEnv, recording occurrence for non-local values found.
307 If not found report error and return Unbound name.
309 Lookup value in RnEnv. If not found lookup in implicit name env.
310 If not found create new implicit name, adding it to the implicit env.
314 lookupValue :: RdrName -> RnMonad x s RnName
315 lookupClassOp :: RnName -> RdrName -> RnMonad x s RnName
318 = lookup_val rdr (\ rn -> True) (unknownNameErr "value")
320 lookupClassOp cls rdr
321 = lookup_val rdr (isRnClassOp cls) (badClassOpErr cls)
324 lookup_val rdr check do_err down@(RnDown _ _ locn (RnSource occ_var) env _ _)
325 = case lookupRnEnv env rdr of
326 Just name | check name -> succ name
331 succ name = if isRnLocal name || isRnWired name then
334 snoc_bag_var (name,rdr) occ_var `thenSST_`
336 fail = failButContinueRn (mkRnUnbound rdr) (do_err rdr locn) down
338 lookup_val rdr check do_err down@(RnDown _ _ locn (RnIface imp_var) env us_var _)
339 = case lookupRnEnv env rdr of
340 Just name | check name -> returnSST name
341 | otherwise -> failButContinueRn (mkRnUnbound rdr) (do_err rdr locn) down
342 Nothing -> lookup_or_create_implicit_val imp_var us_var rdr
344 lookup_or_create_implicit_val imp_var us_var rdr
345 = readMutVarSST imp_var `thenSST` \ (implicit_val_fm, implicit_tc_fm)->
346 case lookupFM implicit_val_fm rdr of
347 Just implicit -> returnSST implicit
349 get_unique us_var `thenSST` \ uniq ->
351 implicit = mkRnImplicit (mkImplicitName uniq rdr)
352 new_val_fm = addToFM implicit_val_fm rdr implicit
354 writeMutVarSST imp_var (new_val_fm, implicit_tc_fm) `thenSST_`
358 lookupValueMaybe :: RdrName -> RnMonad x s (Maybe RnName)
359 lookupValueMaybe rdr down@(RnDown _ _ _ (RnSource _) env _ _)
360 = returnSST (lookupRnEnv env rdr)
365 lookupTyCon :: RdrName -> RnMonad x s RnName
366 lookupClass :: RdrName -> RnMonad x s RnName
369 = lookup_tc rdr isRnTyCon mkRnImplicitTyCon "type constructor"
372 = lookup_tc rdr isRnClass mkRnImplicitClass "class"
375 lookup_tc rdr check mk_implicit err_str down@(RnDown _ _ locn (RnSource occ_var) env _ _)
376 = case lookupTcRnEnv env rdr of
377 Just name | check name -> succ name
381 succ name = snoc_bag_var (name,rdr) occ_var `thenSST_`
383 fail = failButContinueRn (mkRnUnbound rdr) (unknownNameErr err_str rdr locn) down
385 lookup_tc rdr check mk_implicit err_str down@(RnDown _ _ locn (RnIface imp_var) env us_var _)
386 = case lookupTcRnEnv env rdr of
387 Just name | check name -> returnSST name
389 Nothing -> lookup_or_create_implicit_tc check mk_implicit fail imp_var us_var rdr
391 fail = failButContinueRn (mkRnUnbound rdr) (unknownNameErr err_str rdr locn) down
393 lookup_or_create_implicit_tc check mk_implicit fail imp_var us_var rdr
394 = readMutVarSST imp_var `thenSST` \ (implicit_val_fm, implicit_tc_fm)->
395 case lookupFM implicit_tc_fm rdr of
396 Just implicit | check implicit -> returnSST implicit
399 get_unique us_var `thenSST` \ uniq ->
401 implicit = mk_implicit (mkImplicitName uniq rdr)
402 new_tc_fm = addToFM implicit_tc_fm rdr implicit
404 writeMutVarSST imp_var (implicit_val_fm, new_tc_fm) `thenSST_`
409 @extendSS@ extends the scope; @extendSS2@ also removes the newly bound
410 free vars from the result.
413 extendSS :: [RnName] -- Newly bound names
417 extendSS binders m down@(RnDown x mod locn mode env us errs)
418 = (mapRn (addErrRn . shadowedNameWarn locn) dups `thenRn_`
419 m) (RnDown x mod locn mode new_env us errs)
421 (new_env,dups) = extendLocalRnEnv opt_WarnNameShadowing env binders
423 extendSS2 :: [RnName] -- Newly bound names
424 -> RnMonad x s (a, UniqSet RnName)
425 -> RnMonad x s (a, UniqSet RnName)
428 = extendSS binders m `thenRn` \ (r, fvs) ->
429 returnRn (r, fvs `minusUniqSet` (mkUniqSet binders))
432 The free var set returned by @(extendSS binders m)@ is that returned
433 by @m@, {\em minus} binders.
436 *********************************************************
438 \subsection{TyVarNamesEnv}
440 *********************************************************
443 type TyVarNamesEnv = [(RdrName, RnName)]
445 nullTyVarNamesEnv :: TyVarNamesEnv
446 nullTyVarNamesEnv = []
448 catTyVarNamesEnvs :: TyVarNamesEnv -> TyVarNamesEnv -> TyVarNamesEnv
449 catTyVarNamesEnvs e1 e2 = e1 ++ e2
451 domTyVarNamesEnv :: TyVarNamesEnv -> [RdrName]
452 domTyVarNamesEnv env = map fst env
455 @mkTyVarNamesEnv@ checks for duplicates, and complains if so.
460 -> [RdrName] -- The type variables
461 -> RnMonad x s (TyVarNamesEnv,[RnName]) -- Environment and renamed tyvars
463 mkTyVarNamesEnv src_loc tyvars
464 = newLocalNames "type variable"
465 (tyvars `zip` repeat src_loc) `thenRn` \ rn_tyvars ->
467 -- rn_tyvars may not be in the same order as tyvars, so we need some
468 -- jiggery pokery to build the right tyvar env, and return the
469 -- renamed tyvars in the original order.
470 let tv_occ_name_pairs = map tv_occ_name_pair rn_tyvars
471 tv_env = map (lookup_occ_name tv_occ_name_pairs) tyvars
472 rn_tyvars_in_orig_order = map snd tv_env
474 returnRn (tv_env, rn_tyvars_in_orig_order)
476 tv_occ_name_pair :: RnName -> (RdrName, RnName)
477 tv_occ_name_pair rn_name = (getOccName rn_name, rn_name)
479 lookup_occ_name :: [(RdrName, RnName)] -> RdrName -> (RdrName, RnName)
480 lookup_occ_name pairs tyvar_occ
481 = (tyvar_occ, assoc "mkTyVarNamesEnv" pairs tyvar_occ)
485 lookupTyVarName :: TyVarNamesEnv -> RdrName -> RnMonad x s RnName
486 lookupTyVarName env occ
487 = case (assocMaybe env occ) of
488 Just name -> returnRn name
489 Nothing -> getSrcLocRn `thenRn` \ loc ->
490 failButContinueRn (mkRnUnbound occ)
491 (unknownNameErr "type variable" occ loc)