Skip to content

Commit 2168c0b

Browse files
committed
Extract checking for self arg to separate method
1 parent 7353afd commit 2168c0b

File tree

1 file changed

+40
-35
lines changed

1 file changed

+40
-35
lines changed

src/librustc_resolve/late/diagnostics.rs

+40-35
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)