-type RnExprTy = RdrNameHsExpr -> RnMS (RenamedHsExpr, FreeVars)
-
-rnStmts :: RnExprTy
- -> [RdrNameStmt]
- -> RnMS ([RenamedStmt], FreeVars)
-
-rnStmts rn_expr []
- = returnRn ([], emptyFVs)
-
-rnStmts rn_expr (stmt:stmts)
- = rnStmt rn_expr stmt $ \ stmt' ->
- rnStmts rn_expr stmts `thenRn` \ (stmts', fvs) ->
- returnRn (stmt' : stmts', fvs)
-
-rnStmt :: RnExprTy -> RdrNameStmt
- -> (RenamedStmt -> RnMS (a, FreeVars))
- -> RnMS (a, FreeVars)
--- Because of mutual recursion we have to pass in rnExpr.
-
-rnStmt rn_expr (BindStmt pat expr src_loc) thing_inside
- = pushSrcLocRn src_loc $
- rn_expr expr `thenRn` \ (expr', fv_expr) ->
- bindLocalsFVRn doc binders $ \ new_binders ->
- rnPat pat `thenRn` \ (pat', fv_pat) ->
- thing_inside (BindStmt pat' expr' src_loc) `thenRn` \ (result, fvs) ->
- returnRn (result, fv_expr `plusFV` fvs `plusFV` fv_pat)
+rnStmts :: [RdrNameStmt]
+ -> RnM (([Name], [RenamedStmt]), FreeVars)
+
+rnStmts []
+ = returnM (([], []), emptyFVs)
+
+rnStmts (stmt:stmts)
+ = getLocalRdrEnv `thenM` \ name_env ->
+ rnStmt stmt $ \ stmt' ->
+ rnStmts stmts `thenM` \ ((binders, stmts'), fvs) ->
+ returnM ((binders, stmt' : stmts'), fvs)
+
+rnStmt :: RdrNameStmt
+ -> (RenamedStmt -> RnM (([Name], a), FreeVars))
+ -> RnM (([Name], a), FreeVars)
+-- The thing list of names returned is the list returned by the
+-- thing_inside, plus the binders of the arguments stmt
+
+rnStmt (ParStmt stmtss) thing_inside
+ = mapFvRn rnStmts stmtss `thenM` \ (bndrstmtss, fv_stmtss) ->
+ let binderss = map fst bndrstmtss
+ checkBndrs all_bndrs bndrs
+ = checkErr (null (intersectBy eqOcc all_bndrs bndrs)) err `thenM_`
+ returnM (bndrs ++ all_bndrs)
+ eqOcc n1 n2 = nameOccName n1 == nameOccName n2
+ err = text "duplicate binding in parallel list comprehension"
+ in
+ foldlM checkBndrs [] binderss `thenM` \ new_binders ->
+ bindLocalNamesFV new_binders $
+ thing_inside (ParStmtOut bndrstmtss)`thenM` \ ((rest_bndrs, result), fv_rest) ->
+ returnM ((new_binders ++ rest_bndrs, result), fv_stmtss `plusFV` fv_rest)
+
+rnStmt (BindStmt pat expr src_loc) thing_inside
+ = addSrcLoc src_loc $
+ rnExpr expr `thenM` \ (expr', fv_expr) ->
+ bindPatSigTyVars (collectSigTysFromPat pat) $
+ bindLocalsFVRn doc (collectPatBinders pat) $ \ new_binders ->
+ rnPat pat `thenM` \ (pat', fv_pat) ->
+ thing_inside (BindStmt pat' expr' src_loc) `thenM` \ ((rest_binders, result), fvs) ->
+ returnM ((new_binders ++ rest_binders, result),
+ fv_expr `plusFV` fvs `plusFV` fv_pat)