Skip to content

Commit

Permalink
Extract the notes explaining the placeholder region errors to a helpe…
Browse files Browse the repository at this point in the history
…r fn
  • Loading branch information
lqd committed Jan 27, 2019
1 parent 489bc4a commit 43c0518
Showing 1 changed file with 43 additions and 8 deletions.
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
use errors::DiagnosticBuilder;
use hir::def_id::DefId;
use infer::error_reporting::nice_region_error::NiceRegionError;
use infer::lexical_region_resolve::RegionResolutionError;
Expand Down Expand Up @@ -259,7 +260,7 @@ impl NiceRegionError<'me, 'gcx, 'tcx> {
.tcx()
.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!(
"try_report_placeholders_trait: actual_has_vid={:?}",
Expand All @@ -280,6 +281,43 @@ impl NiceRegionError<'me, 'gcx, 'tcx> {
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 match inside is meant to be like this:
//
Expand All @@ -299,7 +337,7 @@ impl NiceRegionError<'me, 'gcx, 'tcx> {
RegionHighlightMode::maybe_highlighting_region(sup_placeholder, has_sup, || {
match (has_sub, has_sup) {
(Some(n1), Some(n2)) => {
if self_ty_has_vid {
if any_self_ty_has_vid {
err.note(&format!(
"`{}` would have to be implemented for the type `{}`, \
for any two lifetimes `'{}` and `'{}`",
Expand All @@ -320,7 +358,7 @@ impl NiceRegionError<'me, 'gcx, 'tcx> {
}
}
(Some(n), _) | (_, Some(n)) => {
if self_ty_has_vid {
if any_self_ty_has_vid {
err.note(&format!(
"`{}` would have to be implemented for the type `{}`, \
for any lifetime `'{}`",
Expand Down Expand Up @@ -350,7 +388,7 @@ impl NiceRegionError<'me, 'gcx, 'tcx> {
n,
));
} else {
if self_ty_has_vid {
if any_self_ty_has_vid {
err.note(&format!(
"`{}` would have to be implemented for the type `{}`",
expected_trait_ref,
Expand All @@ -375,7 +413,7 @@ impl NiceRegionError<'me, 'gcx, 'tcx> {
actual_has_vid,
|| match actual_has_vid {
Some(n) => {
if self_ty_has_vid {
if any_self_ty_has_vid {
err.note(&format!(
"but `{}` is actually implemented for the type `{}`, \
for the specific lifetime `'{}`",
Expand All @@ -402,8 +440,5 @@ impl NiceRegionError<'me, 'gcx, 'tcx> {
}
},
);

err.emit();
ErrorReported
}
}

0 comments on commit 43c0518

Please sign in to comment.