Address review comments
This commit is contained in:
parent
992ba801c2
commit
6e794dcc8b
@ -324,13 +324,8 @@ impl<'tcx> TypeErrCtxt<'_, 'tcx> {
|
|||||||
&format!("`{}: {}`", sup, sub),
|
&format!("`{}: {}`", sup, sub),
|
||||||
);
|
);
|
||||||
// We should only suggest rewriting the `where` clause if the predicate is within that `where` clause
|
// We should only suggest rewriting the `where` clause if the predicate is within that `where` clause
|
||||||
if self
|
if let Some(generics) = self.tcx.hir().get_generics(impl_item_def_id)
|
||||||
.tcx
|
&& generics.where_clause_span.contains(span)
|
||||||
.hir()
|
|
||||||
.get_generics(impl_item_def_id)
|
|
||||||
.unwrap()
|
|
||||||
.where_clause_span
|
|
||||||
.contains(span)
|
|
||||||
{
|
{
|
||||||
self.suggest_copy_trait_method_bounds(
|
self.suggest_copy_trait_method_bounds(
|
||||||
trait_item_def_id,
|
trait_item_def_id,
|
||||||
@ -390,12 +385,13 @@ impl<'tcx> TypeErrCtxt<'_, 'tcx> {
|
|||||||
// but right now it's not really very smart when it comes to implicit `Sized`
|
// but right now it's not really very smart when it comes to implicit `Sized`
|
||||||
// predicates and bounds on the trait itself.
|
// predicates and bounds on the trait itself.
|
||||||
|
|
||||||
let impl_def_id =
|
let Some(impl_def_id) =
|
||||||
self.tcx.associated_item(impl_item_def_id).impl_container(self.tcx).unwrap();
|
self.tcx.associated_item(impl_item_def_id).impl_container(self.tcx) else { return; };
|
||||||
let trait_substs = self
|
let Some(trait_ref) = self
|
||||||
.tcx
|
.tcx
|
||||||
.impl_trait_ref(impl_def_id)
|
.impl_trait_ref(impl_def_id)
|
||||||
.unwrap()
|
else { return; };
|
||||||
|
let trait_substs = trait_ref
|
||||||
// Replace the explicit self type with `Self` for better suggestion rendering
|
// Replace the explicit self type with `Self` for better suggestion rendering
|
||||||
.with_self_ty(self.tcx, self.tcx.mk_ty_param(0, kw::SelfUpper))
|
.with_self_ty(self.tcx, self.tcx.mk_ty_param(0, kw::SelfUpper))
|
||||||
.substs;
|
.substs;
|
||||||
@ -403,23 +399,22 @@ impl<'tcx> TypeErrCtxt<'_, 'tcx> {
|
|||||||
ty::InternalSubsts::identity_for_item(self.tcx, impl_item_def_id.to_def_id())
|
ty::InternalSubsts::identity_for_item(self.tcx, impl_item_def_id.to_def_id())
|
||||||
.rebase_onto(self.tcx, impl_def_id, trait_substs);
|
.rebase_onto(self.tcx, impl_def_id, trait_substs);
|
||||||
|
|
||||||
let mut is_suggestable = true;
|
let Ok(trait_predicates) = self
|
||||||
let trait_predicates = self
|
|
||||||
.tcx
|
.tcx
|
||||||
.bound_explicit_predicates_of(trait_item_def_id)
|
.bound_explicit_predicates_of(trait_item_def_id)
|
||||||
.map_bound(|p| p.predicates)
|
.map_bound(|p| p.predicates)
|
||||||
.subst_iter_copied(self.tcx, trait_item_substs)
|
.subst_iter_copied(self.tcx, trait_item_substs)
|
||||||
.map(|(pred, _)| {
|
.map(|(pred, _)| {
|
||||||
if !pred.is_suggestable(self.tcx, false) {
|
if pred.is_suggestable(self.tcx, false) {
|
||||||
is_suggestable = false;
|
Ok(pred.to_string())
|
||||||
|
} else {
|
||||||
|
Err(())
|
||||||
}
|
}
|
||||||
pred.to_string()
|
|
||||||
})
|
})
|
||||||
.collect::<Vec<_>>();
|
.collect::<Result<Vec<_>, ()>>() else { return; };
|
||||||
|
|
||||||
let generics = self.tcx.hir().get_generics(impl_item_def_id).unwrap();
|
let Some(generics) = self.tcx.hir().get_generics(impl_item_def_id) else { return; };
|
||||||
|
|
||||||
if is_suggestable {
|
|
||||||
if trait_predicates.is_empty() {
|
if trait_predicates.is_empty() {
|
||||||
err.span_suggestion_verbose(
|
err.span_suggestion_verbose(
|
||||||
generics.where_clause_span,
|
generics.where_clause_span,
|
||||||
@ -437,7 +432,6 @@ impl<'tcx> TypeErrCtxt<'_, 'tcx> {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
pub(super) fn report_placeholder_failure(
|
pub(super) fn report_placeholder_failure(
|
||||||
&self,
|
&self,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user