Improve compatible enum variant suggestions.
This commit is contained in:
parent
453e2423e6
commit
b331b66082
1 changed files with 27 additions and 13 deletions
|
@ -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,
|
||||||
);
|
);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue