aboutsummaryrefslogtreecommitdiff
path: root/src/comp
diff options
context:
space:
mode:
authorPatrick Walton <[email protected]>2010-12-10 17:47:53 -0800
committerPatrick Walton <[email protected]>2010-12-10 17:49:28 -0800
commit0509b1b9d78da4abe5c6f32231889d5ee865428e (patch)
tree9c9daf9a45e06943c858db149574887892aaf8d7 /src/comp
parentFix bad GEP and missing branch in iter_sequence; vec.rs compiles now. (diff)
downloadrust-0509b1b9d78da4abe5c6f32231889d5ee865428e.tar.xz
rust-0509b1b9d78da4abe5c6f32231889d5ee865428e.zip
rustc: Add update_env_for_arm to fold; we'll need it to resolve pattern bindings
Diffstat (limited to 'src/comp')
-rw-r--r--src/comp/middle/fold.rs19
1 files changed, 15 insertions, 4 deletions
diff --git a/src/comp/middle/fold.rs b/src/comp/middle/fold.rs
index da2415b7..54e09838 100644
--- a/src/comp/middle/fold.rs
+++ b/src/comp/middle/fold.rs
@@ -210,6 +210,7 @@ type ast_fold[ENV] =
(fn(&ENV e, @stmt s) -> ENV) update_env_for_stmt,
(fn(&ENV e, @decl i) -> ENV) update_env_for_decl,
(fn(&ENV e, @pat p) -> ENV) update_env_for_pat,
+ (fn(&ENV e, &arm a) -> ENV) update_env_for_arm,
(fn(&ENV e, @expr x) -> ENV) update_env_for_expr,
(fn(&ENV e, @ty t) -> ENV) update_env_for_ty,
@@ -455,10 +456,8 @@ fn fold_expr[ENV](&ENV env, ast_fold[ENV] fld, &@expr e) -> @expr {
case (ast.expr_alt(?expr, ?arms, ?t)) {
auto eexpr = fold_expr(env_, fld, expr);
let vec[ast.arm] aarms = vec();
- for (ast.arm arm in arms) {
- auto ppat = fold_pat(env_, fld, arm.pat);
- auto bblock = fold_block(env_, fld, arm.block);
- aarms += vec(rec(pat=ppat, block=bblock));
+ for (ast.arm a in arms) {
+ aarms += vec(fold_arm(env_, fld, a));
}
ret fld.fold_expr_alt(env_, e.span, eexpr, aarms, t);
}
@@ -571,6 +570,13 @@ fn fold_block[ENV](&ENV env, ast_fold[ENV] fld, &block blk) -> block {
ret respan(blk.span, rec(stmts=stmts, expr=expr, index=blk.node.index));
}
+fn fold_arm[ENV](&ENV env, ast_fold[ENV] fld, &arm a) -> arm {
+ let ENV env_ = fld.update_env_for_arm(env, a);
+ auto ppat = fold_pat(env_, fld, a.pat);
+ auto bblock = fold_block(env_, fld, a.block);
+ ret rec(pat=ppat, block=bblock);
+}
+
fn fold_arg[ENV](&ENV env, ast_fold[ENV] fld, &arg a) -> arg {
auto ty = fold_ty(env, fld, a.ty);
ret rec(ty=ty with a);
@@ -965,6 +971,10 @@ fn identity_update_env_for_decl[ENV](&ENV e, @decl d) -> ENV {
ret e;
}
+fn identity_update_env_for_arm[ENV](&ENV e, &arm a) -> ENV {
+ ret e;
+}
+
fn identity_update_env_for_pat[ENV](&ENV e, @pat p) -> ENV {
ret e;
}
@@ -1057,6 +1067,7 @@ fn new_identity_fold[ENV]() -> ast_fold[ENV] {
update_env_for_stmt = bind identity_update_env_for_stmt[ENV](_,_),
update_env_for_decl = bind identity_update_env_for_decl[ENV](_,_),
update_env_for_pat = bind identity_update_env_for_pat[ENV](_,_),
+ update_env_for_arm = bind identity_update_env_for_arm[ENV](_,_),
update_env_for_expr = bind identity_update_env_for_expr[ENV](_,_),
update_env_for_ty = bind identity_update_env_for_ty[ENV](_,_),