Point at field definition when unresolved name exists in Self
This commit is contained in:
parent
81bca5f5cf
commit
d00c7e78ea
6 changed files with 39 additions and 21 deletions
|
@ -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)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue