@@ -260,41 +260,9 @@ impl<'a> LateResolutionVisitor<'a, '_> {
260
260
return ( err, candidates) ;
261
261
}
262
262
263
- // Check if the first argument is `self` and suggest calling a method.
264
- let mut has_self_arg = None ;
265
- if let PathSource :: Expr ( parent) = source {
266
- match & parent. map ( |p| & p. kind ) {
267
- Some ( ExprKind :: Call ( _, args) ) if args. len ( ) > 0 => {
268
- let mut expr_kind = & args[ 0 ] . kind ;
269
- loop {
270
- match expr_kind {
271
- ExprKind :: Path ( _, arg_name) if arg_name. segments . len ( ) == 1 => {
272
- if arg_name. segments [ 0 ] . ident . name == kw:: SelfLower {
273
- let call_span = parent. unwrap ( ) . span ;
274
- let args_span = if args. len ( ) > 1 {
275
- Some ( Span :: new (
276
- args[ 1 ] . span . lo ( ) ,
277
- args. last ( ) . unwrap ( ) . span . hi ( ) ,
278
- call_span. ctxt ( ) ,
279
- ) )
280
- } else {
281
- None
282
- } ;
283
- has_self_arg = Some ( ( call_span, args_span) ) ;
284
- }
285
- break ;
286
- } ,
287
- ExprKind :: AddrOf ( _, _, expr) => expr_kind = & expr. kind ,
288
- _ => break ,
289
- }
290
- }
291
- }
292
- _ => ( ) ,
293
- }
294
- } ;
295
-
296
- if let Some ( ( call_span, args_span) ) = has_self_arg {
297
- let mut args_snippet: String = String :: from ( "" ) ;
263
+ // If the first argument in call is `self` suggest calling a method.
264
+ if let Some ( ( call_span, args_span) ) = self . call_has_self_arg ( source) {
265
+ let mut args_snippet = String :: new ( ) ;
298
266
if let Some ( args_span) = args_span {
299
267
if let Ok ( snippet) = self . r . session . source_map ( ) . span_to_snippet ( args_span) {
300
268
args_snippet = snippet;
@@ -348,6 +316,43 @@ impl<'a> LateResolutionVisitor<'a, '_> {
348
316
( err, candidates)
349
317
}
350
318
319
+ /// Check if the source is call expression and the first argument is `self`. If true,
320
+ /// return the span of whole call and the span for all arguments expect the first one (`self`).
321
+ fn call_has_self_arg ( & self , source : PathSource < ' _ > ) -> Option < ( Span , Option < Span > ) > {
322
+ let mut has_self_arg = None ;
323
+ if let PathSource :: Expr ( parent) = source {
324
+ match & parent. map ( |p| & p. kind ) {
325
+ Some ( ExprKind :: Call ( _, args) ) if args. len ( ) > 0 => {
326
+ let mut expr_kind = & args[ 0 ] . kind ;
327
+ loop {
328
+ match expr_kind {
329
+ ExprKind :: Path ( _, arg_name) if arg_name. segments . len ( ) == 1 => {
330
+ if arg_name. segments [ 0 ] . ident . name == kw:: SelfLower {
331
+ let call_span = parent. unwrap ( ) . span ;
332
+ let tail_args_span = if args. len ( ) > 1 {
333
+ Some ( Span :: new (
334
+ args[ 1 ] . span . lo ( ) ,
335
+ args. last ( ) . unwrap ( ) . span . hi ( ) ,
336
+ call_span. ctxt ( ) ,
337
+ ) )
338
+ } else {
339
+ None
340
+ } ;
341
+ has_self_arg = Some ( ( call_span, tail_args_span) ) ;
342
+ }
343
+ break ;
344
+ }
345
+ ExprKind :: AddrOf ( _, _, expr) => expr_kind = & expr. kind ,
346
+ _ => break ,
347
+ }
348
+ }
349
+ }
350
+ _ => ( ) ,
351
+ }
352
+ } ;
353
+ return has_self_arg;
354
+ }
355
+
351
356
fn followed_by_brace ( & self , span : Span ) -> ( bool , Option < ( Span , String ) > ) {
352
357
// HACK(estebank): find a better way to figure out that this was a
353
358
// parser issue where a struct literal is being used on an expression
0 commit comments