11use clippy_config:: msrvs:: { self , Msrv } ;
22use clippy_utils:: diagnostics:: span_lint_and_then;
3- use clippy_utils:: source:: { get_source_text , with_leading_whitespace , SpanRange } ;
3+ use clippy_utils:: source:: { IntoSpan , SpanRangeExt } ;
44use clippy_utils:: ty:: get_field_by_name;
55use clippy_utils:: visitors:: { for_each_expr, for_each_expr_without_closures} ;
66use clippy_utils:: { expr_use_ctxt, is_diag_item_method, is_diag_trait_item, path_to_local_id, ExprUseNode } ;
@@ -9,7 +9,7 @@ use rustc_errors::Applicability;
99use rustc_hir:: { BindingMode , BorrowKind , ByRef , ClosureKind , Expr , ExprKind , Mutability , Node , PatKind } ;
1010use rustc_lint:: LateContext ;
1111use rustc_middle:: ty:: adjustment:: { Adjust , Adjustment , AutoBorrow , AutoBorrowMutability } ;
12- use rustc_span:: { sym, BytePos , Span , Symbol , DUMMY_SP } ;
12+ use rustc_span:: { sym, Span , Symbol , DUMMY_SP } ;
1313
1414use super :: MANUAL_INSPECT ;
1515
@@ -98,17 +98,19 @@ pub(crate) fn check(cx: &LateContext<'_>, expr: &Expr<'_>, arg: &Expr<'_>, name:
9898 let mut addr_of_edits = Vec :: with_capacity ( delayed. len ( ) ) ;
9999 for x in delayed {
100100 match x {
101- UseKind :: Return ( s) => edits. push ( ( with_leading_whitespace ( cx, s ) . set_span_pos ( s ) , String :: new ( ) ) ) ,
101+ UseKind :: Return ( s) => edits. push ( ( s . with_leading_whitespace ( cx) . with_ctxt ( s . ctxt ( ) ) , String :: new ( ) ) ) ,
102102 UseKind :: Borrowed ( s) => {
103- if let Some ( src) = get_source_text ( cx, s)
104- && let Some ( src) = src. as_str ( )
105- && let trim_src = src. trim_start_matches ( [ ' ' , '\t' , '\n' , '\r' , '(' ] )
106- && trim_src. starts_with ( '&' )
107- {
108- let range = s. into_range ( ) ;
109- #[ expect( clippy:: cast_possible_truncation) ]
110- let start = BytePos ( range. start . 0 + ( src. len ( ) - trim_src. len ( ) ) as u32 ) ;
111- addr_of_edits. push ( ( ( start..BytePos ( start. 0 + 1 ) ) . set_span_pos ( s) , String :: new ( ) ) ) ;
103+ #[ expect( clippy:: range_plus_one) ]
104+ let range = s. map_range ( cx, |src, range| {
105+ let src = src. get ( range. clone ( ) ) ?;
106+ let trimmed = src. trim_start_matches ( [ ' ' , '\t' , '\n' , '\r' , '(' ] ) ;
107+ trimmed. starts_with ( '&' ) . then ( || {
108+ let pos = range. start + src. len ( ) - trimmed. len ( ) ;
109+ pos..pos + 1
110+ } )
111+ } ) ;
112+ if let Some ( range) = range {
113+ addr_of_edits. push ( ( range. with_ctxt ( s. ctxt ( ) ) , String :: new ( ) ) ) ;
112114 } else {
113115 requires_copy = true ;
114116 requires_deref = true ;
@@ -174,7 +176,10 @@ pub(crate) fn check(cx: &LateContext<'_>, expr: &Expr<'_>, arg: &Expr<'_>, name:
174176 } ) ,
175177 ) ) ;
176178 edits. push ( (
177- with_leading_whitespace ( cx, final_expr. span ) . set_span_pos ( final_expr. span ) ,
179+ final_expr
180+ . span
181+ . with_leading_whitespace ( cx)
182+ . with_ctxt ( final_expr. span . ctxt ( ) ) ,
178183 String :: new ( ) ,
179184 ) ) ;
180185 let app = if edits. iter ( ) . any ( |( s, _) | s. from_expansion ( ) ) {
0 commit comments