@@ -137,28 +137,8 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
137137 segment. ident. name
138138 ) ) ;
139139
140- if let Ok ( self_expr) = self . sess ( ) . source_map ( ) . span_to_snippet ( self_expr. span )
141- {
142- let derefs = "*" . repeat ( pick. autoderefs ) ;
143-
144- let autoref = match pick. autoref_or_ptr_adjustment {
145- Some ( probe:: AutorefOrPtrAdjustment :: Autoref {
146- mutbl : Mutability :: Mut ,
147- ..
148- } ) => "&mut " ,
149- Some ( probe:: AutorefOrPtrAdjustment :: Autoref {
150- mutbl : Mutability :: Not ,
151- ..
152- } ) => "&" ,
153- Some ( probe:: AutorefOrPtrAdjustment :: ToConstPtr ) | None => "" ,
154- } ;
155- let self_adjusted = if let Some ( probe:: AutorefOrPtrAdjustment :: ToConstPtr ) =
156- pick. autoref_or_ptr_adjustment
157- {
158- format ! ( "{}{} as *const _" , derefs, self_expr)
159- } else {
160- format ! ( "{}{}{}" , autoref, derefs, self_expr)
161- } ;
140+ let ( self_adjusted, precise) = self . adjust_expr ( pick, self_expr) ;
141+ if precise {
162142 let args = args
163143 . iter ( )
164144 . skip ( 1 )
@@ -317,4 +297,34 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
317297 }
318298 }
319299 }
300+
301+ /// Creates a string version of the `expr` that includes explicit adjustments.
302+ /// Returns the string and also a bool indicating whther this is a *precise*
303+ /// suggestion.
304+ fn adjust_expr ( & self , pick : & Pick < ' tcx > , expr : & hir:: Expr < ' tcx > ) -> ( String , bool ) {
305+ let derefs = "*" . repeat ( pick. autoderefs ) ;
306+
307+ let autoref = match pick. autoref_or_ptr_adjustment {
308+ Some ( probe:: AutorefOrPtrAdjustment :: Autoref { mutbl : Mutability :: Mut , .. } ) => "&mut " ,
309+ Some ( probe:: AutorefOrPtrAdjustment :: Autoref { mutbl : Mutability :: Not , .. } ) => "&" ,
310+ Some ( probe:: AutorefOrPtrAdjustment :: ToConstPtr ) | None => "" ,
311+ } ;
312+
313+ let ( expr_text, precise) =
314+ if let Ok ( expr_text) = self . sess ( ) . source_map ( ) . span_to_snippet ( expr. span ) {
315+ ( expr_text, true )
316+ } else {
317+ ( format ! ( "(..)" ) , false )
318+ } ;
319+
320+ let adjusted_text = if let Some ( probe:: AutorefOrPtrAdjustment :: ToConstPtr ) =
321+ pick. autoref_or_ptr_adjustment
322+ {
323+ format ! ( "{}{} as *const _" , derefs, expr_text)
324+ } else {
325+ format ! ( "{}{}{}" , autoref, derefs, expr_text)
326+ } ;
327+
328+ ( adjusted_text, precise)
329+ }
320330}
0 commit comments