aboutsummaryrefslogtreecommitdiff
path: root/src/comp/middle
diff options
context:
space:
mode:
authorGraydon Hoare <[email protected]>2011-01-20 15:02:12 -0800
committerGraydon Hoare <[email protected]>2011-01-20 15:02:12 -0800
commita8af013077c01901426f7cb829a98c7f1fbe6613 (patch)
tree2b48bd91d52cb31e54bc20f012a0e2d46c7a9cd9 /src/comp/middle
parenttypo (diff)
downloadrust-a8af013077c01901426f7cb829a98c7f1fbe6613.tar.xz
rust-a8af013077c01901426f7cb829a98c7f1fbe6613.zip
Adjust AST encoding, teach fold about linear for loops.
Diffstat (limited to 'src/comp/middle')
-rw-r--r--src/comp/middle/fold.rs18
1 files changed, 18 insertions, 0 deletions
diff --git a/src/comp/middle/fold.rs b/src/comp/middle/fold.rs
index 618790ee..d8688e00 100644
--- a/src/comp/middle/fold.rs
+++ b/src/comp/middle/fold.rs
@@ -104,6 +104,10 @@ type ast_fold[ENV] =
ann a) -> @expr) fold_expr_if,
(fn(&ENV e, &span sp,
+ @decl decl, @expr seq, &block body,
+ ann a) -> @expr) fold_expr_for,
+
+ (fn(&ENV e, &span sp,
@expr cond, &block body,
ann a) -> @expr) fold_expr_while,
@@ -509,6 +513,13 @@ fn fold_expr[ENV](&ENV env, ast_fold[ENV] fld, &@expr e) -> @expr {
ret fld.fold_expr_if(env_, e.span, ccnd, tthn, eels, t);
}
+ case (ast.expr_for(?decl, ?seq, ?body, ?t)) {
+ auto ddecl = fold_decl(env_, fld, decl);
+ auto sseq = fold_expr(env_, fld, seq);
+ auto bbody = fold_block(env_, fld, body);
+ ret fld.fold_expr_for(env_, e.span, ddecl, seq, bbody, t);
+ }
+
case (ast.expr_while(?cnd, ?body, ?t)) {
auto ccnd = fold_expr(env_, fld, cnd);
auto bbody = fold_block(env_, fld, body);
@@ -950,6 +961,12 @@ fn identity_fold_expr_if[ENV](&ENV env, &span sp,
ret @respan(sp, ast.expr_if(cond, thn, els, a));
}
+fn identity_fold_expr_for[ENV](&ENV env, &span sp,
+ @decl d, @expr seq,
+ &block body, ann a) -> @expr {
+ ret @respan(sp, ast.expr_for(d, seq, body, a));
+}
+
fn identity_fold_expr_while[ENV](&ENV env, &span sp,
@expr cond, &block body, ann a) -> @expr {
ret @respan(sp, ast.expr_while(cond, body, a));
@@ -1214,6 +1231,7 @@ fn new_identity_fold[ENV]() -> ast_fold[ENV] {
fold_expr_lit = bind identity_fold_expr_lit[ENV](_,_,_,_),
fold_expr_cast = bind identity_fold_expr_cast[ENV](_,_,_,_,_),
fold_expr_if = bind identity_fold_expr_if[ENV](_,_,_,_,_,_),
+ fold_expr_for = bind identity_fold_expr_for[ENV](_,_,_,_,_,_),
fold_expr_while = bind identity_fold_expr_while[ENV](_,_,_,_,_),
fold_expr_do_while
= bind identity_fold_expr_do_while[ENV](_,_,_,_,_),