Unnamed repository; edit this file 'description' to name the repository.
-rw-r--r--crates/ide-assists/src/handlers/remove_else_branches.rs90
-rw-r--r--crates/ide-assists/src/lib.rs2
-rw-r--r--crates/ide-assists/src/tests/generated.rs40
3 files changed, 132 insertions, 0 deletions
diff --git a/crates/ide-assists/src/handlers/remove_else_branches.rs b/crates/ide-assists/src/handlers/remove_else_branches.rs
new file mode 100644
index 0000000000..6a02c37015
--- /dev/null
+++ b/crates/ide-assists/src/handlers/remove_else_branches.rs
@@ -0,0 +1,90 @@
+use syntax::{AstNode, SyntaxKind, T, TextRange, ast};
+
+use crate::{AssistContext, AssistId, Assists};
+
+// Assist: remove_else_branches
+//
+// Removes the `else` keyword and else branches.
+//
+// ```
+// fn main() {
+// if true {
+// let _ = 2;
+// } $0else {
+// unreachable!();
+// }
+// }
+// ```
+// ->
+// ```
+// fn main() {
+// if true {
+// let _ = 2;
+// }
+// }
+// ```
+// ---
+// ```
+// fn main() {
+// let _x = 2 $0else { unreachable!() };
+// }
+// ```
+// ->
+// ```
+// fn main() {
+// let _x = 2;
+// }
+// ```
+pub(crate) fn remove_else_branches(acc: &mut Assists, ctx: &AssistContext<'_>) -> Option<()> {
+ let else_token = ctx.find_token_syntax_at_offset(T![else])?;
+ let else_branches = ctx
+ .find_node_at_range::<ast::IfExpr>()
+ .and_then(|if_expr| if_expr.else_branch()?.syntax().clone().into())
+ .or_else(|| {
+ ctx.find_node_at_range::<ast::LetStmt>()?
+ .let_else()?
+ .block_expr()?
+ .syntax()
+ .clone()
+ .into()
+ })?;
+
+ let target = TextRange::cover(else_token.text_range(), else_branches.text_range());
+ acc.add(
+ AssistId::refactor("remove_else_branches"),
+ "Remove `else` branches",
+ target,
+ |builder| {
+ let mut editor = builder.make_editor(&else_token.parent().unwrap());
+ match else_token.prev_token() {
+ Some(it) if it.kind() == SyntaxKind::WHITESPACE => editor.delete(it),
+ _ => (),
+ }
+ match else_token.next_token() {
+ Some(it) if it.kind() == SyntaxKind::WHITESPACE => editor.delete(it),
+ _ => (),
+ }
+ editor.delete(else_token);
+ editor.delete(else_branches);
+ builder.add_file_edits(ctx.vfs_file_id(), editor);
+ },
+ )
+}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+ use crate::tests::check_assist_not_applicable;
+
+ #[test]
+ fn test_remove_else_branches_not_on_else_token() {
+ check_assist_not_applicable(
+ remove_else_branches,
+ r#"
+fn main() {
+ let _x = 2 else {$0 unreachable!() };
+}
+"#,
+ );
+ }
+}
diff --git a/crates/ide-assists/src/lib.rs b/crates/ide-assists/src/lib.rs
index b93f8d3386..e9f2d68646 100644
--- a/crates/ide-assists/src/lib.rs
+++ b/crates/ide-assists/src/lib.rs
@@ -201,6 +201,7 @@ mod handlers {
mod qualify_path;
mod raw_string;
mod remove_dbg;
+ mod remove_else_branches;
mod remove_mut;
mod remove_parentheses;
mod remove_underscore;
@@ -343,6 +344,7 @@ mod handlers {
raw_string::remove_hash,
remove_dbg::remove_dbg,
remove_mut::remove_mut,
+ remove_else_branches::remove_else_branches,
remove_parentheses::remove_parentheses,
remove_underscore::remove_underscore,
remove_unused_imports::remove_unused_imports,
diff --git a/crates/ide-assists/src/tests/generated.rs b/crates/ide-assists/src/tests/generated.rs
index 3dc4d6cbac..a99fe8de33 100644
--- a/crates/ide-assists/src/tests/generated.rs
+++ b/crates/ide-assists/src/tests/generated.rs
@@ -2917,6 +2917,46 @@ fn main() {
}
#[test]
+fn doctest_remove_else_branches() {
+ check_doc_test(
+ "remove_else_branches",
+ r#####"
+fn main() {
+ if true {
+ let _ = 2;
+ } $0else {
+ unreachable!();
+ }
+}
+"#####,
+ r#####"
+fn main() {
+ if true {
+ let _ = 2;
+ }
+}
+"#####,
+ )
+}
+
+#[test]
+fn doctest_remove_else_branches_1() {
+ check_doc_test(
+ "remove_else_branches",
+ r#####"
+fn main() {
+ let _x = 2 $0else { unreachable!() };
+}
+"#####,
+ r#####"
+fn main() {
+ let _x = 2;
+}
+"#####,
+ )
+}
+
+#[test]
fn doctest_remove_hash() {
check_doc_test(
"remove_hash",