Different suggestions for when associated functions are referred to
This commit is contained in:
parent
0940040c04
commit
717bf35366
@ -38,8 +38,8 @@
|
||||
/// A field or associated item from self type suggested in case of resolution failure.
|
||||
enum AssocSuggestion {
|
||||
Field,
|
||||
MethodWithSelf,
|
||||
AssocFn,
|
||||
MethodWithSelf { called: bool },
|
||||
AssocFn { called: bool },
|
||||
AssocType,
|
||||
AssocConst,
|
||||
}
|
||||
@ -48,8 +48,14 @@ impl AssocSuggestion {
|
||||
fn action(&self) -> &'static str {
|
||||
match self {
|
||||
AssocSuggestion::Field => "use the available field",
|
||||
AssocSuggestion::MethodWithSelf => "call the method with the fully-qualified path",
|
||||
AssocSuggestion::AssocFn => "call the associated function",
|
||||
AssocSuggestion::MethodWithSelf { called: true } => {
|
||||
"call the method with the fully-qualified path"
|
||||
}
|
||||
AssocSuggestion::MethodWithSelf { called: false } => {
|
||||
"refer to the method with the fully-qualified path"
|
||||
}
|
||||
AssocSuggestion::AssocFn { called: true } => "call the associated function",
|
||||
AssocSuggestion::AssocFn { called: false } => "refer to the associated function",
|
||||
AssocSuggestion::AssocConst => "use the associated `const`",
|
||||
AssocSuggestion::AssocType => "use the associated type",
|
||||
}
|
||||
@ -498,7 +504,9 @@ fn try_lookup_name_relaxed(
|
||||
// Try Levenshtein algorithm.
|
||||
let typo_sugg = self.lookup_typo_candidate(path, source.namespace(), is_expected);
|
||||
if path.len() == 1 && self.self_type_is_available() {
|
||||
if let Some(candidate) = self.lookup_assoc_candidate(ident, ns, is_expected) {
|
||||
if let Some(candidate) =
|
||||
self.lookup_assoc_candidate(ident, ns, is_expected, source.is_call())
|
||||
{
|
||||
let self_is_available = self.self_value_is_available(path[0].ident.span);
|
||||
match candidate {
|
||||
AssocSuggestion::Field => {
|
||||
@ -513,16 +521,21 @@ fn try_lookup_name_relaxed(
|
||||
err.span_label(span, "a field by this name exists in `Self`");
|
||||
}
|
||||
}
|
||||
AssocSuggestion::MethodWithSelf if self_is_available => {
|
||||
AssocSuggestion::MethodWithSelf { called } if self_is_available => {
|
||||
let msg = if called {
|
||||
"you might have meant to call the method"
|
||||
} else {
|
||||
"you might have meant to refer to the method"
|
||||
};
|
||||
err.span_suggestion(
|
||||
span,
|
||||
"you might have meant to call the method",
|
||||
msg,
|
||||
format!("self.{path_str}"),
|
||||
Applicability::MachineApplicable,
|
||||
);
|
||||
}
|
||||
AssocSuggestion::MethodWithSelf
|
||||
| AssocSuggestion::AssocFn
|
||||
AssocSuggestion::MethodWithSelf { .. }
|
||||
| AssocSuggestion::AssocFn { .. }
|
||||
| AssocSuggestion::AssocConst
|
||||
| AssocSuggestion::AssocType => {
|
||||
err.span_suggestion(
|
||||
@ -1494,6 +1507,7 @@ fn lookup_assoc_candidate<FilterFn>(
|
||||
ident: Ident,
|
||||
ns: Namespace,
|
||||
filter_fn: FilterFn,
|
||||
called: bool,
|
||||
) -> Option<AssocSuggestion>
|
||||
where
|
||||
FilterFn: Fn(Res) -> bool,
|
||||
@ -1535,9 +1549,9 @@ fn extract_node_id(t: &Ty) -> Option<NodeId> {
|
||||
return Some(match &assoc_item.kind {
|
||||
ast::AssocItemKind::Const(..) => AssocSuggestion::AssocConst,
|
||||
ast::AssocItemKind::Fn(box ast::Fn { sig, .. }) if sig.decl.has_self() => {
|
||||
AssocSuggestion::MethodWithSelf
|
||||
AssocSuggestion::MethodWithSelf { called }
|
||||
}
|
||||
ast::AssocItemKind::Fn(..) => AssocSuggestion::AssocFn,
|
||||
ast::AssocItemKind::Fn(..) => AssocSuggestion::AssocFn { called },
|
||||
ast::AssocItemKind::Type(..) => AssocSuggestion::AssocType,
|
||||
ast::AssocItemKind::MacCall(_) => continue,
|
||||
});
|
||||
@ -1556,10 +1570,12 @@ fn extract_node_id(t: &Ty) -> Option<NodeId> {
|
||||
let res = binding.res();
|
||||
if filter_fn(res) {
|
||||
if self.r.has_self.contains(&res.def_id()) {
|
||||
return Some(AssocSuggestion::MethodWithSelf);
|
||||
return Some(AssocSuggestion::MethodWithSelf { called });
|
||||
} else {
|
||||
match res {
|
||||
Res::Def(DefKind::AssocFn, _) => return Some(AssocSuggestion::AssocFn),
|
||||
Res::Def(DefKind::AssocFn, _) => {
|
||||
return Some(AssocSuggestion::AssocFn { called });
|
||||
}
|
||||
Res::Def(DefKind::AssocConst, _) => {
|
||||
return Some(AssocSuggestion::AssocConst);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user