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;
}
```
| -rw-r--r-- | crates/ide-assists/src/handlers/add_return_type.rs | 17 |
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( |