Skip to content

Commit a5d2463

Browse files
committed
fix: Simplify logics to allow two-arm enum match.
1 parent 4661a60 commit a5d2463

File tree

1 file changed

+31
-66
lines changed

1 file changed

+31
-66
lines changed

crates/ide-assists/src/handlers/convert_two_arm_bool_match_to_matches_macro.rs

Lines changed: 31 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use syntax::ast::{self, AstNode, Pat};
1+
use syntax::ast::{self, AstNode};
22

33
use crate::{AssistContext, AssistId, AssistKind, Assists};
44

@@ -31,27 +31,16 @@ pub(crate) fn convert_two_arm_bool_match_to_matches_macro(
3131
return None;
3232
}
3333

34-
let mut normal_arm = None;
35-
let mut normal_expr = None;
36-
let mut wildcard_expr = None;
37-
for arm in match_arm_list.arms() {
38-
if matches!(arm.pat(), Some(Pat::WildcardPat(_))) && arm.guard().is_none() {
39-
wildcard_expr = arm.expr();
40-
} else if !matches!(arm.pat(), Some(Pat::WildcardPat(_))) {
41-
normal_arm = Some(arm.clone());
42-
normal_expr = arm.expr();
43-
}
44-
}
34+
let first_arm = match_arm_list.arms().next()?;
35+
let first_arm_expr = first_arm.expr();
4536

4637
let invert_matches;
47-
if is_bool_literal_expr(&normal_expr, true) && is_bool_literal_expr(&wildcard_expr, false) {
38+
if is_bool_literal_expr(&first_arm_expr, true) {
4839
invert_matches = false;
49-
} else if is_bool_literal_expr(&normal_expr, false)
50-
&& is_bool_literal_expr(&wildcard_expr, true)
51-
{
40+
} else if is_bool_literal_expr(&first_arm_expr, false) {
5241
invert_matches = true;
5342
} else {
54-
cov_mark::hit!(non_invert_bool_literal_arms);
43+
cov_mark::hit!(non_bool_literal_match);
5544
return None;
5645
}
5746

@@ -64,10 +53,10 @@ pub(crate) fn convert_two_arm_bool_match_to_matches_macro(
6453
target_range,
6554
|builder| {
6655
let mut arm_str = String::new();
67-
if let Some(ref pat) = normal_arm.as_ref().unwrap().pat() {
56+
if let Some(ref pat) = first_arm.pat() {
6857
arm_str += &pat.to_string();
6958
}
70-
if let Some(ref guard) = normal_arm.as_ref().unwrap().guard() {
59+
if let Some(ref guard) = first_arm.guard() {
7160
arm_str += &format!(" {}", &guard.to_string());
7261
}
7362
if invert_matches {
@@ -129,7 +118,7 @@ fn foo(a: Option<u32>) -> bool {
129118

130119
#[test]
131120
fn not_applicable_non_bool_literal_arms() {
132-
cov_mark::check!(non_invert_bool_literal_arms);
121+
cov_mark::check!(non_bool_literal_match);
133122
check_assist_not_applicable(
134123
convert_two_arm_bool_match_to_matches_macro,
135124
r#"
@@ -144,108 +133,84 @@ fn foo(a: Option<u32>) -> bool {
144133
}
145134

146135
#[test]
147-
fn not_applicable_both_false_arms() {
148-
cov_mark::check!(non_invert_bool_literal_arms);
149-
check_assist_not_applicable(
136+
fn convert_simple_case() {
137+
check_assist(
150138
convert_two_arm_bool_match_to_matches_macro,
151139
r#"
152140
fn foo(a: Option<u32>) -> bool {
153141
match a$0 {
154-
Some(val) => false,
142+
Some(_val) => true,
155143
_ => false
156144
}
157145
}
158-
"#,
159-
);
160-
}
161-
162-
#[test]
163-
fn not_applicable_both_true_arms() {
164-
cov_mark::check!(non_invert_bool_literal_arms);
165-
check_assist_not_applicable(
166-
convert_two_arm_bool_match_to_matches_macro,
146+
"#,
167147
r#"
168148
fn foo(a: Option<u32>) -> bool {
169-
match a$0 {
170-
Some(val) => true,
171-
_ => true
172-
}
173-
}
174-
"#,
175-
);
176-
}
177-
178-
#[test]
179-
fn not_applicable_non_bool_match() {
180-
cov_mark::check!(non_invert_bool_literal_arms);
181-
check_assist_not_applicable(
182-
convert_two_arm_bool_match_to_matches_macro,
183-
r#"
184-
fn foo(a: Option<u32>) -> u32 {
185-
match a$0 {
186-
Some(_val) => 1,
187-
_ => 0
188-
}
149+
matches!(a, Some(_val))
189150
}
190151
"#,
191152
);
192153
}
193154

194155
#[test]
195-
fn convert_simple_case() {
156+
fn convert_simple_invert_case() {
196157
check_assist(
197158
convert_two_arm_bool_match_to_matches_macro,
198159
r#"
199160
fn foo(a: Option<u32>) -> bool {
200161
match a$0 {
201-
Some(_val) => true,
202-
_ => false
162+
Some(_val) => false,
163+
_ => true
203164
}
204165
}
205166
"#,
206167
r#"
207168
fn foo(a: Option<u32>) -> bool {
208-
matches!(a, Some(_val))
169+
!matches!(a, Some(_val))
209170
}
210171
"#,
211172
);
212173
}
213174

214175
#[test]
215-
fn convert_simple_invert_case() {
176+
fn convert_with_guard_case() {
216177
check_assist(
217178
convert_two_arm_bool_match_to_matches_macro,
218179
r#"
219180
fn foo(a: Option<u32>) -> bool {
220181
match a$0 {
221-
Some(_val) => false,
222-
_ => true
182+
Some(val) if val > 3 => true,
183+
_ => false
223184
}
224185
}
225186
"#,
226187
r#"
227188
fn foo(a: Option<u32>) -> bool {
228-
!matches!(a, Some(_val))
189+
matches!(a, Some(val) if val > 3)
229190
}
230191
"#,
231192
);
232193
}
233194

234195
#[test]
235-
fn convert_with_guard_case() {
196+
fn convert_enum_match_cases() {
236197
check_assist(
237198
convert_two_arm_bool_match_to_matches_macro,
238199
r#"
239-
fn foo(a: Option<u32>) -> bool {
200+
enum X { A, B }
201+
202+
fn foo(a: X) -> bool {
240203
match a$0 {
241-
Some(val) if val > 3 => true,
204+
X::A => true,
242205
_ => false
243206
}
244207
}
245208
"#,
246209
r#"
247-
fn foo(a: Option<u32>) -> bool {
248-
matches!(a, Some(val) if val > 3)
210+
enum X { A, B }
211+
212+
fn foo(a: X) -> bool {
213+
matches!(a, X::A)
249214
}
250215
"#,
251216
);

0 commit comments

Comments
 (0)