Improve compatible enum variant suggestions.

This commit is contained in:
Mara Bos 2021-11-04 17:57:03 +01:00
parent 453e2423e6
commit b331b66082

View file

@ -244,7 +244,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
} }
} }
let mut compatible_variants = expected_adt let compatible_variants: Vec<String> = expected_adt
.variants .variants
.iter() .iter()
.filter(|variant| variant.fields.len() == 1) .filter(|variant| variant.fields.len() == 1)
@ -265,19 +265,33 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
None None
} }
}) })
.peekable(); .collect();
if compatible_variants.peek().is_some() { if let [variant] = &compatible_variants[..] {
if let Ok(expr_text) = self.tcx.sess.source_map().span_to_snippet(expr.span) { // Just a single matching variant.
let suggestions = compatible_variants.map(|v| format!("{}({})", v, expr_text)); err.multipart_suggestion(
let msg = "try using a variant of the expected enum"; &format!("try wrapping the expression in `{}`", variant),
err.span_suggestions( vec![
expr.span, (expr.span.shrink_to_lo(), format!("{}(", variant)),
msg, (expr.span.shrink_to_hi(), ")".to_string()),
suggestions, ],
Applicability::MaybeIncorrect,
);
} else if compatible_variants.len() > 1 {
// More than one matching variant.
err.multipart_suggestions(
&format!(
"try wrapping the expression in a variant of `{}`",
self.tcx.def_path_str(expected_adt.did)
),
compatible_variants.into_iter().map(|variant| {
vec![
(expr.span.shrink_to_lo(), format!("{}(", variant)),
(expr.span.shrink_to_hi(), ")".to_string()),
]
}),
Applicability::MaybeIncorrect, Applicability::MaybeIncorrect,
); );
}
} }
} }
} }