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, Name, RdrName )
29 import Outputable ( pprOp )
31 import UniqFM ( lookupUFM )
32 import UniqSet ( emptyUniqSet, unitUniqSet,
33 unionUniqSets, unionManyUniqSets,
35 import Util ( Ord3(..), panic )
39 *********************************************************
43 *********************************************************
46 rnPat :: RdrNamePat -> RnM_Fixes s RenamedPat
48 rnPat WildPatIn = returnRn WildPatIn
51 = lookupValue name `thenRn` \ vname ->
52 returnRn (VarPatIn vname)
54 rnPat (LitPatIn n) = returnRn (LitPatIn n)
57 = rnPat pat `thenRn` \ pat' ->
58 returnRn (LazyPatIn pat')
60 rnPat (AsPatIn name pat)
61 = rnPat pat `thenRn` \ pat' ->
62 lookupValue name `thenRn` \ vname ->
63 returnRn (AsPatIn vname pat')
65 rnPat (ConPatIn name pats)
66 = lookupValue name `thenRn` \ name' ->
67 mapRn rnPat pats `thenRn` \ patslist ->
68 returnRn (ConPatIn name' patslist)
70 rnPat (ConOpPatIn pat1 name pat2)
71 = lookupValue name `thenRn` \ name' ->
72 rnPat pat1 `thenRn` \ pat1' ->
73 rnPat pat2 `thenRn` \ pat2' ->
74 precParsePat (ConOpPatIn pat1' name' pat2')
76 rnPat neg@(NegPatIn pat)
77 = getSrcLocRn `thenRn` \ src_loc ->
78 addErrIfRn (not (is_lit pat)) (negPatErr neg src_loc)
80 rnPat pat `thenRn` \ pat' ->
81 returnRn (NegPatIn pat')
83 is_lit (LitPatIn _) = True
87 = rnPat pat `thenRn` \ pat' ->
88 returnRn (ParPatIn pat')
90 rnPat (ListPatIn pats)
91 = mapRn rnPat pats `thenRn` \ patslist ->
92 returnRn (ListPatIn patslist)
94 rnPat (TuplePatIn pats)
95 = mapRn rnPat pats `thenRn` \ patslist ->
96 returnRn (TuplePatIn patslist)
98 rnPat (RecPatIn con rpats)
99 = panic "rnPat:RecPatIn"
103 ************************************************************************
107 ************************************************************************
110 rnMatch :: RdrNameMatch -> RnM_Fixes s (RenamedMatch, FreeVars)
113 = getSrcLocRn `thenRn` \ src_loc ->
114 newLocalNames "variable in pattern"
115 (binders `zip` repeat src_loc) `thenRn` \ new_binders ->
116 extendSS2 new_binders (rnMatch_aux match)
118 binders = collect_binders match
120 collect_binders :: RdrNameMatch -> [RdrName]
122 collect_binders (GRHSMatch _) = []
123 collect_binders (PatMatch pat match)
124 = collectPatBinders pat ++ collect_binders match
126 rnMatch_aux (PatMatch pat match)
127 = rnPat pat `thenRn` \ pat' ->
128 rnMatch_aux match `thenRn` \ (match', fvMatch) ->
129 returnRn (PatMatch pat' match', fvMatch)
131 rnMatch_aux (GRHSMatch grhss_and_binds)
132 = rnGRHSsAndBinds grhss_and_binds `thenRn` \ (grhss_and_binds', fvs) ->
133 returnRn (GRHSMatch grhss_and_binds', fvs)
136 %************************************************************************
138 \subsubsection{Guarded right-hand sides (GRHSsAndBinds)}
140 %************************************************************************
143 rnGRHSsAndBinds :: RdrNameGRHSsAndBinds -> RnM_Fixes s (RenamedGRHSsAndBinds, FreeVars)
145 rnGRHSsAndBinds (GRHSsAndBindsIn grhss binds)
146 = rnBinds binds `thenRn` \ (binds', fvBinds, scope) ->
147 extendSS2 scope (rnGRHSs grhss) `thenRn` \ (grhss', fvGRHS) ->
148 returnRn (GRHSsAndBindsIn grhss' binds', fvBinds `unionUniqSets` fvGRHS)
150 rnGRHSs [] = returnRn ([], emptyUniqSet)
153 = rnGRHS grhs `thenRn` \ (grhs', fvs) ->
154 rnGRHSs grhss `thenRn` \ (grhss', fvss) ->
155 returnRn (grhs' : grhss', fvs `unionUniqSets` fvss)
157 rnGRHS (GRHS guard expr locn)
158 = pushSrcLocRn locn $
159 rnExpr guard `thenRn` \ (guard', fvsg) ->
160 rnExpr expr `thenRn` \ (expr', fvse) ->
161 returnRn (GRHS guard' expr' locn, fvsg `unionUniqSets` fvse)
163 rnGRHS (OtherwiseGRHS expr locn)
164 = pushSrcLocRn locn $
165 rnExpr expr `thenRn` \ (expr', fvs) ->
166 returnRn (OtherwiseGRHS expr' locn, fvs)
169 %************************************************************************
171 \subsubsection{Expressions}
173 %************************************************************************
176 rnExprs :: [RdrNameHsExpr] -> RnM_Fixes s ([RenamedHsExpr], FreeVars)
178 rnExprs [] = returnRn ([], emptyUniqSet)
181 = rnExpr expr `thenRn` \ (expr', fvExpr) ->
182 rnExprs exprs `thenRn` \ (exprs', fvExprs) ->
183 returnRn (expr':exprs', fvExpr `unionUniqSets` fvExprs)
186 Variables. We look up the variable and return the resulting name. The
187 interesting question is what the free-variable set should be. We
188 don't want to return imported or prelude things as free vars. So we
189 look at the RnName returned from the lookup, and make it part of the
190 free-var set iff if it's a LocallyDefined RnName.
192 ToDo: what about RnClassOps ???
196 rnExpr :: RdrNameHsExpr -> RnM_Fixes s (RenamedHsExpr, FreeVars)
199 = lookupValue v `thenRn` \ vname ->
200 returnRn (HsVar vname, fv_set vname)
202 fv_set vname@(RnName n)
203 | isLocallyDefinedName n = unitUniqSet vname
204 | otherwise = emptyUniqSet
207 = returnRn (HsLit lit, emptyUniqSet)
210 = rnMatch match `thenRn` \ (match', fvMatch) ->
211 returnRn (HsLam match', fvMatch)
213 rnExpr (HsApp fun arg)
214 = rnExpr fun `thenRn` \ (fun',fvFun) ->
215 rnExpr arg `thenRn` \ (arg',fvArg) ->
216 returnRn (HsApp fun' arg', fvFun `unionUniqSets` fvArg)
218 rnExpr (OpApp e1 op e2)
219 = rnExpr e1 `thenRn` \ (e1', fvs_e1) ->
220 rnExpr op `thenRn` \ (op', fvs_op) ->
221 rnExpr e2 `thenRn` \ (e2', fvs_e2) ->
222 precParseExpr (OpApp e1' op' e2') `thenRn` \ exp ->
223 returnRn (exp, (fvs_op `unionUniqSets` fvs_e1) `unionUniqSets` fvs_e2)
226 = rnExpr e `thenRn` \ (e', fvs_e) ->
227 returnRn (NegApp e', fvs_e)
230 = rnExpr e `thenRn` \ (e', fvs_e) ->
231 returnRn (HsPar e', fvs_e)
233 rnExpr (SectionL expr op)
234 = rnExpr expr `thenRn` \ (expr', fvs_expr) ->
235 rnExpr op `thenRn` \ (op', fvs_op) ->
236 returnRn (SectionL expr' op', fvs_op `unionUniqSets` fvs_expr)
238 rnExpr (SectionR op expr)
239 = rnExpr op `thenRn` \ (op', fvs_op) ->
240 rnExpr expr `thenRn` \ (expr', fvs_expr) ->
241 returnRn (SectionR op' expr', fvs_op `unionUniqSets` fvs_expr)
243 rnExpr (CCall fun args may_gc is_casm fake_result_ty)
244 = rnExprs args `thenRn` \ (args', fvs_args) ->
245 returnRn (CCall fun args' may_gc is_casm fake_result_ty, fvs_args)
247 rnExpr (HsSCC label expr)
248 = rnExpr expr `thenRn` \ (expr', fvs_expr) ->
249 returnRn (HsSCC label expr', fvs_expr)
251 rnExpr (HsCase expr ms src_loc)
252 = pushSrcLocRn src_loc $
253 rnExpr expr `thenRn` \ (new_expr, e_fvs) ->
254 mapAndUnzipRn rnMatch ms `thenRn` \ (new_ms, ms_fvs) ->
255 returnRn (HsCase new_expr new_ms src_loc, unionManyUniqSets (e_fvs : ms_fvs))
257 rnExpr (HsLet binds expr)
258 = rnBinds binds `thenRn` \ (binds', fvBinds, new_binders) ->
259 extendSS2 new_binders (rnExpr expr) `thenRn` \ (expr',fvExpr) ->
260 returnRn (HsLet binds' expr', fvBinds `unionUniqSets` fvExpr)
262 rnExpr (HsDo stmts src_loc)
263 = pushSrcLocRn src_loc $
264 rnStmts stmts `thenRn` \ (stmts', fvStmts) ->
265 returnRn (HsDo stmts' src_loc, fvStmts)
267 rnExpr (ListComp expr quals)
268 = rnQuals quals `thenRn` \ ((quals', qual_binders), fvQuals) ->
269 extendSS2 qual_binders (rnExpr expr) `thenRn` \ (expr', fvExpr) ->
270 returnRn (ListComp expr' quals', fvExpr `unionUniqSets` fvQuals)
272 rnExpr (ExplicitList exps)
273 = rnExprs exps `thenRn` \ (exps', fvs) ->
274 returnRn (ExplicitList exps', fvs)
276 rnExpr (ExplicitTuple exps)
277 = rnExprs exps `thenRn` \ (exps', fvExps) ->
278 returnRn (ExplicitTuple exps', fvExps)
280 rnExpr (RecordCon con rbinds)
281 = panic "rnExpr:RecordCon"
282 rnExpr (RecordUpd exp rbinds)
283 = panic "rnExpr:RecordUpd"
285 rnExpr (ExprWithTySig expr pty)
286 = rnExpr expr `thenRn` \ (expr', fvExpr) ->
287 rnPolyType nullTyVarNamesEnv pty `thenRn` \ pty' ->
288 returnRn (ExprWithTySig expr' pty', fvExpr)
290 rnExpr (HsIf p b1 b2 src_loc)
291 = pushSrcLocRn src_loc $
292 rnExpr p `thenRn` \ (p', fvP) ->
293 rnExpr b1 `thenRn` \ (b1', fvB1) ->
294 rnExpr b2 `thenRn` \ (b2', fvB2) ->
295 returnRn (HsIf p' b1' b2' src_loc, unionManyUniqSets [fvP, fvB1, fvB2])
297 rnExpr (ArithSeqIn seq)
298 = rn_seq seq `thenRn` \ (new_seq, fvs) ->
299 returnRn (ArithSeqIn new_seq, fvs)
302 = rnExpr expr `thenRn` \ (expr', fvExpr) ->
303 returnRn (From expr', fvExpr)
305 rn_seq (FromThen expr1 expr2)
306 = rnExpr expr1 `thenRn` \ (expr1', fvExpr1) ->
307 rnExpr expr2 `thenRn` \ (expr2', fvExpr2) ->
308 returnRn (FromThen expr1' expr2', fvExpr1 `unionUniqSets` fvExpr2)
310 rn_seq (FromTo expr1 expr2)
311 = rnExpr expr1 `thenRn` \ (expr1', fvExpr1) ->
312 rnExpr expr2 `thenRn` \ (expr2', fvExpr2) ->
313 returnRn (FromTo expr1' expr2', fvExpr1 `unionUniqSets` fvExpr2)
315 rn_seq (FromThenTo expr1 expr2 expr3)
316 = rnExpr expr1 `thenRn` \ (expr1', fvExpr1) ->
317 rnExpr expr2 `thenRn` \ (expr2', fvExpr2) ->
318 rnExpr expr3 `thenRn` \ (expr3', fvExpr3) ->
319 returnRn (FromThenTo expr1' expr2' expr3',
320 unionManyUniqSets [fvExpr1, fvExpr2, fvExpr3])
324 %************************************************************************
326 \subsubsection{@Qual@s: in list comprehensions}
328 %************************************************************************
330 Note that although some bound vars may appear in the free var set for
331 the first qual, these will eventually be removed by the caller. For
332 example, if we have @[p | r <- s, q <- r, p <- q]@, when doing
333 @[q <- r, p <- q]@, the free var set for @q <- r@ will
334 be @{r}@, and the free var set for the entire Quals will be @{r}@. This
335 @r@ will be removed only when we finally return from examining all the
339 rnQuals :: [RdrNameQual]
340 -> RnM_Fixes s (([RenamedQual], -- renamed qualifiers
341 [RnName]), -- qualifiers' binders
342 FreeVars) -- free variables
344 rnQuals [qual] -- must be at least one qual
345 = rnQual qual `thenRn` \ ((new_qual, bs), fvs) ->
346 returnRn (([new_qual], bs), fvs)
348 rnQuals (qual: quals)
349 = rnQual qual `thenRn` \ ((qual', bs1), fvQuals1) ->
350 extendSS2 bs1 (rnQuals quals) `thenRn` \ ((quals', bs2), fvQuals2) ->
352 ((qual' : quals', bs2 ++ bs1), -- The ones on the right (bs2) shadow the
353 -- ones on the left (bs1)
354 fvQuals1 `unionUniqSets` fvQuals2)
356 rnQual (GeneratorQual pat expr)
357 = rnExpr expr `thenRn` \ (expr', fvExpr) ->
359 binders = collectPatBinders pat
361 getSrcLocRn `thenRn` \ src_loc ->
362 newLocalNames "variable in list-comprehension-generator pattern"
363 (binders `zip` repeat src_loc) `thenRn` \ new_binders ->
364 extendSS new_binders (rnPat pat) `thenRn` \ pat' ->
366 returnRn ((GeneratorQual pat' expr', new_binders), fvExpr)
368 rnQual (FilterQual expr)
369 = rnExpr expr `thenRn` \ (expr', fvs) ->
370 returnRn ((FilterQual expr', []), fvs)
372 rnQual (LetQual binds)
373 = rnBinds binds `thenRn` \ (binds', binds_fvs, new_binders) ->
374 returnRn ((LetQual binds', new_binders), binds_fvs)
378 %************************************************************************
380 \subsubsection{@Stmt@s: in @do@ expressions}
382 %************************************************************************
385 rnStmts :: [RdrNameStmt] -> RnM_Fixes s ([RenamedStmt], FreeVars)
387 rnStmts [stmt@(ExprStmt _ _)] -- last stmt must be ExprStmt
388 = rnStmt stmt `thenRn` \ ((stmt',[]), fvStmt) ->
389 returnRn ([stmt'], fvStmt)
392 = rnStmt stmt `thenRn` \ ((stmt',bs), fvStmt) ->
393 extendSS2 bs (rnStmts stmts) `thenRn` \ (stmts', fvStmts) ->
394 returnRn (stmt':stmts', fvStmt `unionUniqSets` fvStmts)
397 rnStmt (BindStmt pat expr src_loc)
398 = pushSrcLocRn src_loc $
399 rnExpr expr `thenRn` \ (expr', fvExpr) ->
401 binders = collectPatBinders pat
403 newLocalNames "variable in do binding"
404 (binders `zip` repeat src_loc) `thenRn` \ new_binders ->
405 extendSS new_binders (rnPat pat) `thenRn` \ pat' ->
407 returnRn ((BindStmt pat' expr' src_loc, new_binders), fvExpr)
409 rnStmt (ExprStmt expr src_loc)
411 rnExpr expr `thenRn` \ (expr', fvs) ->
412 returnRn ((ExprStmt expr' src_loc, []), fvs)
414 rnStmt (LetStmt binds)
415 = rnBinds binds `thenRn` \ (binds', binds_fvs, new_binders) ->
416 returnRn ((LetStmt binds', new_binders), binds_fvs)
420 %************************************************************************
422 \subsubsection{Precedence Parsing}
424 %************************************************************************
427 precParseExpr :: RenamedHsExpr -> RnM_Fixes s RenamedHsExpr
428 precParsePat :: RenamedPat -> RnM_Fixes s RenamedPat
430 precParseExpr exp@(OpApp (NegApp e1) (HsVar op) e2)
431 = lookupFixity op `thenRn` \ (op_fix, op_prec) ->
433 -- negate precedence 6 wired in
435 precParseExpr (OpApp e1 (HsVar op) e2) `thenRn` \ op_app ->
436 returnRn (NegApp op_app)
440 precParseExpr exp@(OpApp (OpApp e11 (HsVar op1) e12) (HsVar op) e2)
441 = lookupFixity op `thenRn` \ (op_fix, op_prec) ->
442 lookupFixity op1 `thenRn` \ (op1_fix, op1_prec) ->
443 case cmp op1_prec op_prec of
445 EQ_ -> case (op1_fix, op_fix) of
446 (INFIXR, INFIXR) -> rearrange
447 (INFIXL, INFIXL) -> returnRn exp
448 _ -> getSrcLocRn `thenRn` \ src_loc ->
449 failButContinueRn exp
450 (precParseErr (op1,op1_fix,op1_prec) (op,op_fix,op_prec) src_loc)
453 rearrange = precParseExpr (OpApp e12 (HsVar op) e2) `thenRn` \ e2' ->
454 returnRn (OpApp e11 (HsVar op1) e2')
456 precParseExpr exp = returnRn exp
459 precParsePat pat@(ConOpPatIn (NegPatIn e1) op e2)
460 = lookupFixity op `thenRn` \ (op_fix, op_prec) ->
462 -- negate precedence 6 wired in
463 getSrcLocRn `thenRn` \ src_loc ->
464 failButContinueRn pat (precParseNegPatErr (op,op_fix,op_prec) src_loc)
468 precParsePat pat@(ConOpPatIn (ConOpPatIn p11 op1 p12) op p2)
469 = lookupFixity op `thenRn` \ (op_fix, op_prec) ->
470 lookupFixity op1 `thenRn` \ (op1_fix, op1_prec) ->
471 case cmp op1_prec op_prec of
473 EQ_ -> case (op1_fix, op_fix) of
474 (INFIXR, INFIXR) -> rearrange
475 (INFIXL, INFIXL) -> returnRn pat
476 _ -> getSrcLocRn `thenRn` \ src_loc ->
477 failButContinueRn pat
478 (precParseErr (op1,op1_fix,op1_prec) (op,op_fix,op_prec) src_loc)
481 rearrange = precParsePat (ConOpPatIn p12 op p2) `thenRn` \ p2' ->
482 returnRn (ConOpPatIn p11 op1 p2')
484 precParsePat pat = returnRn pat
487 data INFIX = INFIXL | INFIXR | INFIXN
489 lookupFixity :: RnName -> RnM_Fixes s (INFIX, Int)
491 = getExtraRn `thenRn` \ fixity_fm ->
492 case lookupUFM fixity_fm op of
493 Nothing -> returnRn (INFIXL, 9)
494 Just (InfixL _ n) -> returnRn (INFIXL, n)
495 Just (InfixR _ n) -> returnRn (INFIXR, n)
496 Just (InfixN _ n) -> returnRn (INFIXN, n)
500 negPatErr pat src_loc
501 = addErrLoc src_loc "prefix `-' not applied to literal in pattern" ( \sty ->
504 precParseNegPatErr op src_loc
505 = addErrLoc src_loc "precedence parsing error" (\ sty ->
506 ppBesides [ppStr "prefix `-' has lower precedence than ", pp_op sty op, ppStr " in pattern"])
508 precParseErr op1 op2 src_loc
509 = addErrLoc src_loc "precedence parsing error" (\ sty ->
510 ppBesides [ppStr "cannot mix ", pp_op sty op1, ppStr " and ", pp_op sty op2,
511 ppStr " in the same infix expression"])
513 pp_op sty (op, fix, prec) = ppBesides [pprOp sty op, ppLparen, pp_fix fix, ppSP, ppInt prec, ppRparen]
514 pp_fix INFIXL = ppStr "infixl"
515 pp_fix INFIXR = ppStr "infixr"
516 pp_fix INFIXN = ppStr "infix"