@@ -260,41 +260,9 @@ impl<'a> LateResolutionVisitor<'a, '_> {
260260 return ( err, candidates) ;
261261 }
262262
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 ( ) ;
298266 if let Some ( args_span) = args_span {
299267 if let Ok ( snippet) = self . r . session . source_map ( ) . span_to_snippet ( args_span) {
300268 args_snippet = snippet;
@@ -348,6 +316,43 @@ impl<'a> LateResolutionVisitor<'a, '_> {
348316 ( err, candidates)
349317 }
350318
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+
351356 fn followed_by_brace ( & self , span : Span ) -> ( bool , Option < ( Span , String ) > ) {
352357 // HACK(estebank): find a better way to figure out that this was a
353358 // parser issue where a struct literal is being used on an expression
0 commit comments