Unnamed repository; edit this file 'description' to name the repository.
Fix not applicable on statement for convert_to_guarded_return
Fix not applicable in statement when exist else block Example --- ```rust fn main() { some_statements(); if$0 let Ok(x) = Err(92) { foo(x); } else { return; } some_statements(); } ``` **Before this PR** Assist not applicable **After this PR** ```rust fn main() { some_statements(); let Ok(x) = Err(92) else { return; }; foo(x); some_statements(); } ```
A4-Tacks 4 months ago
parent 0c061ee · commit 9b80d75
-rw-r--r--crates/ide-assists/src/handlers/convert_to_guarded_return.rs72
1 files changed, 71 insertions, 1 deletions
diff --git a/crates/ide-assists/src/handlers/convert_to_guarded_return.rs b/crates/ide-assists/src/handlers/convert_to_guarded_return.rs
index 08b114072f..ea5c1637b7 100644
--- a/crates/ide-assists/src/handlers/convert_to_guarded_return.rs
+++ b/crates/ide-assists/src/handlers/convert_to_guarded_return.rs
@@ -95,7 +95,9 @@ fn if_expr_to_guarded_return(
let parent_block = if_expr.syntax().parent()?.ancestors().find_map(ast::BlockExpr::cast)?;
- if parent_block.tail_expr()? != if_expr.clone().into() {
+ if parent_block.tail_expr() != Some(if_expr.clone().into())
+ && !(else_block.is_some() && ast::ExprStmt::can_cast(if_expr.syntax().parent()?.kind()))
+ {
return None;
}
@@ -503,6 +505,36 @@ fn main() {
}
#[test]
+ fn convert_if_let_has_else_block_in_statement() {
+ check_assist(
+ convert_to_guarded_return,
+ r#"
+fn main() {
+ some_statements();
+ if$0 let Ok(x) = Err(92) {
+ foo(x);
+ } else {
+ // needless comment
+ return;
+ }
+ some_statements();
+}
+"#,
+ r#"
+fn main() {
+ some_statements();
+ let Ok(x) = Err(92) else {
+ // needless comment
+ return;
+ };
+ foo(x);
+ some_statements();
+}
+"#,
+ );
+ }
+
+ #[test]
fn convert_if_let_result_inside_let() {
check_assist(
convert_to_guarded_return,
@@ -1137,6 +1169,44 @@ fn main() {
}
#[test]
+ fn ignore_else_if() {
+ check_assist_not_applicable(
+ convert_to_guarded_return,
+ r#"
+fn main() {
+ some_statements();
+ if cond {
+ ()
+ } else if$0 let Ok(x) = Err(92) {
+ foo(x);
+ } else {
+ return;
+ }
+ some_statements();
+}
+"#,
+ );
+ }
+
+ #[test]
+ fn ignore_if_inside_let() {
+ check_assist_not_applicable(
+ convert_to_guarded_return,
+ r#"
+fn main() {
+ some_statements();
+ let _ = if$0 let Ok(x) = Err(92) {
+ foo(x);
+ } else {
+ return;
+ }
+ some_statements();
+}
+"#,
+ );
+ }
+
+ #[test]
fn ignore_let_else_branch() {
check_assist_not_applicable(
convert_to_guarded_return,