@@ -3368,38 +3368,44 @@ fn collect_upvars(@block_ctxt cx, &ast.block bloc, &ast.def_id initial_decl)
3368
3368
hashmap[ ast. def_id, ( ) ] decls
3369
3369
) ;
3370
3370
3371
- fn fold_expr_path( & env e, & common. span sp, & ast. path p,
3372
- & option. t[ ast. def] d, ast. ann a) -> @ast. expr {
3373
- alt ( option. get[ ast. def] ( d) ) {
3374
- case ( ast. def_arg( ?did) ) { e. refs += vec( did) ; }
3375
- case ( ast. def_local( ?did) ) { e. refs += vec( did) ; }
3376
- case ( ast. def_upvar( ?did) ) { e. refs += vec( did) ; }
3377
- case ( _) { /* ignore */ }
3371
+ fn walk_expr( env e, @ast. expr expr) {
3372
+ alt ( expr. node) {
3373
+ case ( ast. expr_path( ?path, ?d, _) ) {
3374
+ alt ( option. get[ ast. def] ( d) ) {
3375
+ case ( ast. def_arg( ?did) ) {
3376
+ _vec. push[ ast. def_id] ( e. refs, did) ;
3377
+ }
3378
+ case ( ast. def_local( ?did) ) {
3379
+ _vec. push[ ast. def_id] ( e. refs, did) ;
3380
+ }
3381
+ case ( ast. def_upvar( ?did) ) {
3382
+ _vec. push[ ast. def_id] ( e. refs, did) ;
3383
+ }
3384
+ case ( _) { }
3385
+ }
3386
+ }
3387
+ case ( _) { }
3378
3388
}
3379
-
3380
- ret @fold. respan[ ast. expr_] ( sp, ast. expr_path( p, d, a) ) ;
3381
3389
}
3382
3390
3383
- fn fold_decl_local( & env e, & common. span sp, @ast. local local)
3384
- -> @ast. decl {
3385
- e. decls. insert( local. id, ( ) ) ;
3386
- ret @fold. respan[ ast. decl_] ( sp, ast. decl_local( local) ) ;
3391
+ fn walk_decl( env e, @ast. decl decl) {
3392
+ alt ( decl. node) {
3393
+ case ( ast. decl_local( ?local) ) {
3394
+ e. decls. insert( local. id, ( ) ) ;
3395
+ }
3396
+ case ( _) { }
3397
+ }
3387
3398
}
3388
3399
3389
- auto fep = fold_expr_path;
3390
- auto fdl = fold_decl_local;
3391
- auto fld = @rec(
3392
- fold_expr_path=fep,
3393
- fold_decl_local=fdl
3394
- with * fold. new_identity_fold[ env] ( )
3395
- ) ;
3396
-
3397
3400
let vec[ ast. def_id] refs = vec( ) ;
3398
3401
let hashmap[ ast. def_id, ( ) ] decls = new_def_hash[ ( ) ] ( ) ;
3399
3402
decls. insert( initial_decl, ( ) ) ;
3400
3403
let env e = @rec( mutable refs=refs, decls=decls) ;
3401
3404
3402
- fold. fold_block[ env] ( e, fld, bloc) ;
3405
+ auto visitor = @rec( visit_decl_pre = bind walk_decl( e, _) ,
3406
+ visit_expr_pre = bind walk_expr( e, _)
3407
+ with walk. default_visitor( ) ) ;
3408
+ walk. walk_block( * visitor, bloc) ;
3403
3409
3404
3410
// Calculate (refs - decls). This is the set of captured upvars.
3405
3411
let vec[ ast. def_id] result = vec( ) ;
0 commit comments