Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/ide-diagnostics/src/handlers/remove_unnecessary_else.rs')
-rw-r--r--crates/ide-diagnostics/src/handlers/remove_unnecessary_else.rs122
1 files changed, 117 insertions, 5 deletions
diff --git a/crates/ide-diagnostics/src/handlers/remove_unnecessary_else.rs b/crates/ide-diagnostics/src/handlers/remove_unnecessary_else.rs
index ae8241ec2c..9c63d79d91 100644
--- a/crates/ide-diagnostics/src/handlers/remove_unnecessary_else.rs
+++ b/crates/ide-diagnostics/src/handlers/remove_unnecessary_else.rs
@@ -2,7 +2,10 @@ use hir::{db::ExpandDatabase, diagnostics::RemoveUnnecessaryElse, HirFileIdExt};
use ide_db::{assists::Assist, source_change::SourceChange};
use itertools::Itertools;
use syntax::{
- ast::{self, edit::IndentLevel},
+ ast::{
+ self,
+ edit::{AstNodeEdit, IndentLevel},
+ },
AstNode, SyntaxToken, TextRange,
};
use text_edit::TextEdit;
@@ -41,10 +44,15 @@ fn fixes(ctx: &DiagnosticsContext<'_>, d: &RemoveUnnecessaryElse) -> Option<Vec<
indent = indent + 1;
}
let else_replacement = match if_expr.else_branch()? {
- ast::ElseBranch::Block(ref block) => {
- block.statements().map(|stmt| format!("\n{indent}{stmt}")).join("")
- }
- ast::ElseBranch::IfExpr(ref nested_if_expr) => {
+ ast::ElseBranch::Block(block) => block
+ .statements()
+ .map(|stmt| format!("\n{indent}{stmt}"))
+ .chain(block.tail_expr().map(|tail| format!("\n{indent}{tail}")))
+ .join(""),
+ ast::ElseBranch::IfExpr(mut nested_if_expr) => {
+ if has_parent_if_expr {
+ nested_if_expr = nested_if_expr.indent(IndentLevel(1))
+ }
format!("\n{indent}{nested_if_expr}")
}
};
@@ -172,6 +180,41 @@ fn test() {
}
#[test]
+ fn remove_unnecessary_else_for_return3() {
+ check_diagnostics_with_needless_return_disabled(
+ r#"
+fn test(a: bool) -> i32 {
+ if a {
+ return 1;
+ } else {
+ //^^^^ 💡 weak: remove unnecessary else block
+ 0
+ }
+}
+"#,
+ );
+ check_fix(
+ r#"
+fn test(a: bool) -> i32 {
+ if a {
+ return 1;
+ } else$0 {
+ 0
+ }
+}
+"#,
+ r#"
+fn test(a: bool) -> i32 {
+ if a {
+ return 1;
+ }
+ 0
+}
+"#,
+ );
+ }
+
+ #[test]
fn remove_unnecessary_else_for_return_in_child_if_expr() {
check_diagnostics_with_needless_return_disabled(
r#"
@@ -215,6 +258,41 @@ fn test() {
}
#[test]
+ fn remove_unnecessary_else_for_return_in_child_if_expr2() {
+ check_fix(
+ r#"
+fn test() {
+ if foo {
+ do_something();
+ } else if qux {
+ return bar;
+ } else$0 if quux {
+ do_something_else();
+ } else {
+ do_something_else2();
+ }
+}
+"#,
+ r#"
+fn test() {
+ if foo {
+ do_something();
+ } else {
+ if qux {
+ return bar;
+ }
+ if quux {
+ do_something_else();
+ } else {
+ do_something_else2();
+ }
+ }
+}
+"#,
+ );
+ }
+
+ #[test]
fn remove_unnecessary_else_for_break() {
check_diagnostics(
r#"
@@ -387,4 +465,38 @@ fn test() {
"#,
);
}
+
+ #[test]
+ fn no_diagnostic_if_not_expr_stmt() {
+ check_diagnostics_with_needless_return_disabled(
+ r#"
+fn test1() {
+ let _x = if a {
+ return;
+ } else {
+ 1
+ };
+}
+
+fn test2() {
+ let _x = if a {
+ return;
+ } else if b {
+ return;
+ } else if c {
+ 1
+ } else {
+ return;
+ };
+}
+"#,
+ );
+ check_diagnostics(
+ r#"
+fn test3() -> u8 {
+ foo(if a { return 1 } else { 0 })
+}
+"#,
+ );
+ }
}