diff options
Diffstat (limited to 'src/comp/middle/fold.rs')
| -rw-r--r-- | src/comp/middle/fold.rs | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/src/comp/middle/fold.rs b/src/comp/middle/fold.rs index bbe6f841..1fc91693 100644 --- a/src/comp/middle/fold.rs +++ b/src/comp/middle/fold.rs @@ -67,6 +67,8 @@ type ast_fold[ENV] = &option.t[def] d) -> @ty) fold_ty_path, (fn(&ENV e, &span sp, @ty t) -> @ty) fold_ty_mutable, + (fn(&ENV e, &span sp, @ty t) -> @ty) fold_ty_chan, + (fn(&ENV e, &span sp, @ty t) -> @ty) fold_ty_port, // Expr folds. (fn(&ENV e, &span sp, @@ -141,6 +143,12 @@ type ast_fold[ENV] = 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, @@ -176,6 +184,13 @@ type ast_fold[ENV] = (fn(&ENV e, &span sp, @expr e) -> @expr) fold_expr_check_expr, + (fn(&ENV e, &span sp, + ann a) -> @expr) fold_expr_port, + + (fn(&ENV e, &span sp, + @expr e, ann a) -> @expr) fold_expr_chan, + + // Decl folds. (fn(&ENV e, &span sp, @ast.local local) -> @decl) fold_decl_local, @@ -385,6 +400,16 @@ fn fold_ty[ENV](&ENV env, ast_fold[ENV] fld, @ty t) -> @ty { case (ast.ty_fn(?proto, ?inputs, ?output)) { ret fold_ty_fn(env_, fld, t.span, proto, inputs, output); } + + case (ast.ty_chan(?ty)) { + auto ty_ = fold_ty(env, fld, ty); + ret fld.fold_ty_chan(env_, t.span, ty_); + } + + case (ast.ty_port(?ty)) { + auto ty_ = fold_ty(env, fld, ty); + ret fld.fold_ty_port(env_, t.span, ty_); + } } } @@ -629,6 +654,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); @@ -694,6 +731,14 @@ fn fold_expr[ENV](&ENV env, ast_fold[ENV] fld, &@expr e) -> @expr { ret fld.fold_expr_check_expr(env_, e.span, ee); } + case (ast.expr_port(?t)) { + ret fld.fold_expr_port(env_, e.span, t); + } + + case (ast.expr_chan(?x, ?t)) { + auto ee = fold_expr(env_, fld, x); + ret fld.fold_expr_chan(env_, e.span, ee, t); + } } fail; @@ -1072,6 +1117,13 @@ fn identity_fold_ty_mutable[ENV](&ENV env, &span sp, @ty t) -> @ty { ret @respan(sp, ast.ty_mutable(t)); } +fn identity_fold_ty_chan[ENV](&ENV env, &span sp, @ty t) -> @ty { + ret @respan(sp, ast.ty_chan(t)); +} + +fn identity_fold_ty_port[ENV](&ENV env, &span sp, @ty t) -> @ty { + ret @respan(sp, ast.ty_port(t)); +} // Expr identities. @@ -1174,6 +1226,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)); @@ -1224,6 +1286,13 @@ fn identity_fold_expr_check_expr[ENV](&ENV e, &span sp, @expr x) -> @expr { ret @respan(sp, ast.expr_check_expr(x)); } +fn identity_fold_expr_port[ENV](&ENV e, &span sp, ann a) -> @expr { + ret @respan(sp, ast.expr_port(a)); +} + +fn identity_fold_expr_chan[ENV](&ENV e, &span sp, @expr x, ann a) -> @expr { + ret @respan(sp, ast.expr_chan(x, a)); +} // Decl identities. @@ -1461,6 +1530,8 @@ fn new_identity_fold[ENV]() -> ast_fold[ENV] { fold_ty_fn = bind identity_fold_ty_fn[ENV](_,_,_,_,_), fold_ty_path = bind identity_fold_ty_path[ENV](_,_,_,_), fold_ty_mutable = bind identity_fold_ty_mutable[ENV](_,_,_), + fold_ty_chan = bind identity_fold_ty_chan[ENV](_,_,_), + fold_ty_port = bind identity_fold_ty_port[ENV](_,_,_), fold_expr_vec = bind identity_fold_expr_vec[ENV](_,_,_,_), fold_expr_tup = bind identity_fold_expr_tup[ENV](_,_,_,_), @@ -1483,6 +1554,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](_,_,_,_,_), @@ -1494,6 +1567,8 @@ fn new_identity_fold[ENV]() -> ast_fold[ENV] { fold_expr_log = bind identity_fold_expr_log[ENV](_,_,_), fold_expr_check_expr = 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_decl_local = bind identity_fold_decl_local[ENV](_,_,_), fold_decl_item = bind identity_fold_decl_item[ENV](_,_,_), |