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, rnExpr, rnExprs, rnStmts,
18 #include "HsVersions.h"
20 import {-# SOURCE #-} RnSource ( rnSrcDecls, rnBindsAndThen, rnBinds )
22 -- RnSource imports RnBinds.rnTopMonoBinds, RnExpr.rnExpr
23 -- RnBinds imports RnExpr.rnMatch, etc
24 -- RnExpr imports [boot] RnSource.rnSrcDecls, RnSource.rnBinds
31 import RnNames ( importsFromLocalDecls )
32 import RnTypes ( rnHsTypeFVs, rnPat, litFVs, rnOverLit, rnPatsAndThen,
33 dupFieldErr, precParseErr, sectionPrecErr, patSigErr )
34 import CmdLineOpts ( DynFlag(..), opt_IgnoreAsserts )
35 import BasicTypes ( Fixity(..), FixityDirection(..), IPName(..),
36 defaultFixity, negateFixity, compareFixity )
37 import PrelNames ( hasKey, assertIdKey,
39 cCallableClassName, cReturnableClassName,
41 splitName, fstName, sndName, ioDataConName,
42 replicatePName, mapPName, filterPName,
43 crossPName, zipPName, toPName,
44 enumFromToPName, enumFromThenToPName, assertErrorName,
45 negateName, monadNames, mfixName )
47 import DsMeta ( qTyConName )
49 import Name ( Name, nameOccName )
51 import UnicodeUtil ( stringToUtf8 )
52 import UniqFM ( isNullUFM )
53 import UniqSet ( emptyUniqSet )
54 import Util ( isSingleton )
55 import List ( intersectBy, unzip4 )
56 import ListSetOps ( removeDups )
62 ************************************************************************
66 ************************************************************************
69 rnMatch :: HsMatchContext Name -> RdrNameMatch -> RnM (RenamedMatch, FreeVars)
71 rnMatch ctxt match@(Match pats maybe_rhs_sig grhss)
72 = addSrcLoc (getMatchLoc match) $
74 -- Deal with the rhs type signature
75 bindPatSigTyVars rhs_sig_tys $
76 doptM Opt_GlasgowExts `thenM` \ opt_GlasgowExts ->
77 (case maybe_rhs_sig of
78 Nothing -> returnM (Nothing, emptyFVs)
79 Just ty | opt_GlasgowExts -> rnHsTypeFVs doc_sig ty `thenM` \ (ty', ty_fvs) ->
80 returnM (Just ty', ty_fvs)
81 | otherwise -> addErr (patSigErr ty) `thenM_`
82 returnM (Nothing, emptyFVs)
83 ) `thenM` \ (maybe_rhs_sig', ty_fvs) ->
86 rnPatsAndThen ctxt pats $ \ pats' ->
87 rnGRHSs ctxt grhss `thenM` \ (grhss', grhss_fvs) ->
89 returnM (Match pats' maybe_rhs_sig' grhss', grhss_fvs `plusFV` ty_fvs)
90 -- The bindPatSigTyVars and rnPatsAndThen will remove the bound FVs
92 rhs_sig_tys = case maybe_rhs_sig of
95 doc_sig = text "In a result type-signature"
99 %************************************************************************
101 \subsubsection{Guarded right-hand sides (GRHSs)}
103 %************************************************************************
106 rnGRHSs :: HsMatchContext Name -> RdrNameGRHSs -> RnM (RenamedGRHSs, FreeVars)
108 rnGRHSs ctxt (GRHSs grhss binds _)
109 = rnBindsAndThen binds $ \ binds' ->
110 mapFvRn (rnGRHS ctxt) grhss `thenM` \ (grhss', fvGRHSs) ->
111 returnM (GRHSs grhss' binds' placeHolderType, fvGRHSs)
113 rnGRHS ctxt (GRHS guarded locn)
115 doptM Opt_GlasgowExts `thenM` \ opt_GlasgowExts ->
116 checkM (opt_GlasgowExts || is_standard_guard guarded)
117 (addWarn (nonStdGuardErr guarded)) `thenM_`
119 rnStmts (PatGuard ctxt) guarded `thenM` \ (guarded', fvs) ->
120 returnM (GRHS guarded' locn, fvs)
122 -- Standard Haskell 1.4 guards are just a single boolean
123 -- expression, rather than a list of qualifiers as in the
125 is_standard_guard [ResultStmt _ _] = True
126 is_standard_guard [ExprStmt _ _ _, ResultStmt _ _] = True
127 is_standard_guard other = False
130 %************************************************************************
132 \subsubsection{Expressions}
134 %************************************************************************
137 rnExprs :: [RdrNameHsExpr] -> RnM ([RenamedHsExpr], FreeVars)
138 rnExprs ls = rnExprs' ls emptyUniqSet
140 rnExprs' [] acc = returnM ([], acc)
141 rnExprs' (expr:exprs) acc
142 = rnExpr expr `thenM` \ (expr', fvExpr) ->
144 -- Now we do a "seq" on the free vars because typically it's small
145 -- or empty, especially in very long lists of constants
147 acc' = acc `plusFV` fvExpr
149 (grubby_seqNameSet acc' rnExprs') exprs acc' `thenM` \ (exprs', fvExprs) ->
150 returnM (expr':exprs', fvExprs)
152 -- Grubby little function to do "seq" on namesets; replace by proper seq when GHC can do seq
153 grubby_seqNameSet ns result | isNullUFM ns = result
157 Variables. We look up the variable and return the resulting name.
160 rnExpr :: RdrNameHsExpr -> RnM (RenamedHsExpr, FreeVars)
163 = lookupOccRn v `thenM` \ name ->
164 if name `hasKey` assertIdKey && not opt_IgnoreAsserts then
165 -- We expand it to (GHC.Err.assertError location_string)
168 -- The normal case. Even if the Id was 'assert', if we are
169 -- ignoring assertions we leave it as GHC.Base.assert;
170 -- this function just ignores its first arg.
171 returnM (HsVar name, unitFV name)
174 = newIPName v `thenM` \ name ->
177 Linear _ -> mkFVs [splitName, fstName, sndName]
178 Dupable _ -> emptyFVs
180 returnM (HsIPVar name, fvs)
183 = litFVs lit `thenM` \ fvs ->
184 returnM (HsLit lit, fvs)
186 rnExpr (HsOverLit lit)
187 = rnOverLit lit `thenM` \ (lit', fvs) ->
188 returnM (HsOverLit lit', fvs)
191 = rnMatch LambdaExpr match `thenM` \ (match', fvMatch) ->
192 returnM (HsLam match', fvMatch)
194 rnExpr (HsApp fun arg)
195 = rnExpr fun `thenM` \ (fun',fvFun) ->
196 rnExpr arg `thenM` \ (arg',fvArg) ->
197 returnM (HsApp fun' arg', fvFun `plusFV` fvArg)
199 rnExpr (OpApp e1 op _ e2)
200 = rnExpr e1 `thenM` \ (e1', fv_e1) ->
201 rnExpr e2 `thenM` \ (e2', fv_e2) ->
202 rnExpr op `thenM` \ (op'@(HsVar op_name), fv_op) ->
205 -- When renaming code synthesised from "deriving" declarations
206 -- we're in Interface mode, and we should ignore fixity; assume
207 -- that the deriving code generator got the association correct
208 -- Don't even look up the fixity when in interface mode
209 getModeRn `thenM` \ mode ->
210 (if isInterfaceMode mode
211 then returnM (OpApp e1' op' defaultFixity e2')
212 else lookupFixityRn op_name `thenM` \ fixity ->
213 mkOpAppRn e1' op' fixity e2'
214 ) `thenM` \ final_e ->
217 fv_e1 `plusFV` fv_op `plusFV` fv_e2)
220 = rnExpr e `thenM` \ (e', fv_e) ->
221 lookupSyntaxName negateName `thenM` \ (neg_name, fv_neg) ->
222 mkNegAppRn e' neg_name `thenM` \ final_e ->
223 returnM (final_e, fv_e `plusFV` fv_neg)
226 = rnExpr e `thenM` \ (e', fvs_e) ->
227 returnM (HsPar e', fvs_e)
229 -- Template Haskell extensions
231 rnExpr (HsBracket br_body loc)
233 checkGHCI (thErr "bracket") `thenM_`
234 rnBracket br_body `thenM` \ (body', fvs_e) ->
235 returnM (HsBracket body' loc, fvs_e `addOneFV` qTyConName)
236 -- We use the Q tycon as a proxy to haul in all the smart
237 -- constructors; see the hack in RnIfaces
239 rnExpr (HsSplice n e loc)
241 checkGHCI (thErr "splice") `thenM_`
242 newLocalsRn [(n,loc)] `thenM` \ [n'] ->
243 rnExpr e `thenM` \ (e', fvs_e) ->
244 returnM (HsSplice n' e' loc, fvs_e)
246 rnExpr (HsReify (Reify flavour name))
247 = checkGHCI (thErr "reify") `thenM_`
248 lookupGlobalOccRn name `thenM` \ name' ->
249 -- For now, we can only reify top-level things
250 returnM (HsReify (Reify flavour name'), mkFVs [name', qTyConName])
251 -- The qTyCon brutally pulls in all the meta stuff
254 rnExpr section@(SectionL expr op)
255 = rnExpr expr `thenM` \ (expr', fvs_expr) ->
256 rnExpr op `thenM` \ (op', fvs_op) ->
257 checkSectionPrec InfixL section op' expr' `thenM_`
258 returnM (SectionL expr' op', fvs_op `plusFV` fvs_expr)
260 rnExpr section@(SectionR op expr)
261 = rnExpr op `thenM` \ (op', fvs_op) ->
262 rnExpr expr `thenM` \ (expr', fvs_expr) ->
263 checkSectionPrec InfixR section op' expr' `thenM_`
264 returnM (SectionR op' expr', fvs_op `plusFV` fvs_expr)
266 rnExpr (HsCCall fun args may_gc is_casm _)
267 -- Check out the comment on RnIfaces.getNonWiredDataDecl about ccalls
268 = rnExprs args `thenM` \ (args', fvs_args) ->
269 returnM (HsCCall fun args' may_gc is_casm placeHolderType,
270 fvs_args `plusFV` mkFVs [cCallableClassName,
271 cReturnableClassName,
274 rnExpr (HsSCC lbl expr)
275 = rnExpr expr `thenM` \ (expr', fvs_expr) ->
276 returnM (HsSCC lbl expr', fvs_expr)
278 rnExpr (HsCase expr ms src_loc)
279 = addSrcLoc src_loc $
280 rnExpr expr `thenM` \ (new_expr, e_fvs) ->
281 mapFvRn (rnMatch CaseAlt) ms `thenM` \ (new_ms, ms_fvs) ->
282 returnM (HsCase new_expr new_ms src_loc, e_fvs `plusFV` ms_fvs)
284 rnExpr (HsLet binds expr)
285 = rnBindsAndThen binds $ \ binds' ->
286 rnExpr expr `thenM` \ (expr',fvExpr) ->
287 returnM (HsLet binds' expr', fvExpr)
289 rnExpr (HsWith expr binds is_with)
290 = warnIf is_with withWarning `thenM_`
291 rnExpr expr `thenM` \ (expr',fvExpr) ->
292 rnIPBinds binds `thenM` \ (binds',fvBinds) ->
293 returnM (HsWith expr' binds' is_with, fvExpr `plusFV` fvBinds)
295 rnExpr e@(HsDo do_or_lc stmts _ _ src_loc)
296 = addSrcLoc src_loc $
297 rnStmts do_or_lc stmts `thenM` \ (stmts', fvs) ->
299 -- Check the statement list ends in an expression
300 case last stmts' of {
301 ResultStmt _ _ -> returnM () ;
302 _ -> addErr (doStmtListErr do_or_lc e)
305 -- Generate the rebindable syntax for the monad
306 mapAndUnzipM lookupSyntaxName
307 (syntax_names do_or_lc) `thenM` \ (monad_names', monad_fvs) ->
309 returnM (HsDo do_or_lc stmts' monad_names' placeHolderType src_loc,
310 fvs `plusFV` implicit_fvs do_or_lc `plusFV` plusFVs monad_fvs)
312 implicit_fvs PArrComp = mkFVs [replicatePName, mapPName, filterPName, crossPName, zipPName]
313 implicit_fvs ListComp = mkFVs [foldrName, buildName]
314 implicit_fvs DoExpr = emptyFVs
315 implicit_fvs MDoExpr = emptyFVs
317 syntax_names DoExpr = monadNames
318 syntax_names MDoExpr = monadNames ++ [mfixName]
319 syntax_names other = []
321 rnExpr (ExplicitList _ exps)
322 = rnExprs exps `thenM` \ (exps', fvs) ->
323 returnM (ExplicitList placeHolderType exps', fvs `addOneFV` listTyCon_name)
325 rnExpr (ExplicitPArr _ exps)
326 = rnExprs exps `thenM` \ (exps', fvs) ->
327 returnM (ExplicitPArr placeHolderType exps',
328 fvs `addOneFV` toPName `addOneFV` parrTyCon_name)
330 rnExpr (ExplicitTuple exps boxity)
331 = rnExprs exps `thenM` \ (exps', fvs) ->
332 returnM (ExplicitTuple exps' boxity, fvs `addOneFV` tycon_name)
334 tycon_name = tupleTyCon_name boxity (length exps)
336 rnExpr (RecordCon con_id rbinds)
337 = lookupOccRn con_id `thenM` \ conname ->
338 rnRbinds "construction" rbinds `thenM` \ (rbinds', fvRbinds) ->
339 returnM (RecordCon conname rbinds', fvRbinds `addOneFV` conname)
341 rnExpr (RecordUpd expr rbinds)
342 = rnExpr expr `thenM` \ (expr', fvExpr) ->
343 rnRbinds "update" rbinds `thenM` \ (rbinds', fvRbinds) ->
344 returnM (RecordUpd expr' rbinds', fvExpr `plusFV` fvRbinds)
346 rnExpr (ExprWithTySig expr pty)
347 = rnExpr expr `thenM` \ (expr', fvExpr) ->
348 rnHsTypeFVs doc pty `thenM` \ (pty', fvTy) ->
349 returnM (ExprWithTySig expr' pty', fvExpr `plusFV` fvTy)
351 doc = text "In an expression type signature"
353 rnExpr (HsIf p b1 b2 src_loc)
354 = addSrcLoc src_loc $
355 rnExpr p `thenM` \ (p', fvP) ->
356 rnExpr b1 `thenM` \ (b1', fvB1) ->
357 rnExpr b2 `thenM` \ (b2', fvB2) ->
358 returnM (HsIf p' b1' b2' src_loc, plusFVs [fvP, fvB1, fvB2])
361 = rnHsTypeFVs doc a `thenM` \ (t, fvT) ->
362 returnM (HsType t, fvT)
364 doc = text "In a type argument"
366 rnExpr (ArithSeqIn seq)
367 = rnArithSeq seq `thenM` \ (new_seq, fvs) ->
368 returnM (ArithSeqIn new_seq, fvs `addOneFV` enumClassName)
370 rnExpr (PArrSeqIn seq)
371 = rnArithSeq seq `thenM` \ (new_seq, fvs) ->
372 returnM (PArrSeqIn new_seq,
373 fvs `plusFV` mkFVs [enumFromToPName, enumFromThenToPName])
376 These three are pattern syntax appearing in expressions.
377 Since all the symbols are reservedops we can simply reject them.
378 We return a (bogus) EWildPat in each case.
381 rnExpr e@EWildPat = addErr (patSynErr e) `thenM_`
382 returnM (EWildPat, emptyFVs)
384 rnExpr e@(EAsPat _ _) = addErr (patSynErr e) `thenM_`
385 returnM (EWildPat, emptyFVs)
387 rnExpr e@(ELazyPat _) = addErr (patSynErr e) `thenM_`
388 returnM (EWildPat, emptyFVs)
391 %************************************************************************
395 %************************************************************************
398 rnArithSeq (From expr)
399 = rnExpr expr `thenM` \ (expr', fvExpr) ->
400 returnM (From expr', fvExpr)
402 rnArithSeq (FromThen expr1 expr2)
403 = rnExpr expr1 `thenM` \ (expr1', fvExpr1) ->
404 rnExpr expr2 `thenM` \ (expr2', fvExpr2) ->
405 returnM (FromThen expr1' expr2', fvExpr1 `plusFV` fvExpr2)
407 rnArithSeq (FromTo expr1 expr2)
408 = rnExpr expr1 `thenM` \ (expr1', fvExpr1) ->
409 rnExpr expr2 `thenM` \ (expr2', fvExpr2) ->
410 returnM (FromTo expr1' expr2', fvExpr1 `plusFV` fvExpr2)
412 rnArithSeq (FromThenTo expr1 expr2 expr3)
413 = rnExpr expr1 `thenM` \ (expr1', fvExpr1) ->
414 rnExpr expr2 `thenM` \ (expr2', fvExpr2) ->
415 rnExpr expr3 `thenM` \ (expr3', fvExpr3) ->
416 returnM (FromThenTo expr1' expr2' expr3',
417 plusFVs [fvExpr1, fvExpr2, fvExpr3])
421 %************************************************************************
423 \subsubsection{@Rbinds@s and @Rpats@s: in record expressions}
425 %************************************************************************
429 = mappM_ field_dup_err dup_fields `thenM_`
430 mapFvRn rn_rbind rbinds `thenM` \ (rbinds', fvRbind) ->
431 returnM (rbinds', fvRbind)
433 (_, dup_fields) = removeDups compare [ f | (f,_) <- rbinds ]
435 field_dup_err dups = addErr (dupFieldErr str dups)
437 rn_rbind (field, expr)
438 = lookupGlobalOccRn field `thenM` \ fieldname ->
439 rnExpr expr `thenM` \ (expr', fvExpr) ->
440 returnM ((fieldname, expr'), fvExpr `addOneFV` fieldname)
443 %************************************************************************
445 \subsubsection{@rnIPBinds@s: in implicit parameter bindings} *
447 %************************************************************************
450 rnIPBinds [] = returnM ([], emptyFVs)
451 rnIPBinds ((n, expr) : binds)
452 = newIPName n `thenM` \ name ->
453 rnExpr expr `thenM` \ (expr',fvExpr) ->
454 rnIPBinds binds `thenM` \ (binds',fvBinds) ->
455 returnM ((name, expr') : binds', fvExpr `plusFV` fvBinds)
459 %************************************************************************
461 Template Haskell brackets
463 %************************************************************************
466 rnBracket (ExpBr e) = rnExpr e `thenM` \ (e', fvs) ->
467 returnM (ExpBr e', fvs)
468 rnBracket (PatBr p) = rnPat p `thenM` \ (p', fvs) ->
469 returnM (PatBr p', fvs)
470 rnBracket (TypBr t) = rnHsTypeFVs doc t `thenM` \ (t', fvs) ->
471 returnM (TypBr t', fvs)
473 doc = ptext SLIT("In a Template-Haskell quoted type")
474 rnBracket (DecBr group)
475 = importsFromLocalDecls group `thenM` \ (rdr_env, avails) ->
476 -- Discard avails (not useful here)
478 updGblEnv (\gbl -> gbl { tcg_rdr_env = rdr_env `plusGlobalRdrEnv` tcg_rdr_env gbl }) $
480 rnSrcDecls group `thenM` \ (tcg_env, group', fvs) ->
481 -- Discard the tcg_env; it contains only extra info about fixity
483 returnM (DecBr group', fvs)
486 %************************************************************************
488 \subsubsection{@Stmt@s: in @do@ expressions}
490 %************************************************************************
493 rnStmts :: HsStmtContext Name -> [RdrNameStmt] -> RnM ([RenamedStmt], FreeVars)
495 rnStmts MDoExpr stmts = rnMDoStmts stmts
496 rnStmts ctxt stmts = rnNormalStmts ctxt stmts
498 rnNormalStmts :: HsStmtContext Name -> [RdrNameStmt] -> RnM ([RenamedStmt], FreeVars)
499 -- Used for cases *other* than recursive mdo
500 -- Implements nested scopes
502 rnNormalStmts ctxt [] = returnM ([], emptyFVs)
503 -- Happens at the end of the sub-lists of a ParStmts
505 rnNormalStmts ctxt (ExprStmt expr _ src_loc : stmts)
506 = addSrcLoc src_loc $
507 rnExpr expr `thenM` \ (expr', fv_expr) ->
508 rnNormalStmts ctxt stmts `thenM` \ (stmts', fvs) ->
509 returnM (ExprStmt expr' placeHolderType src_loc : stmts',
510 fv_expr `plusFV` fvs)
512 rnNormalStmts ctxt [ResultStmt expr src_loc]
513 = addSrcLoc src_loc $
514 rnExpr expr `thenM` \ (expr', fv_expr) ->
515 returnM ([ResultStmt expr' src_loc], fv_expr)
517 rnNormalStmts ctxt (BindStmt pat expr src_loc : stmts)
518 = addSrcLoc src_loc $
519 rnExpr expr `thenM` \ (expr', fv_expr) ->
520 -- The binders do not scope over the expression
522 rnPatsAndThen (StmtCtxt ctxt) [pat] $ \ [pat'] ->
523 rnNormalStmts ctxt stmts `thenM` \ (stmts', fvs) ->
524 returnM (BindStmt pat' expr' src_loc : stmts',
525 fv_expr `plusFV` fvs) -- fv_expr shouldn't really be filtered by
526 -- the rnPatsAndThen, but it does not matter
528 rnNormalStmts ctxt (LetStmt binds : stmts)
529 = rnBindsAndThen binds $ \ binds' ->
530 rnNormalStmts ctxt stmts `thenM` \ (stmts', fvs) ->
531 returnM (LetStmt binds' : stmts', fvs)
533 rnNormalStmts ctxt (ParStmt stmtss : stmts)
534 = mapFvRn (rnNormalStmts ctxt) stmtss `thenM` \ (stmtss', fv_stmtss) ->
536 bndrss = map collectStmtsBinders stmtss'
538 foldlM checkBndrs [] bndrss `thenM` \ new_binders ->
539 bindLocalNamesFV new_binders $
540 -- Note: binders are returned in scope order, so one may
541 -- shadow the next; e.g. x <- xs; x <- ys
542 rnNormalStmts ctxt stmts `thenM` \ (stmts', fvs) ->
543 returnM (ParStmtOut (bndrss `zip` stmtss') : stmts',
544 fv_stmtss `plusFV` fvs)
547 checkBndrs all_bndrs bndrs
548 = checkErr (null common) (err (head common)) `thenM_`
549 returnM (bndrs ++ all_bndrs)
551 common = intersectBy eqOcc all_bndrs bndrs
553 eqOcc n1 n2 = nameOccName n1 == nameOccName n2
554 err v = ptext SLIT("Duplicate binding in parallel list comprehension for:")
557 rnNormalStmts ctxt stmts = pprPanic "rnNormalStmts" (ppr stmts)
561 %************************************************************************
563 \subsubsection{Precedence Parsing}
565 %************************************************************************
569 type Uses = NameSet -- Same as FreeVars really
570 type FwdRefs = NameSet
571 type Segment = (Defs,
572 Uses, -- May include defs
573 FwdRefs, -- A subset of uses that are
574 -- (a) used before they are bound in this segment, or
575 -- (b) used here, and bound in subsequent segments
578 ----------------------------------------------------
579 rnMDoStmts :: [RdrNameStmt] -> RnM ([RenamedStmt], FreeVars)
581 = -- Step1: bring all the binders of the mdo into scope
582 bindLocalsRn doc (collectStmtsBinders stmts) $ \ _ ->
584 -- Step 2: Rename each individual stmt, making a
585 -- singleton segment. At this stage the FwdRefs field
586 -- isn't finished: it's empty for all except a BindStmt
587 -- for which it's the fwd refs within the bind itself
588 mappM rn_mdo_stmt stmts `thenM` \ segs ->
590 -- Step 3: Fill in the fwd refs.
591 -- The segments are all singletons, but their fwd-ref
592 -- field mentions all the things used by the segment
593 -- that are bound after their use
594 segs_w_fwd_refs = addFwdRefs segs
596 -- Step 4: Group together the segments to make bigger segments
597 -- Invariant: in the result, no segment uses a variable
598 -- bound in a later segment
599 grouped_segs = glomSegments segs_w_fwd_refs
601 -- Step 5: Turn the segments into Stmts
602 -- Use RecStmt when and only when there are fwd refs
603 -- Also gather up the uses from the end towards the
604 -- start, so we can tell the RecStmt which things are
605 -- used 'after' the RecStmt
606 stmts_w_fvs = segsToStmts grouped_segs
610 doc = text "In a mdo-expression"
612 ----------------------------------------------------
613 rn_mdo_stmt :: RdrNameStmt -> RnM Segment
614 -- Assumes all binders are already in scope
615 -- Turns each stmt into a singleton Stmt
617 rn_mdo_stmt (ExprStmt expr _ src_loc)
618 = addSrcLoc src_loc (rnExpr expr) `thenM` \ (expr', fvs) ->
619 returnM (emptyNameSet, fvs, emptyNameSet,
620 [ExprStmt expr' placeHolderType src_loc])
622 rn_mdo_stmt (ResultStmt expr src_loc)
623 = addSrcLoc src_loc (rnExpr expr) `thenM` \ (expr', fvs) ->
624 returnM (emptyNameSet, fvs, emptyNameSet,
625 [ResultStmt expr' src_loc])
627 rn_mdo_stmt (BindStmt pat expr src_loc)
628 = addSrcLoc src_loc $
629 rnExpr expr `thenM` \ (expr', fv_expr) ->
630 rnPat pat `thenM` \ (pat', fv_pat) ->
632 bndrs = mkNameSet (collectPatBinders pat')
633 fvs = fv_expr `plusFV` fv_pat
635 returnM (bndrs, fvs, bndrs `intersectNameSet` fvs,
636 [BindStmt pat' expr' src_loc])
638 rn_mdo_stmt (LetStmt binds)
639 = rnBinds binds `thenM` \ (binds', fv_binds) ->
640 returnM (mkNameSet (collectHsBinders binds'),
641 fv_binds, emptyNameSet, [LetStmt binds'])
643 rn_mdo_stmt stmt@(ParStmt _) -- Syntactically illegal in mdo
644 = pprPanic "rn_mdo_stmt" (ppr stmt)
647 addFwdRefs :: [Segment] -> [Segment]
648 -- So far the segments only have forward refs *within* the Stmt
649 -- (which happens for bind: x <- ...x...)
650 -- This function adds the cross-seg fwd ref info
653 = fst (foldr mk_seg ([], emptyNameSet) pairs)
655 mk_seg (defs, uses, fwds, stmts) (segs, seg_defs)
656 = (new_seg : segs, all_defs)
658 new_seg = (defs, uses, new_fwds, stmts)
659 all_defs = seg_defs `unionNameSets` defs
660 new_fwds = fwds `unionNameSets` (uses `intersectNameSet` seg_defs)
661 -- Add the downstream fwd refs here
663 ----------------------------------------------------
664 -- Glomming the singleton segments of an mdo into
665 -- minimal recursive groups.
667 -- At first I thought this was just strongly connected components, but
668 -- there's an important constraint: the order of the stmts must not change.
671 -- mdo { x <- ...y...
678 -- Here, the first stmt mention 'y', which is bound in the third.
679 -- But that means that the innocent second stmt (p <- z) gets caught
680 -- up in the recursion. And that in turn means that the binding for
681 -- 'z' has to be included... and so on.
683 -- Start at the tail { r <- x }
684 -- Now add the next one { z <- y ; r <- x }
685 -- Now add one more { q <- x ; z <- y ; r <- x }
686 -- Now one more... but this time we have to group a bunch into rec
687 -- { rec { y <- ...x... ; q <- x ; z <- y } ; r <- x }
688 -- Now one more, which we can add on without a rec
690 -- rec { y <- ...x... ; q <- x ; z <- y } ;
692 -- Finally we add the last one; since it mentions y we have to
693 -- glom it togeher with the first two groups
694 -- { rec { x <- ...y...; p <- z ; y <- ...x... ;
695 -- q <- x ; z <- y } ;
698 glomSegments :: [Segment] -> [Segment]
700 glomSegments [seg] = [seg]
701 glomSegments ((defs,uses,fwds,stmts) : segs)
702 -- Actually stmts will always be a singleton
703 = (seg_defs, seg_uses, seg_fwds, seg_stmts) : others
705 segs' = glomSegments segs
706 (extras, others) = grab uses segs'
707 (ds, us, fs, ss) = unzip4 extras
709 seg_defs = plusFVs ds `plusFV` defs
710 seg_uses = plusFVs us `plusFV` uses
711 seg_fwds = plusFVs fs `plusFV` fwds
712 seg_stmts = stmts ++ concat ss
714 grab :: NameSet -- The client
716 -> ([Segment], -- Needed by the 'client'
717 [Segment]) -- Not needed by the client
718 -- The result is simply a split of the input
720 = (reverse yeses, reverse noes)
722 (noes, yeses) = span not_needed (reverse dus)
723 not_needed (defs,_,_,_) = not (intersectsNameSet defs uses)
726 ----------------------------------------------------
727 segsToStmts :: [Segment] -> ([RenamedStmt], FreeVars)
729 segsToStmts [] = ([], emptyFVs)
730 segsToStmts ((defs, uses, fwds, ss) : segs)
731 = (new_stmt : later_stmts, later_uses `plusFV` uses)
733 (later_stmts, later_uses) = segsToStmts segs
734 new_stmt | non_rec = head ss
735 | otherwise = RecStmt rec_names ss []
737 non_rec = isSingleton ss && isEmptyNameSet fwds
738 rec_names = nameSetToList (fwds `plusFV` (defs `intersectNameSet` later_uses))
739 -- The names for the fixpoint are
740 -- (a) the ones needed after the RecStmt
741 -- (b) the forward refs within the fixpoint
744 %************************************************************************
746 \subsubsection{Precedence Parsing}
748 %************************************************************************
750 @mkOpAppRn@ deals with operator fixities. The argument expressions
751 are assumed to be already correctly arranged. It needs the fixities
752 recorded in the OpApp nodes, because fixity info applies to the things
753 the programmer actually wrote, so you can't find it out from the Name.
755 Furthermore, the second argument is guaranteed not to be another
756 operator application. Why? Because the parser parses all
757 operator appications left-associatively, EXCEPT negation, which
758 we need to handle specially.
761 mkOpAppRn :: RenamedHsExpr -- Left operand; already rearranged
762 -> RenamedHsExpr -> Fixity -- Operator and fixity
763 -> RenamedHsExpr -- Right operand (not an OpApp, but might
767 ---------------------------
768 -- (e11 `op1` e12) `op2` e2
769 mkOpAppRn e1@(OpApp e11 op1 fix1 e12) op2 fix2 e2
771 = addErr (precParseErr (ppr_op op1,fix1) (ppr_op op2,fix2)) `thenM_`
772 returnM (OpApp e1 op2 fix2 e2)
775 = mkOpAppRn e12 op2 fix2 e2 `thenM` \ new_e ->
776 returnM (OpApp e11 op1 fix1 new_e)
778 (nofix_error, associate_right) = compareFixity fix1 fix2
780 ---------------------------
781 -- (- neg_arg) `op` e2
782 mkOpAppRn e1@(NegApp neg_arg neg_name) op2 fix2 e2
784 = addErr (precParseErr (pp_prefix_minus,negateFixity) (ppr_op op2,fix2)) `thenM_`
785 returnM (OpApp e1 op2 fix2 e2)
788 = mkOpAppRn neg_arg op2 fix2 e2 `thenM` \ new_e ->
789 returnM (NegApp new_e neg_name)
791 (nofix_error, associate_right) = compareFixity negateFixity fix2
793 ---------------------------
795 mkOpAppRn e1 op1 fix1 e2@(NegApp neg_arg _) -- NegApp can occur on the right
796 | not associate_right -- We *want* right association
797 = addErr (precParseErr (ppr_op op1, fix1) (pp_prefix_minus, negateFixity)) `thenM_`
798 returnM (OpApp e1 op1 fix1 e2)
800 (_, associate_right) = compareFixity fix1 negateFixity
802 ---------------------------
804 mkOpAppRn e1 op fix e2 -- Default case, no rearrangment
805 = ASSERT2( right_op_ok fix e2,
806 ppr e1 $$ text "---" $$ ppr op $$ text "---" $$ ppr fix $$ text "---" $$ ppr e2
808 returnM (OpApp e1 op fix e2)
810 -- Parser left-associates everything, but
811 -- derived instances may have correctly-associated things to
812 -- in the right operarand. So we just check that the right operand is OK
813 right_op_ok fix1 (OpApp _ _ fix2 _)
814 = not error_please && associate_right
816 (error_please, associate_right) = compareFixity fix1 fix2
817 right_op_ok fix1 other
820 -- Parser initially makes negation bind more tightly than any other operator
821 mkNegAppRn neg_arg neg_name
824 getModeRn `thenM` \ mode ->
825 ASSERT( not_op_app mode neg_arg )
827 returnM (NegApp neg_arg neg_name)
829 not_op_app SourceMode (OpApp _ _ _ _) = False
830 not_op_app mode other = True
834 checkPrecMatch :: Bool -> Name -> RenamedMatch -> RnM ()
836 checkPrecMatch False fn match
839 checkPrecMatch True op (Match (p1:p2:_) _ _)
840 -- True indicates an infix lhs
841 = getModeRn `thenM` \ mode ->
842 -- See comments with rnExpr (OpApp ...)
843 if isInterfaceMode mode
845 else checkPrec op p1 False `thenM_`
848 checkPrecMatch True op _ = panic "checkPrecMatch"
850 checkPrec op (ConPatIn op1 (InfixCon _ _)) right
851 = lookupFixityRn op `thenM` \ op_fix@(Fixity op_prec op_dir) ->
852 lookupFixityRn op1 `thenM` \ op1_fix@(Fixity op1_prec op1_dir) ->
854 inf_ok = op1_prec > op_prec ||
855 (op1_prec == op_prec &&
856 (op1_dir == InfixR && op_dir == InfixR && right ||
857 op1_dir == InfixL && op_dir == InfixL && not right))
859 info = (ppr_op op, op_fix)
860 info1 = (ppr_op op1, op1_fix)
861 (infol, infor) = if right then (info, info1) else (info1, info)
863 checkErr inf_ok (precParseErr infol infor)
865 checkPrec op pat right
868 -- Check precedence of (arg op) or (op arg) respectively
869 -- If arg is itself an operator application, then either
870 -- (a) its precedence must be higher than that of op
871 -- (b) its precedency & associativity must be the same as that of op
872 checkSectionPrec direction section op arg
874 OpApp _ op fix _ -> go_for_it (ppr_op op) fix
875 NegApp _ _ -> go_for_it pp_prefix_minus negateFixity
879 go_for_it pp_arg_op arg_fix@(Fixity arg_prec assoc)
880 = lookupFixityRn op_name `thenM` \ op_fix@(Fixity op_prec _) ->
881 checkErr (op_prec < arg_prec
882 || op_prec == arg_prec && direction == assoc)
883 (sectionPrecErr (ppr_op op_name, op_fix)
884 (pp_arg_op, arg_fix) section)
888 %************************************************************************
890 \subsubsection{Assertion utils}
892 %************************************************************************
895 mkAssertErrorExpr :: RnM (RenamedHsExpr, FreeVars)
896 -- Return an expression for (assertError "Foo.hs:27")
898 = getSrcLocM `thenM` \ sloc ->
900 expr = HsApp (HsVar assertErrorName) (HsLit msg)
901 msg = HsStringPrim (mkFastString (stringToUtf8 (showSDoc (ppr sloc))))
903 returnM (expr, unitFV assertErrorName)
906 %************************************************************************
908 \subsubsection{Errors}
910 %************************************************************************
913 ppr_op op = quotes (ppr op) -- Here, op can be a Name or a (Var n), where n is a Name
914 pp_prefix_minus = ptext SLIT("prefix `-'")
918 SLIT("accepting non-standard pattern guards (-fglasgow-exts to suppress this message)")
922 = sep [ptext SLIT("Pattern syntax in expression context:"),
925 doStmtListErr do_or_lc e
926 = sep [quotes (text binder_name) <+> ptext SLIT("statements must end in expression:"),
929 binder_name = case do_or_lc of
934 = ptext SLIT("Template Haskell") <+> text what <+>
935 ptext SLIT("illegal in a stage-1 compiler")
939 = sep [quotes (ptext SLIT("with")),
940 ptext SLIT("is deprecated, use"),
941 quotes (ptext SLIT("let")),
942 ptext SLIT("instead")]