Skip to content

Commit 21f8bfb

Browse files
committed
---
yaml --- r: 948 b: refs/heads/master c: f075b10 h: refs/heads/master v: v3
1 parent 220e00a commit 21f8bfb

File tree

4 files changed

+99
-10
lines changed

4 files changed

+99
-10
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: 756880a5f5e5df2474a9770d27fa3751b0be4916
2+
refs/heads/master: f075b10af2c2a1088d72fff0bff1918a8e74fbf0

trunk/src/comp/front/ast.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -41,13 +41,11 @@ type block_ = rec(vec[@stmt] stmts,
4141

4242
type pat = spanned[pat_];
4343
tag pat_ {
44-
pat_wild;
45-
pat_bind(ident);
46-
pat_tag(ident, vec[@pat]);
44+
pat_wild(ann);
45+
pat_bind(ident, ann);
46+
pat_tag(ident, vec[@pat], ann);
4747
}
4848

49-
type arm = rec(@pat pat, block block);
50-
5149
tag binop {
5250
add;
5351
sub;
@@ -100,6 +98,8 @@ tag decl_ {
10098
decl_item(@item);
10199
}
102100

101+
type arm = rec(@pat pat, block block);
102+
103103
type expr = spanned[expr_];
104104
tag expr_ {
105105
expr_vec(vec[@expr], ann);

trunk/src/comp/front/parser.rs

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -815,13 +815,19 @@ impure fn parse_initializer(parser p) -> option.t[@ast.expr] {
815815
impure fn parse_pat(parser p) -> @ast.pat {
816816
auto lo = p.get_span();
817817

818-
auto pat = ast.pat_wild; // FIXME: typestate bug
818+
auto pat = ast.pat_wild(ast.ann_none); // FIXME: typestate bug
819819
alt (p.peek()) {
820-
case (token.UNDERSCORE) { p.bump(); pat = ast.pat_wild; }
820+
case (token.UNDERSCORE) {
821+
p.bump();
822+
pat = ast.pat_wild(ast.ann_none);
823+
}
821824
case (token.QUES) {
822825
p.bump();
823826
alt (p.peek()) {
824-
case (token.IDENT(?id)) { p.bump(); pat = ast.pat_bind(id); }
827+
case (token.IDENT(?id)) {
828+
p.bump();
829+
pat = ast.pat_bind(id, ast.ann_none);
830+
}
825831
case (?tok) {
826832
p.err("expected identifier after '?' in pattern but " +
827833
"found " + token.to_str(tok));
@@ -842,7 +848,7 @@ impure fn parse_pat(parser p) -> @ast.pat {
842848
case (_) { args = vec(); }
843849
}
844850

845-
pat = ast.pat_tag(id, args);
851+
pat = ast.pat_tag(id, args, ast.ann_none);
846852
}
847853
case (?tok) {
848854
p.err("expected pattern but found " + token.to_str(tok));

trunk/src/comp/middle/fold.rs

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,9 @@ import front.ast.stmt;
1919
import front.ast.block;
2020
import front.ast.item;
2121
import front.ast.arg;
22+
import front.ast.pat;
2223
import front.ast.decl;
24+
import front.ast.arm;
2325
import front.ast.def;
2426
import front.ast.def_id;
2527
import front.ast.ann;
@@ -94,6 +96,10 @@ type ast_fold[ENV] =
9496
&block body, @expr cond,
9597
ann a) -> @expr) fold_expr_do_while,
9698

99+
(fn(&ENV e, &span sp,
100+
@expr e, vec[arm] arms,
101+
ann a) -> @expr) fold_expr_alt,
102+
97103
(fn(&ENV e, &span sp,
98104
&block blk, ann a) -> @expr) fold_expr_block,
99105

@@ -122,6 +128,18 @@ type ast_fold[ENV] =
122128
@item item) -> @decl) fold_decl_item,
123129

124130

131+
// Pat folds.
132+
(fn(&ENV e, &span sp,
133+
ann a) -> @pat) fold_pat_wild,
134+
135+
(fn(&ENV e, &span sp,
136+
ident i, ann a) -> @pat) fold_pat_bind,
137+
138+
(fn(&ENV e, &span sp,
139+
ident i, vec[@pat] args,
140+
ann a) -> @pat) fold_pat_tag,
141+
142+
125143
// Stmt folds.
126144
(fn(&ENV e, &span sp,
127145
@decl decl) -> @stmt) fold_stmt_decl,
@@ -170,6 +188,7 @@ type ast_fold[ENV] =
170188
(fn(&ENV e, &block b) -> ENV) update_env_for_block,
171189
(fn(&ENV e, @stmt s) -> ENV) update_env_for_stmt,
172190
(fn(&ENV e, @decl i) -> ENV) update_env_for_decl,
191+
(fn(&ENV e, @pat p) -> ENV) update_env_for_pat,
173192
(fn(&ENV e, @expr x) -> ENV) update_env_for_expr,
174193
(fn(&ENV e, @ty t) -> ENV) update_env_for_ty,
175194

@@ -275,6 +294,28 @@ fn fold_decl[ENV](&ENV env, ast_fold[ENV] fld, @decl d) -> @decl {
275294
fail;
276295
}
277296

297+
fn fold_pat[ENV](&ENV env, ast_fold[ENV] fld, @ast.pat p) -> @ast.pat {
298+
let ENV env_ = fld.update_env_for_pat(env, p);
299+
300+
if (!fld.keep_going(env_)) {
301+
ret p;
302+
}
303+
304+
alt (p.node) {
305+
case (ast.pat_wild(?t)) { ret fld.fold_pat_wild(env_, p.span, t); }
306+
case (ast.pat_bind(?id, ?t)) {
307+
ret fld.fold_pat_bind(env_, p.span, id, t);
308+
}
309+
case (ast.pat_tag(?id, ?pats, ?t)) {
310+
let vec[@ast.pat] ppats = vec();
311+
for (@ast.pat pat in pats) {
312+
ppats += vec(fold_pat(env_, fld, pat));
313+
}
314+
ret fld.fold_pat_tag(env_, p.span, id, ppats, t);
315+
}
316+
}
317+
}
318+
278319
fn fold_exprs[ENV](&ENV env, ast_fold[ENV] fld, vec[@expr] es) -> vec[@expr] {
279320
let vec[@expr] exprs = vec();
280321
for (@expr e in es) {
@@ -368,6 +409,17 @@ fn fold_expr[ENV](&ENV env, ast_fold[ENV] fld, &@expr e) -> @expr {
368409
ret fld.fold_expr_do_while(env_, e.span, bbody, ccnd, t);
369410
}
370411

412+
case (ast.expr_alt(?expr, ?arms, ?t)) {
413+
auto eexpr = fold_expr(env_, fld, expr);
414+
let vec[ast.arm] aarms = vec();
415+
for (ast.arm arm in arms) {
416+
auto ppat = fold_pat(env_, fld, arm.pat);
417+
auto bblock = fold_block(env_, fld, arm.block);
418+
aarms += vec(rec(pat=ppat, block=bblock));
419+
}
420+
ret fld.fold_expr_alt(env_, e.span, eexpr, aarms, t);
421+
}
422+
371423
case (ast.expr_block(?b, ?t)) {
372424
auto bb = fold_block(env_, fld, b);
373425
ret fld.fold_expr_block(env_, e.span, bb, t);
@@ -658,6 +710,11 @@ fn identity_fold_expr_do_while[ENV](&ENV env, &span sp,
658710
ret @respan(sp, ast.expr_do_while(body, cond, a));
659711
}
660712

713+
fn identity_fold_expr_alt[ENV](&ENV env, &span sp,
714+
@expr e, vec[arm] arms, ann a) -> @expr {
715+
ret @respan(sp, ast.expr_alt(e, arms, a));
716+
}
717+
661718
fn identity_fold_expr_block[ENV](&ENV env, &span sp, &block blk,
662719
ann a) -> @expr {
663720
ret @respan(sp, ast.expr_block(blk, a));
@@ -698,6 +755,22 @@ fn identity_fold_decl_item[ENV](&ENV e, &span sp, @item i) -> @decl {
698755
}
699756

700757

758+
// Pat identities.
759+
760+
fn identity_fold_pat_wild[ENV](&ENV e, &span sp, ann a) -> @pat {
761+
ret @respan(sp, ast.pat_wild(a));
762+
}
763+
764+
fn identity_fold_pat_bind[ENV](&ENV e, &span sp, ident i, ann a) -> @pat {
765+
ret @respan(sp, ast.pat_bind(i, a));
766+
}
767+
768+
fn identity_fold_pat_tag[ENV](&ENV e, &span sp, ident i, vec[@pat] args,
769+
ann a) -> @pat {
770+
ret @respan(sp, ast.pat_tag(i, args, a));
771+
}
772+
773+
701774
// Stmt identities.
702775

703776
fn identity_fold_stmt_decl[ENV](&ENV env, &span sp, @decl d) -> @stmt {
@@ -790,6 +863,10 @@ fn identity_update_env_for_decl[ENV](&ENV e, @decl d) -> ENV {
790863
ret e;
791864
}
792865

866+
fn identity_update_env_for_pat[ENV](&ENV e, @pat p) -> ENV {
867+
ret e;
868+
}
869+
793870
fn identity_update_env_for_expr[ENV](&ENV e, @expr x) -> ENV {
794871
ret e;
795872
}
@@ -835,6 +912,7 @@ fn new_identity_fold[ENV]() -> ast_fold[ENV] {
835912
fold_expr_while = bind identity_fold_expr_while[ENV](_,_,_,_,_),
836913
fold_expr_do_while
837914
= bind identity_fold_expr_do_while[ENV](_,_,_,_,_),
915+
fold_expr_alt = bind identity_fold_expr_alt[ENV](_,_,_,_,_),
838916
fold_expr_block = bind identity_fold_expr_block[ENV](_,_,_,_),
839917
fold_expr_assign = bind identity_fold_expr_assign[ENV](_,_,_,_,_),
840918
fold_expr_field = bind identity_fold_expr_field[ENV](_,_,_,_,_),
@@ -844,6 +922,10 @@ fn new_identity_fold[ENV]() -> ast_fold[ENV] {
844922
fold_decl_local = bind identity_fold_decl_local[ENV](_,_,_),
845923
fold_decl_item = bind identity_fold_decl_item[ENV](_,_,_),
846924

925+
fold_pat_wild = bind identity_fold_pat_wild[ENV](_,_,_),
926+
fold_pat_bind = bind identity_fold_pat_bind[ENV](_,_,_,_),
927+
fold_pat_tag = bind identity_fold_pat_tag[ENV](_,_,_,_,_),
928+
847929
fold_stmt_decl = bind identity_fold_stmt_decl[ENV](_,_,_),
848930
fold_stmt_ret = bind identity_fold_stmt_ret[ENV](_,_,_),
849931
fold_stmt_log = bind identity_fold_stmt_log[ENV](_,_,_),
@@ -866,6 +948,7 @@ fn new_identity_fold[ENV]() -> ast_fold[ENV] {
866948
update_env_for_block = bind identity_update_env_for_block[ENV](_,_),
867949
update_env_for_stmt = bind identity_update_env_for_stmt[ENV](_,_),
868950
update_env_for_decl = bind identity_update_env_for_decl[ENV](_,_),
951+
update_env_for_pat = bind identity_update_env_for_pat[ENV](_,_),
869952
update_env_for_expr = bind identity_update_env_for_expr[ENV](_,_),
870953
update_env_for_ty = bind identity_update_env_for_ty[ENV](_,_),
871954

0 commit comments

Comments
 (0)