Skip to content

Commit 11c35cd

Browse files
committed
Add applicable in closure for convert_to_guarded_return
Example --- ```rust fn main() { let _f = || { bar(); if$0 true { foo(); // comment bar(); } } } ``` -> ```rust fn main() { let _f = || { bar(); if false { return; } foo(); // comment bar(); } } ```
1 parent 1947949 commit 11c35cd

File tree

1 file changed

+49
-5
lines changed

1 file changed

+49
-5
lines changed

src/tools/rust-analyzer/crates/ide-assists/src/handlers/convert_to_guarded_return.rs

Lines changed: 49 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
use std::iter::once;
22

3-
use hir::Semantics;
43
use either::Either;
4+
use hir::{Semantics, TypeInfo};
55
use ide_db::{RootDatabase, ty_filter::TryEnum};
66
use syntax::{
77
AstNode,
8-
SyntaxKind::{FN, FOR_EXPR, LOOP_EXPR, WHILE_EXPR, WHITESPACE},
8+
SyntaxKind::{CLOSURE_EXPR, FN, FOR_EXPR, LOOP_EXPR, WHILE_EXPR, WHITESPACE},
99
SyntaxNode, T,
1010
ast::{
1111
self,
@@ -228,16 +228,26 @@ fn early_expression(
228228
parent_container: SyntaxNode,
229229
sema: &Semantics<'_, RootDatabase>,
230230
) -> Option<ast::Expr> {
231+
let return_none_expr = || {
232+
let none_expr = make::expr_path(make::ext::ident_path("None"));
233+
make::expr_return(Some(none_expr))
234+
};
231235
if let Some(fn_) = ast::Fn::cast(parent_container.clone())
232236
&& let Some(fn_def) = sema.to_def(&fn_)
233237
&& let Some(TryEnum::Option) = TryEnum::from_ty(sema, &fn_def.ret_type(sema.db))
234238
{
235-
let none_expr = make::expr_path(make::ext::ident_path("None"));
236-
return Some(make::expr_return(Some(none_expr)));
239+
return Some(return_none_expr());
240+
}
241+
if let Some(body) = ast::ClosureExpr::cast(parent_container.clone()).and_then(|it| it.body())
242+
&& let Some(ret_ty) = sema.type_of_expr(&body).map(TypeInfo::original)
243+
&& let Some(TryEnum::Option) = TryEnum::from_ty(sema, &ret_ty)
244+
{
245+
return Some(return_none_expr());
237246
}
247+
238248
Some(match parent_container.kind() {
239249
WHILE_EXPR | LOOP_EXPR | FOR_EXPR => make::expr_continue(None),
240-
FN => make::expr_return(None),
250+
FN | CLOSURE_EXPR => make::expr_return(None),
241251
_ => return None,
242252
})
243253
}
@@ -329,6 +339,40 @@ fn ret_option() -> Option<()> {
329339
);
330340
}
331341

342+
#[test]
343+
fn convert_inside_closure() {
344+
check_assist(
345+
convert_to_guarded_return,
346+
r#"
347+
fn main() {
348+
let _f = || {
349+
bar();
350+
if$0 true {
351+
foo();
352+
353+
// comment
354+
bar();
355+
}
356+
}
357+
}
358+
"#,
359+
r#"
360+
fn main() {
361+
let _f = || {
362+
bar();
363+
if false {
364+
return;
365+
}
366+
foo();
367+
368+
// comment
369+
bar();
370+
}
371+
}
372+
"#,
373+
);
374+
}
375+
332376
#[test]
333377
fn convert_let_inside_fn() {
334378
check_assist(

0 commit comments

Comments
 (0)