@@ -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, _) |
@@ -191,7 +215,7 @@ pub fn check_expr(sess: Session,
191
215
}
192
216
_ => ( )
193
217
}
194
- oldvisit :: visit_expr ( e , ( is_const , v ) ) ;
218
+ visit :: walk_expr ( v , e , is_const ) ;
195
219
}
196
220
197
221
#[ deriving( Clone ) ]
@@ -203,6 +227,8 @@ struct env {
203
227
idstack : @mut ~[ NodeId ]
204
228
}
205
229
230
+ struct CheckItemRecursionVisitor ;
231
+
206
232
// Make sure a const item doesn't recursively refer to itself
207
233
// FIXME: Should use the dependency graph when it's available (#1356)
208
234
pub fn check_item_recursion ( sess : Session ,
@@ -217,36 +243,34 @@ pub fn check_item_recursion(sess: Session,
217
243
idstack : @mut ~[ ]
218
244
} ;
219
245
220
- let visitor = oldvisit:: mk_vt ( @oldvisit:: Visitor {
221
- visit_item : visit_item,
222
- visit_expr : visit_expr,
223
- .. * oldvisit:: default_visitor ( )
224
- } ) ;
225
- ( visitor. visit_item ) ( it, ( env, visitor) ) ;
246
+ let mut visitor = CheckItemRecursionVisitor ;
247
+ visitor. visit_item ( it, env) ;
248
+ }
226
249
227
- fn visit_item ( it : @item, ( env , v ) : ( env , oldvisit:: vt < env > ) ) {
250
+ impl Visitor < env > for CheckItemRecursionVisitor {
251
+ fn visit_item ( & mut self , it: @item, env : env ) {
228
252
if env. idstack . iter ( ) . any ( |x| x == & ( it. id ) ) {
229
253
env. sess . span_fatal ( env. root_it . span , "recursive constant" ) ;
230
254
}
231
255
env. idstack . push ( it. id ) ;
232
- oldvisit :: visit_item ( it , ( env , v ) ) ;
256
+ visit :: walk_item ( self , it , env ) ;
233
257
env. idstack . pop ( ) ;
234
258
}
235
259
236
- fn visit_expr ( e : @expr, ( env , v ) : ( env , oldvisit :: vt < env > ) ) {
260
+ fn visit_expr ( & mut self , e: @expr, env : env ) {
237
261
match e. node {
238
262
expr_path( * ) => match env. def_map . find ( & e. id ) {
239
263
Some ( & def_static( def_id, _) ) if ast_util:: is_local ( def_id) =>
240
264
match env. ast_map . get_copy ( & def_id. node ) {
241
265
ast_map:: node_item( it, _) => {
242
- ( v . visit_item ) ( it, ( env, v ) ) ;
266
+ self . visit_item ( it, env) ;
243
267
}
244
268
_ => fail ! ( "const not bound to an item" )
245
269
} ,
246
270
_ => ( )
247
271
} ,
248
272
_ => ( )
249
273
}
250
- oldvisit :: visit_expr ( e , ( env , v ) ) ;
274
+ visit :: walk_expr ( self , e , env ) ;
251
275
}
252
276
}
0 commit comments