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(..), emptyImplicitEnv,
20 rnGetUnique, rnGetUniques,
23 lookupValue, lookupValueMaybe, lookupClassOp,
24 lookupTyCon, lookupClass, lookupTyConOrClass,
27 TyVarNamesEnv(..), mkTyVarNamesEnv, domTyVarNamesEnv,
28 lookupTyVarName, nullTyVarNamesEnv, catTyVarNamesEnvs,
37 import HsSyn ( FixityDecl )
38 import RnHsSyn ( RnName, mkRnName, mkRnUnbound, mkRnImplicit,
39 mkRnImplicitTyCon, mkRnImplicitClass,
40 isRnLocal, isRnWired, isRnTyCon, isRnClass,
41 isRnTyConOrClass, isRnClassOp,
42 RenamedFixityDecl(..) )
43 import RnUtils ( RnEnv(..), extendLocalRnEnv,
44 lookupRnEnv, lookupTcRnEnv,
45 unknownNameErr, badClassOpErr, qualNameErr,
46 dupNamesErr, shadowedNameWarn )
48 import Bag ( Bag, emptyBag, isEmptyBag, snocBag )
49 import CmdLineOpts ( opt_WarnNameShadowing )
50 import ErrUtils ( Error(..), Warning(..) )
51 import FiniteMap ( FiniteMap, emptyFM, lookupFM, addToFM )
52 import Maybes ( assocMaybe )
53 import Name ( Module(..), RdrName(..), isQual,
54 Name, mkLocalName, mkImplicitName,
57 import PrelInfo ( builtinNameInfo, BuiltinNames(..), BuiltinKeys(..) )
58 import Pretty ( Pretty(..), PrettyRep )
59 import SrcLoc ( SrcLoc, mkUnknownSrcLoc )
60 import UniqFM ( UniqFM, emptyUFM )
61 import UniqSet ( UniqSet(..), mkUniqSet, minusUniqSet )
62 import UniqSupply ( UniqSupply, getUnique, getUniques, splitUniqSupply )
63 import Unique ( Unique )
66 infixr 9 `thenRn`, `thenRn_`
70 type RnM s r = RnMonad () s r
71 type RnM_Fixes s r = RnMonad (UniqFM RenamedFixityDecl) s r
73 type RnMonad x s r = RnDown x s -> SST s r
79 SrcLoc -- Source location
80 (RnMode s) -- Source or Iface
81 RnEnv -- Renaming environment
82 (MutableVar s UniqSupply) -- Unique supply
83 (MutableVar s (Bag Warning, -- Warnings and Errors
87 = RnSource (MutableVar s (Bag (RnName, RdrName)))
88 -- Renaming source; returning occurences
90 | RnIface BuiltinNames BuiltinKeys
91 (MutableVar s ImplicitEnv)
92 -- Renaming interface; creating and returning implicit names
93 -- ImplicitEnv: one map for Values and one for TyCons/Classes.
95 type ImplicitEnv = (FiniteMap RdrName RnName, FiniteMap RdrName RnName)
96 emptyImplicitEnv :: ImplicitEnv
97 emptyImplicitEnv = (emptyFM, emptyFM)
99 -- With a builtin polymorphic type for _runSST the type for
100 -- initTc should use RnM s r instead of RnM _RealWorld r
102 initRn :: Bool -- True => Source; False => Iface
107 -> (r, Bag Error, Bag Warning)
109 initRn source mod env us do_rn
111 newMutVarSST emptyBag `thenSST` \ occ_var ->
112 newMutVarSST emptyImplicitEnv `thenSST` \ imp_var ->
113 newMutVarSST us `thenSST` \ us_var ->
114 newMutVarSST (emptyBag,emptyBag) `thenSST` \ errs_var ->
116 mode = if source then
119 case builtinNameInfo of { (wiredin_fm, key_fm, _) ->
120 RnIface wiredin_fm key_fm imp_var }
122 rn_down = RnDown () mod mkUnknownSrcLoc mode env us_var errs_var
125 do_rn rn_down `thenSST` \ res ->
127 -- grab errors and return
128 readMutVarSST errs_var `thenSST` \ (warns,errs) ->
129 returnSST (res, errs, warns)
132 {-# INLINE thenRn #-}
133 {-# INLINE thenRn_ #-}
134 {-# INLINE returnRn #-}
137 returnRn :: a -> RnMonad x s a
138 thenRn :: RnMonad x s a -> (a -> RnMonad x s b) -> RnMonad x s b
139 thenRn_ :: RnMonad x s a -> RnMonad x s b -> RnMonad x s b
140 andRn :: (a -> a -> a) -> RnMonad x s a -> RnMonad x s a -> RnMonad x s a
141 mapRn :: (a -> RnMonad x s b) -> [a] -> RnMonad x s [b]
142 mapAndUnzipRn :: (a -> RnMonad x s (b,c)) -> [a] -> RnMonad x s ([b],[c])
144 returnRn v down = returnSST v
145 thenRn m k down = m down `thenSST` \ r -> k r down
146 thenRn_ m k down = m down `thenSST_` k down
148 andRn combiner m1 m2 down
149 = m1 down `thenSST` \ res1 ->
150 m2 down `thenSST` \ res2 ->
151 returnSST (combiner res1 res2)
153 mapRn f [] = returnRn []
155 = f x `thenRn` \ r ->
156 mapRn f xs `thenRn` \ rs ->
159 mapAndUnzipRn f [] = returnRn ([],[])
160 mapAndUnzipRn f (x:xs)
161 = f x `thenRn` \ (r1, r2) ->
162 mapAndUnzipRn f xs `thenRn` \ (rs1, rs2) ->
163 returnRn (r1:rs1, r2:rs2)
166 For errors and warnings ...
168 failButContinueRn :: a -> Error -> RnMonad x s a
169 failButContinueRn res err (RnDown _ _ _ _ _ _ errs_var)
170 = readMutVarSST errs_var `thenSST` \ (warns,errs) ->
171 writeMutVarSST errs_var (warns, errs `snocBag` err) `thenSST_`
174 warnAndContinueRn :: a -> Warning -> RnMonad x s a
175 warnAndContinueRn res warn (RnDown _ _ _ _ _ _ errs_var)
176 = readMutVarSST errs_var `thenSST` \ (warns,errs) ->
177 writeMutVarSST errs_var (warns `snocBag` warn, errs) `thenSST_`
180 addErrRn :: Error -> RnMonad x s ()
181 addErrRn err = failButContinueRn () err
183 addErrIfRn :: Bool -> Error -> RnMonad x s ()
184 addErrIfRn True err = addErrRn err
185 addErrIfRn False err = returnRn ()
187 addWarnRn :: Warning -> RnMonad x s ()
188 addWarnRn warn = warnAndContinueRn () warn
190 addWarnIfRn :: Bool -> Warning -> RnMonad x s ()
191 addWarnIfRn True warn = addWarnRn warn
192 addWarnIfRn False warn = returnRn ()
197 setExtraRn :: x -> RnMonad x s r -> RnMonad y s r
198 setExtraRn x m (RnDown _ mod locn mode env us errs)
199 = m (RnDown x mod locn mode env us errs)
201 getExtraRn :: RnMonad x s x
202 getExtraRn (RnDown x _ _ _ _ _ _)
205 getModuleRn :: RnMonad x s Module
206 getModuleRn (RnDown _ mod _ _ _ _ _)
209 pushSrcLocRn :: SrcLoc -> RnMonad x s a -> RnMonad x s a
210 pushSrcLocRn locn m (RnDown x mod _ mode env us errs)
211 = m (RnDown x mod locn mode env us errs)
213 getSrcLocRn :: RnMonad x s SrcLoc
214 getSrcLocRn (RnDown _ _ locn _ _ _ _)
217 getSourceRn :: RnMonad x s Bool
218 getSourceRn (RnDown _ _ _ (RnSource _) _ _ _) = returnSST True
219 getSourceRn (RnDown _ _ _ (RnIface _ _ _) _ _ _) = returnSST False
221 getOccurrenceUpRn :: RnMonad x s (Bag (RnName, RdrName))
222 getOccurrenceUpRn (RnDown _ _ _ (RnSource occ_var) _ _ _)
223 = readMutVarSST occ_var
224 getOccurrenceUpRn (RnDown _ _ _ (RnIface _ _ _) _ _ _)
225 = panic "getOccurrenceUpRn:RnIface"
227 getImplicitUpRn :: RnMonad x s ImplicitEnv
228 getImplicitUpRn (RnDown _ _ _ (RnIface _ _ imp_var) _ _ _)
229 = readMutVarSST imp_var
230 getImplicitUpRn (RnDown _ _ _(RnSource _) _ _ _)
231 = panic "getImplicitUpRn:RnIface"
235 rnGetUnique :: RnMonad x s Unique
236 rnGetUnique (RnDown _ _ _ _ _ us_var _)
239 rnGetUniques :: Int -> RnMonad x s [Unique]
240 rnGetUniques n (RnDown _ _ _ _ _ us_var _)
241 = get_uniques n us_var
245 = readMutVarSST us_var `thenSST` \ uniq_supply ->
247 (new_uniq_supply, uniq_s) = splitUniqSupply uniq_supply
248 uniq = getUnique uniq_s
250 writeMutVarSST us_var new_uniq_supply `thenSST_`
254 = readMutVarSST us_var `thenSST` \ uniq_supply ->
256 (new_uniq_supply, uniq_s) = splitUniqSupply uniq_supply
257 uniqs = getUniques n uniq_s
259 writeMutVarSST us_var new_uniq_supply `thenSST_`
262 snoc_bag_var add bag_var
263 = readMutVarSST bag_var `thenSST` \ bag ->
264 writeMutVarSST bag_var (bag `snocBag` add)
268 *********************************************************
270 \subsection{Making new names}
272 *********************************************************
274 @newLocalNames@ takes a bunch of RdrNames, which are defined together
275 in a group (eg a pattern or set of bindings), checks they are
276 unqualified and distinct, and creates new Names for them.
279 newLocalNames :: String -- Documentation string
280 -> [(RdrName, SrcLoc)]
281 -> RnMonad x s [RnName]
283 newLocalNames str names_w_loc
284 = mapRn (addErrRn . qualNameErr str) quals `thenRn_`
285 mapRn (addErrRn . dupNamesErr str) dups `thenRn_`
288 quals = filter (isQual.fst) names_w_loc
289 (these, dups) = removeDups cmp_fst names_w_loc
290 cmp_fst (a,_) (b,_) = cmp a b
294 mkLocalNames :: [(RdrName, SrcLoc)] -> RnMonad x s [RnName]
295 mkLocalNames names_w_locs
296 = rnGetUniques (length names_w_locs) `thenRn` \ uniqs ->
297 returnRn (zipWithEqual new_local uniqs names_w_locs)
299 new_local uniq (Unqual str, srcloc)
300 = mkRnName (mkLocalName uniq str srcloc)
304 *********************************************************
306 \subsection{Looking up values}
308 *********************************************************
310 Action to look up a value depends on the RnMode.
313 Lookup value in RnEnv, recording occurrence for non-local values found.
314 If not found report error and return Unbound name.
316 Lookup value in RnEnv. If not found lookup in implicit name env.
317 If not found create new implicit name, adding it to the implicit env.
321 lookupValue :: RdrName -> RnMonad x s RnName
322 lookupClassOp :: RnName -> RdrName -> RnMonad x s RnName
325 = lookup_val rdr (\ rn -> True) (unknownNameErr "value")
327 lookupClassOp cls rdr
328 = lookup_val rdr (\ rn -> True){-WAS:(isRnClassOp cls)-} (badClassOpErr cls)
331 lookup_val rdr check do_err down@(RnDown _ _ locn (RnSource occ_var) env _ _)
332 = case lookupRnEnv env rdr of
333 Just name | check name -> succ name
338 succ name = if isRnLocal name || isRnWired name then
341 snoc_bag_var (name,rdr) occ_var `thenSST_`
343 fail = failButContinueRn (mkRnUnbound rdr) (do_err rdr locn) down
345 lookup_val rdr check do_err down@(RnDown _ _ locn (RnIface b_names b_key imp_var) env us_var _)
346 = case lookupRnEnv env rdr of
347 Just name | check name -> returnSST name
348 | otherwise -> failButContinueRn (mkRnUnbound rdr) (do_err rdr locn) down
349 Nothing -> lookup_nonexisting_val b_names b_key imp_var us_var rdr
351 lookup_nonexisting_val (b_names,_) b_key imp_var us_var rdr
353 Qual _ _ -> -- builtin things *don't* have Qual names
354 lookup_or_create_implicit_val b_key imp_var us_var rdr
356 Unqual n -> case (lookupFM b_names n) of
357 Nothing -> lookup_or_create_implicit_val b_key imp_var us_var rdr
358 Just xx -> returnSST xx
360 lookup_or_create_implicit_val b_key imp_var us_var rdr
361 = readMutVarSST imp_var `thenSST` \ (implicit_val_fm, implicit_tc_fm) ->
362 case lookupFM implicit_val_fm rdr of
363 Just implicit -> returnSST implicit
366 Qual _ _ -> get_unique us_var
367 Unqual n -> case (lookupFM b_key n) of
368 Just (u,_) -> returnSST u
369 _ -> get_unique us_var
370 ) `thenSST` \ uniq ->
372 implicit = mkRnImplicit (mkImplicitName uniq rdr)
373 new_val_fm = addToFM implicit_val_fm rdr implicit
375 writeMutVarSST imp_var (new_val_fm, implicit_tc_fm) `thenSST_`
379 lookupValueMaybe :: RdrName -> RnMonad x s (Maybe RnName)
380 lookupValueMaybe rdr down@(RnDown _ _ _ (RnSource _) env _ _)
381 = returnSST (lookupRnEnv env rdr)
386 lookupTyCon :: RdrName -> RnMonad x s RnName
387 lookupClass :: RdrName -> RnMonad x s RnName
390 = lookup_tc rdr isRnTyCon mkRnImplicitTyCon "type constructor"
393 = lookup_tc rdr isRnClass mkRnImplicitClass "class"
395 lookupTyConOrClass rdr
396 = lookup_tc rdr isRnTyConOrClass
397 (panic "lookupTC:mk_implicit") "class or type constructor"
399 lookup_tc rdr check mk_implicit err_str down@(RnDown _ _ locn (RnSource occ_var) env _ _)
400 = case lookupTcRnEnv env rdr of
401 Just name | check name -> succ name
405 succ name = snoc_bag_var (name,rdr) occ_var `thenSST_`
407 fail = failButContinueRn (mkRnUnbound rdr) (unknownNameErr err_str rdr locn) down
409 lookup_tc rdr check mk_implicit err_str down@(RnDown _ _ locn (RnIface b_names b_key imp_var) env us_var _)
410 = case lookupTcRnEnv env rdr of
411 Just name | check name -> returnSST name
413 Nothing -> lookup_nonexisting_tc check mk_implicit fail b_names b_key imp_var us_var rdr
415 fail = failButContinueRn (mkRnUnbound rdr) (unknownNameErr err_str rdr locn) down
417 lookup_nonexisting_tc check mk_implicit fail (_,b_names) b_key imp_var us_var rdr
419 Qual _ _ -> -- builtin things *don't* have Qual names
420 lookup_or_create_implicit_tc check mk_implicit fail b_key imp_var us_var rdr
422 Unqual n -> case (lookupFM b_names n) of
423 Nothing -> lookup_or_create_implicit_tc check mk_implicit fail b_key imp_var us_var rdr
424 Just xx -> returnSST xx
426 lookup_or_create_implicit_tc check mk_implicit fail b_key imp_var us_var rdr
427 = readMutVarSST imp_var `thenSST` \ (implicit_val_fm, implicit_tc_fm) ->
428 case lookupFM implicit_tc_fm rdr of
429 Just implicit | check implicit -> returnSST implicit
433 Qual _ _ -> get_unique us_var
434 Unqual n -> case (lookupFM b_key n) of
435 Just (u,_) -> returnSST u
436 _ -> get_unique us_var
437 ) `thenSST` \ uniq ->
439 implicit = mk_implicit (mkImplicitName uniq rdr)
440 new_tc_fm = addToFM implicit_tc_fm rdr implicit
442 writeMutVarSST imp_var (implicit_val_fm, new_tc_fm) `thenSST_`
447 @extendSS@ extends the scope; @extendSS2@ also removes the newly bound
448 free vars from the result.
451 extendSS :: [RnName] -- Newly bound names
455 extendSS binders m down@(RnDown x mod locn mode env us errs)
456 = (mapRn (addErrRn . shadowedNameWarn locn) dups `thenRn_`
457 m) (RnDown x mod locn mode new_env us errs)
459 (new_env,dups) = extendLocalRnEnv opt_WarnNameShadowing env binders
461 extendSS2 :: [RnName] -- Newly bound names
462 -> RnMonad x s (a, UniqSet RnName)
463 -> RnMonad x s (a, UniqSet RnName)
466 = extendSS binders m `thenRn` \ (r, fvs) ->
467 returnRn (r, fvs `minusUniqSet` (mkUniqSet binders))
470 The free var set returned by @(extendSS binders m)@ is that returned
471 by @m@, {\em minus} binders.
474 *********************************************************
476 \subsection{TyVarNamesEnv}
478 *********************************************************
481 type TyVarNamesEnv = [(RdrName, RnName)]
483 nullTyVarNamesEnv :: TyVarNamesEnv
484 nullTyVarNamesEnv = []
486 catTyVarNamesEnvs :: TyVarNamesEnv -> TyVarNamesEnv -> TyVarNamesEnv
487 catTyVarNamesEnvs e1 e2 = e1 ++ e2
489 domTyVarNamesEnv :: TyVarNamesEnv -> [RdrName]
490 domTyVarNamesEnv env = map fst env
493 @mkTyVarNamesEnv@ checks for duplicates, and complains if so.
498 -> [RdrName] -- The type variables
499 -> RnMonad x s (TyVarNamesEnv,[RnName]) -- Environment and renamed tyvars
501 mkTyVarNamesEnv src_loc tyvars
502 = newLocalNames "type variable"
503 (tyvars `zip` repeat src_loc) `thenRn` \ rn_tyvars ->
505 -- rn_tyvars may not be in the same order as tyvars, so we need some
506 -- jiggery pokery to build the right tyvar env, and return the
507 -- renamed tyvars in the original order.
508 let tv_occ_name_pairs = map tv_occ_name_pair rn_tyvars
509 tv_env = map (lookup_occ_name tv_occ_name_pairs) tyvars
510 rn_tyvars_in_orig_order = map snd tv_env
512 returnRn (tv_env, rn_tyvars_in_orig_order)
514 tv_occ_name_pair :: RnName -> (RdrName, RnName)
515 tv_occ_name_pair rn_name = (getOccName rn_name, rn_name)
517 lookup_occ_name :: [(RdrName, RnName)] -> RdrName -> (RdrName, RnName)
518 lookup_occ_name pairs tyvar_occ
519 = (tyvar_occ, assoc "mkTyVarNamesEnv" pairs tyvar_occ)
523 lookupTyVarName :: TyVarNamesEnv -> RdrName -> RnMonad x s RnName
524 lookupTyVarName env occ
525 = case (assocMaybe env occ) of
526 Just name -> returnRn name
527 Nothing -> getSrcLocRn `thenRn` \ loc ->
528 failButContinueRn (mkRnUnbound occ)
529 (unknownNameErr "type variable" occ loc)
534 fixIO :: (a -> IO a) -> IO a
537 (Right loop, _) = result