Skip to content

Commit 32a2f0d

Browse files
committed
suggest calling the method of the same name when method not found
1 parent 9be2f35 commit 32a2f0d

File tree

6 files changed

+61
-16
lines changed

6 files changed

+61
-16
lines changed

compiler/rustc_resolve/src/late/diagnostics.rs

+12-12
Original file line numberDiff line numberDiff line change
@@ -213,26 +213,26 @@ impl<'a: 'ast, 'ast> LateResolutionVisitor<'a, '_, 'ast> {
213213
let (mod_prefix, mod_str, suggestion) = if path.len() == 1 {
214214
debug!(?self.diagnostic_metadata.current_impl_items);
215215
debug!(?self.diagnostic_metadata.current_function);
216-
let suggestion = if let Some(items) = self.diagnostic_metadata.current_impl_items
216+
let suggestion = if self.current_trait_ref.is_none()
217217
&& let Some((fn_kind, _)) = self.diagnostic_metadata.current_function
218-
&& self.current_trait_ref.is_none()
219218
&& let Some(FnCtxt::Assoc(_)) = fn_kind.ctxt()
219+
&& let Some(items) = self.diagnostic_metadata.current_impl_items
220220
&& let Some(item) = items.iter().find(|i| {
221-
if let AssocItemKind::Fn(fn_) = &i.kind
222-
&& !fn_.sig.decl.has_self()
223-
&& i.ident.name == item_str.name
221+
if let AssocItemKind::Fn(_) = &i.kind && i.ident.name == item_str.name
224222
{
225223
debug!(?item_str.name);
226-
debug!(?fn_.sig.decl.inputs);
227224
return true
228225
}
229226
false
230227
})
228+
&& let AssocItemKind::Fn(fn_) = &item.kind
231229
{
230+
debug!(?fn_);
231+
let self_sugg = if fn_.sig.decl.has_self() { "self." } else { "Self::" };
232232
Some((
233-
item_span,
233+
item_span.shrink_to_lo(),
234234
"consider using the associated function",
235-
format!("Self::{}", item.ident)
235+
self_sugg.to_string()
236236
))
237237
} else {
238238
None
@@ -381,11 +381,13 @@ impl<'a: 'ast, 'ast> LateResolutionVisitor<'a, '_, 'ast> {
381381
}
382382

383383
fn suggest_self_or_self_ref(&mut self, err: &mut Diagnostic, path: &[Segment], span: Span) {
384-
let is_assoc_fn = self.self_type_is_available();
384+
if !self.self_type_is_available() {
385+
return;
386+
}
385387
let Some(path_last_segment) = path.last() else { return };
386388
let item_str = path_last_segment.ident;
387389
// Emit help message for fake-self from other languages (e.g., `this` in Javascript).
388-
if ["this", "my"].contains(&item_str.as_str()) && is_assoc_fn {
390+
if ["this", "my"].contains(&item_str.as_str()) {
389391
err.span_suggestion_short(
390392
span,
391393
"you might have meant to use `self` here instead",
@@ -436,7 +438,6 @@ impl<'a: 'ast, 'ast> LateResolutionVisitor<'a, '_, 'ast> {
436438
let is_enum_variant = &|res| matches!(res, Res::Def(DefKind::Variant, _));
437439
let path_str = Segment::names_to_string(path);
438440
let ident_span = path.last().map_or(span, |ident| ident.ident.span);
439-
440441
let mut candidates = self
441442
.r
442443
.lookup_import_candidates(ident, ns, &self.parent_scope, is_expected)
@@ -1512,7 +1513,6 @@ impl<'a: 'ast, 'ast> LateResolutionVisitor<'a, '_, 'ast> {
15121513
_ => None,
15131514
}
15141515
}
1515-
15161516
// Fields are generally expected in the same contexts as locals.
15171517
if filter_fn(Res::Local(ast::DUMMY_NODE_ID)) {
15181518
if let Some(node_id) =

src/test/ui/resolve/issue-103474.rs

+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
struct S {}
2+
impl S {
3+
fn first(&self) {}
4+
5+
fn second(&self) {
6+
first()
7+
//~^ ERROR cannot find function `first` in this scope
8+
}
9+
10+
fn third(&self) {
11+
no_method_err()
12+
//~^ ERROR cannot find function `no_method_err` in this scope
13+
}
14+
}
15+
16+
fn main() {}
+20
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
error[E0425]: cannot find function `first` in this scope
2+
--> $DIR/issue-103474.rs:6:9
3+
|
4+
LL | first()
5+
| ^^^^^ not found in this scope
6+
|
7+
help: consider using the associated function
8+
|
9+
LL | self.first()
10+
| +++++
11+
12+
error[E0425]: cannot find function `no_method_err` in this scope
13+
--> $DIR/issue-103474.rs:11:9
14+
|
15+
LL | no_method_err()
16+
| ^^^^^^^^^^^^^ not found in this scope
17+
18+
error: aborting due to 2 previous errors
19+
20+
For more information about this error, try `rustc --explain E0425`.

src/test/ui/resolve/issue-2356.stderr

+2-2
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ LL | static_method();
8585
help: consider using the associated function
8686
|
8787
LL | Self::static_method();
88-
| ~~~~~~~~~~~~~~~~~~~
88+
| ++++++
8989

9090
error[E0425]: cannot find function `purr` in this scope
9191
--> $DIR/issue-2356.rs:54:9
@@ -114,7 +114,7 @@ LL | grow_older();
114114
help: consider using the associated function
115115
|
116116
LL | Self::grow_older();
117-
| ~~~~~~~~~~~~~~~~
117+
| ++++++
118118

119119
error[E0425]: cannot find function `shave` in this scope
120120
--> $DIR/issue-2356.rs:74:5

src/test/ui/self/class-missing-self.stderr

+4
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,10 @@ error[E0425]: cannot find function `sleep` in this scope
1010
LL | sleep();
1111
| ^^^^^ not found in this scope
1212
|
13+
help: consider using the associated function
14+
|
15+
LL | self.sleep();
16+
| +++++
1317
help: consider importing this function
1418
|
1519
LL | use std::thread::sleep;

src/test/ui/suggestions/assoc_fn_without_self.stderr

+7-2
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,18 @@ LL | foo();
77
help: consider using the associated function
88
|
99
LL | Self::foo();
10-
| ~~~~~~~~~
10+
| ++++++
1111

1212
error[E0425]: cannot find function `bar` in this scope
1313
--> $DIR/assoc_fn_without_self.rs:17:9
1414
|
1515
LL | bar();
1616
| ^^^ not found in this scope
17+
|
18+
help: consider using the associated function
19+
|
20+
LL | self.bar();
21+
| +++++
1722

1823
error[E0425]: cannot find function `baz` in this scope
1924
--> $DIR/assoc_fn_without_self.rs:18:9
@@ -24,7 +29,7 @@ LL | baz(2, 3);
2429
help: consider using the associated function
2530
|
2631
LL | Self::baz(2, 3);
27-
| ~~~~~~~~~
32+
| ++++++
2833

2934
error[E0425]: cannot find function `foo` in this scope
3035
--> $DIR/assoc_fn_without_self.rs:14:13

0 commit comments

Comments
 (0)