diff --git a/src/comp/front/ast.rs b/src/comp/front/ast.rs index d768f93552af12d1ce9297c8d456f5ef49b37dd2..8507298d773d357227f4e5a8fbdae5918849bd3d 100644 --- a/src/comp/front/ast.rs +++ b/src/comp/front/ast.rs @@ -232,6 +232,8 @@ fn unop_to_str(unop op) -> str { expr_block(block, ann); expr_assign(@expr /* TODO: @expr|is_lval */, @expr, ann); expr_assign_op(binop, @expr /* TODO: @expr|is_lval */, @expr, ann); + expr_send(@expr /* TODO: @expr|is_lval */, @expr, ann); + expr_recv(@expr /* TODO: @expr|is_lval */, @expr, ann); expr_field(@expr, ident, ann); expr_index(@expr, @expr, ann); expr_path(path, option.t[def], ann); @@ -244,8 +246,6 @@ fn unop_to_str(unop op) -> str { expr_check_expr(@expr); expr_port(ann); expr_chan(@expr, ann); - expr_send(@expr /* TODO: @expr|is_lval */, @expr, ann); - expr_recv(@expr /* TODO: @expr|is_lval */, @expr, ann); } type lit = spanned[lit_]; diff --git a/src/comp/middle/fold.rs b/src/comp/middle/fold.rs index 320033cdc8ce80e79530544171f0e64ca76673c8..8de857495c6e055ae3cd771370138efbb602d6db 100644 --- a/src/comp/middle/fold.rs +++ b/src/comp/middle/fold.rs @@ -143,6 +143,12 @@ @expr lhs, @expr rhs, ann a) -> @expr) fold_expr_assign_op, + (fn(&ENV e, &span sp, + @expr lhs, @expr rhs, ann a) -> @expr) fold_expr_send, + + (fn(&ENV e, &span sp, + @expr lhs, @expr rhs, ann a) -> @expr) fold_expr_recv, + (fn(&ENV e, &span sp, @expr e, ident i, ann a) -> @expr) fold_expr_field, @@ -185,11 +191,6 @@ (fn(&ENV e, &span sp, @expr e, ann a) -> @expr) fold_expr_chan, - (fn(&ENV e, &span sp, - @expr lhs, @expr rhs, ann a) -> @expr) fold_expr_send, - - (fn(&ENV e, &span sp, - @expr lhs, @expr rhs, ann a) -> @expr) fold_expr_recv, // Decl folds. (fn(&ENV e, &span sp, @@ -664,6 +665,18 @@ fn fold_expr[ENV](&ENV env, ast_fold[ENV] fld, &@expr e) -> @expr { ret fld.fold_expr_assign_op(env_, e.span, op, llhs, rrhs, t); } + case (ast.expr_send(?lhs, ?rhs, ?t)) { + auto llhs = fold_expr(env_, fld, lhs); + auto rrhs = fold_expr(env_, fld, rhs); + ret fld.fold_expr_send(env_, e.span, llhs, rrhs, t); + } + + case (ast.expr_recv(?lhs, ?rhs, ?t)) { + auto llhs = fold_expr(env_, fld, lhs); + auto rrhs = fold_expr(env_, fld, rhs); + ret fld.fold_expr_recv(env_, e.span, 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); @@ -737,18 +750,6 @@ fn fold_expr[ENV](&ENV env, ast_fold[ENV] fld, &@expr e) -> @expr { auto ee = fold_expr(env_, fld, x); ret fld.fold_expr_chan(env_, e.span, ee, t); } - - case (ast.expr_send(?lhs, ?rhs, ?t)) { - auto llhs = fold_expr(env_, fld, lhs); - auto rrhs = fold_expr(env_, fld, rhs); - ret fld.fold_expr_send(env_, e.span, llhs, rrhs, t); - } - - case (ast.expr_recv(?lhs, ?rhs, ?t)) { - auto llhs = fold_expr(env_, fld, lhs); - auto rrhs = fold_expr(env_, fld, rhs); - ret fld.fold_expr_recv(env_, e.span, llhs, rrhs, t); - } } fail; @@ -1237,6 +1238,16 @@ fn identity_fold_expr_assign_op[ENV](&ENV env, &span sp, ast.binop op, ret @respan(sp, ast.expr_assign_op(op, lhs, rhs, a)); } +fn identity_fold_expr_send[ENV](&ENV e, &span sp, + @expr lhs, @expr rhs, ann a) -> @expr { + ret @respan(sp, ast.expr_send(lhs, rhs, a)); +} + +fn identity_fold_expr_recv[ENV](&ENV e, &span sp, + @expr lhs, @expr rhs, ann a) -> @expr { + ret @respan(sp, ast.expr_recv(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)); @@ -1295,16 +1306,6 @@ fn identity_fold_expr_chan[ENV](&ENV e, &span sp, @expr x, ann a) -> @expr { ret @respan(sp, ast.expr_chan(x, a)); } -fn identity_fold_expr_send[ENV](&ENV e, &span sp, - @expr lhs, @expr rhs, ann a) -> @expr { - ret @respan(sp, ast.expr_send(lhs, rhs, a)); -} - -fn identity_fold_expr_recv[ENV](&ENV e, &span sp, - @expr lhs, @expr rhs, ann a) -> @expr { - ret @respan(sp, ast.expr_recv(lhs, rhs, a)); -} - // Decl identities. fn identity_fold_decl_local[ENV](&ENV e, &span sp, @@ -1565,6 +1566,8 @@ fn new_identity_fold[ENV]() -> ast_fold[ENV] { fold_expr_assign = bind identity_fold_expr_assign[ENV](_,_,_,_,_), fold_expr_assign_op = bind identity_fold_expr_assign_op[ENV](_,_,_,_,_,_), + fold_expr_send = bind identity_fold_expr_send[ENV](_,_,_,_,_), + fold_expr_recv = bind identity_fold_expr_recv[ENV](_,_,_,_,_), fold_expr_field = bind identity_fold_expr_field[ENV](_,_,_,_,_), fold_expr_index = bind identity_fold_expr_index[ENV](_,_,_,_,_), fold_expr_path = bind identity_fold_expr_path[ENV](_,_,_,_,_), @@ -1578,8 +1581,6 @@ fn new_identity_fold[ENV]() -> ast_fold[ENV] { = bind identity_fold_expr_check_expr[ENV](_,_,_), fold_expr_port = bind identity_fold_expr_port[ENV](_,_,_), fold_expr_chan = bind identity_fold_expr_chan[ENV](_,_,_,_), - fold_expr_send = bind identity_fold_expr_send[ENV](_,_,_,_,_), - fold_expr_recv = bind identity_fold_expr_recv[ENV](_,_,_,_,_), fold_decl_local = bind identity_fold_decl_local[ENV](_,_,_), fold_decl_item = bind identity_fold_decl_item[ENV](_,_,_),