Suggest correct signature on missing fn returning RPITIT/AFIT

This commit is contained in:
Michael Goulet 2023-06-13 20:41:15 +00:00
parent 2ca8d358e5
commit dbee24d949
4 changed files with 88 additions and 2 deletions

View file

@ -403,7 +403,32 @@ fn fn_sig_suggestion<'tcx>(
.flatten()
.collect::<Vec<String>>()
.join(", ");
let output = sig.output();
let mut output = sig.output();
let asyncness = if tcx.asyncness(assoc.def_id).is_async() {
output = if let ty::Alias(_, alias_ty) = *output.kind() {
tcx.explicit_item_bounds(alias_ty.def_id)
.subst_iter_copied(tcx, alias_ty.substs)
.find_map(|(bound, _)| {
bound.to_opt_poly_projection_pred()?.no_bound_vars()?.term.ty()
})
.unwrap_or_else(|| {
span_bug!(
ident.span,
"expected async fn to have `impl Future` output, but it returns {output}"
)
})
} else {
span_bug!(
ident.span,
"expected async fn to have `impl Future` output, but it returns {output}"
)
};
"async "
} else {
""
};
let output = if !output.is_unit() { format!(" -> {output}") } else { String::new() };
let unsafety = sig.unsafety.prefix_str();
@ -414,7 +439,9 @@ fn fn_sig_suggestion<'tcx>(
// lifetimes between the `impl` and the `trait`, but this should be good enough to
// fill in a significant portion of the missing code, and other subsequent
// suggestions can help the user fix the code.
format!("{unsafety}fn {ident}{generics}({args}){output}{where_clauses} {{ todo!() }}")
format!(
"{unsafety}{asyncness}fn {ident}{generics}({args}){output}{where_clauses} {{ todo!() }}"
)
}
pub fn ty_kind_suggestion(ty: Ty<'_>) -> Option<&'static str> {