Skip to content

Commit c6ecced

Browse files
committed
---
yaml --- r: 1270 b: refs/heads/master c: a8af013 h: refs/heads/master v: v3
1 parent 89bdd70 commit c6ecced

File tree

4 files changed

+40
-13
lines changed

4 files changed

+40
-13
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
---
2-
refs/heads/master: 7fdb6437d862d18a50f6c9d3f79f08e8d90905c4
2+
refs/heads/master: a8af013077c01901426f7cb829a98c7f1fbe6613

trunk/src/comp/front/ast.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,7 @@ tag expr_ {
150150
expr_cast(@expr, @ty, ann);
151151
expr_if(@expr, block, option.t[block], ann);
152152
expr_while(@expr, block, ann);
153-
expr_for(@local, @expr, block, ann);
153+
expr_for(@decl, @expr, block, ann);
154154
expr_do_while(block, @expr, ann);
155155
expr_alt(@expr, vec[arm], ann);
156156
expr_block(block, ann);

trunk/src/comp/front/parser.rs

Lines changed: 20 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -891,27 +891,35 @@ impure fn parse_if_expr(parser p) -> @ast.expr {
891891
ret @spanned(lo, hi, ast.expr_if(cond, thn, els, ast.ann_none));
892892
}
893893

894-
impure fn parse_for_expr(parser p) -> @ast.expr {
894+
impure fn parse_head_local(parser p) -> @ast.decl {
895895
auto lo = p.get_span();
896-
auto hi = lo;
897-
898-
expect(p, token.FOR);
899-
expect (p, token.LPAREN);
900-
901896
let @ast.local local;
902897
if (p.peek() == token.AUTO) {
903-
p.bump();
904898
local = parse_auto_local(p);
905899
} else {
906900
local = parse_typed_local(p);
907901
}
902+
auto hi = p.get_span();
903+
ret @spanned(lo, hi, ast.decl_local(local));
904+
}
905+
906+
907+
908+
impure fn parse_for_expr(parser p) -> @ast.expr {
909+
auto lo = p.get_span();
910+
auto hi = lo;
911+
912+
expect(p, token.FOR);
913+
expect (p, token.LPAREN);
914+
915+
auto decl = parse_head_local(p);
908916
expect(p, token.IN);
909917

910918
auto seq = parse_expr(p);
911919
expect(p, token.RPAREN);
912920
auto body = parse_block(p);
913921
hi = body.span;
914-
ret @spanned(lo, hi, ast.expr_for(local, seq, body, ast.ann_none));
922+
ret @spanned(lo, hi, ast.expr_for(decl, seq, body, ast.ann_none));
915923
}
916924

917925
impure fn parse_while_expr(parser p) -> @ast.expr {
@@ -1078,7 +1086,8 @@ impure fn parse_pat(parser p) -> @ast.pat {
10781086
ret @spanned(lo, hi, pat);
10791087
}
10801088

1081-
impure fn parse_local(&option.t[@ast.ty] tyopt, parser p) -> @ast.local {
1089+
impure fn parse_local_full(&option.t[@ast.ty] tyopt,
1090+
parser p) -> @ast.local {
10821091
auto ident = parse_ident(p);
10831092
auto init = parse_initializer(p);
10841093
ret @rec(ty = tyopt,
@@ -1091,11 +1100,11 @@ impure fn parse_local(&option.t[@ast.ty] tyopt, parser p) -> @ast.local {
10911100

10921101
impure fn parse_typed_local(parser p) -> @ast.local {
10931102
auto ty = parse_ty(p);
1094-
ret parse_local(some(ty), p);
1103+
ret parse_local_full(some(ty), p);
10951104
}
10961105

10971106
impure fn parse_auto_local(parser p) -> @ast.local {
1098-
ret parse_local(none[@ast.ty], p);
1107+
ret parse_local_full(none[@ast.ty], p);
10991108
}
11001109

11011110
impure fn parse_let(parser p) -> @ast.decl {

trunk/src/comp/middle/fold.rs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,10 @@ type ast_fold[ENV] =
103103
&option.t[block] els,
104104
ann a) -> @expr) fold_expr_if,
105105

106+
(fn(&ENV e, &span sp,
107+
@decl decl, @expr seq, &block body,
108+
ann a) -> @expr) fold_expr_for,
109+
106110
(fn(&ENV e, &span sp,
107111
@expr cond, &block body,
108112
ann a) -> @expr) fold_expr_while,
@@ -509,6 +513,13 @@ fn fold_expr[ENV](&ENV env, ast_fold[ENV] fld, &@expr e) -> @expr {
509513
ret fld.fold_expr_if(env_, e.span, ccnd, tthn, eels, t);
510514
}
511515

516+
case (ast.expr_for(?decl, ?seq, ?body, ?t)) {
517+
auto ddecl = fold_decl(env_, fld, decl);
518+
auto sseq = fold_expr(env_, fld, seq);
519+
auto bbody = fold_block(env_, fld, body);
520+
ret fld.fold_expr_for(env_, e.span, ddecl, seq, bbody, t);
521+
}
522+
512523
case (ast.expr_while(?cnd, ?body, ?t)) {
513524
auto ccnd = fold_expr(env_, fld, cnd);
514525
auto bbody = fold_block(env_, fld, body);
@@ -950,6 +961,12 @@ fn identity_fold_expr_if[ENV](&ENV env, &span sp,
950961
ret @respan(sp, ast.expr_if(cond, thn, els, a));
951962
}
952963

964+
fn identity_fold_expr_for[ENV](&ENV env, &span sp,
965+
@decl d, @expr seq,
966+
&block body, ann a) -> @expr {
967+
ret @respan(sp, ast.expr_for(d, seq, body, a));
968+
}
969+
953970
fn identity_fold_expr_while[ENV](&ENV env, &span sp,
954971
@expr cond, &block body, ann a) -> @expr {
955972
ret @respan(sp, ast.expr_while(cond, body, a));
@@ -1214,6 +1231,7 @@ fn new_identity_fold[ENV]() -> ast_fold[ENV] {
12141231
fold_expr_lit = bind identity_fold_expr_lit[ENV](_,_,_,_),
12151232
fold_expr_cast = bind identity_fold_expr_cast[ENV](_,_,_,_,_),
12161233
fold_expr_if = bind identity_fold_expr_if[ENV](_,_,_,_,_,_),
1234+
fold_expr_for = bind identity_fold_expr_for[ENV](_,_,_,_,_,_),
12171235
fold_expr_while = bind identity_fold_expr_while[ENV](_,_,_,_,_),
12181236
fold_expr_do_while
12191237
= bind identity_fold_expr_do_while[ENV](_,_,_,_,_),

0 commit comments

Comments
 (0)