Unnamed repository; edit this file 'description' to name the repository.
Fix closure coerced return type for add_return_type
Example --- ```rust fn foo() { let f = ||$0 {loop {}}; let _: fn() -> i8 = f; } ``` **Before this PR**: ```rust fn foo() { let f = || -> ! {loop {}}; let _: fn() -> i8 = f; } ``` mismatched types error on line 3 **After this PR**: ```rust fn foo() { let f = || -> i8 {loop {}}; let _: fn() -> i8 = f; } ```
A4-Tacks 6 months ago
parent f8fdf54 · commit a77747f
-rw-r--r--crates/ide-assists/src/handlers/add_return_type.rs17
1 files changed, 16 insertions, 1 deletions
diff --git a/crates/ide-assists/src/handlers/add_return_type.rs b/crates/ide-assists/src/handlers/add_return_type.rs
index a7104ce068..c9022f66d1 100644
--- a/crates/ide-assists/src/handlers/add_return_type.rs
+++ b/crates/ide-assists/src/handlers/add_return_type.rs
@@ -18,7 +18,7 @@ use crate::{AssistContext, AssistId, Assists};
pub(crate) fn add_return_type(acc: &mut Assists, ctx: &AssistContext<'_>) -> Option<()> {
let (fn_type, tail_expr, builder_edit_pos) = extract_tail(ctx)?;
let module = ctx.sema.scope(tail_expr.syntax())?.module();
- let ty = ctx.sema.type_of_expr(&peel_blocks(tail_expr.clone()))?.original();
+ let ty = ctx.sema.type_of_expr(&peel_blocks(tail_expr.clone()))?.adjusted();
if ty.is_unit() {
return None;
}
@@ -422,6 +422,21 @@ mod tests {
}
#[test]
+ fn infer_coerced_return_type_closure() {
+ check_assist(
+ add_return_type,
+ r#"fn foo() {
+ let f = ||$0 {loop {}};
+ let _: fn() -> i8 = f;
+}"#,
+ r#"fn foo() {
+ let f = || -> i8 {loop {}};
+ let _: fn() -> i8 = f;
+}"#,
+ );
+ }
+
+ #[test]
fn not_applicable_ret_type_specified_closure() {
cov_mark::check!(existing_ret_type_closure);
check_assist_not_applicable(