2 % (c) The GRASP/AQUA Project, Glasgow University, 1992-1998
4 \section[RnExpr]{Renaming of expressions}
6 Basically dependency analysis.
8 Handles @Match@, @GRHSs@, @HsExpr@, and @Qualifier@ datatypes. In
9 general, all of these functions return a renamed thing, and a set of
14 rnMatch, rnGRHSs, rnPat, rnExpr, rnExprs,
18 #include "HsVersions.h"
20 import {-# SOURCE #-} RnBinds ( rnBinds )
21 import {-# SOURCE #-} RnSource ( rnHsSigType, rnHsType )
28 import RnIfaces ( lookupFixityRn )
29 import CmdLineOpts ( opt_GlasgowExts, opt_IgnoreAsserts )
30 import Literal ( inIntRange )
31 import BasicTypes ( Fixity(..), FixityDirection(..), defaultFixity, negateFixity )
32 import PrelNames ( hasKey, assertIdKey,
33 eqClass_RDR, foldr_RDR, build_RDR, eqString_RDR,
34 ccallableClass_RDR, creturnableClass_RDR,
35 monadClass_RDR, enumClass_RDR, ordClass_RDR,
36 ratioDataCon_RDR, negate_RDR, assertErr_RDR,
37 ioDataCon_RDR, plusInteger_RDR, timesInteger_RDR
39 import TysPrim ( charPrimTyCon, addrPrimTyCon, intPrimTyCon,
40 floatPrimTyCon, doublePrimTyCon
42 import TysWiredIn ( intTyCon, integerTyCon )
43 import Name ( NamedThing(..), mkSysLocalName, nameSrcLoc )
45 import UniqFM ( isNullUFM )
46 import FiniteMap ( elemFM )
47 import UniqSet ( emptyUniqSet )
48 import ListSetOps ( unionLists, removeDups )
49 import Maybes ( maybeToBool )
54 *********************************************************
58 *********************************************************
61 rnPat :: RdrNamePat -> RnMS (RenamedPat, FreeVars)
63 rnPat WildPatIn = returnRn (WildPatIn, emptyFVs)
66 = lookupBndrRn name `thenRn` \ vname ->
67 returnRn (VarPatIn vname, emptyFVs)
69 rnPat (SigPatIn pat ty)
71 = rnPat pat `thenRn` \ (pat', fvs1) ->
72 rnHsType doc ty `thenRn` \ (ty', fvs2) ->
73 returnRn (SigPatIn pat' ty', fvs1 `plusFV` fvs2)
76 = addErrRn (patSigErr ty) `thenRn_`
79 doc = text "a pattern type-signature"
81 rnPat (LitPatIn s@(HsString _))
82 = lookupOrigName eqString_RDR `thenRn` \ eq ->
83 returnRn (LitPatIn s, unitFV eq)
86 = litFVs lit `thenRn` \ fvs ->
87 returnRn (LitPatIn lit, fvs)
90 = rnOverLit lit `thenRn` \ (lit', fvs1) ->
91 lookupOrigName eqClass_RDR `thenRn` \ eq -> -- Needed to find equality on pattern
92 returnRn (NPatIn lit', fvs1 `addOneFV` eq)
94 rnPat (NPlusKPatIn name lit minus)
95 = rnOverLit lit `thenRn` \ (lit', fvs) ->
96 lookupOrigName ordClass_RDR `thenRn` \ ord ->
97 lookupBndrRn name `thenRn` \ name' ->
98 lookupOccRn minus `thenRn` \ minus' ->
99 returnRn (NPlusKPatIn name' lit' minus', fvs `addOneFV` ord `addOneFV` minus')
101 rnPat (LazyPatIn pat)
102 = rnPat pat `thenRn` \ (pat', fvs) ->
103 returnRn (LazyPatIn pat', fvs)
105 rnPat (AsPatIn name pat)
106 = rnPat pat `thenRn` \ (pat', fvs) ->
107 lookupBndrRn name `thenRn` \ vname ->
108 returnRn (AsPatIn vname pat', fvs)
110 rnPat (ConPatIn con pats)
111 = lookupOccRn con `thenRn` \ con' ->
112 mapFvRn rnPat pats `thenRn` \ (patslist, fvs) ->
113 returnRn (ConPatIn con' patslist, fvs `addOneFV` con')
115 rnPat (ConOpPatIn pat1 con _ pat2)
116 = rnPat pat1 `thenRn` \ (pat1', fvs1) ->
117 lookupOccRn con `thenRn` \ con' ->
118 rnPat pat2 `thenRn` \ (pat2', fvs2) ->
120 getModeRn `thenRn` \ mode ->
121 -- See comments with rnExpr (OpApp ...)
123 InterfaceMode -> returnRn (ConOpPatIn pat1' con' defaultFixity pat2')
124 SourceMode -> lookupFixityRn con' `thenRn` \ fixity ->
125 mkConOpPatRn pat1' con' fixity pat2'
127 returnRn (pat', fvs1 `plusFV` fvs2 `addOneFV` con')
130 = rnPat pat `thenRn` \ (pat', fvs) ->
131 returnRn (ParPatIn pat', fvs)
133 rnPat (ListPatIn pats)
134 = mapFvRn rnPat pats `thenRn` \ (patslist, fvs) ->
135 returnRn (ListPatIn patslist, fvs `addOneFV` listTyCon_name)
137 rnPat (TuplePatIn pats boxed)
138 = mapFvRn rnPat pats `thenRn` \ (patslist, fvs) ->
139 returnRn (TuplePatIn patslist boxed, fvs `addOneFV` tycon_name)
141 tycon_name = tupleTyCon_name boxed (length pats)
143 rnPat (RecPatIn con rpats)
144 = lookupOccRn con `thenRn` \ con' ->
145 rnRpats rpats `thenRn` \ (rpats', fvs) ->
146 returnRn (RecPatIn con' rpats', fvs `addOneFV` con')
147 rnPat (TypePatIn name) =
148 (rnHsType (text "type pattern") name) `thenRn` \ (name', fvs) ->
149 returnRn (TypePatIn name', fvs)
152 ************************************************************************
156 ************************************************************************
159 rnMatch :: RdrNameMatch -> RnMS (RenamedMatch, FreeVars)
161 rnMatch match@(Match _ pats maybe_rhs_sig grhss)
162 = pushSrcLocRn (getMatchLoc match) $
164 -- Find the universally quantified type variables
165 -- in the pattern type signatures
166 getLocalNameEnv `thenRn` \ name_env ->
168 tyvars_in_sigs = rhs_sig_tyvars `unionLists` tyvars_in_pats
169 rhs_sig_tyvars = case maybe_rhs_sig of
171 Just ty -> extractHsTyRdrTyVars ty
172 tyvars_in_pats = extractPatsTyVars pats
173 forall_tyvars = filter (not . (`elemFM` name_env)) tyvars_in_sigs
174 doc_sig = text "a pattern type-signature"
175 doc_pats = text "in a pattern match"
177 bindNakedTyVarsFVRn doc_sig forall_tyvars $ \ sig_tyvars ->
179 -- Note that we do a single bindLocalsRn for all the
180 -- matches together, so that we spot the repeated variable in
182 bindLocalsFVRn doc_pats (collectPatsBinders pats) $ \ new_binders ->
184 mapFvRn rnPat pats `thenRn` \ (pats', pat_fvs) ->
185 rnGRHSs grhss `thenRn` \ (grhss', grhss_fvs) ->
186 (case maybe_rhs_sig of
187 Nothing -> returnRn (Nothing, emptyFVs)
188 Just ty | opt_GlasgowExts -> rnHsType doc_sig ty `thenRn` \ (ty', ty_fvs) ->
189 returnRn (Just ty', ty_fvs)
190 | otherwise -> addErrRn (patSigErr ty) `thenRn_`
191 returnRn (Nothing, emptyFVs)
192 ) `thenRn` \ (maybe_rhs_sig', ty_fvs) ->
195 binder_set = mkNameSet new_binders
196 unused_binders = nameSetToList (binder_set `minusNameSet` grhss_fvs)
197 all_fvs = grhss_fvs `plusFV` pat_fvs `plusFV` ty_fvs
199 warnUnusedMatches unused_binders `thenRn_`
201 returnRn (Match sig_tyvars pats' maybe_rhs_sig' grhss', all_fvs)
202 -- The bindLocals and bindTyVars will remove the bound FVs
205 %************************************************************************
207 \subsubsection{Guarded right-hand sides (GRHSs)}
209 %************************************************************************
212 rnGRHSs :: RdrNameGRHSs -> RnMS (RenamedGRHSs, FreeVars)
214 rnGRHSs (GRHSs grhss binds maybe_ty)
215 = ASSERT( not (maybeToBool maybe_ty) )
216 rnBinds binds $ \ binds' ->
217 mapFvRn rnGRHS grhss `thenRn` \ (grhss', fvGRHSs) ->
218 returnRn (GRHSs grhss' binds' Nothing, fvGRHSs)
220 rnGRHS (GRHS guarded locn)
221 = pushSrcLocRn locn $
222 (if not (opt_GlasgowExts || is_standard_guard guarded) then
223 addWarnRn (nonStdGuardErr guarded)
228 rnStmts rnExpr guarded `thenRn` \ (guarded', fvs) ->
229 returnRn (GRHS guarded' locn, fvs)
231 -- Standard Haskell 1.4 guards are just a single boolean
232 -- expression, rather than a list of qualifiers as in the
234 is_standard_guard [ExprStmt _ _] = True
235 is_standard_guard [GuardStmt _ _, ExprStmt _ _] = True
236 is_standard_guard other = False
239 %************************************************************************
241 \subsubsection{Expressions}
243 %************************************************************************
246 rnExprs :: [RdrNameHsExpr] -> RnMS ([RenamedHsExpr], FreeVars)
247 rnExprs ls = rnExprs' ls emptyUniqSet
249 rnExprs' [] acc = returnRn ([], acc)
250 rnExprs' (expr:exprs) acc
251 = rnExpr expr `thenRn` \ (expr', fvExpr) ->
253 -- Now we do a "seq" on the free vars because typically it's small
254 -- or empty, especially in very long lists of constants
256 acc' = acc `plusFV` fvExpr
258 (grubby_seqNameSet acc' rnExprs') exprs acc' `thenRn` \ (exprs', fvExprs) ->
259 returnRn (expr':exprs', fvExprs)
261 -- Grubby little function to do "seq" on namesets; replace by proper seq when GHC can do seq
262 grubby_seqNameSet ns result | isNullUFM ns = result
266 Variables. We look up the variable and return the resulting name.
269 rnExpr :: RdrNameHsExpr -> RnMS (RenamedHsExpr, FreeVars)
272 = lookupOccRn v `thenRn` \ name ->
273 if name `hasKey` assertIdKey then
274 -- We expand it to (GHCerr.assert__ location)
278 returnRn (HsVar name, unitFV name)
281 = newIPName v `thenRn` \ name ->
282 returnRn (HsIPVar name, emptyFVs)
285 = litFVs lit `thenRn` \ fvs ->
286 returnRn (HsLit lit, fvs)
288 rnExpr (HsOverLit lit)
289 = rnOverLit lit `thenRn` \ (lit', fvs) ->
290 returnRn (HsOverLit lit', fvs)
293 = rnMatch match `thenRn` \ (match', fvMatch) ->
294 returnRn (HsLam match', fvMatch)
296 rnExpr (HsApp fun arg)
297 = rnExpr fun `thenRn` \ (fun',fvFun) ->
298 rnExpr arg `thenRn` \ (arg',fvArg) ->
299 returnRn (HsApp fun' arg', fvFun `plusFV` fvArg)
301 rnExpr (OpApp e1 op _ e2)
302 = rnExpr e1 `thenRn` \ (e1', fv_e1) ->
303 rnExpr e2 `thenRn` \ (e2', fv_e2) ->
304 rnExpr op `thenRn` \ (op'@(HsVar op_name), fv_op) ->
307 -- When renaming code synthesised from "deriving" declarations
308 -- we're in Interface mode, and we should ignore fixity; assume
309 -- that the deriving code generator got the association correct
310 -- Don't even look up the fixity when in interface mode
311 getModeRn `thenRn` \ mode ->
313 SourceMode -> lookupFixityRn op_name `thenRn` \ fixity ->
314 mkOpAppRn e1' op' fixity e2'
315 InterfaceMode -> returnRn (OpApp e1' op' defaultFixity e2')
316 ) `thenRn` \ final_e ->
319 fv_e1 `plusFV` fv_op `plusFV` fv_e2)
322 = rnExpr e `thenRn` \ (e', fv_e) ->
323 lookupOrigName negate_RDR `thenRn` \ neg ->
324 mkNegAppRn e' neg `thenRn` \ final_e ->
325 returnRn (final_e, fv_e `addOneFV` neg)
328 = rnExpr e `thenRn` \ (e', fvs_e) ->
329 returnRn (HsPar e', fvs_e)
331 rnExpr section@(SectionL expr op)
332 = rnExpr expr `thenRn` \ (expr', fvs_expr) ->
333 rnExpr op `thenRn` \ (op', fvs_op) ->
334 checkSectionPrec "left" section op' expr' `thenRn_`
335 returnRn (SectionL expr' op', fvs_op `plusFV` fvs_expr)
337 rnExpr section@(SectionR op expr)
338 = rnExpr op `thenRn` \ (op', fvs_op) ->
339 rnExpr expr `thenRn` \ (expr', fvs_expr) ->
340 checkSectionPrec "right" section op' expr' `thenRn_`
341 returnRn (SectionR op' expr', fvs_op `plusFV` fvs_expr)
343 rnExpr (HsCCall fun args may_gc is_casm fake_result_ty)
344 -- Check out the comment on RnIfaces.getNonWiredDataDecl about ccalls
345 = lookupOrigNames [ccallableClass_RDR,
346 creturnableClass_RDR,
347 ioDataCon_RDR] `thenRn` \ implicit_fvs ->
348 rnExprs args `thenRn` \ (args', fvs_args) ->
349 returnRn (HsCCall fun args' may_gc is_casm fake_result_ty,
350 fvs_args `plusFV` implicit_fvs)
352 rnExpr (HsSCC lbl expr)
353 = rnExpr expr `thenRn` \ (expr', fvs_expr) ->
354 returnRn (HsSCC lbl expr', fvs_expr)
356 rnExpr (HsCase expr ms src_loc)
357 = pushSrcLocRn src_loc $
358 rnExpr expr `thenRn` \ (new_expr, e_fvs) ->
359 mapFvRn rnMatch ms `thenRn` \ (new_ms, ms_fvs) ->
360 returnRn (HsCase new_expr new_ms src_loc, e_fvs `plusFV` ms_fvs)
362 rnExpr (HsLet binds expr)
363 = rnBinds binds $ \ binds' ->
364 rnExpr expr `thenRn` \ (expr',fvExpr) ->
365 returnRn (HsLet binds' expr', fvExpr)
367 rnExpr (HsWith expr binds)
368 = rnExpr expr `thenRn` \ (expr',fvExpr) ->
369 rnIPBinds binds `thenRn` \ (binds',fvBinds) ->
370 returnRn (HsWith expr' binds', fvExpr `plusFV` fvBinds)
372 rnExpr e@(HsDo do_or_lc stmts src_loc)
373 = pushSrcLocRn src_loc $
374 lookupOrigNames implicit_rdr_names `thenRn` \ implicit_fvs ->
375 rnStmts rnExpr stmts `thenRn` \ (stmts', fvs) ->
376 -- check the statement list ends in an expression
377 case last stmts' of {
378 ExprStmt _ _ -> returnRn () ;
379 ReturnStmt _ -> returnRn () ; -- for list comprehensions
380 _ -> addErrRn (doStmtListErr e)
382 returnRn (HsDo do_or_lc stmts' src_loc, fvs `plusFV` implicit_fvs)
384 implicit_rdr_names = [foldr_RDR, build_RDR, monadClass_RDR]
385 -- Monad stuff should not be necessary for a list comprehension
386 -- but the typechecker looks up the bind and return Ids anyway
390 rnExpr (ExplicitList exps)
391 = rnExprs exps `thenRn` \ (exps', fvs) ->
392 returnRn (ExplicitList exps', fvs `addOneFV` listTyCon_name)
394 rnExpr (ExplicitTuple exps boxity)
395 = rnExprs exps `thenRn` \ (exps', fvs) ->
396 returnRn (ExplicitTuple exps' boxity, fvs `addOneFV` tycon_name)
398 tycon_name = tupleTyCon_name boxity (length exps)
400 rnExpr (RecordCon con_id rbinds)
401 = lookupOccRn con_id `thenRn` \ conname ->
402 rnRbinds "construction" rbinds `thenRn` \ (rbinds', fvRbinds) ->
403 returnRn (RecordCon conname rbinds', fvRbinds `addOneFV` conname)
405 rnExpr (RecordUpd expr rbinds)
406 = rnExpr expr `thenRn` \ (expr', fvExpr) ->
407 rnRbinds "update" rbinds `thenRn` \ (rbinds', fvRbinds) ->
408 returnRn (RecordUpd expr' rbinds', fvExpr `plusFV` fvRbinds)
410 rnExpr (ExprWithTySig expr pty)
411 = rnExpr expr `thenRn` \ (expr', fvExpr) ->
412 rnHsSigType (text "an expression") pty `thenRn` \ (pty', fvTy) ->
413 returnRn (ExprWithTySig expr' pty', fvExpr `plusFV` fvTy)
415 rnExpr (HsIf p b1 b2 src_loc)
416 = pushSrcLocRn src_loc $
417 rnExpr p `thenRn` \ (p', fvP) ->
418 rnExpr b1 `thenRn` \ (b1', fvB1) ->
419 rnExpr b2 `thenRn` \ (b2', fvB2) ->
420 returnRn (HsIf p' b1' b2' src_loc, plusFVs [fvP, fvB1, fvB2])
423 (rnHsType doc a) `thenRn` \ (t, fvT) -> returnRn (HsType t, fvT)
424 where doc = text "renaming a type pattern"
427 rnExpr (ArithSeqIn seq)
428 = lookupOrigName enumClass_RDR `thenRn` \ enum ->
429 rn_seq seq `thenRn` \ (new_seq, fvs) ->
430 returnRn (ArithSeqIn new_seq, fvs `addOneFV` enum)
433 = rnExpr expr `thenRn` \ (expr', fvExpr) ->
434 returnRn (From expr', fvExpr)
436 rn_seq (FromThen expr1 expr2)
437 = rnExpr expr1 `thenRn` \ (expr1', fvExpr1) ->
438 rnExpr expr2 `thenRn` \ (expr2', fvExpr2) ->
439 returnRn (FromThen expr1' expr2', fvExpr1 `plusFV` fvExpr2)
441 rn_seq (FromTo expr1 expr2)
442 = rnExpr expr1 `thenRn` \ (expr1', fvExpr1) ->
443 rnExpr expr2 `thenRn` \ (expr2', fvExpr2) ->
444 returnRn (FromTo expr1' expr2', fvExpr1 `plusFV` fvExpr2)
446 rn_seq (FromThenTo expr1 expr2 expr3)
447 = rnExpr expr1 `thenRn` \ (expr1', fvExpr1) ->
448 rnExpr expr2 `thenRn` \ (expr2', fvExpr2) ->
449 rnExpr expr3 `thenRn` \ (expr3', fvExpr3) ->
450 returnRn (FromThenTo expr1' expr2' expr3',
451 plusFVs [fvExpr1, fvExpr2, fvExpr3])
454 These three are pattern syntax appearing in expressions.
455 Since all the symbols are reservedops we can simply reject them.
456 We return a (bogus) EWildPat in each case.
459 rnExpr e@EWildPat = addErrRn (patSynErr e) `thenRn_`
460 returnRn (EWildPat, emptyFVs)
462 rnExpr e@(EAsPat _ _) = addErrRn (patSynErr e) `thenRn_`
463 returnRn (EWildPat, emptyFVs)
465 rnExpr e@(ELazyPat _) = addErrRn (patSynErr e) `thenRn_`
466 returnRn (EWildPat, emptyFVs)
471 %************************************************************************
473 \subsubsection{@Rbinds@s and @Rpats@s: in record expressions}
475 %************************************************************************
479 = mapRn_ field_dup_err dup_fields `thenRn_`
480 mapFvRn rn_rbind rbinds `thenRn` \ (rbinds', fvRbind) ->
481 returnRn (rbinds', fvRbind)
483 (_, dup_fields) = removeDups compare [ f | (f,_,_) <- rbinds ]
485 field_dup_err dups = addErrRn (dupFieldErr str dups)
487 rn_rbind (field, expr, pun)
488 = lookupGlobalOccRn field `thenRn` \ fieldname ->
489 rnExpr expr `thenRn` \ (expr', fvExpr) ->
490 returnRn ((fieldname, expr', pun), fvExpr `addOneFV` fieldname)
493 = mapRn_ field_dup_err dup_fields `thenRn_`
494 mapFvRn rn_rpat rpats `thenRn` \ (rpats', fvs) ->
495 returnRn (rpats', fvs)
497 (_, dup_fields) = removeDups compare [ f | (f,_,_) <- rpats ]
499 field_dup_err dups = addErrRn (dupFieldErr "pattern" dups)
501 rn_rpat (field, pat, pun)
502 = lookupGlobalOccRn field `thenRn` \ fieldname ->
503 rnPat pat `thenRn` \ (pat', fvs) ->
504 returnRn ((fieldname, pat', pun), fvs `addOneFV` fieldname)
507 %************************************************************************
509 \subsubsection{@rnIPBinds@s: in implicit parameter bindings} *
511 %************************************************************************
514 rnIPBinds [] = returnRn ([], emptyFVs)
515 rnIPBinds ((n, expr) : binds)
516 = newIPName n `thenRn` \ name ->
517 rnExpr expr `thenRn` \ (expr',fvExpr) ->
518 rnIPBinds binds `thenRn` \ (binds',fvBinds) ->
519 returnRn ((name, expr') : binds', fvExpr `plusFV` fvBinds)
523 %************************************************************************
525 \subsubsection{@Stmt@s: in @do@ expressions}
527 %************************************************************************
529 Note that although some bound vars may appear in the free var set for
530 the first qual, these will eventually be removed by the caller. For
531 example, if we have @[p | r <- s, q <- r, p <- q]@, when doing
532 @[q <- r, p <- q]@, the free var set for @q <- r@ will
533 be @{r}@, and the free var set for the entire Quals will be @{r}@. This
534 @r@ will be removed only when we finally return from examining all the
538 type RnExprTy = RdrNameHsExpr -> RnMS (RenamedHsExpr, FreeVars)
542 -> RnMS ([RenamedStmt], FreeVars)
545 = returnRn ([], emptyFVs)
547 rnStmts rn_expr (stmt:stmts)
548 = rnStmt rn_expr stmt $ \ stmt' ->
549 rnStmts rn_expr stmts `thenRn` \ (stmts', fvs) ->
550 returnRn (stmt' : stmts', fvs)
552 rnStmt :: RnExprTy -> RdrNameStmt
553 -> (RenamedStmt -> RnMS (a, FreeVars))
554 -> RnMS (a, FreeVars)
555 -- Because of mutual recursion we have to pass in rnExpr.
557 rnStmt rn_expr (BindStmt pat expr src_loc) thing_inside
558 = pushSrcLocRn src_loc $
559 rn_expr expr `thenRn` \ (expr', fv_expr) ->
560 bindLocalsFVRn doc binders $ \ new_binders ->
561 rnPat pat `thenRn` \ (pat', fv_pat) ->
562 thing_inside (BindStmt pat' expr' src_loc) `thenRn` \ (result, fvs) ->
563 returnRn (result, fv_expr `plusFV` fvs `plusFV` fv_pat)
565 binders = collectPatBinders pat
566 doc = text "a pattern in do binding"
568 rnStmt rn_expr (ExprStmt expr src_loc) thing_inside
569 = pushSrcLocRn src_loc $
570 rn_expr expr `thenRn` \ (expr', fv_expr) ->
571 thing_inside (ExprStmt expr' src_loc) `thenRn` \ (result, fvs) ->
572 returnRn (result, fv_expr `plusFV` fvs)
574 rnStmt rn_expr (GuardStmt expr src_loc) thing_inside
575 = pushSrcLocRn src_loc $
576 rn_expr expr `thenRn` \ (expr', fv_expr) ->
577 thing_inside (GuardStmt expr' src_loc) `thenRn` \ (result, fvs) ->
578 returnRn (result, fv_expr `plusFV` fvs)
580 rnStmt rn_expr (ReturnStmt expr) thing_inside
581 = rn_expr expr `thenRn` \ (expr', fv_expr) ->
582 thing_inside (ReturnStmt expr') `thenRn` \ (result, fvs) ->
583 returnRn (result, fv_expr `plusFV` fvs)
585 rnStmt rn_expr (LetStmt binds) thing_inside
586 = rnBinds binds $ \ binds' ->
587 thing_inside (LetStmt binds')
590 %************************************************************************
592 \subsubsection{Precedence Parsing}
594 %************************************************************************
596 @mkOpAppRn@ deals with operator fixities. The argument expressions
597 are assumed to be already correctly arranged. It needs the fixities
598 recorded in the OpApp nodes, because fixity info applies to the things
599 the programmer actually wrote, so you can't find it out from the Name.
601 Furthermore, the second argument is guaranteed not to be another
602 operator application. Why? Because the parser parses all
603 operator appications left-associatively, EXCEPT negation, which
604 we need to handle specially.
607 mkOpAppRn :: RenamedHsExpr -- Left operand; already rearranged
608 -> RenamedHsExpr -> Fixity -- Operator and fixity
609 -> RenamedHsExpr -- Right operand (not an OpApp, but might
611 -> RnMS RenamedHsExpr
613 ---------------------------
614 -- (e11 `op1` e12) `op2` e2
615 mkOpAppRn e1@(OpApp e11 op1 fix1 e12) op2 fix2 e2
617 = addErrRn (precParseErr (ppr_op op1,fix1) (ppr_op op2,fix2)) `thenRn_`
618 returnRn (OpApp e1 op2 fix2 e2)
621 = mkOpAppRn e12 op2 fix2 e2 `thenRn` \ new_e ->
622 returnRn (OpApp e11 op1 fix1 new_e)
624 (nofix_error, associate_right) = compareFixity fix1 fix2
626 ---------------------------
627 -- (- neg_arg) `op` e2
628 mkOpAppRn e1@(NegApp neg_arg neg_op) op2 fix2 e2
630 = addErrRn (precParseErr (pp_prefix_minus,negateFixity) (ppr_op op2,fix2)) `thenRn_`
631 returnRn (OpApp e1 op2 fix2 e2)
634 = mkOpAppRn neg_arg op2 fix2 e2 `thenRn` \ new_e ->
635 returnRn (NegApp new_e neg_op)
637 (nofix_error, associate_right) = compareFixity negateFixity fix2
639 ---------------------------
641 mkOpAppRn e1 op1 fix1 e2@(NegApp neg_arg neg_op) -- NegApp can occur on the right
642 | not associate_right -- We *want* right association
643 = addErrRn (precParseErr (ppr_op op1, fix1) (pp_prefix_minus, negateFixity)) `thenRn_`
644 returnRn (OpApp e1 op1 fix1 e2)
646 (_, associate_right) = compareFixity fix1 negateFixity
648 ---------------------------
650 mkOpAppRn e1 op fix e2 -- Default case, no rearrangment
651 = ASSERT2( right_op_ok fix e2,
652 ppr e1 $$ text "---" $$ ppr op $$ text "---" $$ ppr fix $$ text "---" $$ ppr e2
654 returnRn (OpApp e1 op fix e2)
656 -- Parser left-associates everything, but
657 -- derived instances may have correctly-associated things to
658 -- in the right operarand. So we just check that the right operand is OK
659 right_op_ok fix1 (OpApp _ _ fix2 _)
660 = not error_please && associate_right
662 (error_please, associate_right) = compareFixity fix1 fix2
663 right_op_ok fix1 other
666 -- Parser initially makes negation bind more tightly than any other operator
667 mkNegAppRn neg_arg neg_op
670 getModeRn `thenRn` \ mode ->
671 ASSERT( not_op_app mode neg_arg )
673 returnRn (NegApp neg_arg neg_op)
675 not_op_app SourceMode (OpApp _ _ _ _) = False
676 not_op_app mode other = True
680 mkConOpPatRn :: RenamedPat -> Name -> Fixity -> RenamedPat
683 mkConOpPatRn p1@(ConOpPatIn p11 op1 fix1 p12)
686 = addErrRn (precParseErr (ppr_op op1,fix1) (ppr_op op2,fix2)) `thenRn_`
687 returnRn (ConOpPatIn p1 op2 fix2 p2)
690 = mkConOpPatRn p12 op2 fix2 p2 `thenRn` \ new_p ->
691 returnRn (ConOpPatIn p11 op1 fix1 new_p)
694 (nofix_error, associate_right) = compareFixity fix1 fix2
696 mkConOpPatRn p1 op fix p2 -- Default case, no rearrangment
697 = ASSERT( not_op_pat p2 )
698 returnRn (ConOpPatIn p1 op fix p2)
700 not_op_pat (ConOpPatIn _ _ _ _) = False
701 not_op_pat other = True
705 checkPrecMatch :: Bool -> Name -> RenamedMatch -> RnMS ()
707 checkPrecMatch False fn match
710 checkPrecMatch True op (Match _ (p1:p2:_) _ _)
711 -- True indicates an infix lhs
712 = getModeRn `thenRn` \ mode ->
713 -- See comments with rnExpr (OpApp ...)
715 InterfaceMode -> returnRn ()
716 SourceMode -> checkPrec op p1 False `thenRn_`
719 checkPrecMatch True op _ = panic "checkPrecMatch"
721 checkPrec op (ConOpPatIn _ op1 _ _) right
722 = lookupFixityRn op `thenRn` \ op_fix@(Fixity op_prec op_dir) ->
723 lookupFixityRn op1 `thenRn` \ op1_fix@(Fixity op1_prec op1_dir) ->
725 inf_ok = op1_prec > op_prec ||
726 (op1_prec == op_prec &&
727 (op1_dir == InfixR && op_dir == InfixR && right ||
728 op1_dir == InfixL && op_dir == InfixL && not right))
730 info = (ppr_op op, op_fix)
731 info1 = (ppr_op op1, op1_fix)
732 (infol, infor) = if right then (info, info1) else (info1, info)
734 checkRn inf_ok (precParseErr infol infor)
736 checkPrec op pat right
739 -- Check precedence of (arg op) or (op arg) respectively
740 -- If arg is itself an operator application, its precedence should
741 -- be higher than that of op
742 checkSectionPrec left_or_right section op arg
744 OpApp _ op fix _ -> go_for_it (ppr_op op) fix
745 NegApp _ _ -> go_for_it pp_prefix_minus negateFixity
749 go_for_it pp_arg_op arg_fix@(Fixity arg_prec _)
750 = lookupFixityRn op_name `thenRn` \ op_fix@(Fixity op_prec _) ->
751 checkRn (op_prec < arg_prec)
752 (sectionPrecErr (ppr_op op_name, op_fix) (pp_arg_op, arg_fix) section)
759 @(compareFixity op1 op2)@ tells which way to arrange appication, or
760 whether there's an error.
763 compareFixity :: Fixity -> Fixity
764 -> (Bool, -- Error please
765 Bool) -- Associate to the right: a op1 (b op2 c)
766 compareFixity (Fixity prec1 dir1) (Fixity prec2 dir2)
767 = case prec1 `compare` prec2 of
770 EQ -> case (dir1, dir2) of
771 (InfixR, InfixR) -> right
772 (InfixL, InfixL) -> left
775 right = (False, True)
776 left = (False, False)
777 error_please = (True, False)
780 %************************************************************************
782 \subsubsection{Literals}
784 %************************************************************************
786 When literals occur we have to make sure
787 that the types and classes they involve
791 litFVs (HsChar c) = returnRn (unitFV charTyCon_name)
792 litFVs (HsCharPrim c) = returnRn (unitFV (getName charPrimTyCon))
793 litFVs (HsString s) = returnRn (mkFVs [listTyCon_name, charTyCon_name])
794 litFVs (HsStringPrim s) = returnRn (unitFV (getName addrPrimTyCon))
795 litFVs (HsInt i) = returnRn (unitFV (getName intTyCon))
796 litFVs (HsIntPrim i) = returnRn (unitFV (getName intPrimTyCon))
797 litFVs (HsFloatPrim f) = returnRn (unitFV (getName floatPrimTyCon))
798 litFVs (HsDoublePrim d) = returnRn (unitFV (getName doublePrimTyCon))
799 litFVs (HsLitLit l bogus_ty) = lookupOrigName ccallableClass_RDR `thenRn` \ cc ->
801 litFVs lit = pprPanic "RnExpr.litFVs" (ppr lit) -- HsInteger and HsRat only appear
802 -- in post-typechecker translations
804 rnOverLit (HsIntegral i from_integer)
805 = lookupOccRn from_integer `thenRn` \ from_integer' ->
806 (if inIntRange i then
809 lookupOrigNames [plusInteger_RDR, timesInteger_RDR]
811 returnRn (HsIntegral i from_integer', ns `addOneFV` from_integer')
813 rnOverLit (HsFractional i n)
814 = lookupOccRn n `thenRn` \ n' ->
815 lookupOrigNames [ratioDataCon_RDR, plusInteger_RDR, timesInteger_RDR] `thenRn` \ ns' ->
816 -- We have to make sure that the Ratio type is imported with
817 -- its constructor, because literals of type Ratio t are
818 -- built with that constructor.
819 -- The Rational type is needed too, but that will come in
820 -- when fractionalClass does.
821 -- The plus/times integer operations may be needed to construct the numerator
822 -- and denominator (see DsUtils.mkIntegerLit)
823 returnRn (HsFractional i n', ns' `addOneFV` n')
826 %************************************************************************
828 \subsubsection{Assertion utils}
830 %************************************************************************
833 mkAssertExpr :: RnMS (RenamedHsExpr, FreeVars)
835 lookupOrigName assertErr_RDR `thenRn` \ name ->
836 getSrcLocRn `thenRn` \ sloc ->
838 -- if we're ignoring asserts, return (\ _ e -> e)
839 -- if not, return (assertError "src-loc")
841 if opt_IgnoreAsserts then
842 getUniqRn `thenRn` \ uniq ->
844 vname = mkSysLocalName uniq SLIT("v")
845 expr = HsLam ignorePredMatch
846 loc = nameSrcLoc vname
847 ignorePredMatch = Match [] [WildPatIn, VarPatIn vname] Nothing
848 (GRHSs [GRHS [ExprStmt (HsVar vname) loc] loc]
851 returnRn (expr, unitFV name)
856 (HsLit (HsString (_PK_ (showSDoc (ppr sloc)))))
859 returnRn (expr, unitFV name)
863 %************************************************************************
865 \subsubsection{Errors}
867 %************************************************************************
870 ppr_op op = quotes (ppr op) -- Here, op can be a Name or a (Var n), where n is a Name
871 ppr_opfix (pp_op, fixity) = pp_op <+> brackets (ppr fixity)
872 pp_prefix_minus = ptext SLIT("prefix `-'")
874 dupFieldErr str (dup:rest)
875 = hsep [ptext SLIT("duplicate field name"),
877 ptext SLIT("in record"), text str]
880 = hang (ptext SLIT("precedence parsing error"))
881 4 (hsep [ptext SLIT("cannot mix"), ppr_opfix op1, ptext SLIT("and"),
883 ptext SLIT("in the same infix expression")])
885 sectionPrecErr op arg_op section
886 = vcat [ptext SLIT("The operator") <+> ppr_opfix op <+> ptext SLIT("of a section"),
887 nest 4 (ptext SLIT("must have lower precedence than the operand") <+> ppr_opfix arg_op),
888 nest 4 (ptext SLIT("In the section:") <+> quotes (ppr section))]
892 SLIT("accepting non-standard pattern guards (-fglasgow-exts to suppress this message)")
896 = (ptext SLIT("Illegal signature in pattern:") <+> ppr ty)
897 $$ nest 4 (ptext SLIT("Use -fglasgow-exts to permit it"))
900 = sep [ptext SLIT("Pattern syntax in expression context:"),
904 = sep [ptext SLIT("`do' statements must end in expression:"),