@@ -19,12 +19,12 @@ import front::ast::decl;
19
19
import front:: ast:: decl_local;
20
20
import front:: ast:: def_id;
21
21
import front:: ast:: ident;
22
+
22
23
import middle:: fold:: span;
23
24
import middle:: fold:: respan;
24
- import middle:: fold:: new_identity_fold;
25
- import middle:: fold:: fold_block;
26
- import middle:: fold:: fold_fn;
27
- import middle:: fold:: fold_crate;
25
+ import middle:: walk:: walk_crate;
26
+ import middle:: walk:: walk_fn;
27
+ import middle:: walk:: ast_visitor;
28
28
29
29
import aux:: fn_info;
30
30
import aux:: var_info;
@@ -36,19 +36,17 @@ fn var_is_local(def_id v, fn_info m) -> bool {
36
36
ret ( m. vars . contains_key ( v) ) ;
37
37
}
38
38
39
- fn collect_local ( & @vec[ tup( ident, def_id) ] vars , & span sp, & @local loc )
40
- -> @decl {
39
+ fn collect_local ( & @vec[ tup( ident, def_id) ] vars , & @local loc ) -> ( ) {
41
40
log ( "collect_local: pushing " + loc. ident ) ;
42
- vec:: push[ tup ( ident, def_id) ] ( * vars, tup ( loc. ident , loc. id ) ) ;
43
- ret @respan ( sp, decl_local ( loc) ) ;
41
+ _vec:: push[ tup ( ident, def_id) ] ( * vars, tup ( loc. ident , loc. id ) ) ;
44
42
}
45
43
46
44
fn find_locals ( _fn f) -> @vec[ tup ( ident , def_id ) ] {
47
45
auto res = @vec:: alloc[ tup ( ident, def_id) ] ( 0 u) ;
48
46
49
- auto fld = new_identity_fold [ @vec [ tup ( ident , def_id ) ] ] ( ) ;
50
- fld = @ rec ( fold_decl_local = bind collect_local ( _ , _ , _ ) with * fld ) ;
51
- auto ignore = fold_fn [ @vec [ tup ( ident , def_id ) ] ] ( res , fld , f) ;
47
+ auto visitor = walk :: default_visitor ( ) ;
48
+ visitor = rec ( visit_decl_pre= bind collect_local ( res , _ ) with visitor ) ;
49
+ walk_fn ( visitor , f) ;
52
50
53
51
ret res;
54
52
}
@@ -83,40 +81,47 @@ fn mk_fn_info(_fn f, def_id f_id, ident f_name) -> fn_info {
83
81
ret res;
84
82
}
85
83
86
- /* extends mk_fn_info to a function item, side-effecting the map fi from
87
- function IDs to fn_info maps */
88
- fn mk_fn_info_item_fn ( & crate_ctxt ccx, & span sp, & ident i, & _fn f,
89
- & vec[ ty_param] ty_params , & def_id id, & ann a) -> @item {
90
- auto f_inf = mk_fn_info ( f, id, i) ;
91
- ccx. fm . insert ( id, f_inf) ;
92
- // log_err("inserting: " + i);
93
- ret @respan ( sp, item_fn ( i, f, ty_params, id, a) ) ;
94
- }
95
-
96
- /* extends mk_fn_info to an obj item, side-effecting the map fi from
97
- function IDs to fn_info maps */
98
- fn mk_fn_info_item_obj ( & crate_ctxt ccx, & span sp, & ident i, & _obj o,
99
- & vec[ ty_param] ty_params ,
100
- & obj_def_ids odid, & ann a) -> @item {
101
- auto all_methods = vec:: clone[ @method] ( o. methods ) ;
102
- plus_option[ @method] ( all_methods, o. dtor ) ;
103
- auto f_inf;
104
- for ( @method m in all_methods) {
84
+ /* extends mk_fn_info to an item, side-effecting the map fi from
85
+ function IDs to fn_info maps
86
+ only looks at function and object items. */
87
+ fn mk_fn_info_item ( & crate_ctxt ccx, & @item i ) -> ( ) {
88
+ alt ( i. node ) {
89
+ case ( item_fn ( ?i, ?f, ?ty_params, ?id, ?a) ) {
90
+ auto f_inf = mk_fn_info ( f, id, i) ;
91
+ ccx. fm . insert ( id, f_inf) ;
92
+ }
93
+ case ( item_obj ( ?i, ?o, ?ty_params, ?odid, ?a) ) {
94
+ auto all_methods = _vec:: clone[ @method] ( o. methods ) ;
95
+ plus_option[ @method] ( all_methods, o. dtor ) ;
96
+ auto f_inf;
97
+ for ( @method m in all_methods) {
105
98
f_inf = mk_fn_info ( m. node . meth , m. node . id , m. node . ident ) ;
106
99
ccx. fm . insert ( m. node . id , f_inf) ;
100
+ }
107
101
}
108
- ret @respan ( sp, item_obj ( i, o, ty_params, odid, a) ) ;
102
+ case ( _) { ret; }
103
+ }
109
104
}
110
105
111
-
112
106
/* initializes the global fn_info_map (mapping each function ID, including
113
107
nested locally defined functions, onto a mapping from local variable name
114
108
to bit number) */
115
109
fn mk_f_to_fn_info ( & crate_ctxt ccx, @crate c ) -> ( ) {
110
+ let ast_visitor vars_visitor = walk:: default_visitor ( ) ;
111
+ vars_visitor = rec ( visit_item_post=bind mk_fn_info_item ( ccx, _)
112
+ with vars_visitor) ;
116
113
117
- auto fld = new_identity_fold[ crate_ctxt] ( ) ;
118
- fld = @rec ( fold_item_fn = bind mk_fn_info_item_fn ( _, _, _, _, _, _, _) ,
119
- fold_item_obj = bind mk_fn_info_item_obj ( _, _, _, _, _, _, _)
120
- with * fld) ;
121
- fold_crate[ crate_ctxt] ( ccx, fld, c) ;
114
+ walk_crate ( vars_visitor, * c) ;
122
115
}
116
+
117
+ //
118
+ // Local Variables:
119
+ // mode: rust
120
+ // fill-column: 78;
121
+ // indent-tabs-mode: nil
122
+ // c-basic-offset: 4
123
+ // buffer-file-coding-system: utf-8-unix
124
+ // compile-command: "make -k -C $RBUILD 2>&1 | sed -e 's/\\/x\\//x:\\//g'";
125
+ // End:
126
+ //
127
+
0 commit comments