@@ -3,13 +3,13 @@ use clippy_utils::source::{SpanRangeExt, snippet_indent};
3
3
use clippy_utils:: tokenize_with_text;
4
4
use itertools:: Itertools ;
5
5
use rustc_ast:: token:: CommentKind ;
6
- use rustc_ast:: { AttrKind , AttrStyle , Attribute , Crate , Item , ItemKind , ModKind , NodeId } ;
6
+ use rustc_ast:: { AssocItemKind , AttrKind , AttrStyle , Attribute , Crate , Item , ItemKind , ModKind , NodeId } ;
7
7
use rustc_errors:: { Applicability , Diag , SuggestionStyle } ;
8
8
use rustc_lexer:: TokenKind ;
9
9
use rustc_lint:: { EarlyContext , EarlyLintPass , LintContext } ;
10
10
use rustc_session:: impl_lint_pass;
11
11
use rustc_span:: symbol:: kw;
12
- use rustc_span:: { BytePos , ExpnKind , InnerSpan , Span , SpanData , Symbol } ;
12
+ use rustc_span:: { BytePos , ExpnKind , Ident , InnerSpan , Span , SpanData , Symbol } ;
13
13
14
14
declare_clippy_lint ! {
15
15
/// ### What it does
@@ -92,7 +92,7 @@ struct ItemInfo {
92
92
kind : & ' static str ,
93
93
name : Symbol ,
94
94
span : Span ,
95
- mod_items : Vec < NodeId > ,
95
+ mod_items : Option < NodeId > ,
96
96
}
97
97
98
98
pub struct EmptyLineAfter {
@@ -347,7 +347,7 @@ impl EmptyLineAfter {
347
347
fn suggest_inner ( & self , diag : & mut Diag < ' _ , ( ) > , kind : StopKind , gaps : & [ Gap < ' _ > ] , id : NodeId ) {
348
348
if let Some ( parent) = self . items . iter ( ) . rev ( ) . nth ( 1 )
349
349
&& ( parent. kind == "module" || parent. kind == "crate" )
350
- && parent. mod_items . first ( ) == Some ( & id)
350
+ && parent. mod_items == Some ( id)
351
351
{
352
352
let desc = if parent. kind == "module" {
353
353
"parent module"
@@ -367,48 +367,35 @@ impl EmptyLineAfter {
367
367
) ;
368
368
}
369
369
}
370
- }
371
370
372
- impl EarlyLintPass for EmptyLineAfter {
373
- fn check_crate ( & mut self , _: & EarlyContext < ' _ > , krate : & Crate ) {
371
+ fn check_item_kind (
372
+ & mut self ,
373
+ cx : & EarlyContext < ' _ > ,
374
+ kind : & ItemKind ,
375
+ ident : & Ident ,
376
+ span : Span ,
377
+ attrs : & [ Attribute ] ,
378
+ id : NodeId ,
379
+ ) {
374
380
self . items . push ( ItemInfo {
375
- kind : "crate" ,
376
- name : kw:: Crate ,
377
- span : krate. spans . inner_span . with_hi ( krate. spans . inner_span . lo ( ) ) ,
378
- mod_items : krate
379
- . items
380
- . iter ( )
381
- . filter ( |i| !matches ! ( i. span. ctxt( ) . outer_expn_data( ) . kind, ExpnKind :: AstPass ( _) ) )
382
- . map ( |i| i. id )
383
- . collect :: < Vec < _ > > ( ) ,
384
- } ) ;
385
- }
386
-
387
- fn check_item_post ( & mut self , _: & EarlyContext < ' _ > , _: & Item ) {
388
- self . items . pop ( ) ;
389
- }
390
-
391
- fn check_item ( & mut self , cx : & EarlyContext < ' _ > , item : & Item ) {
392
- self . items . push ( ItemInfo {
393
- kind : item. kind . descr ( ) ,
394
- name : item. ident . name ,
395
- span : if item. span . contains ( item. ident . span ) {
396
- item. span . with_hi ( item. ident . span . hi ( ) )
381
+ kind : kind. descr ( ) ,
382
+ name : ident. name ,
383
+ span : if span. contains ( ident. span ) {
384
+ span. with_hi ( ident. span . hi ( ) )
397
385
} else {
398
- item . span . with_hi ( item . span . lo ( ) )
386
+ span. with_hi ( span. lo ( ) )
399
387
} ,
400
- mod_items : match item . kind {
401
- ItemKind :: Mod ( _, ModKind :: Loaded ( ref items, _, _, _) ) => items
388
+ mod_items : match kind {
389
+ ItemKind :: Mod ( _, ModKind :: Loaded ( items, _, _, _) ) => items
402
390
. iter ( )
403
391
. filter ( |i| !matches ! ( i. span. ctxt( ) . outer_expn_data( ) . kind, ExpnKind :: AstPass ( _) ) )
404
392
. map ( |i| i. id )
405
- . collect :: < Vec < _ > > ( ) ,
406
- _ => Vec :: new ( ) ,
393
+ . next ( ) ,
394
+ _ => None ,
407
395
} ,
408
396
} ) ;
409
397
410
- let mut outer = item
411
- . attrs
398
+ let mut outer = attrs
412
399
. iter ( )
413
400
. filter ( |attr| attr. style == AttrStyle :: Outer && !attr. span . from_expansion ( ) )
414
401
. map ( |attr| Stop :: from_attr ( cx, attr) )
@@ -448,6 +435,58 @@ impl EarlyLintPass for EmptyLineAfter {
448
435
}
449
436
}
450
437
451
- self . check_gaps ( cx, & gaps, item. id ) ;
438
+ self . check_gaps ( cx, & gaps, id) ;
439
+ }
440
+ }
441
+
442
+ impl EarlyLintPass for EmptyLineAfter {
443
+ fn check_crate ( & mut self , _: & EarlyContext < ' _ > , krate : & Crate ) {
444
+ self . items . push ( ItemInfo {
445
+ kind : "crate" ,
446
+ name : kw:: Crate ,
447
+ span : krate. spans . inner_span . with_hi ( krate. spans . inner_span . lo ( ) ) ,
448
+ mod_items : krate
449
+ . items
450
+ . iter ( )
451
+ . filter ( |i| !matches ! ( i. span. ctxt( ) . outer_expn_data( ) . kind, ExpnKind :: AstPass ( _) ) )
452
+ . map ( |i| i. id )
453
+ . next ( ) ,
454
+ } ) ;
455
+ }
456
+
457
+ fn check_item_post ( & mut self , _: & EarlyContext < ' _ > , _: & Item ) {
458
+ self . items . pop ( ) ;
459
+ }
460
+ fn check_impl_item_post ( & mut self , _: & EarlyContext < ' _ > , _: & Item < AssocItemKind > ) {
461
+ self . items . pop ( ) ;
462
+ }
463
+ fn check_trait_item_post ( & mut self , _: & EarlyContext < ' _ > , _: & Item < AssocItemKind > ) {
464
+ self . items . pop ( ) ;
465
+ }
466
+
467
+ fn check_impl_item ( & mut self , cx : & EarlyContext < ' _ > , item : & Item < AssocItemKind > ) {
468
+ self . check_item_kind (
469
+ cx,
470
+ & item. kind . clone ( ) . into ( ) ,
471
+ & item. ident ,
472
+ item. span ,
473
+ & item. attrs ,
474
+ item. id ,
475
+ ) ;
476
+ }
477
+
478
+ fn check_trait_item ( & mut self , cx : & EarlyContext < ' _ > , item : & Item < AssocItemKind > ) {
479
+ self . check_item_kind (
480
+ cx,
481
+ & item. kind . clone ( ) . into ( ) ,
482
+ & item. ident ,
483
+ item. span ,
484
+ & item. attrs ,
485
+ item. id ,
486
+ ) ;
487
+ }
488
+
489
+ fn check_item ( & mut self , cx : & EarlyContext < ' _ > , item : & Item ) {
490
+ self . check_item_kind ( cx, & item. kind , & item. ident , item. span , & item. attrs , item. id ) ;
452
491
}
453
492
}
0 commit comments