@@ -11,7 +11,7 @@ use rustc_middle::ty::adjustment;
11
11
use rustc_middle:: ty:: { self , Ty } ;
12
12
use rustc_span:: symbol:: Symbol ;
13
13
use rustc_span:: symbol:: { kw, sym} ;
14
- use rustc_span:: { BytePos , Span , DUMMY_SP } ;
14
+ use rustc_span:: { BytePos , Span } ;
15
15
16
16
declare_lint ! {
17
17
/// The `unused_must_use` lint detects unused result of a type flagged as
@@ -504,23 +504,23 @@ trait UnusedDelimLint {
504
504
ast:: ExprKind :: Block ( ref block, None ) if block. stmts . len ( ) > 0 => {
505
505
let start = block. stmts [ 0 ] . span ;
506
506
let end = block. stmts [ block. stmts . len ( ) - 1 ] . span ;
507
- if value. span . from_expansion ( ) || start. from_expansion ( ) || end. from_expansion ( ) {
508
- (
509
- value. span . with_hi ( value. span . lo ( ) + BytePos ( 1 ) ) ,
510
- value. span . with_lo ( value. span . hi ( ) - BytePos ( 1 ) ) ,
511
- )
507
+ if let Some ( start) = start. find_ancestor_inside ( value. span )
508
+ && let Some ( end) = end. find_ancestor_inside ( value. span )
509
+ {
510
+ Some ( (
511
+ value. span . with_hi ( start. lo ( ) ) ,
512
+ value. span . with_lo ( end. hi ( ) ) ,
513
+ ) )
512
514
} else {
513
- ( value . span . with_hi ( start . lo ( ) ) , value . span . with_lo ( end . hi ( ) ) )
515
+ None
514
516
}
515
517
}
516
518
ast:: ExprKind :: Paren ( ref expr) => {
517
- if value. span . from_expansion ( ) || expr. span . from_expansion ( ) {
518
- (
519
- value. span . with_hi ( value. span . lo ( ) + BytePos ( 1 ) ) ,
520
- value. span . with_lo ( value. span . hi ( ) - BytePos ( 1 ) ) ,
521
- )
519
+ let expr_span = expr. span . find_ancestor_inside ( value. span ) ;
520
+ if let Some ( expr_span) = expr_span {
521
+ Some ( ( value. span . with_hi ( expr_span. lo ( ) ) , value. span . with_lo ( expr_span. hi ( ) ) ) )
522
522
} else {
523
- ( value . span . with_hi ( expr . span . lo ( ) ) , value . span . with_lo ( expr . span . hi ( ) ) )
523
+ None
524
524
}
525
525
}
526
526
_ => return ,
@@ -529,36 +529,38 @@ trait UnusedDelimLint {
529
529
left_pos. map_or ( false , |s| s >= value. span . lo ( ) ) ,
530
530
right_pos. map_or ( false , |s| s <= value. span . hi ( ) ) ,
531
531
) ;
532
- self . emit_unused_delims ( cx, spans, ctx. into ( ) , keep_space) ;
532
+ self . emit_unused_delims ( cx, value . span , spans, ctx. into ( ) , keep_space) ;
533
533
}
534
534
535
535
fn emit_unused_delims (
536
536
& self ,
537
537
cx : & EarlyContext < ' _ > ,
538
- spans : ( Span , Span ) ,
538
+ value_span : Span ,
539
+ spans : Option < ( Span , Span ) > ,
539
540
msg : & str ,
540
541
keep_space : ( bool , bool ) ,
541
542
) {
542
- // FIXME(flip1995): Quick and dirty fix for #70814. This should be fixed in rustdoc
543
- // properly.
544
- if spans . 0 == DUMMY_SP || spans . 1 == DUMMY_SP {
545
- return ;
546
- }
547
-
548
- cx . struct_span_lint ( self . lint ( ) , MultiSpan :: from ( vec ! [ spans . 0 , spans . 1 ] ) , |lint| {
549
- let replacement = vec ! [
550
- ( spans . 0 , if keep_space . 0 { " " . into ( ) } else { "" . into ( ) } ) ,
551
- ( spans . 1 , if keep_space . 1 { " " . into ( ) } else { "" . into ( ) } ) ,
552
- ] ;
553
- lint . build ( fluent :: lint :: unused_delim )
554
- . set_arg ( "delim" , Self :: DELIM_STR )
555
- . set_arg ( "item" , msg )
556
- . multipart_suggestion (
543
+ let primary_span = if let Some ( ( lo , hi ) ) = spans {
544
+ MultiSpan :: from ( vec ! [ lo , hi ] )
545
+ } else {
546
+ MultiSpan :: from ( value_span )
547
+ } ;
548
+ cx . struct_span_lint ( self . lint ( ) , primary_span , |lint| {
549
+ let mut db = lint . build ( fluent :: lint:: unused_delim ) ;
550
+ db . set_arg ( "delim" , Self :: DELIM_STR ) ;
551
+ db . set_arg ( "item" , msg ) ;
552
+ if let Some ( ( lo , hi ) ) = spans {
553
+ let replacement = vec ! [
554
+ ( lo , if keep_space . 0 { " " . into ( ) } else { "" . into ( ) } ) ,
555
+ ( hi , if keep_space . 1 { " " . into ( ) } else { "" . into ( ) } ) ,
556
+ ] ;
557
+ db . multipart_suggestion (
557
558
fluent:: lint:: suggestion,
558
559
replacement,
559
560
Applicability :: MachineApplicable ,
560
- )
561
- . emit ( ) ;
561
+ ) ;
562
+ }
563
+ db. emit ( ) ;
562
564
} ) ;
563
565
}
564
566
@@ -766,15 +768,12 @@ impl UnusedParens {
766
768
// Otherwise proceed with linting.
767
769
_ => { }
768
770
}
769
- let spans = if value. span . from_expansion ( ) || inner. span . from_expansion ( ) {
770
- (
771
- value. span . with_hi ( value. span . lo ( ) + BytePos ( 1 ) ) ,
772
- value. span . with_lo ( value. span . hi ( ) - BytePos ( 1 ) ) ,
773
- )
771
+ let spans = if let Some ( inner) = inner. span . find_ancestor_inside ( value. span ) {
772
+ Some ( ( value. span . with_hi ( inner. lo ( ) ) , value. span . with_lo ( inner. hi ( ) ) ) )
774
773
} else {
775
- ( value . span . with_hi ( inner . span . lo ( ) ) , value . span . with_lo ( inner . span . hi ( ) ) )
774
+ None
776
775
} ;
777
- self . emit_unused_delims ( cx, spans, "pattern" , ( false , false ) ) ;
776
+ self . emit_unused_delims ( cx, value . span , spans, "pattern" , ( false , false ) ) ;
778
777
}
779
778
}
780
779
}
@@ -879,15 +878,12 @@ impl EarlyLintPass for UnusedParens {
879
878
) ;
880
879
}
881
880
_ => {
882
- let spans = if ty. span . from_expansion ( ) || r. span . from_expansion ( ) {
883
- (
884
- ty. span . with_hi ( ty. span . lo ( ) + BytePos ( 1 ) ) ,
885
- ty. span . with_lo ( ty. span . hi ( ) - BytePos ( 1 ) ) ,
886
- )
881
+ let spans = if let Some ( r) = r. span . find_ancestor_inside ( ty. span ) {
882
+ Some ( ( ty. span . with_hi ( r. lo ( ) ) , ty. span . with_lo ( r. hi ( ) ) ) )
887
883
} else {
888
- ( ty . span . with_hi ( r . span . lo ( ) ) , ty . span . with_lo ( r . span . hi ( ) ) )
884
+ None
889
885
} ;
890
- self . emit_unused_delims ( cx, spans, "type" , ( false , false ) ) ;
886
+ self . emit_unused_delims ( cx, ty . span , spans, "type" , ( false , false ) ) ;
891
887
}
892
888
}
893
889
}
0 commit comments