diff options
| author | Patrick Walton <[email protected]> | 2010-12-20 18:58:18 -0800 |
|---|---|---|
| committer | Patrick Walton <[email protected]> | 2010-12-20 18:58:18 -0800 |
| commit | 5cbf8889d0e8bc0e4b52c19c89e4578c0fc65eac (patch) | |
| tree | c110bc7ad2a237a7cde11057ea2c7761039bb1ca /src/comp/middle | |
| parent | Null-check on obj box ptr, init to null. Un-XFAIL simple-obj.rs. (diff) | |
| download | rust-5cbf8889d0e8bc0e4b52c19c89e4578c0fc65eac.tar.xz rust-5cbf8889d0e8bc0e4b52c19c89e4578c0fc65eac.zip | |
rustc: Add bind expressions to the AST
Diffstat (limited to 'src/comp/middle')
| -rw-r--r-- | src/comp/middle/fold.rs | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/src/comp/middle/fold.rs b/src/comp/middle/fold.rs index 90f6bed3..d8efa25d 100644 --- a/src/comp/middle/fold.rs +++ b/src/comp/middle/fold.rs @@ -75,6 +75,10 @@ type ast_fold[ENV] = ann a) -> @expr) fold_expr_call, (fn(&ENV e, &span sp, + @expr f, vec[option.t[@expr]] args, + ann a) -> @expr) fold_expr_bind, + + (fn(&ENV e, &span sp, ast.binop, @expr lhs, @expr rhs, ann a) -> @expr) fold_expr_binary, @@ -417,6 +421,20 @@ fn fold_expr[ENV](&ENV env, ast_fold[ENV] fld, &@expr e) -> @expr { ret fld.fold_expr_call(env_, e.span, ff, aargs, t); } + case (ast.expr_bind(?f, ?args_opt, ?t)) { + auto ff = fold_expr(env_, fld, f); + let vec[option.t[@ast.expr]] aargs_opt = vec(); + for (option.t[@ast.expr] t_opt in args_opt) { + alt (t_opt) { + case (some[@ast.expr](?e)) { + aargs_opt += vec(some(fold_expr(env_, fld, e))); + } + case (none[@ast.expr]) { /* empty */ } + } + } + ret fld.fold_expr_bind(env_, e.span, ff, aargs_opt, t); + } + case (ast.expr_binary(?op, ?a, ?b, ?t)) { auto aa = fold_expr(env_, fld, a); auto bb = fold_expr(env_, fld, b); @@ -807,6 +825,12 @@ fn identity_fold_expr_call[ENV](&ENV env, &span sp, @expr f, ret @respan(sp, ast.expr_call(f, args, a)); } +fn identity_fold_expr_bind[ENV](&ENV env, &span sp, @expr f, + vec[option.t[@expr]] args_opt, ann a) + -> @expr { + ret @respan(sp, ast.expr_bind(f, args_opt, a)); +} + fn identity_fold_expr_binary[ENV](&ENV env, &span sp, ast.binop b, @expr lhs, @expr rhs, ann a) -> @expr { @@ -1075,6 +1099,7 @@ fn new_identity_fold[ENV]() -> ast_fold[ENV] { fold_expr_tup = bind identity_fold_expr_tup[ENV](_,_,_,_), fold_expr_rec = bind identity_fold_expr_rec[ENV](_,_,_,_), fold_expr_call = bind identity_fold_expr_call[ENV](_,_,_,_,_), + fold_expr_bind = bind identity_fold_expr_bind[ENV](_,_,_,_,_), fold_expr_binary = bind identity_fold_expr_binary[ENV](_,_,_,_,_,_), fold_expr_unary = bind identity_fold_expr_unary[ENV](_,_,_,_,_), fold_expr_lit = bind identity_fold_expr_lit[ENV](_,_,_,_), |