@@ -19,9 +19,9 @@ use hir::def::Def;
19
19
use hir:: def_id:: { CrateNum , DefId , LocalDefId , LOCAL_CRATE } ;
20
20
use hir:: map:: Map ;
21
21
use hir:: { GenericArg , GenericParam , ItemLocalId , LifetimeName , ParamName , Node } ;
22
- use ty:: { self , TyCtxt , GenericParamDefKind } ;
22
+ use ty:: { self , TyCtxt , DefIdTree , GenericParamDefKind } ;
23
23
24
- use errors:: DiagnosticBuilder ;
24
+ use errors:: { Applicability , DiagnosticBuilder } ;
25
25
use rustc:: lint;
26
26
use rustc_data_structures:: sync:: Lrc ;
27
27
use session:: Session ;
@@ -1398,6 +1398,30 @@ impl<'a, 'tcx> LifetimeContext<'a, 'tcx> {
1398
1398
self . xcrate_object_lifetime_defaults = this. xcrate_object_lifetime_defaults ;
1399
1399
}
1400
1400
1401
+ /// helper method to determine the span to remove when suggesting the
1402
+ /// deletion of a lifetime
1403
+ fn lifetime_deletion_span ( & self , name : ast:: Ident , generics : & hir:: Generics ) -> Option < Span > {
1404
+ if generics. params . len ( ) == 1 {
1405
+ // if sole lifetime, remove the `<>` brackets
1406
+ Some ( generics. span )
1407
+ } else {
1408
+ generics. params . iter ( ) . enumerate ( )
1409
+ . find_map ( |( i, param) | {
1410
+ if param. name . ident ( ) == name {
1411
+ // We also want to delete a leading or trailing comma
1412
+ // as appropriate
1413
+ if i >= generics. params . len ( ) - 1 {
1414
+ Some ( generics. params [ i-1 ] . span . shrink_to_hi ( ) . to ( param. span ) )
1415
+ } else {
1416
+ Some ( param. span . to ( generics. params [ i+1 ] . span . shrink_to_lo ( ) ) )
1417
+ }
1418
+ } else {
1419
+ None
1420
+ }
1421
+ } )
1422
+ }
1423
+ }
1424
+
1401
1425
fn check_uses_for_lifetimes_defined_by_scope ( & mut self ) {
1402
1426
let defined_by = match self . scope {
1403
1427
Scope :: Binder { lifetimes, .. } => lifetimes,
@@ -1468,12 +1492,26 @@ impl<'a, 'tcx> LifetimeContext<'a, 'tcx> {
1468
1492
_ => None ,
1469
1493
} {
1470
1494
debug ! ( "id ={:?} span = {:?} name = {:?}" , node_id, span, name) ;
1471
- self . tcx . struct_span_lint_node (
1495
+ let mut err = self . tcx . struct_span_lint_node (
1472
1496
lint:: builtin:: UNUSED_LIFETIMES ,
1473
1497
id,
1474
1498
span,
1475
1499
& format ! ( "lifetime parameter `{}` never used" , name)
1476
- ) . emit ( ) ;
1500
+ ) ;
1501
+ if let Some ( parent_def_id) = self . tcx . parent ( def_id) {
1502
+ if let Some ( generics) = self . tcx . hir . get_generics ( parent_def_id) {
1503
+ let unused_lt_span = self . lifetime_deletion_span ( name, generics) ;
1504
+ if let Some ( span) = unused_lt_span {
1505
+ err. span_suggestion_with_applicability (
1506
+ span,
1507
+ "remove it" ,
1508
+ String :: new ( ) ,
1509
+ Applicability :: MachineApplicable
1510
+ ) ;
1511
+ }
1512
+ }
1513
+ }
1514
+ err. emit ( ) ;
1477
1515
}
1478
1516
}
1479
1517
}
0 commit comments