Rollup merge of #96772 - TaKO8Ki:suggest-fully-qualified-path-with-appropriate-params, r=compiler-errors

Suggest fully qualified path with appropriate params

closes #96291
This commit is contained in:
Guillaume Gomez 2022-05-06 20:05:44 +02:00 committed by GitHub
commit 6db969ec95
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 107 additions and 1 deletions

View file

@ -731,6 +731,7 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> {
// | help: specify type like: `<Impl as Into<u32>>::into(foo_impl)`
// |
// = note: cannot satisfy `Impl: Into<_>`
debug!(?segment);
if !impl_candidates.is_empty() && e.span.contains(span)
&& let Some(expr) = exprs.first()
&& let ExprKind::Path(hir::QPath::Resolved(_, path)) = expr.kind
@ -739,9 +740,29 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> {
let mut eraser = TypeParamEraser(self.tcx);
let candidate_len = impl_candidates.len();
let mut suggestions: Vec<_> = impl_candidates.iter().map(|candidate| {
let trait_item = self.tcx
.associated_items(candidate.def_id)
.find_by_name_and_kind(
self.tcx,
segment.ident,
ty::AssocKind::Fn,
candidate.def_id
);
let prefix = if let Some(trait_item) = trait_item
&& let Some(trait_m) = trait_item.def_id.as_local()
&& let hir::TraitItemKind::Fn(fn_, _) = &self.tcx.hir().trait_item(hir::TraitItemId { def_id: trait_m }).kind
{
match fn_.decl.implicit_self {
hir::ImplicitSelfKind::ImmRef => "&",
hir::ImplicitSelfKind::MutRef => "&mut ",
_ => "",
}
} else {
""
};
let candidate = candidate.super_fold_with(&mut eraser);
vec![
(expr.span.shrink_to_lo(), format!("{}::{}(", candidate, segment.ident)),
(expr.span.shrink_to_lo(), format!("{}::{}({}", candidate, segment.ident, prefix)),
if exprs.len() == 1 {
(expr.span.shrink_to_hi().with_hi(e.span.hi()), ")".to_string())
} else {

View file

@ -0,0 +1,24 @@
struct Thing;
trait Method<T> {
fn method(&self) -> T;
fn mut_method(&mut self) -> T;
}
impl Method<i32> for Thing {
fn method(&self) -> i32 { 0 }
fn mut_method(&mut self) -> i32 { 0 }
}
impl Method<u32> for Thing {
fn method(&self) -> u32 { 0 }
fn mut_method(&mut self) -> u32 { 0 }
}
fn main() {
let thing = Thing;
thing.method();
//~^ ERROR type annotations needed
//~| ERROR type annotations needed
thing.mut_method(); //~ ERROR type annotations needed
}

View file

@ -0,0 +1,61 @@
error[E0282]: type annotations needed
--> $DIR/suggest-fully-qualified-path-with-appropriate-params.rs:20:11
|
LL | thing.method();
| ------^^^^^^--
| | |
| | cannot infer type for type parameter `T` declared on the trait `Method`
| this method call resolves to `T`
error[E0283]: type annotations needed
--> $DIR/suggest-fully-qualified-path-with-appropriate-params.rs:20:11
|
LL | thing.method();
| ------^^^^^^--
| | |
| | cannot infer type for type parameter `T` declared on the trait `Method`
| this method call resolves to `T`
|
note: multiple `impl`s satisfying `Thing: Method<_>` found
--> $DIR/suggest-fully-qualified-path-with-appropriate-params.rs:8:1
|
LL | impl Method<i32> for Thing {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^
...
LL | impl Method<u32> for Thing {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^
help: use the fully qualified path for the potential candidates
|
LL | <Thing as Method<i32>>::method(&thing);
| ++++++++++++++++++++++++++++++++ ~
LL | <Thing as Method<u32>>::method(&thing);
| ++++++++++++++++++++++++++++++++ ~
error[E0283]: type annotations needed
--> $DIR/suggest-fully-qualified-path-with-appropriate-params.rs:23:11
|
LL | thing.mut_method();
| ------^^^^^^^^^^--
| | |
| | cannot infer type for type parameter `T` declared on the trait `Method`
| this method call resolves to `T`
|
note: multiple `impl`s satisfying `Thing: Method<_>` found
--> $DIR/suggest-fully-qualified-path-with-appropriate-params.rs:8:1
|
LL | impl Method<i32> for Thing {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^
...
LL | impl Method<u32> for Thing {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^
help: use the fully qualified path for the potential candidates
|
LL | <Thing as Method<i32>>::mut_method(&mut thing);
| +++++++++++++++++++++++++++++++++++++++ ~
LL | <Thing as Method<u32>>::mut_method(&mut thing);
| +++++++++++++++++++++++++++++++++++++++ ~
error: aborting due to 3 previous errors
Some errors have detailed explanations: E0282, E0283.
For more information about an error, try `rustc --explain E0282`.