1
Fork 0

Fix lifetime generics in <T<..> as Trait>::try_from suggestion.

This commit is contained in:
Mara Bos 2021-08-30 19:01:34 +02:00
parent a4f6d3e5c2
commit e2abf06890

View file

@ -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,
); );