diff options
| author | Patrick Walton <[email protected]> | 2010-12-10 17:47:53 -0800 |
|---|---|---|
| committer | Patrick Walton <[email protected]> | 2010-12-10 17:49:28 -0800 |
| commit | 0509b1b9d78da4abe5c6f32231889d5ee865428e (patch) | |
| tree | 9c9daf9a45e06943c858db149574887892aaf8d7 /src | |
| parent | Fix bad GEP and missing branch in iter_sequence; vec.rs compiles now. (diff) | |
| download | rust-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')
| -rw-r--r-- | src/comp/middle/fold.rs | 19 |
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](_,_), |