@@ -19,7 +19,9 @@ import front.ast.stmt;
19
19
import front. ast . block ;
20
20
import front. ast . item ;
21
21
import front. ast . arg ;
22
+ import front. ast . pat ;
22
23
import front. ast . decl ;
24
+ import front. ast . arm ;
23
25
import front. ast . def ;
24
26
import front. ast . def_id ;
25
27
import front. ast . ann ;
@@ -94,6 +96,10 @@ type ast_fold[ENV] =
94
96
& block body, @expr cond,
95
97
ann a) -> @expr) fold_expr_do_while,
96
98
99
+ ( fn ( & ENV e, & span sp,
100
+ @expr e, vec[ arm] arms,
101
+ ann a) -> @expr) fold_expr_alt,
102
+
97
103
( fn ( & ENV e, & span sp,
98
104
& block blk, ann a) -> @expr) fold_expr_block,
99
105
@@ -122,6 +128,18 @@ type ast_fold[ENV] =
122
128
@item item) -> @decl) fold_decl_item,
123
129
124
130
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
+
125
143
// Stmt folds.
126
144
( fn ( & ENV e, & span sp,
127
145
@decl decl) -> @stmt) fold_stmt_decl,
@@ -170,6 +188,7 @@ type ast_fold[ENV] =
170
188
( fn ( & ENV e, & block b) -> ENV ) update_env_for_block,
171
189
( fn ( & ENV e, @stmt s) -> ENV ) update_env_for_stmt,
172
190
( fn ( & ENV e, @decl i) -> ENV ) update_env_for_decl,
191
+ ( fn ( & ENV e, @pat p) -> ENV ) update_env_for_pat,
173
192
( fn ( & ENV e, @expr x) -> ENV ) update_env_for_expr,
174
193
( fn ( & ENV e, @ty t) -> ENV ) update_env_for_ty,
175
194
@@ -275,6 +294,28 @@ fn fold_decl[ENV](&ENV env, ast_fold[ENV] fld, @decl d) -> @decl {
275
294
fail;
276
295
}
277
296
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
+
278
319
fn fold_exprs[ ENV ] ( & ENV env, ast_fold[ ENV ] fld, vec[ @expr] es) -> vec[ @expr] {
279
320
let vec[ @expr] exprs = vec ( ) ;
280
321
for ( @expr e in es) {
@@ -368,6 +409,17 @@ fn fold_expr[ENV](&ENV env, ast_fold[ENV] fld, &@expr e) -> @expr {
368
409
ret fld. fold_expr_do_while ( env_, e. span , bbody, ccnd, t) ;
369
410
}
370
411
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
+
371
423
case ( ast. expr_block( ?b, ?t) ) {
372
424
auto bb = fold_block( env_, fld, b) ;
373
425
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,
658
710
ret @respan ( sp, ast. expr_do_while ( body, cond, a) ) ;
659
711
}
660
712
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
+
661
718
fn identity_fold_expr_block[ ENV ] ( & ENV env, & span sp, & block blk,
662
719
ann a) -> @expr {
663
720
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 {
698
755
}
699
756
700
757
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
+
701
774
// Stmt identities.
702
775
703
776
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 {
790
863
ret e;
791
864
}
792
865
866
+ fn identity_update_env_for_pat[ ENV ] ( & ENV e, @pat p) -> ENV {
867
+ ret e;
868
+ }
869
+
793
870
fn identity_update_env_for_expr[ ENV ] ( & ENV e, @expr x) -> ENV {
794
871
ret e;
795
872
}
@@ -835,6 +912,7 @@ fn new_identity_fold[ENV]() -> ast_fold[ENV] {
835
912
fold_expr_while = bind identity_fold_expr_while[ ENV ] ( _, _, _, _, _) ,
836
913
fold_expr_do_while
837
914
= bind identity_fold_expr_do_while[ ENV ] ( _, _, _, _, _) ,
915
+ fold_expr_alt = bind identity_fold_expr_alt[ ENV ] ( _, _, _, _, _) ,
838
916
fold_expr_block = bind identity_fold_expr_block[ ENV ] ( _, _, _, _) ,
839
917
fold_expr_assign = bind identity_fold_expr_assign[ ENV ] ( _, _, _, _, _) ,
840
918
fold_expr_field = bind identity_fold_expr_field[ ENV ] ( _, _, _, _, _) ,
@@ -844,6 +922,10 @@ fn new_identity_fold[ENV]() -> ast_fold[ENV] {
844
922
fold_decl_local = bind identity_fold_decl_local[ ENV ] ( _, _, _) ,
845
923
fold_decl_item = bind identity_fold_decl_item[ ENV ] ( _, _, _) ,
846
924
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
+
847
929
fold_stmt_decl = bind identity_fold_stmt_decl[ ENV ] ( _, _, _) ,
848
930
fold_stmt_ret = bind identity_fold_stmt_ret[ ENV ] ( _, _, _) ,
849
931
fold_stmt_log = bind identity_fold_stmt_log[ ENV ] ( _, _, _) ,
@@ -866,6 +948,7 @@ fn new_identity_fold[ENV]() -> ast_fold[ENV] {
866
948
update_env_for_block = bind identity_update_env_for_block[ ENV ] ( _, _) ,
867
949
update_env_for_stmt = bind identity_update_env_for_stmt[ ENV ] ( _, _) ,
868
950
update_env_for_decl = bind identity_update_env_for_decl[ ENV ] ( _, _) ,
951
+ update_env_for_pat = bind identity_update_env_for_pat[ ENV ] ( _, _) ,
869
952
update_env_for_expr = bind identity_update_env_for_expr[ ENV ] ( _, _) ,
870
953
update_env_for_ty = bind identity_update_env_for_ty[ ENV ] ( _, _) ,
871
954
0 commit comments