1
Fork 0

Point at field definition when unresolved name exists in Self

This commit is contained in:
Esteban Küber 2023-09-23 17:23:16 +00:00
parent 81bca5f5cf
commit d00c7e78ea
6 changed files with 39 additions and 21 deletions

View file

@ -41,7 +41,7 @@ type Res = def::Res<ast::NodeId>;
/// A field or associated item from self type suggested in case of resolution failure. /// A field or associated item from self type suggested in case of resolution failure.
enum AssocSuggestion { enum AssocSuggestion {
Field, Field(Span),
MethodWithSelf { called: bool }, MethodWithSelf { called: bool },
AssocFn { called: bool }, AssocFn { called: bool },
AssocType, AssocType,
@ -51,7 +51,7 @@ enum AssocSuggestion {
impl AssocSuggestion { impl AssocSuggestion {
fn action(&self) -> &'static str { fn action(&self) -> &'static str {
match self { match self {
AssocSuggestion::Field => "use the available field", AssocSuggestion::Field(_) => "use the available field",
AssocSuggestion::MethodWithSelf { called: true } => { AssocSuggestion::MethodWithSelf { called: true } => {
"call the method with the fully-qualified path" "call the method with the fully-qualified path"
} }
@ -670,7 +670,7 @@ impl<'a: 'ast, 'ast, 'tcx> LateResolutionVisitor<'a, '_, 'ast, 'tcx> {
_ => String::new(), _ => String::new(),
}; };
match candidate { match candidate {
AssocSuggestion::Field => { AssocSuggestion::Field(field_span) => {
if self_is_available { if self_is_available {
err.span_suggestion_verbose( err.span_suggestion_verbose(
span.shrink_to_lo(), span.shrink_to_lo(),
@ -679,7 +679,7 @@ impl<'a: 'ast, 'ast, 'tcx> LateResolutionVisitor<'a, '_, 'ast, 'tcx> {
Applicability::MachineApplicable, Applicability::MachineApplicable,
); );
} else { } else {
err.span_label(span, "a field by this name exists in `Self`"); err.span_label(field_span, "a field by that name exists in `Self`");
} }
} }
AssocSuggestion::MethodWithSelf { called } if self_is_available => { AssocSuggestion::MethodWithSelf { called } if self_is_available => {
@ -1715,11 +1715,11 @@ impl<'a: 'ast, 'ast, 'tcx> LateResolutionVisitor<'a, '_, 'ast, 'tcx> {
resolution.full_res() resolution.full_res()
{ {
if let Some(field_ids) = self.r.field_def_ids(did) { if let Some(field_ids) = self.r.field_def_ids(did) {
if field_ids if let Some(field_id) = field_ids
.iter() .iter()
.any(|&field_id| ident.name == self.r.tcx.item_name(field_id)) .find(|&&field_id| ident.name == self.r.tcx.item_name(field_id))
{ {
return Some(AssocSuggestion::Field); return Some(AssocSuggestion::Field(self.r.def_span(*field_id)));
} }
} }
} }

View file

@ -1,20 +1,26 @@
error[E0425]: cannot find value `field` in this scope error[E0425]: cannot find value `field` in this scope
--> $DIR/field-and-method-in-self-not-available-in-assoc-fn.rs:11:9 --> $DIR/field-and-method-in-self-not-available-in-assoc-fn.rs:11:9
| |
LL | field: u32,
| ---------- a field by that name exists in `Self`
...
LL | fn field(&self) -> u32 { LL | fn field(&self) -> u32 {
| ----- a method by that name is available on `Self` here | ----- a method by that name is available on `Self` here
... ...
LL | field; LL | field;
| ^^^^^ a field by this name exists in `Self` | ^^^^^
error[E0425]: cannot find value `field` in this scope error[E0425]: cannot find value `field` in this scope
--> $DIR/field-and-method-in-self-not-available-in-assoc-fn.rs:12:15 --> $DIR/field-and-method-in-self-not-available-in-assoc-fn.rs:12:15
| |
LL | field: u32,
| ---------- a field by that name exists in `Self`
...
LL | fn field(&self) -> u32 { LL | fn field(&self) -> u32 {
| ----- a method by that name is available on `Self` here | ----- a method by that name is available on `Self` here
... ...
LL | Foo { field } LL | Foo { field }
| ^^^^^ a field by this name exists in `Self` | ^^^^^
error[E0425]: cannot find value `field` in this scope error[E0425]: cannot find value `field` in this scope
--> $DIR/field-and-method-in-self-not-available-in-assoc-fn.rs:15:15 --> $DIR/field-and-method-in-self-not-available-in-assoc-fn.rs:15:15

View file

@ -1,8 +1,11 @@
error[E0425]: cannot find value `whiskers` in this scope error[E0425]: cannot find value `whiskers` in this scope
--> $DIR/issue-2356.rs:39:5 --> $DIR/issue-2356.rs:39:5
| |
LL | whiskers: isize,
| --------------- a field by that name exists in `Self`
...
LL | whiskers -= other; LL | whiskers -= other;
| ^^^^^^^^ a field by this name exists in `Self` | ^^^^^^^^
error[E0424]: expected value, found module `self` error[E0424]: expected value, found module `self`
--> $DIR/issue-2356.rs:65:8 --> $DIR/issue-2356.rs:65:8
@ -31,8 +34,11 @@ LL | self.whiskers = 0;
error[E0425]: cannot find value `whiskers` in this scope error[E0425]: cannot find value `whiskers` in this scope
--> $DIR/issue-2356.rs:84:5 --> $DIR/issue-2356.rs:84:5
| |
LL | whiskers: isize,
| --------------- a field by that name exists in `Self`
...
LL | whiskers = 4; LL | whiskers = 4;
| ^^^^^^^^ a field by this name exists in `Self` | ^^^^^^^^
error[E0424]: expected value, found module `self` error[E0424]: expected value, found module `self`
--> $DIR/issue-2356.rs:92:5 --> $DIR/issue-2356.rs:92:5

View file

@ -1,8 +1,11 @@
error[E0425]: cannot find value `banana` in this scope error[E0425]: cannot find value `banana` in this scope
--> $DIR/issue-60057.rs:8:21 --> $DIR/issue-60057.rs:8:21
| |
LL | banana: u8,
| ---------- a field by that name exists in `Self`
...
LL | banana: banana LL | banana: banana
| ^^^^^^ a field by this name exists in `Self` | ^^^^^^
error[E0425]: cannot find value `banana` in this scope error[E0425]: cannot find value `banana` in this scope
--> $DIR/issue-60057.rs:14:21 --> $DIR/issue-60057.rs:14:21

View file

@ -1,20 +1,20 @@
error[E0425]: cannot find value `config` in this scope error[E0425]: cannot find value `config` in this scope
--> $DIR/typo-suggestion-for-variable-with-name-similar-to-struct-field.rs:7:16 --> $DIR/typo-suggestion-for-variable-with-name-similar-to-struct-field.rs:7:16
| |
LL | config: String,
| -------------- a field by that name exists in `Self`
...
LL | Self { config } LL | Self { config }
| ^^^^^^ | ^^^^^^ help: a local variable with a similar name exists: `cofig`
| |
| a field by this name exists in `Self`
| help: a local variable with a similar name exists: `cofig`
error[E0425]: cannot find value `config` in this scope error[E0425]: cannot find value `config` in this scope
--> $DIR/typo-suggestion-for-variable-with-name-similar-to-struct-field.rs:11:20 --> $DIR/typo-suggestion-for-variable-with-name-similar-to-struct-field.rs:11:20
| |
LL | config: String,
| -------------- a field by that name exists in `Self`
...
LL | println!("{config}"); LL | println!("{config}");
| ^^^^^^ | ^^^^^^ help: a local variable with a similar name exists: `cofig`
| |
| a field by this name exists in `Self`
| help: a local variable with a similar name exists: `cofig`
error[E0425]: cannot find value `config` in this scope error[E0425]: cannot find value `config` in this scope
--> $DIR/typo-suggestion-for-variable-with-name-similar-to-struct-field.rs:15:20 --> $DIR/typo-suggestion-for-variable-with-name-similar-to-struct-field.rs:15:20

View file

@ -1,8 +1,11 @@
error[E0425]: cannot find value `cx` in this scope error[E0425]: cannot find value `cx` in this scope
--> $DIR/unresolved_static_type_field.rs:9:11 --> $DIR/unresolved_static_type_field.rs:9:11
| |
LL | cx: bool,
| -------- a field by that name exists in `Self`
...
LL | f(cx); LL | f(cx);
| ^^ a field by this name exists in `Self` | ^^
error: aborting due to previous error error: aborting due to previous error