1
Fork 0

More accurate suggestion for self. and Self::

Fix #115992.
This commit is contained in:
Esteban Küber 2023-09-23 01:34:50 +00:00
parent 0fd7ce99b0
commit c4a4926083
3 changed files with 60 additions and 11 deletions

View file

@ -224,14 +224,21 @@ impl<'a: 'ast, 'ast, 'tcx> LateResolutionVisitor<'a, '_, 'ast, 'tcx> {
&& let FnKind::Fn(_, _, sig, ..) = fn_kind && let FnKind::Fn(_, _, sig, ..) = fn_kind
&& let Some(items) = self.diagnostic_metadata.current_impl_items && let Some(items) = self.diagnostic_metadata.current_impl_items
&& let Some(item) = items.iter().find(|i| { && let Some(item) = items.iter().find(|i| {
if let AssocItemKind::Fn(..) | AssocItemKind::Const(..) = &i.kind if i.ident.name == item_str.name
&& i.ident.name == item_str.name // Don't suggest if the item is in Fn signature arguments (#112590).
// don't suggest if the item is in Fn signature arguments
// issue #112590
&& !sig.span.contains(item_span) && !sig.span.contains(item_span)
{ {
debug!(?item_str.name); debug!(?item_str.name);
return true return match &i.kind {
AssocItemKind::Fn(fn_)
if !sig.decl.has_self() && fn_.sig.decl.has_self() => {
// Ensure that we only suggest `self.` if `self` is available,
// you can't call `fn foo(&self)` from `fn bar()` (#115992).
false
}
AssocItemKind::Fn(_) | AssocItemKind::Const(..) => true,
_ => false
}
} }
false false
}) })

View file

@ -17,4 +17,12 @@ impl S {
bar(); //~ ERROR cannot find function `bar` in this scope bar(); //~ ERROR cannot find function `bar` in this scope
baz(2, 3); //~ ERROR cannot find function `baz` in this scope baz(2, 3); //~ ERROR cannot find function `baz` in this scope
} }
fn d(&self) {
fn c() {
foo(); //~ ERROR cannot find function `foo` in this scope
}
foo(); //~ ERROR cannot find function `foo` in this scope
bar(); //~ ERROR cannot find function `bar` in this scope
baz(2, 3); //~ ERROR cannot find function `baz` in this scope
}
} }

View file

@ -14,11 +14,6 @@ error[E0425]: cannot find function `bar` in this scope
| |
LL | bar(); LL | bar();
| ^^^ not found in this scope | ^^^ not found in this scope
|
help: consider using the associated function
|
LL | self.bar();
| +++++
error[E0425]: cannot find function `baz` in this scope error[E0425]: cannot find function `baz` in this scope
--> $DIR/assoc_fn_without_self.rs:18:9 --> $DIR/assoc_fn_without_self.rs:18:9
@ -37,6 +32,45 @@ error[E0425]: cannot find function `foo` in this scope
LL | foo(); LL | foo();
| ^^^ not found in this scope | ^^^ not found in this scope
error: aborting due to 4 previous errors error[E0425]: cannot find function `foo` in this scope
--> $DIR/assoc_fn_without_self.rs:24:9
|
LL | foo();
| ^^^ not found in this scope
|
help: consider using the associated function
|
LL | Self::foo();
| ++++++
error[E0425]: cannot find function `bar` in this scope
--> $DIR/assoc_fn_without_self.rs:25:9
|
LL | bar();
| ^^^ not found in this scope
|
help: consider using the associated function
|
LL | self.bar();
| +++++
error[E0425]: cannot find function `baz` in this scope
--> $DIR/assoc_fn_without_self.rs:26:9
|
LL | baz(2, 3);
| ^^^ not found in this scope
|
help: consider using the associated function
|
LL | Self::baz(2, 3);
| ++++++
error[E0425]: cannot find function `foo` in this scope
--> $DIR/assoc_fn_without_self.rs:22:13
|
LL | foo();
| ^^^ not found in this scope
error: aborting due to 8 previous errors
For more information about this error, try `rustc --explain E0425`. For more information about this error, try `rustc --explain E0425`.