aboutsummaryrefslogtreecommitdiff
path: root/src/comp/middle/fold.rs
diff options
context:
space:
mode:
authorGraydon Hoare <[email protected]>2010-12-08 14:50:47 -0800
committerGraydon Hoare <[email protected]>2010-12-08 14:50:47 -0800
commit68af077e8192a6a1b18778b97449ad695a4ecffb (patch)
treed5a7bb274b328239429bdb0c40cf1675f01c3d1a /src/comp/middle/fold.rs
parentFix missing case in resolve, un-XFAIL rec-tup.rs. (diff)
downloadrust-68af077e8192a6a1b18778b97449ad695a4ecffb.tar.xz
rust-68af077e8192a6a1b18778b97449ad695a4ecffb.zip
Implement binop= forms. Un-XFAIL bitwise.rs.
Diffstat (limited to 'src/comp/middle/fold.rs')
-rw-r--r--src/comp/middle/fold.rs19
1 files changed, 19 insertions, 0 deletions
diff --git a/src/comp/middle/fold.rs b/src/comp/middle/fold.rs
index 24e23e92..54492305 100644
--- a/src/comp/middle/fold.rs
+++ b/src/comp/middle/fold.rs
@@ -115,6 +115,11 @@ type ast_fold[ENV] =
ann a) -> @expr) fold_expr_assign,
(fn(&ENV e, &span sp,
+ ast.binop,
+ @expr lhs, @expr rhs,
+ ann a) -> @expr) fold_expr_assign_op,
+
+ (fn(&ENV e, &span sp,
@expr e, ident i,
ann a) -> @expr) fold_expr_field,
@@ -465,6 +470,12 @@ fn fold_expr[ENV](&ENV env, ast_fold[ENV] fld, &@expr e) -> @expr {
ret fld.fold_expr_assign(env_, e.span, llhs, rrhs, t);
}
+ case (ast.expr_assign_op(?op, ?lhs, ?rhs, ?t)) {
+ auto llhs = fold_expr(env_, fld, lhs);
+ auto rrhs = fold_expr(env_, fld, rhs);
+ ret fld.fold_expr_assign_op(env_, e.span, op, llhs, rrhs, t);
+ }
+
case (ast.expr_field(?e, ?i, ?t)) {
auto ee = fold_expr(env_, fld, e);
ret fld.fold_expr_field(env_, e.span, ee, i, t);
@@ -790,6 +801,12 @@ fn identity_fold_expr_assign[ENV](&ENV env, &span sp,
ret @respan(sp, ast.expr_assign(lhs, rhs, a));
}
+fn identity_fold_expr_assign_op[ENV](&ENV env, &span sp, ast.binop op,
+ @expr lhs, @expr rhs, ann a)
+ -> @expr {
+ ret @respan(sp, ast.expr_assign_op(op, lhs, rhs, a));
+}
+
fn identity_fold_expr_field[ENV](&ENV env, &span sp,
@expr e, ident i, ann a) -> @expr {
ret @respan(sp, ast.expr_field(e, i, a));
@@ -986,6 +1003,8 @@ fn new_identity_fold[ENV]() -> ast_fold[ENV] {
fold_expr_alt = bind identity_fold_expr_alt[ENV](_,_,_,_,_),
fold_expr_block = bind identity_fold_expr_block[ENV](_,_,_,_),
fold_expr_assign = bind identity_fold_expr_assign[ENV](_,_,_,_,_),
+ fold_expr_assign_op
+ = bind identity_fold_expr_assign_op[ENV](_,_,_,_,_,_),
fold_expr_field = bind identity_fold_expr_field[ENV](_,_,_,_,_),
fold_expr_index = bind identity_fold_expr_index[ENV](_,_,_,_,_),
fold_expr_name = bind identity_fold_expr_name[ENV](_,_,_,_,_),