Fix lifetime generics in <T<..> as Trait>::try_from suggestion.
This commit is contained in:
parent
a4f6d3e5c2
commit
e2abf06890
1 changed files with 21 additions and 17 deletions
|
@ -262,31 +262,35 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||||
method_name.name
|
method_name.name
|
||||||
));
|
));
|
||||||
|
|
||||||
let self_ty_name = self
|
let mut self_ty_name = self
|
||||||
.sess()
|
.sess()
|
||||||
.source_map()
|
.source_map()
|
||||||
.span_to_snippet(self_ty_span)
|
.span_to_snippet(self_ty_span)
|
||||||
.unwrap_or_else(|_| self_ty.to_string());
|
.unwrap_or_else(|_| self_ty.to_string());
|
||||||
|
|
||||||
let self_ty_generics_count = match self_ty.kind() {
|
// Get the number of generics the self type has (if an Adt) unless we can determine that
|
||||||
// Get the number of generics the self type has (if an Adt) unless we can determine that
|
// the user has written the self type with generics already which we (naively) do by looking
|
||||||
// the user has written the self type with generics already which we (naively) do by looking
|
// for a "<" in `self_ty_name`.
|
||||||
// for a "<" in `self_ty_name`.
|
if !self_ty_name.contains('<') {
|
||||||
Adt(def, _) if !self_ty_name.contains('<') => self.tcx.generics_of(def.did).count(),
|
if let Adt(def, _) = self_ty.kind() {
|
||||||
_ => 0,
|
let generics = self.tcx.generics_of(def.did);
|
||||||
};
|
if !generics.params.is_empty() {
|
||||||
let self_ty_generics = if self_ty_generics_count > 0 {
|
let counts = generics.own_counts();
|
||||||
format!("<{}>", vec!["_"; self_ty_generics_count].join(", "))
|
self_ty_name += &format!(
|
||||||
} else {
|
"<{}>",
|
||||||
String::new()
|
std::iter::repeat("'_")
|
||||||
};
|
.take(counts.lifetimes)
|
||||||
|
.chain(std::iter::repeat("_").take(counts.types + counts.consts))
|
||||||
|
.collect::<Vec<_>>()
|
||||||
|
.join(", ")
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
lint.span_suggestion(
|
lint.span_suggestion(
|
||||||
span,
|
span,
|
||||||
"disambiguate the associated function",
|
"disambiguate the associated function",
|
||||||
format!(
|
format!("<{} as {}>::{}", self_ty_name, trait_name, method_name.name,),
|
||||||
"<{}{} as {}>::{}",
|
|
||||||
self_ty_name, self_ty_generics, trait_name, method_name.name,
|
|
||||||
),
|
|
||||||
Applicability::MachineApplicable,
|
Applicability::MachineApplicable,
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue