@@ -210,7 +210,7 @@ fn time(do_it: bool, what: str, thunk: fn()) {
210
210
end - start, what) ) ;
211
211
}
212
212
213
- fn check_item ( cx : ctxt , i : @ast :: item ) {
213
+ fn check_item ( i : @ast :: item , & & cx: ctxt , v : visit :: vt < ctxt > ) {
214
214
cx. with_warn_attrs ( i. attrs ) { |cx|
215
215
for cx. curr . each { |lint, level|
216
216
alt int_to_lint ( lint as int ) {
@@ -221,11 +221,20 @@ fn check_item(cx: ctxt, i: @ast::item) {
221
221
old_vecs { check_item_old_vecs( cx, level, i) ; }
222
222
}
223
223
}
224
+ visit:: visit_item ( i, cx, v) ;
224
225
}
225
226
}
226
227
228
+ // Take a visitor, and modify it so that it will not proceed past subitems.
229
+ // This is used to make the simple visitors used for the lint passes
230
+ // not traverse into subitems, since that is handled by the outer
231
+ // lint visitor.
232
+ fn item_stopping_visitor < E > ( v : visit:: vt < E > ) -> visit:: vt < E > {
233
+ visit:: mk_vt ( @{ visit_item : { |_i, _e, _v| } with * * v} )
234
+ }
235
+
227
236
fn check_item_while_true ( cx : ctxt , level : level , it : @ast:: item ) {
228
- let visit = visit:: mk_simple_visitor ( @{
237
+ let visit = item_stopping_visitor ( visit:: mk_simple_visitor ( @{
229
238
visit_expr : fn @( e: @ast:: expr) {
230
239
alt e. node {
231
240
ast:: expr_while ( cond, _) {
@@ -242,7 +251,7 @@ fn check_item_while_true(cx: ctxt, level: level, it: @ast::item) {
242
251
}
243
252
}
244
253
with * visit:: default_simple_visitor ( )
245
- } ) ;
254
+ } ) ) ;
246
255
visit:: visit_item ( it, ( ) , visit) ;
247
256
}
248
257
@@ -295,7 +304,7 @@ fn check_item_ctypes(cx: ctxt, level: level, it: @ast::item) {
295
304
}
296
305
297
306
fn check_item_path_statement ( cx : ctxt , level : level , it : @ast:: item ) {
298
- let visit = visit:: mk_simple_visitor ( @{
307
+ let visit = item_stopping_visitor ( visit:: mk_simple_visitor ( @{
299
308
visit_stmt : fn @( s: @ast:: stmt) {
300
309
alt s. node {
301
310
ast:: stmt_semi ( @{ id: _,
@@ -309,14 +318,14 @@ fn check_item_path_statement(cx: ctxt, level: level, it: @ast::item) {
309
318
}
310
319
}
311
320
with * visit:: default_simple_visitor ( )
312
- } ) ;
321
+ } ) ) ;
313
322
visit:: visit_item ( it, ( ) , visit) ;
314
323
}
315
324
316
325
fn check_item_old_vecs ( cx : ctxt , level : level , it : @ast:: item ) {
317
326
let uses_vstore = int_hash ( ) ;
318
327
319
- let visit = visit:: mk_simple_visitor ( @{
328
+ let visit = item_stopping_visitor ( visit:: mk_simple_visitor ( @{
320
329
321
330
visit_expr : fn @( e: @ast:: expr) {
322
331
alt e. node {
@@ -353,7 +362,7 @@ fn check_item_old_vecs(cx: ctxt, level: level, it: @ast::item) {
353
362
}
354
363
355
364
with * visit:: default_simple_visitor ( )
356
- } ) ;
365
+ } ) ) ;
357
366
visit:: visit_item ( it, ( ) , visit) ;
358
367
}
359
368
@@ -379,11 +388,11 @@ fn check_crate(tcx: ty::ctxt, crate: @ast::crate,
379
388
380
389
time ( time_pass, "lint checking" ) { ||
381
390
cx. with_warn_attrs ( crate . node. attrs ) { |cx|
382
- let visit = visit:: mk_simple_visitor ( @{
383
- visit_item : fn @ ( i : @ast :: item ) { check_item ( cx , i ) ; }
384
- with * visit:: default_simple_visitor ( )
391
+ let visit = visit:: mk_vt ( @{
392
+ visit_item: check_item
393
+ with * visit:: default_visitor ( )
385
394
} ) ;
386
- visit:: visit_crate ( * crate , ( ) , visit) ;
395
+ visit:: visit_crate ( * crate , cx , visit) ;
387
396
}
388
397
}
389
398
0 commit comments