Extract the notes explaining the placeholder region errors to a helper fn

This commit is contained in:
Rémy Rakic 2019-01-26 21:32:09 +01:00
parent 489bc4a2c6
commit 43c0518d5b

View file

@ -1,3 +1,4 @@
use errors::DiagnosticBuilder;
use hir::def_id::DefId; use hir::def_id::DefId;
use infer::error_reporting::nice_region_error::NiceRegionError; use infer::error_reporting::nice_region_error::NiceRegionError;
use infer::lexical_region_resolve::RegionResolutionError; use infer::lexical_region_resolve::RegionResolutionError;
@ -259,7 +260,7 @@ impl NiceRegionError<'me, 'gcx, 'tcx> {
.tcx() .tcx()
.any_free_region_meets(&expected_trait_ref.self_ty(), |r| Some(r) == vid); .any_free_region_meets(&expected_trait_ref.self_ty(), |r| Some(r) == vid);
let self_ty_has_vid = actual_self_ty_has_vid || expected_self_ty_has_vid; let any_self_ty_has_vid = actual_self_ty_has_vid || expected_self_ty_has_vid;
debug!( debug!(
"try_report_placeholders_trait: actual_has_vid={:?}", "try_report_placeholders_trait: actual_has_vid={:?}",
@ -280,6 +281,43 @@ impl NiceRegionError<'me, 'gcx, 'tcx> {
expected_self_ty_has_vid expected_self_ty_has_vid
); );
self.explain_actual_impl_that_was_found(
&mut err,
sub_placeholder,
sup_placeholder,
has_sub,
has_sup,
expected_trait_ref,
actual_trait_ref,
vid,
expected_has_vid,
actual_has_vid,
any_self_ty_has_vid,
);
err.emit();
ErrorReported
}
/// Add notes with details about the expected and actual trait refs, with attention to cases
/// when placeholder regions are involved: either the trait or the self type containing
/// them needs to be mentioned the closest to the placeholders.
/// This makes the error messages read better, however at the cost of some complexity
/// due to the number of combinations we have to deal with.
fn explain_actual_impl_that_was_found(
&self,
err: &mut DiagnosticBuilder<'_>,
sub_placeholder: Option<ty::Region<'tcx>>,
sup_placeholder: Option<ty::Region<'tcx>>,
has_sub: Option<usize>,
has_sup: Option<usize>,
expected_trait_ref: ty::TraitRef<'_>,
actual_trait_ref: ty::TraitRef<'_>,
vid: Option<ty::Region<'tcx>>,
expected_has_vid: Option<usize>,
actual_has_vid: Option<usize>,
any_self_ty_has_vid: bool,
) {
// The weird thing here with the `maybe_highlighting_region` calls and the // The weird thing here with the `maybe_highlighting_region` calls and the
// the match inside is meant to be like this: // the match inside is meant to be like this:
// //
@ -299,7 +337,7 @@ impl NiceRegionError<'me, 'gcx, 'tcx> {
RegionHighlightMode::maybe_highlighting_region(sup_placeholder, has_sup, || { RegionHighlightMode::maybe_highlighting_region(sup_placeholder, has_sup, || {
match (has_sub, has_sup) { match (has_sub, has_sup) {
(Some(n1), Some(n2)) => { (Some(n1), Some(n2)) => {
if self_ty_has_vid { if any_self_ty_has_vid {
err.note(&format!( err.note(&format!(
"`{}` would have to be implemented for the type `{}`, \ "`{}` would have to be implemented for the type `{}`, \
for any two lifetimes `'{}` and `'{}`", for any two lifetimes `'{}` and `'{}`",
@ -320,7 +358,7 @@ impl NiceRegionError<'me, 'gcx, 'tcx> {
} }
} }
(Some(n), _) | (_, Some(n)) => { (Some(n), _) | (_, Some(n)) => {
if self_ty_has_vid { if any_self_ty_has_vid {
err.note(&format!( err.note(&format!(
"`{}` would have to be implemented for the type `{}`, \ "`{}` would have to be implemented for the type `{}`, \
for any lifetime `'{}`", for any lifetime `'{}`",
@ -350,7 +388,7 @@ impl NiceRegionError<'me, 'gcx, 'tcx> {
n, n,
)); ));
} else { } else {
if self_ty_has_vid { if any_self_ty_has_vid {
err.note(&format!( err.note(&format!(
"`{}` would have to be implemented for the type `{}`", "`{}` would have to be implemented for the type `{}`",
expected_trait_ref, expected_trait_ref,
@ -375,7 +413,7 @@ impl NiceRegionError<'me, 'gcx, 'tcx> {
actual_has_vid, actual_has_vid,
|| match actual_has_vid { || match actual_has_vid {
Some(n) => { Some(n) => {
if self_ty_has_vid { if any_self_ty_has_vid {
err.note(&format!( err.note(&format!(
"but `{}` is actually implemented for the type `{}`, \ "but `{}` is actually implemented for the type `{}`, \
for the specific lifetime `'{}`", for the specific lifetime `'{}`",
@ -402,8 +440,5 @@ impl NiceRegionError<'me, 'gcx, 'tcx> {
} }
}, },
); );
err.emit();
ErrorReported
} }
} }