Skip to content

Commit 840cd38

Browse files
committed
Add ide-assist: remove else branches
1 parent 2ada018 commit 840cd38

File tree

3 files changed

+132
-0
lines changed

3 files changed

+132
-0
lines changed
Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
use syntax::{AstNode, SyntaxKind, T, TextRange, ast};
2+
3+
use crate::{AssistContext, AssistId, Assists};
4+
5+
// Assist: remove_else_branches
6+
//
7+
// Removes the `else` keyword and else branches.
8+
//
9+
// ```
10+
// fn main() {
11+
// if true {
12+
// let _ = 2;
13+
// } $0else {
14+
// unreachable!();
15+
// }
16+
// }
17+
// ```
18+
// ->
19+
// ```
20+
// fn main() {
21+
// if true {
22+
// let _ = 2;
23+
// }
24+
// }
25+
// ```
26+
// ---
27+
// ```
28+
// fn main() {
29+
// let _x = 2 $0else { unreachable!() };
30+
// }
31+
// ```
32+
// ->
33+
// ```
34+
// fn main() {
35+
// let _x = 2;
36+
// }
37+
// ```
38+
pub(crate) fn remove_else_branches(acc: &mut Assists, ctx: &AssistContext<'_>) -> Option<()> {
39+
let else_token = ctx.find_token_syntax_at_offset(T![else])?;
40+
let else_branches = ctx
41+
.find_node_at_range::<ast::IfExpr>()
42+
.and_then(|if_expr| if_expr.else_branch()?.syntax().clone().into())
43+
.or_else(|| {
44+
ctx.find_node_at_range::<ast::LetStmt>()?
45+
.let_else()?
46+
.block_expr()?
47+
.syntax()
48+
.clone()
49+
.into()
50+
})?;
51+
52+
let target = TextRange::cover(else_token.text_range(), else_branches.text_range());
53+
acc.add(
54+
AssistId::refactor("remove_else_branches"),
55+
"Remove `else` branches",
56+
target,
57+
|builder| {
58+
let mut editor = builder.make_editor(&else_token.parent().unwrap());
59+
match else_token.prev_token() {
60+
Some(it) if it.kind() == SyntaxKind::WHITESPACE => editor.delete(it),
61+
_ => (),
62+
}
63+
match else_token.next_token() {
64+
Some(it) if it.kind() == SyntaxKind::WHITESPACE => editor.delete(it),
65+
_ => (),
66+
}
67+
editor.delete(else_token);
68+
editor.delete(else_branches);
69+
builder.add_file_edits(ctx.vfs_file_id(), editor);
70+
},
71+
)
72+
}
73+
74+
#[cfg(test)]
75+
mod tests {
76+
use super::*;
77+
use crate::tests::check_assist_not_applicable;
78+
79+
#[test]
80+
fn test_remove_else_branches_not_on_else_token() {
81+
check_assist_not_applicable(
82+
remove_else_branches,
83+
r#"
84+
fn main() {
85+
let _x = 2 else {$0 unreachable!() };
86+
}
87+
"#,
88+
);
89+
}
90+
}

src/tools/rust-analyzer/crates/ide-assists/src/lib.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -199,6 +199,7 @@ mod handlers {
199199
mod qualify_path;
200200
mod raw_string;
201201
mod remove_dbg;
202+
mod remove_else_branches;
202203
mod remove_mut;
203204
mod remove_parentheses;
204205
mod remove_underscore;
@@ -337,6 +338,7 @@ mod handlers {
337338
raw_string::remove_hash,
338339
remove_dbg::remove_dbg,
339340
remove_mut::remove_mut,
341+
remove_else_branches::remove_else_branches,
340342
remove_parentheses::remove_parentheses,
341343
remove_underscore::remove_underscore,
342344
remove_unused_imports::remove_unused_imports,

src/tools/rust-analyzer/crates/ide-assists/src/tests/generated.rs

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2738,6 +2738,46 @@ fn main() {
27382738
)
27392739
}
27402740

2741+
#[test]
2742+
fn doctest_remove_else_branches() {
2743+
check_doc_test(
2744+
"remove_else_branches",
2745+
r#####"
2746+
fn main() {
2747+
if true {
2748+
let _ = 2;
2749+
} $0else {
2750+
unreachable!();
2751+
}
2752+
}
2753+
"#####,
2754+
r#####"
2755+
fn main() {
2756+
if true {
2757+
let _ = 2;
2758+
}
2759+
}
2760+
"#####,
2761+
)
2762+
}
2763+
2764+
#[test]
2765+
fn doctest_remove_else_branches_1() {
2766+
check_doc_test(
2767+
"remove_else_branches",
2768+
r#####"
2769+
fn main() {
2770+
let _x = 2 $0else { unreachable!() };
2771+
}
2772+
"#####,
2773+
r#####"
2774+
fn main() {
2775+
let _x = 2;
2776+
}
2777+
"#####,
2778+
)
2779+
}
2780+
27412781
#[test]
27422782
fn doctest_remove_hash() {
27432783
check_doc_test(

0 commit comments

Comments
 (0)