Skip to content

Commit 3145078

Browse files
authored
Merge pull request rust-lang#19918 from A4-Tacks/remove-else-branches
Add ide-assist: remove else branches
2 parents 64326b2 + 840cd38 commit 3145078

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
@@ -201,6 +201,7 @@ mod handlers {
201201
mod qualify_path;
202202
mod raw_string;
203203
mod remove_dbg;
204+
mod remove_else_branches;
204205
mod remove_mut;
205206
mod remove_parentheses;
206207
mod remove_underscore;
@@ -343,6 +344,7 @@ mod handlers {
343344
raw_string::remove_hash,
344345
remove_dbg::remove_dbg,
345346
remove_mut::remove_mut,
347+
remove_else_branches::remove_else_branches,
346348
remove_parentheses::remove_parentheses,
347349
remove_underscore::remove_underscore,
348350
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
@@ -2916,6 +2916,46 @@ fn main() {
29162916
)
29172917
}
29182918

2919+
#[test]
2920+
fn doctest_remove_else_branches() {
2921+
check_doc_test(
2922+
"remove_else_branches",
2923+
r#####"
2924+
fn main() {
2925+
if true {
2926+
let _ = 2;
2927+
} $0else {
2928+
unreachable!();
2929+
}
2930+
}
2931+
"#####,
2932+
r#####"
2933+
fn main() {
2934+
if true {
2935+
let _ = 2;
2936+
}
2937+
}
2938+
"#####,
2939+
)
2940+
}
2941+
2942+
#[test]
2943+
fn doctest_remove_else_branches_1() {
2944+
check_doc_test(
2945+
"remove_else_branches",
2946+
r#####"
2947+
fn main() {
2948+
let _x = 2 $0else { unreachable!() };
2949+
}
2950+
"#####,
2951+
r#####"
2952+
fn main() {
2953+
let _x = 2;
2954+
}
2955+
"#####,
2956+
)
2957+
}
2958+
29192959
#[test]
29202960
fn doctest_remove_hash() {
29212961
check_doc_test(

0 commit comments

Comments
 (0)