make E0277 use short paths

add note

change wording

short_ty_string on t
This commit is contained in:
Milo 2023-10-14 18:49:51 +00:00
parent 193e8a196b
commit 991bf752f1

View File

@ -429,14 +429,18 @@ impl<'tcx> TypeErrCtxtExt<'tcx> for TypeErrCtxt<'_, 'tcx> {
return; return;
} }
let trait_ref = trait_predicate.to_poly_trait_ref(); let trait_ref = trait_predicate.to_poly_trait_ref();
let (post_message, pre_message, type_def, file_note) = self
let (post_message, pre_message, type_def) = self
.get_parent_trait_ref(obligation.cause.code()) .get_parent_trait_ref(obligation.cause.code())
.map(|(t, s)| { .map(|(t, s)| {
let (t, file) = self.tcx.short_ty_string(t);
( (
format!(" in `{t}`"), format!(" in `{t}`"),
format!("within `{t}`, "), format!("within `{t}`, "),
s.map(|s| (format!("within this `{t}`"), s)), s.map(|s| (format!("within this `{t}`"), s)),
file.and_then(|file| Some(format!(
"the full trait has been written to '{}'",
file.display(),
)))
) )
}) })
.unwrap_or_default(); .unwrap_or_default();
@ -544,6 +548,8 @@ impl<'tcx> TypeErrCtxtExt<'tcx> for TypeErrCtxt<'_, 'tcx> {
err.emit(); err.emit();
return; return;
} }
file_note.map(|note| err.note(note));
if let Some(s) = label { if let Some(s) = label {
// If it has a custom `#[rustc_on_unimplemented]` // If it has a custom `#[rustc_on_unimplemented]`
// error message, let's display it as the label! // error message, let's display it as the label!
@ -1077,7 +1083,7 @@ pub(super) trait InferCtxtPrivExt<'tcx> {
fn get_parent_trait_ref( fn get_parent_trait_ref(
&self, &self,
code: &ObligationCauseCode<'tcx>, code: &ObligationCauseCode<'tcx>,
) -> Option<(String, Option<Span>)>; ) -> Option<(Ty<'tcx>, Option<Span>)>;
/// If the `Self` type of the unsatisfied trait `trait_ref` implements a trait /// If the `Self` type of the unsatisfied trait `trait_ref` implements a trait
/// with the same path as `trait_ref`, a help message about /// with the same path as `trait_ref`, a help message about
@ -1927,7 +1933,7 @@ impl<'tcx> InferCtxtPrivExt<'tcx> for TypeErrCtxt<'_, 'tcx> {
fn get_parent_trait_ref( fn get_parent_trait_ref(
&self, &self,
code: &ObligationCauseCode<'tcx>, code: &ObligationCauseCode<'tcx>,
) -> Option<(String, Option<Span>)> { ) -> Option<(Ty<'tcx>, Option<Span>)> {
match code { match code {
ObligationCauseCode::BuiltinDerivedObligation(data) => { ObligationCauseCode::BuiltinDerivedObligation(data) => {
let parent_trait_ref = self.resolve_vars_if_possible(data.parent_trait_pred); let parent_trait_ref = self.resolve_vars_if_possible(data.parent_trait_pred);
@ -1937,7 +1943,7 @@ impl<'tcx> InferCtxtPrivExt<'tcx> for TypeErrCtxt<'_, 'tcx> {
let ty = parent_trait_ref.skip_binder().self_ty(); let ty = parent_trait_ref.skip_binder().self_ty();
let span = TyCategory::from_ty(self.tcx, ty) let span = TyCategory::from_ty(self.tcx, ty)
.map(|(_, def_id)| self.tcx.def_span(def_id)); .map(|(_, def_id)| self.tcx.def_span(def_id));
Some((ty.to_string(), span)) Some((ty, span))
} }
} }
} }