@@ -2073,47 +2073,85 @@ impl<'tcx> LifetimeContext<'_, 'tcx> {
20732073 continue ;
20742074 }
20752075 } ) ;
2076- let span_unnamed_borrow = |span : Span | {
2077- let lo = span. lo ( ) + BytePos ( 1 ) ;
2078- span. with_lo ( lo) . with_hi ( lo)
2079- } ;
2080- let span_underscore_borrow = |span : Span | {
2081- let lo = span. lo ( ) + BytePos ( 1 ) ;
2082- let hi = lo + BytePos ( 2 ) ;
2083- span. with_lo ( lo) . with_hi ( hi)
2084- } ;
2085- let unnamed_borrow =
2086- |snippet : & str | snippet. starts_with ( '&' ) && !snippet. starts_with ( "&'" ) ;
2076+
2077+ struct Lifetime ( Span , String ) ;
2078+ impl Lifetime {
2079+ fn is_unnamed ( & self ) -> bool {
2080+ self . 1 . starts_with ( '&' ) && !self . 1 . starts_with ( "&'" )
2081+ }
2082+ fn is_underscore ( & self ) -> bool {
2083+ self . 1 . starts_with ( "&'_ " )
2084+ }
2085+ fn is_named ( & self ) -> bool {
2086+ self . 1 . starts_with ( "&'" )
2087+ }
2088+ fn suggestion ( & self , sugg : String ) -> Option < ( Span , String ) > {
2089+ Some (
2090+ match (
2091+ self . is_unnamed ( ) ,
2092+ self . is_underscore ( ) ,
2093+ self . is_named ( ) ,
2094+ sugg. starts_with ( "&" ) ,
2095+ ) {
2096+ ( true , _, _, false ) => ( self . span_unnamed_borrow ( ) , sugg) ,
2097+ ( true , _, _, true ) => {
2098+ ( self . span_unnamed_borrow ( ) , sugg[ 1 ..] . to_string ( ) )
2099+ }
2100+ ( _, true , _, false ) => {
2101+ ( self . span_underscore_borrow ( ) , sugg. trim ( ) . to_string ( ) )
2102+ }
2103+ ( _, true , _, true ) => {
2104+ ( self . span_underscore_borrow ( ) , sugg[ 1 ..] . trim ( ) . to_string ( ) )
2105+ }
2106+ ( _, _, true , false ) => {
2107+ ( self . span_named_borrow ( ) , sugg. trim ( ) . to_string ( ) )
2108+ }
2109+ ( _, _, true , true ) => {
2110+ ( self . span_named_borrow ( ) , sugg[ 1 ..] . trim ( ) . to_string ( ) )
2111+ }
2112+ _ => return None ,
2113+ } ,
2114+ )
2115+ }
2116+ fn span_unnamed_borrow ( & self ) -> Span {
2117+ let lo = self . 0 . lo ( ) + BytePos ( 1 ) ;
2118+ self . 0 . with_lo ( lo) . with_hi ( lo)
2119+ }
2120+ fn span_named_borrow ( & self ) -> Span {
2121+ let lo = self . 0 . lo ( ) + BytePos ( 1 ) ;
2122+ self . 0 . with_lo ( lo)
2123+ }
2124+ fn span_underscore_borrow ( & self ) -> Span {
2125+ let lo = self . 0 . lo ( ) + BytePos ( 1 ) ;
2126+ let hi = lo + BytePos ( 2 ) ;
2127+ self . 0 . with_lo ( lo) . with_hi ( hi)
2128+ }
2129+ }
2130+
20872131 for param in params {
20882132 if let Ok ( snippet) = self . tcx . sess . source_map ( ) . span_to_snippet ( param. span ) {
2089- if unnamed_borrow ( & snippet) {
2090- let span = span_unnamed_borrow ( param. span ) ;
2091- introduce_suggestion. push ( ( span, "'a " . to_string ( ) ) ) ;
2092- } else if snippet. starts_with ( "&'_ " ) {
2093- let span = span_underscore_borrow ( param. span ) ;
2094- introduce_suggestion. push ( ( span, "'a" . to_string ( ) ) ) ;
2133+ if let Some ( ( span, sugg) ) =
2134+ Lifetime ( param. span , snippet) . suggestion ( "'a " . to_string ( ) )
2135+ {
2136+ introduce_suggestion. push ( ( span, sugg) ) ;
20952137 }
20962138 }
20972139 }
20982140 for ( span, sugg) in spans_with_counts. iter ( ) . copied ( ) . zip ( suggs. iter ( ) ) . filter_map (
2099- |( ( span, _) , sugg) | match sugg {
2100- Some ( sugg) => Some ( ( span, sugg) ) ,
2141+ |( ( span, _) , sugg) | match & sugg {
2142+ Some ( sugg) => Some ( ( span, sugg. to_string ( ) ) ) ,
21012143 _ => None ,
21022144 } ,
21032145 ) {
2104- match self . tcx . sess . source_map ( ) . span_to_snippet ( span) {
2105- Ok ( snippet) if unnamed_borrow ( & snippet) && sugg. starts_with ( "&" ) => {
2106- let span = span_unnamed_borrow ( span) ;
2107- introduce_suggestion. push ( ( span, sugg[ 1 ..] . to_string ( ) ) ) ;
2108- }
2109- Ok ( snippet) if snippet. starts_with ( "&'_ " ) && sugg. starts_with ( "&" ) => {
2110- let span = span_underscore_borrow ( span) ;
2111- introduce_suggestion. push ( ( span, sugg[ 1 ..] . to_string ( ) ) ) ;
2112- }
2113- _ => {
2114- introduce_suggestion. push ( ( span, sugg. to_string ( ) ) ) ;
2115- }
2116- }
2146+ let ( span, sugg) = self
2147+ . tcx
2148+ . sess
2149+ . source_map ( )
2150+ . span_to_snippet ( span)
2151+ . ok ( )
2152+ . and_then ( |snippet| Lifetime ( span, snippet) . suggestion ( sugg. clone ( ) ) )
2153+ . unwrap_or ( ( span, sugg) ) ;
2154+ introduce_suggestion. push ( ( span, sugg. to_string ( ) ) ) ;
21172155 }
21182156 err. multipart_suggestion_with_style (
21192157 & msg,
0 commit comments