@@ -17,47 +17,71 @@ use util::ppaux;
17
17
18
18
use syntax:: ast:: * ;
19
19
use syntax:: codemap;
20
- use syntax:: { oldvisit, ast_util, ast_map} ;
20
+ use syntax:: { ast_util, ast_map} ;
21
+ use syntax:: visit:: Visitor ;
22
+ use syntax:: visit;
23
+
24
+ struct CheckCrateVisitor {
25
+ sess : Session ,
26
+ ast_map : ast_map:: map ,
27
+ def_map : resolve:: DefMap ,
28
+ method_map : typeck:: method_map ,
29
+ tcx : ty:: ctxt ,
30
+ }
31
+
32
+ impl Visitor < bool > for CheckCrateVisitor {
33
+ fn visit_item ( & mut self , i: @item, env : bool ) {
34
+ check_item ( self , self . sess , self . ast_map , self . def_map , i, env) ;
35
+ }
36
+ fn visit_pat ( & mut self , p: @pat, env : bool ) {
37
+ check_pat ( self , p, env) ;
38
+ }
39
+ fn visit_expr ( & mut self , ex: @expr, env : bool ) {
40
+ check_expr ( self , self . sess , self . def_map , self . method_map ,
41
+ self . tcx , ex, env) ;
42
+ }
43
+ }
21
44
22
45
pub fn check_crate ( sess : Session ,
23
46
crate : & Crate ,
24
47
ast_map : ast_map:: map ,
25
48
def_map : resolve:: DefMap ,
26
49
method_map : typeck:: method_map ,
27
50
tcx : ty:: ctxt ) {
28
- oldvisit:: visit_crate ( crate , ( false , oldvisit:: mk_vt ( @oldvisit:: Visitor {
29
- visit_item : |a, b| check_item ( sess, ast_map, def_map, a, b) ,
30
- visit_pat : check_pat,
31
- visit_expr : |a, b|
32
- check_expr ( sess, def_map, method_map, tcx, a, b) ,
33
- .. * oldvisit:: default_visitor ( )
34
- } ) ) ) ;
51
+ let mut v = CheckCrateVisitor {
52
+ sess : sess,
53
+ ast_map : ast_map,
54
+ def_map : def_map,
55
+ method_map : method_map,
56
+ tcx : tcx,
57
+ } ;
58
+ visit:: walk_crate ( & mut v, crate , false ) ;
35
59
sess. abort_if_errors ( ) ;
36
60
}
37
61
38
- pub fn check_item ( sess : Session ,
62
+ pub fn check_item ( v : & mut CheckCrateVisitor ,
63
+ sess : Session ,
39
64
ast_map : ast_map:: map ,
40
65
def_map : resolve:: DefMap ,
41
66
it: @item,
42
- ( _is_const , v ) : ( bool ,
43
- oldvisit:: vt < bool > ) ) {
67
+ _is_const : bool ) {
44
68
match it. node {
45
69
item_static( _, _, ex) => {
46
- ( v. visit_expr ) ( ex, ( true , v ) ) ;
70
+ v. visit_expr ( ex, true ) ;
47
71
check_item_recursion ( sess, ast_map, def_map, it) ;
48
72
}
49
73
item_enum( ref enum_definition, _) => {
50
74
for var in ( * enum_definition) . variants . iter ( ) {
51
75
for ex in var. node . disr_expr . iter ( ) {
52
- ( v. visit_expr ) ( * ex, ( true , v ) ) ;
76
+ v. visit_expr ( * ex, true ) ;
53
77
}
54
78
}
55
79
}
56
- _ => oldvisit :: visit_item ( it , ( false , v ) )
80
+ _ => visit :: walk_item ( v , it , false )
57
81
}
58
82
}
59
83
60
- pub fn check_pat( p : @pat, ( _is_const , v ) : ( bool , oldvisit :: vt < bool > ) ) {
84
+ pub fn check_pat( v : & mut CheckCrateVisitor , p: @pat, _is_const : bool ) {
61
85
fn is_str ( e: @expr) -> bool {
62
86
match e. node {
63
87
expr_vstore(
@@ -72,22 +96,22 @@ pub fn check_pat(p: @pat, (_is_const, v): (bool, oldvisit::vt<bool>)) {
72
96
}
73
97
match p. node {
74
98
// Let through plain ~-string literals here
75
- pat_lit( a) => if !is_str ( a) { ( v. visit_expr ) ( a, ( true , v ) ) ; } ,
99
+ pat_lit( a) => if !is_str ( a) { v. visit_expr ( a, true ) ; } ,
76
100
pat_range( a, b) => {
77
- if !is_str ( a) { ( v. visit_expr ) ( a, ( true , v ) ) ; }
78
- if !is_str ( b) { ( v. visit_expr ) ( b, ( true , v ) ) ; }
101
+ if !is_str ( a) { v. visit_expr ( a, true ) ; }
102
+ if !is_str ( b) { v. visit_expr ( b, true ) ; }
79
103
}
80
- _ => oldvisit :: visit_pat ( p , ( false , v ) )
104
+ _ => visit :: walk_pat ( v , p , false )
81
105
}
82
106
}
83
107
84
- pub fn check_expr ( sess : Session ,
108
+ pub fn check_expr ( v : & mut CheckCrateVisitor ,
109
+ sess : Session ,
85
110
def_map : resolve:: DefMap ,
86
111
method_map : typeck:: method_map ,
87
112
tcx : ty:: ctxt ,
88
113
e: @expr,
89
- ( is_const , v ) : ( bool ,
90
- oldvisit:: vt < bool > ) ) {
114
+ is_const : bool ) {
91
115
if is_const {
92
116
match e. node {
93
117
expr_unary( _, deref, _) => { }
@@ -152,8 +176,8 @@ pub fn check_expr(sess: Session,
152
176
}
153
177
}
154
178
}
155
- expr_paren( e) => { check_expr ( sess, def_map, method_map,
156
- tcx, e, ( is_const, v ) ) ; }
179
+ expr_paren( e) => { check_expr ( v , sess, def_map, method_map,
180
+ tcx, e, is_const) ; }
157
181
expr_vstore( _, expr_vstore_slice) |
158
182
expr_vec( _, m_imm) |
159
183
expr_addr_of( m_imm, _) |
@@ -192,7 +216,7 @@ pub fn check_expr(sess: Session,
192
216
}
193
217
_ => ( )
194
218
}
195
- oldvisit :: visit_expr ( e , ( is_const , v ) ) ;
219
+ visit :: walk_expr ( v , e , is_const ) ;
196
220
}
197
221
198
222
#[ deriving( Clone ) ]
@@ -204,6 +228,8 @@ struct env {
204
228
idstack : @mut ~[ NodeId ]
205
229
}
206
230
231
+ struct CheckItemRecursionVisitor ;
232
+
207
233
// Make sure a const item doesn't recursively refer to itself
208
234
// FIXME: Should use the dependency graph when it's available (#1356)
209
235
pub fn check_item_recursion ( sess : Session ,
@@ -218,36 +244,34 @@ pub fn check_item_recursion(sess: Session,
218
244
idstack : @mut ~[ ]
219
245
} ;
220
246
221
- let visitor = oldvisit:: mk_vt ( @oldvisit:: Visitor {
222
- visit_item : visit_item,
223
- visit_expr : visit_expr,
224
- .. * oldvisit:: default_visitor ( )
225
- } ) ;
226
- ( visitor. visit_item ) ( it, ( env, visitor) ) ;
247
+ let mut visitor = CheckItemRecursionVisitor ;
248
+ visitor. visit_item ( it, env) ;
249
+ }
227
250
228
- fn visit_item ( it : @item, ( env , v ) : ( env , oldvisit:: vt < env > ) ) {
251
+ impl Visitor < env > for CheckItemRecursionVisitor {
252
+ fn visit_item ( & mut self , it: @item, env : env ) {
229
253
if env. idstack . iter ( ) . any ( |x| x == & ( it. id ) ) {
230
254
env. sess . span_fatal ( env. root_it . span , "recursive constant" ) ;
231
255
}
232
256
env. idstack . push ( it. id ) ;
233
- oldvisit :: visit_item ( it , ( env , v ) ) ;
257
+ visit :: walk_item ( self , it , env ) ;
234
258
env. idstack . pop ( ) ;
235
259
}
236
260
237
- fn visit_expr ( e : @expr, ( env , v ) : ( env , oldvisit :: vt < env > ) ) {
261
+ fn visit_expr ( & mut self , e: @expr, env : env ) {
238
262
match e. node {
239
263
expr_path( * ) => match env. def_map . find ( & e. id ) {
240
264
Some ( & def_static( def_id, _) ) if ast_util:: is_local ( def_id) =>
241
265
match env. ast_map . get_copy ( & def_id. node ) {
242
266
ast_map:: node_item( it, _) => {
243
- ( v . visit_item ) ( it, ( env, v ) ) ;
267
+ self . visit_item ( it, env) ;
244
268
}
245
269
_ => fail ! ( "const not bound to an item" )
246
270
} ,
247
271
_ => ( )
248
272
} ,
249
273
_ => ( )
250
274
}
251
- oldvisit :: visit_expr ( e , ( env , v ) ) ;
275
+ visit :: walk_expr ( self , e , env ) ;
252
276
}
253
277
}
0 commit comments