Auto merge of #96353 - estebank:issue-95413, r=compiler-errors
When suggesting to import an item, also suggest changing the path if appropriate When we don't find an item we search all of them for an appropriate import and suggest `use`ing it. This is sometimes done for expressions that have paths with more than one segment. We now also suggest changing that path to work with the `use`. Fix #95413
This commit is contained in:
commit
9add63257b
14 changed files with 132 additions and 1 deletions
|
@ -117,7 +117,7 @@ impl<'a> Resolver<'a> {
|
|||
}
|
||||
|
||||
fn report_with_use_injections(&mut self, krate: &Crate) {
|
||||
for UseError { mut err, candidates, def_id, instead, suggestion } in
|
||||
for UseError { mut err, candidates, def_id, instead, suggestion, path } in
|
||||
self.use_injections.drain(..)
|
||||
{
|
||||
let (span, found_use) = if let Some(def_id) = def_id.as_local() {
|
||||
|
@ -135,6 +135,7 @@ impl<'a> Resolver<'a> {
|
|||
if instead { Instead::Yes } else { Instead::No },
|
||||
found_use,
|
||||
IsPattern::No,
|
||||
path,
|
||||
);
|
||||
} else if let Some((span, msg, sugg, appl)) = suggestion {
|
||||
err.span_suggestion(span, msg, sugg, appl);
|
||||
|
@ -702,6 +703,7 @@ impl<'a> Resolver<'a> {
|
|||
Instead::No,
|
||||
FoundUse::Yes,
|
||||
IsPattern::Yes,
|
||||
vec![],
|
||||
);
|
||||
}
|
||||
err
|
||||
|
@ -1482,6 +1484,7 @@ impl<'a> Resolver<'a> {
|
|||
Instead::No,
|
||||
FoundUse::Yes,
|
||||
IsPattern::No,
|
||||
vec![],
|
||||
);
|
||||
|
||||
if macro_kind == MacroKind::Derive && (ident.name == sym::Send || ident.name == sym::Sync) {
|
||||
|
@ -2448,6 +2451,7 @@ fn show_candidates(
|
|||
instead: Instead,
|
||||
found_use: FoundUse,
|
||||
is_pattern: IsPattern,
|
||||
path: Vec<Segment>,
|
||||
) {
|
||||
if candidates.is_empty() {
|
||||
return;
|
||||
|
@ -2515,6 +2519,14 @@ fn show_candidates(
|
|||
accessible_path_strings.into_iter().map(|a| a.0),
|
||||
Applicability::MaybeIncorrect,
|
||||
);
|
||||
if let [first, .., last] = &path[..] {
|
||||
err.span_suggestion_verbose(
|
||||
first.ident.span.until(last.ident.span),
|
||||
&format!("if you import `{}`, refer to it directly", last.ident),
|
||||
String::new(),
|
||||
Applicability::Unspecified,
|
||||
);
|
||||
}
|
||||
} else {
|
||||
msg.push(':');
|
||||
|
||||
|
|
|
@ -2693,6 +2693,7 @@ impl<'a: 'ast, 'b, 'ast> LateResolutionVisitor<'a, 'b, 'ast> {
|
|||
def_id,
|
||||
instead,
|
||||
suggestion,
|
||||
path: path.into(),
|
||||
});
|
||||
}
|
||||
|
||||
|
@ -2756,6 +2757,7 @@ impl<'a: 'ast, 'b, 'ast> LateResolutionVisitor<'a, 'b, 'ast> {
|
|||
def_id,
|
||||
instead: false,
|
||||
suggestion: None,
|
||||
path: path.into(),
|
||||
});
|
||||
} else {
|
||||
err.cancel();
|
||||
|
|
|
@ -696,6 +696,9 @@ struct UseError<'a> {
|
|||
instead: bool,
|
||||
/// Extra free-form suggestion.
|
||||
suggestion: Option<(Span, &'static str, String, Applicability)>,
|
||||
/// Path `Segment`s at the place of use that failed. Used for accurate suggestion after telling
|
||||
/// the user to import the item directly.
|
||||
path: Vec<Segment>,
|
||||
}
|
||||
|
||||
#[derive(Clone, Copy, PartialEq, Debug)]
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue