@@ -156,15 +156,16 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
156
156
segment. ident. name
157
157
) ) ;
158
158
159
- let ( self_adjusted, precise) = self . adjust_expr ( pick, self_expr) ;
159
+ let ( self_adjusted, precise) = self . adjust_expr ( pick, self_expr, sp ) ;
160
160
if precise {
161
161
let args = args
162
162
. iter ( )
163
163
. skip ( 1 )
164
164
. map ( |arg| {
165
+ let span = arg. span . find_ancestor_inside ( sp) . unwrap_or_default ( ) ;
165
166
format ! (
166
167
", {}" ,
167
- self . sess( ) . source_map( ) . span_to_snippet( arg . span) . unwrap( )
168
+ self . sess( ) . source_map( ) . span_to_snippet( span) . unwrap( )
168
169
)
169
170
} )
170
171
. collect :: < String > ( ) ;
@@ -272,11 +273,10 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
272
273
method_name. name
273
274
) ) ;
274
275
275
- let mut self_ty_name = self
276
- . sess ( )
277
- . source_map ( )
278
- . span_to_snippet ( self_ty_span)
279
- . unwrap_or_else ( |_| self_ty. to_string ( ) ) ;
276
+ let mut self_ty_name = self_ty_span
277
+ . find_ancestor_inside ( span)
278
+ . and_then ( |span| self . sess ( ) . source_map ( ) . span_to_snippet ( span) . ok ( ) )
279
+ . unwrap_or_else ( || self_ty. to_string ( ) ) ;
280
280
281
281
// Get the number of generics the self type has (if an Adt) unless we can determine that
282
282
// the user has written the self type with generics already which we (naively) do by looking
@@ -370,7 +370,12 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
370
370
/// Creates a string version of the `expr` that includes explicit adjustments.
371
371
/// Returns the string and also a bool indicating whther this is a *precise*
372
372
/// suggestion.
373
- fn adjust_expr ( & self , pick : & Pick < ' tcx > , expr : & hir:: Expr < ' tcx > ) -> ( String , bool ) {
373
+ fn adjust_expr (
374
+ & self ,
375
+ pick : & Pick < ' tcx > ,
376
+ expr : & hir:: Expr < ' tcx > ,
377
+ outer : Span ,
378
+ ) -> ( String , bool ) {
374
379
let derefs = "*" . repeat ( pick. autoderefs ) ;
375
380
376
381
let autoref = match pick. autoref_or_ptr_adjustment {
@@ -379,12 +384,15 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
379
384
Some ( probe:: AutorefOrPtrAdjustment :: ToConstPtr ) | None => "" ,
380
385
} ;
381
386
382
- let ( expr_text, precise) =
383
- if let Ok ( expr_text) = self . sess ( ) . source_map ( ) . span_to_snippet ( expr. span ) {
384
- ( expr_text, true )
385
- } else {
386
- ( "(..)" . to_string ( ) , false )
387
- } ;
387
+ let ( expr_text, precise) = if let Some ( expr_text) = expr
388
+ . span
389
+ . find_ancestor_inside ( outer)
390
+ . and_then ( |span| self . sess ( ) . source_map ( ) . span_to_snippet ( span) . ok ( ) )
391
+ {
392
+ ( expr_text, true )
393
+ } else {
394
+ ( "(..)" . to_string ( ) , false )
395
+ } ;
388
396
389
397
let adjusted_text = if let Some ( probe:: AutorefOrPtrAdjustment :: ToConstPtr ) =
390
398
pick. autoref_or_ptr_adjustment
0 commit comments