2 % (c) The GRASP/AQUA Project, Glasgow University, 1992-1996
4 \section[RnExpr]{Renaming of expressions}
6 Basically dependency analysis.
8 Handles @Match@, @GRHSsAndBinds@, @HsExpr@, and @Qual@ datatypes. In
9 general, all of these functions return a renamed thing, and a set of
13 #include "HsVersions.h"
16 rnMatch, rnGRHSsAndBinds, rnPat
20 import RnLoop -- break the RnPass4/RnExpr4/RnBinds4 loops
27 import ErrUtils ( addErrLoc )
28 import Name ( isLocallyDefinedName, pprOp, Name, RdrName )
30 import UniqFM ( lookupUFM )
31 import UniqSet ( emptyUniqSet, unitUniqSet,
32 unionUniqSets, unionManyUniqSets,
34 import Util ( Ord3(..), panic )
38 *********************************************************
42 *********************************************************
45 rnPat :: RdrNamePat -> RnM_Fixes s RenamedPat
47 rnPat WildPatIn = returnRn WildPatIn
50 = lookupValue name `thenRn` \ vname ->
51 returnRn (VarPatIn vname)
53 rnPat (LitPatIn n) = returnRn (LitPatIn n)
56 = rnPat pat `thenRn` \ pat' ->
57 returnRn (LazyPatIn pat')
59 rnPat (AsPatIn name pat)
60 = rnPat pat `thenRn` \ pat' ->
61 lookupValue name `thenRn` \ vname ->
62 returnRn (AsPatIn vname pat')
64 rnPat (ConPatIn name pats)
65 = lookupValue name `thenRn` \ name' ->
66 mapRn rnPat pats `thenRn` \ patslist ->
67 returnRn (ConPatIn name' patslist)
69 rnPat (ConOpPatIn pat1 name pat2)
70 = lookupValue name `thenRn` \ name' ->
71 rnPat pat1 `thenRn` \ pat1' ->
72 rnPat pat2 `thenRn` \ pat2' ->
73 precParsePat (ConOpPatIn pat1' name' pat2')
75 rnPat neg@(NegPatIn pat)
76 = getSrcLocRn `thenRn` \ src_loc ->
77 addErrIfRn (not (is_lit pat)) (negPatErr neg src_loc)
79 rnPat pat `thenRn` \ pat' ->
80 returnRn (NegPatIn pat')
82 is_lit (LitPatIn _) = True
86 = rnPat pat `thenRn` \ pat' ->
87 returnRn (ParPatIn pat')
89 rnPat (ListPatIn pats)
90 = mapRn rnPat pats `thenRn` \ patslist ->
91 returnRn (ListPatIn patslist)
93 rnPat (TuplePatIn pats)
94 = mapRn rnPat pats `thenRn` \ patslist ->
95 returnRn (TuplePatIn patslist)
97 rnPat (RecPatIn con rpats)
98 = panic "rnPat:RecPatIn"
102 ************************************************************************
106 ************************************************************************
109 rnMatch :: RdrNameMatch -> RnM_Fixes s (RenamedMatch, FreeVars)
112 = getSrcLocRn `thenRn` \ src_loc ->
113 newLocalNames "variable in pattern"
114 (binders `zip` repeat src_loc) `thenRn` \ new_binders ->
115 extendSS2 new_binders (rnMatch_aux match)
117 binders = collect_binders match
119 collect_binders :: RdrNameMatch -> [RdrName]
121 collect_binders (GRHSMatch _) = []
122 collect_binders (PatMatch pat match)
123 = collectPatBinders pat ++ collect_binders match
125 rnMatch_aux (PatMatch pat match)
126 = rnPat pat `thenRn` \ pat' ->
127 rnMatch_aux match `thenRn` \ (match', fvMatch) ->
128 returnRn (PatMatch pat' match', fvMatch)
130 rnMatch_aux (GRHSMatch grhss_and_binds)
131 = rnGRHSsAndBinds grhss_and_binds `thenRn` \ (grhss_and_binds', fvs) ->
132 returnRn (GRHSMatch grhss_and_binds', fvs)
135 %************************************************************************
137 \subsubsection{Guarded right-hand sides (GRHSsAndBinds)}
139 %************************************************************************
142 rnGRHSsAndBinds :: RdrNameGRHSsAndBinds -> RnM_Fixes s (RenamedGRHSsAndBinds, FreeVars)
144 rnGRHSsAndBinds (GRHSsAndBindsIn grhss binds)
145 = rnBinds binds `thenRn` \ (binds', fvBinds, scope) ->
146 extendSS2 scope (rnGRHSs grhss) `thenRn` \ (grhss', fvGRHS) ->
147 returnRn (GRHSsAndBindsIn grhss' binds', fvBinds `unionUniqSets` fvGRHS)
149 rnGRHSs [] = returnRn ([], emptyUniqSet)
152 = rnGRHS grhs `thenRn` \ (grhs', fvs) ->
153 rnGRHSs grhss `thenRn` \ (grhss', fvss) ->
154 returnRn (grhs' : grhss', fvs `unionUniqSets` fvss)
156 rnGRHS (GRHS guard expr locn)
157 = pushSrcLocRn locn $
158 rnExpr guard `thenRn` \ (guard', fvsg) ->
159 rnExpr expr `thenRn` \ (expr', fvse) ->
160 returnRn (GRHS guard' expr' locn, fvsg `unionUniqSets` fvse)
162 rnGRHS (OtherwiseGRHS expr locn)
163 = pushSrcLocRn locn $
164 rnExpr expr `thenRn` \ (expr', fvs) ->
165 returnRn (OtherwiseGRHS expr' locn, fvs)
168 %************************************************************************
170 \subsubsection{Expressions}
172 %************************************************************************
175 rnExprs :: [RdrNameHsExpr] -> RnM_Fixes s ([RenamedHsExpr], FreeVars)
177 rnExprs [] = returnRn ([], emptyUniqSet)
180 = rnExpr expr `thenRn` \ (expr', fvExpr) ->
181 rnExprs exprs `thenRn` \ (exprs', fvExprs) ->
182 returnRn (expr':exprs', fvExpr `unionUniqSets` fvExprs)
185 Variables. We look up the variable and return the resulting name. The
186 interesting question is what the free-variable set should be. We
187 don't want to return imported or prelude things as free vars. So we
188 look at the RnName returned from the lookup, and make it part of the
189 free-var set iff if it's a LocallyDefined RnName.
191 ToDo: what about RnClassOps ???
195 rnExpr :: RdrNameHsExpr -> RnM_Fixes s (RenamedHsExpr, FreeVars)
198 = lookupValue v `thenRn` \ vname ->
199 returnRn (HsVar vname, fv_set vname)
201 fv_set vname@(RnName n)
202 | isLocallyDefinedName n = unitUniqSet vname
203 | otherwise = emptyUniqSet
206 = returnRn (HsLit lit, emptyUniqSet)
209 = rnMatch match `thenRn` \ (match', fvMatch) ->
210 returnRn (HsLam match', fvMatch)
212 rnExpr (HsApp fun arg)
213 = rnExpr fun `thenRn` \ (fun',fvFun) ->
214 rnExpr arg `thenRn` \ (arg',fvArg) ->
215 returnRn (HsApp fun' arg', fvFun `unionUniqSets` fvArg)
217 rnExpr (OpApp e1 op e2)
218 = rnExpr e1 `thenRn` \ (e1', fvs_e1) ->
219 rnExpr op `thenRn` \ (op', fvs_op) ->
220 rnExpr e2 `thenRn` \ (e2', fvs_e2) ->
221 precParseExpr (OpApp e1' op' e2') `thenRn` \ exp ->
222 returnRn (exp, (fvs_op `unionUniqSets` fvs_e1) `unionUniqSets` fvs_e2)
225 = rnExpr e `thenRn` \ (e', fvs_e) ->
226 returnRn (NegApp e', fvs_e)
229 = rnExpr e `thenRn` \ (e', fvs_e) ->
230 returnRn (HsPar e', fvs_e)
232 rnExpr (SectionL expr op)
233 = rnExpr expr `thenRn` \ (expr', fvs_expr) ->
234 rnExpr op `thenRn` \ (op', fvs_op) ->
235 returnRn (SectionL expr' op', fvs_op `unionUniqSets` fvs_expr)
237 rnExpr (SectionR op expr)
238 = rnExpr op `thenRn` \ (op', fvs_op) ->
239 rnExpr expr `thenRn` \ (expr', fvs_expr) ->
240 returnRn (SectionR op' expr', fvs_op `unionUniqSets` fvs_expr)
242 rnExpr (CCall fun args may_gc is_casm fake_result_ty)
243 = rnExprs args `thenRn` \ (args', fvs_args) ->
244 returnRn (CCall fun args' may_gc is_casm fake_result_ty, fvs_args)
246 rnExpr (HsSCC label expr)
247 = rnExpr expr `thenRn` \ (expr', fvs_expr) ->
248 returnRn (HsSCC label expr', fvs_expr)
250 rnExpr (HsCase expr ms src_loc)
251 = pushSrcLocRn src_loc $
252 rnExpr expr `thenRn` \ (new_expr, e_fvs) ->
253 mapAndUnzipRn rnMatch ms `thenRn` \ (new_ms, ms_fvs) ->
254 returnRn (HsCase new_expr new_ms src_loc, unionManyUniqSets (e_fvs : ms_fvs))
256 rnExpr (HsLet binds expr)
257 = rnBinds binds `thenRn` \ (binds', fvBinds, new_binders) ->
258 extendSS2 new_binders (rnExpr expr) `thenRn` \ (expr',fvExpr) ->
259 returnRn (HsLet binds' expr', fvBinds `unionUniqSets` fvExpr)
261 rnExpr (HsDo stmts src_loc)
262 = pushSrcLocRn src_loc $
263 rnStmts stmts `thenRn` \ (stmts', fvStmts) ->
264 returnRn (HsDo stmts' src_loc, fvStmts)
266 rnExpr (ListComp expr quals)
267 = rnQuals quals `thenRn` \ ((quals', qual_binders), fvQuals) ->
268 extendSS2 qual_binders (rnExpr expr) `thenRn` \ (expr', fvExpr) ->
269 returnRn (ListComp expr' quals', fvExpr `unionUniqSets` fvQuals)
271 rnExpr (ExplicitList exps)
272 = rnExprs exps `thenRn` \ (exps', fvs) ->
273 returnRn (ExplicitList exps', fvs)
275 rnExpr (ExplicitTuple exps)
276 = rnExprs exps `thenRn` \ (exps', fvExps) ->
277 returnRn (ExplicitTuple exps', fvExps)
279 rnExpr (RecordCon con rbinds)
280 = panic "rnExpr:RecordCon"
281 rnExpr (RecordUpd exp rbinds)
282 = panic "rnExpr:RecordUpd"
284 rnExpr (ExprWithTySig expr pty)
285 = rnExpr expr `thenRn` \ (expr', fvExpr) ->
286 rnPolyType nullTyVarNamesEnv pty `thenRn` \ pty' ->
287 returnRn (ExprWithTySig expr' pty', fvExpr)
289 rnExpr (HsIf p b1 b2 src_loc)
290 = pushSrcLocRn src_loc $
291 rnExpr p `thenRn` \ (p', fvP) ->
292 rnExpr b1 `thenRn` \ (b1', fvB1) ->
293 rnExpr b2 `thenRn` \ (b2', fvB2) ->
294 returnRn (HsIf p' b1' b2' src_loc, unionManyUniqSets [fvP, fvB1, fvB2])
296 rnExpr (ArithSeqIn seq)
297 = rn_seq seq `thenRn` \ (new_seq, fvs) ->
298 returnRn (ArithSeqIn new_seq, fvs)
301 = rnExpr expr `thenRn` \ (expr', fvExpr) ->
302 returnRn (From expr', fvExpr)
304 rn_seq (FromThen expr1 expr2)
305 = rnExpr expr1 `thenRn` \ (expr1', fvExpr1) ->
306 rnExpr expr2 `thenRn` \ (expr2', fvExpr2) ->
307 returnRn (FromThen expr1' expr2', fvExpr1 `unionUniqSets` fvExpr2)
309 rn_seq (FromTo expr1 expr2)
310 = rnExpr expr1 `thenRn` \ (expr1', fvExpr1) ->
311 rnExpr expr2 `thenRn` \ (expr2', fvExpr2) ->
312 returnRn (FromTo expr1' expr2', fvExpr1 `unionUniqSets` fvExpr2)
314 rn_seq (FromThenTo expr1 expr2 expr3)
315 = rnExpr expr1 `thenRn` \ (expr1', fvExpr1) ->
316 rnExpr expr2 `thenRn` \ (expr2', fvExpr2) ->
317 rnExpr expr3 `thenRn` \ (expr3', fvExpr3) ->
318 returnRn (FromThenTo expr1' expr2' expr3',
319 unionManyUniqSets [fvExpr1, fvExpr2, fvExpr3])
323 %************************************************************************
325 \subsubsection{@Qual@s: in list comprehensions}
327 %************************************************************************
329 Note that although some bound vars may appear in the free var set for
330 the first qual, these will eventually be removed by the caller. For
331 example, if we have @[p | r <- s, q <- r, p <- q]@, when doing
332 @[q <- r, p <- q]@, the free var set for @q <- r@ will
333 be @{r}@, and the free var set for the entire Quals will be @{r}@. This
334 @r@ will be removed only when we finally return from examining all the
338 rnQuals :: [RdrNameQual]
339 -> RnM_Fixes s (([RenamedQual], -- renamed qualifiers
340 [RnName]), -- qualifiers' binders
341 FreeVars) -- free variables
343 rnQuals [qual] -- must be at least one qual
344 = rnQual qual `thenRn` \ ((new_qual, bs), fvs) ->
345 returnRn (([new_qual], bs), fvs)
347 rnQuals (qual: quals)
348 = rnQual qual `thenRn` \ ((qual', bs1), fvQuals1) ->
349 extendSS2 bs1 (rnQuals quals) `thenRn` \ ((quals', bs2), fvQuals2) ->
351 ((qual' : quals', bs2 ++ bs1), -- The ones on the right (bs2) shadow the
352 -- ones on the left (bs1)
353 fvQuals1 `unionUniqSets` fvQuals2)
355 rnQual (GeneratorQual pat expr)
356 = rnExpr expr `thenRn` \ (expr', fvExpr) ->
358 binders = collectPatBinders pat
360 getSrcLocRn `thenRn` \ src_loc ->
361 newLocalNames "variable in list-comprehension-generator pattern"
362 (binders `zip` repeat src_loc) `thenRn` \ new_binders ->
363 extendSS new_binders (rnPat pat) `thenRn` \ pat' ->
365 returnRn ((GeneratorQual pat' expr', new_binders), fvExpr)
367 rnQual (FilterQual expr)
368 = rnExpr expr `thenRn` \ (expr', fvs) ->
369 returnRn ((FilterQual expr', []), fvs)
371 rnQual (LetQual binds)
372 = rnBinds binds `thenRn` \ (binds', binds_fvs, new_binders) ->
373 returnRn ((LetQual binds', new_binders), binds_fvs)
377 %************************************************************************
379 \subsubsection{@Stmt@s: in @do@ expressions}
381 %************************************************************************
384 rnStmts :: [RdrNameStmt] -> RnM_Fixes s ([RenamedStmt], FreeVars)
386 rnStmts [stmt@(ExprStmt _ _)] -- last stmt must be ExprStmt
387 = rnStmt stmt `thenRn` \ ((stmt',[]), fvStmt) ->
388 returnRn ([stmt'], fvStmt)
391 = rnStmt stmt `thenRn` \ ((stmt',bs), fvStmt) ->
392 extendSS2 bs (rnStmts stmts) `thenRn` \ (stmts', fvStmts) ->
393 returnRn (stmt':stmts', fvStmt `unionUniqSets` fvStmts)
396 rnStmt (BindStmt pat expr src_loc)
397 = pushSrcLocRn src_loc $
398 rnExpr expr `thenRn` \ (expr', fvExpr) ->
400 binders = collectPatBinders pat
402 newLocalNames "variable in do binding"
403 (binders `zip` repeat src_loc) `thenRn` \ new_binders ->
404 extendSS new_binders (rnPat pat) `thenRn` \ pat' ->
406 returnRn ((BindStmt pat' expr' src_loc, new_binders), fvExpr)
408 rnStmt (ExprStmt expr src_loc)
410 rnExpr expr `thenRn` \ (expr', fvs) ->
411 returnRn ((ExprStmt expr' src_loc, []), fvs)
413 rnStmt (LetStmt binds)
414 = rnBinds binds `thenRn` \ (binds', binds_fvs, new_binders) ->
415 returnRn ((LetStmt binds', new_binders), binds_fvs)
419 %************************************************************************
421 \subsubsection{Precedence Parsing}
423 %************************************************************************
426 precParseExpr :: RenamedHsExpr -> RnM_Fixes s RenamedHsExpr
427 precParsePat :: RenamedPat -> RnM_Fixes s RenamedPat
429 precParseExpr exp@(OpApp (NegApp e1) (HsVar op) e2)
430 = lookupFixity op `thenRn` \ (op_fix, op_prec) ->
432 -- negate precedence 6 wired in
434 precParseExpr (OpApp e1 (HsVar op) e2) `thenRn` \ op_app ->
435 returnRn (NegApp op_app)
439 precParseExpr exp@(OpApp (OpApp e11 (HsVar op1) e12) (HsVar op) e2)
440 = lookupFixity op `thenRn` \ (op_fix, op_prec) ->
441 lookupFixity op1 `thenRn` \ (op1_fix, op1_prec) ->
442 case cmp op1_prec op_prec of
444 EQ_ -> case (op1_fix, op_fix) of
445 (INFIXR, INFIXR) -> rearrange
446 (INFIXL, INFIXL) -> returnRn exp
447 _ -> getSrcLocRn `thenRn` \ src_loc ->
448 failButContinueRn exp
449 (precParseErr (op1,op1_fix,op1_prec) (op,op_fix,op_prec) src_loc)
452 rearrange = precParseExpr (OpApp e12 (HsVar op) e2) `thenRn` \ e2' ->
453 returnRn (OpApp e11 (HsVar op1) e2')
455 precParseExpr exp = returnRn exp
458 precParsePat pat@(ConOpPatIn (NegPatIn e1) op e2)
459 = lookupFixity op `thenRn` \ (op_fix, op_prec) ->
461 -- negate precedence 6 wired in
462 getSrcLocRn `thenRn` \ src_loc ->
463 failButContinueRn pat (precParseNegPatErr (op,op_fix,op_prec) src_loc)
467 precParsePat pat@(ConOpPatIn (ConOpPatIn p11 op1 p12) op p2)
468 = lookupFixity op `thenRn` \ (op_fix, op_prec) ->
469 lookupFixity op1 `thenRn` \ (op1_fix, op1_prec) ->
470 case cmp op1_prec op_prec of
472 EQ_ -> case (op1_fix, op_fix) of
473 (INFIXR, INFIXR) -> rearrange
474 (INFIXL, INFIXL) -> returnRn pat
475 _ -> getSrcLocRn `thenRn` \ src_loc ->
476 failButContinueRn pat
477 (precParseErr (op1,op1_fix,op1_prec) (op,op_fix,op_prec) src_loc)
480 rearrange = precParsePat (ConOpPatIn p12 op p2) `thenRn` \ p2' ->
481 returnRn (ConOpPatIn p11 op1 p2')
483 precParsePat pat = returnRn pat
486 data INFIX = INFIXL | INFIXR | INFIXN
488 lookupFixity :: RnName -> RnM_Fixes s (INFIX, Int)
490 = getExtraRn `thenRn` \ fixity_fm ->
491 case lookupUFM fixity_fm op of
492 Nothing -> returnRn (INFIXL, 9)
493 Just (InfixL _ n) -> returnRn (INFIXL, n)
494 Just (InfixR _ n) -> returnRn (INFIXR, n)
495 Just (InfixN _ n) -> returnRn (INFIXN, n)
499 negPatErr pat src_loc
500 = addErrLoc src_loc "prefix `-' not applied to literal in pattern" ( \sty ->
503 precParseNegPatErr op src_loc
504 = addErrLoc src_loc "precedence parsing error" (\ sty ->
505 ppBesides [ppStr "prefix `-' has lower precedence than ", pp_op sty op, ppStr " in pattern"])
507 precParseErr op1 op2 src_loc
508 = addErrLoc src_loc "precedence parsing error" (\ sty ->
509 ppBesides [ppStr "cannot mix ", pp_op sty op1, ppStr " and ", pp_op sty op2,
510 ppStr " in the same infix expression"])
512 pp_op sty (op, fix, prec) = ppBesides [pprOp sty op, ppLparen, pp_fix fix, ppSP, ppInt prec, ppRparen]
513 pp_fix INFIXL = ppStr "infixl"
514 pp_fix INFIXR = ppStr "infixr"
515 pp_fix INFIXN = ppStr "infix"