@@ -29,7 +29,8 @@ use util::ppaux;
29
29
use syntax:: ast;
30
30
use syntax:: codemap:: Span ;
31
31
use syntax:: print:: pprust:: pat_to_str;
32
- use syntax:: oldvisit;
32
+ use syntax:: visit;
33
+ use syntax:: visit:: Visitor ;
33
34
34
35
fn resolve_type_vars_in_type ( fcx : @mut FnCtxt , sp : Span , typ : ty:: t )
35
36
-> Option < ty:: t > {
@@ -214,15 +215,15 @@ struct WbCtxt {
214
215
success : bool ,
215
216
}
216
217
217
- type wb_vt = oldvisit :: vt < @ mut WbCtxt > ;
218
+ struct WbVisitor ;
218
219
219
- fn visit_stmt ( s : @ast:: Stmt , ( wbcx, v) : ( @mut WbCtxt , wb_vt ) ) {
220
+ fn visit_stmt ( s : @ast:: Stmt , ( wbcx, v) : ( @mut WbCtxt , & mut WbVisitor ) ) {
220
221
if !wbcx. success { return ; }
221
222
resolve_type_vars_for_node ( wbcx, s. span , ty:: stmt_node_id ( s) ) ;
222
- oldvisit :: visit_stmt ( s , ( wbcx , v ) ) ;
223
+ visit :: walk_stmt ( v , s , wbcx ) ;
223
224
}
224
225
225
- fn visit_expr ( e : @ast:: Expr , ( wbcx, v) : ( @mut WbCtxt , wb_vt ) ) {
226
+ fn visit_expr ( e : @ast:: Expr , ( wbcx, v) : ( @mut WbCtxt , & mut WbVisitor ) ) {
226
227
if !wbcx. success {
227
228
return ;
228
229
}
@@ -267,19 +268,19 @@ fn visit_expr(e: @ast::Expr, (wbcx, v): (@mut WbCtxt, wb_vt)) {
267
268
_ => ( )
268
269
}
269
270
270
- oldvisit :: visit_expr ( e , ( wbcx , v ) ) ;
271
+ visit :: walk_expr ( v , e , wbcx ) ;
271
272
}
272
273
273
- fn visit_block ( b : & ast:: Block , ( wbcx, v) : ( @mut WbCtxt , wb_vt ) ) {
274
+ fn visit_block ( b : & ast:: Block , ( wbcx, v) : ( @mut WbCtxt , & mut WbVisitor ) ) {
274
275
if !wbcx. success {
275
276
return ;
276
277
}
277
278
278
279
resolve_type_vars_for_node ( wbcx, b. span , b. id ) ;
279
- oldvisit :: visit_block ( b , ( wbcx , v ) ) ;
280
+ visit :: walk_block ( v , b , wbcx ) ;
280
281
}
281
282
282
- fn visit_pat ( p : @ast:: Pat , ( wbcx, v) : ( @mut WbCtxt , wb_vt ) ) {
283
+ fn visit_pat ( p : @ast:: Pat , ( wbcx, v) : ( @mut WbCtxt , & mut WbVisitor ) ) {
283
284
if !wbcx. success {
284
285
return ;
285
286
}
@@ -290,10 +291,10 @@ fn visit_pat(p: @ast::Pat, (wbcx, v): (@mut WbCtxt, wb_vt)) {
290
291
wbcx. fcx. infcx( ) . ty_to_str(
291
292
ty:: node_id_to_type( wbcx. fcx. ccx. tcx,
292
293
p. id) ) ) ;
293
- oldvisit :: visit_pat ( p , ( wbcx , v ) ) ;
294
+ visit :: walk_pat ( v , p , wbcx ) ;
294
295
}
295
296
296
- fn visit_local ( l : @ast:: Local , ( wbcx, v) : ( @mut WbCtxt , wb_vt ) ) {
297
+ fn visit_local ( l : @ast:: Local , ( wbcx, v) : ( @mut WbCtxt , & mut WbVisitor ) ) {
297
298
if !wbcx. success { return ; }
298
299
let var_ty = wbcx. fcx . local_ty ( l. span , l. id ) ;
299
300
match resolve_type ( wbcx. fcx . infcx ( ) , var_ty, resolve_all | force_all) {
@@ -313,26 +314,25 @@ fn visit_local(l: @ast::Local, (wbcx, v): (@mut WbCtxt, wb_vt)) {
313
314
wbcx. success = false ;
314
315
}
315
316
}
316
- oldvisit :: visit_local ( l , ( wbcx , v ) ) ;
317
+ visit :: walk_local ( v , l , wbcx ) ;
317
318
}
318
- fn visit_item ( _item : @ast:: item , ( _wbcx, _v) : ( @mut WbCtxt , wb_vt ) ) {
319
+ fn visit_item ( _item : @ast:: item , ( _wbcx, _v) : ( @mut WbCtxt , & mut WbVisitor ) ) {
319
320
// Ignore items
320
321
}
321
322
322
- fn mk_visitor ( ) -> oldvisit:: vt < @mut WbCtxt > {
323
- oldvisit:: mk_vt ( @oldvisit:: Visitor { visit_item : visit_item,
324
- visit_stmt : visit_stmt,
325
- visit_expr : visit_expr,
326
- visit_block : visit_block,
327
- visit_pat : visit_pat,
328
- visit_local : visit_local,
329
- .. * oldvisit:: default_visitor ( ) } )
323
+ impl Visitor < @mut WbCtxt > for WbVisitor {
324
+ fn visit_item ( & mut self , i : @ast:: item , e : @mut WbCtxt ) { visit_item ( i, ( e, self ) ) ; }
325
+ fn visit_stmt ( & mut self , s : @ast:: Stmt , e : @mut WbCtxt ) { visit_stmt ( s, ( e, self ) ) ; }
326
+ fn visit_expr ( & mut self , ex : @ast:: Expr , e : @mut WbCtxt ) { visit_expr ( ex, ( e, self ) ) ; }
327
+ fn visit_block ( & mut self , b : & ast:: Block , e : @mut WbCtxt ) { visit_block ( b, ( e, self ) ) ; }
328
+ fn visit_pat ( & mut self , p : @ast:: Pat , e : @mut WbCtxt ) { visit_pat ( p, ( e, self ) ) ; }
329
+ fn visit_local ( & mut self , l : @ast:: Local , e : @mut WbCtxt ) { visit_local ( l, ( e, self ) ) ; }
330
330
}
331
331
332
332
pub fn resolve_type_vars_in_expr ( fcx : @mut FnCtxt , e : @ast:: Expr ) -> bool {
333
333
let wbcx = @mut WbCtxt { fcx : fcx, success : true } ;
334
- let visit = mk_visitor ( ) ;
335
- ( visit. visit_expr ) ( e, ( wbcx, visit ) ) ;
334
+ let mut visit = WbVisitor ;
335
+ visit. visit_expr ( e, wbcx) ;
336
336
return wbcx. success ;
337
337
}
338
338
@@ -341,15 +341,15 @@ pub fn resolve_type_vars_in_fn(fcx: @mut FnCtxt,
341
341
blk : & ast:: Block ,
342
342
self_info : Option < SelfInfo > ) -> bool {
343
343
let wbcx = @mut WbCtxt { fcx : fcx, success : true } ;
344
- let visit = mk_visitor ( ) ;
345
- ( visit. visit_block ) ( blk, ( wbcx, visit ) ) ;
344
+ let mut visit = WbVisitor ;
345
+ visit. visit_block ( blk, wbcx) ;
346
346
for self_info in self_info. iter ( ) {
347
347
resolve_type_vars_for_node ( wbcx,
348
348
self_info. span ,
349
349
self_info. self_id ) ;
350
350
}
351
351
for arg in decl. inputs . iter ( ) {
352
- ( visit. visit_pat ) ( arg. pat , ( wbcx, visit ) ) ;
352
+ visit. visit_pat ( arg. pat , wbcx) ;
353
353
// Privacy needs the type for the whole pattern, not just each binding
354
354
if !pat_util:: pat_is_binding ( fcx. tcx ( ) . def_map , arg. pat ) {
355
355
resolve_type_vars_for_node ( wbcx, arg. pat . span , arg. pat . id ) ;
0 commit comments