Suggest full trait ref (with placeholders) on unresolved assoc tys
This commit is contained in:
parent
3c8b108512
commit
02a2f02727
5 changed files with 57 additions and 23 deletions
|
@ -128,19 +128,20 @@ pub enum AssocItemNotFoundSugg<'a> {
|
|||
},
|
||||
#[multipart_suggestion(
|
||||
hir_analysis_assoc_item_not_found_similar_in_other_trait_qpath_sugg,
|
||||
style = "verbose",
|
||||
applicability = "maybe-incorrect"
|
||||
style = "verbose"
|
||||
)]
|
||||
SimilarInOtherTraitQPath {
|
||||
#[suggestion_part(code = "<")]
|
||||
lo: Span,
|
||||
#[suggestion_part(code = " as {trait_}>")]
|
||||
#[suggestion_part(code = " as {trait_ref}>")]
|
||||
mi: Span,
|
||||
#[suggestion_part(code = "{suggested_name}")]
|
||||
hi: Option<Span>,
|
||||
trait_: &'a str,
|
||||
trait_ref: String,
|
||||
suggested_name: Symbol,
|
||||
identically_named: bool,
|
||||
#[applicability]
|
||||
applicability: Applicability,
|
||||
},
|
||||
#[suggestion(
|
||||
hir_analysis_assoc_item_not_found_other_sugg,
|
||||
|
|
|
@ -251,6 +251,18 @@ impl<'tcx> dyn HirTyLowerer<'tcx> + '_ {
|
|||
return self.dcx().emit_err(err);
|
||||
}
|
||||
|
||||
let trait_args = &ty::GenericArgs::identity_for_item(tcx, best_trait)[1..];
|
||||
let mut trait_ref = trait_name.clone();
|
||||
let applicability = if let [arg, args @ ..] = trait_args {
|
||||
use std::fmt::Write;
|
||||
write!(trait_ref, "</* {arg}").unwrap();
|
||||
args.iter().try_for_each(|arg| write!(trait_ref, ", {arg}")).unwrap();
|
||||
trait_ref += " */>";
|
||||
Applicability::HasPlaceholders
|
||||
} else {
|
||||
Applicability::MaybeIncorrect
|
||||
};
|
||||
|
||||
let identically_named = suggested_name == assoc_name.name;
|
||||
|
||||
if let DefKind::TyAlias = tcx.def_kind(item_def_id)
|
||||
|
@ -260,22 +272,15 @@ impl<'tcx> dyn HirTyLowerer<'tcx> + '_ {
|
|||
lo: ty_param_span.shrink_to_lo(),
|
||||
mi: ty_param_span.shrink_to_hi(),
|
||||
hi: (!identically_named).then_some(assoc_name.span),
|
||||
// FIXME(fmease): Use a full trait ref here (with placeholders).
|
||||
trait_: &trait_name,
|
||||
trait_ref,
|
||||
identically_named,
|
||||
suggested_name,
|
||||
applicability,
|
||||
});
|
||||
} else {
|
||||
let mut err = self.dcx().create_err(err);
|
||||
if suggest_constraining_type_param(
|
||||
tcx,
|
||||
generics,
|
||||
&mut err,
|
||||
&qself_str,
|
||||
// FIXME(fmease): Use a full trait ref here (with placeholders).
|
||||
&trait_name,
|
||||
None,
|
||||
None,
|
||||
tcx, generics, &mut err, &qself_str, &trait_ref, None, None,
|
||||
) && !identically_named
|
||||
{
|
||||
// We suggested constraining a type parameter, but the associated item on it
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue