diff options
| author | Pocket7878 <poketo7878@gmail.com> | 2022-08-13 00:29:18 +0900 |
|---|---|---|
| committer | Pocket7878 <poketo7878@gmail.com> | 2022-08-31 18:47:45 +0900 |
| commit | a5d2463b1d0ee286218e428ca6f0ee53d72e3788 (patch) | |
| tree | 37194a6634c2e1fe727be59aacb0c36829f01f01 | |
| parent | 4661a60aa90e4fa7b4d1184ef64f8a6613e0075e (diff) | |
| download | rust-a5d2463b1d0ee286218e428ca6f0ee53d72e3788.tar.gz rust-a5d2463b1d0ee286218e428ca6f0ee53d72e3788.zip | |
fix: Simplify logics to allow two-arm enum match.
| -rw-r--r-- | crates/ide-assists/src/handlers/convert_two_arm_bool_match_to_matches_macro.rs | 97 |
1 files changed, 31 insertions, 66 deletions
diff --git a/crates/ide-assists/src/handlers/convert_two_arm_bool_match_to_matches_macro.rs b/crates/ide-assists/src/handlers/convert_two_arm_bool_match_to_matches_macro.rs index 68c9f5baf2b..5278fe5303a 100644 --- a/crates/ide-assists/src/handlers/convert_two_arm_bool_match_to_matches_macro.rs +++ b/crates/ide-assists/src/handlers/convert_two_arm_bool_match_to_matches_macro.rs @@ -1,4 +1,4 @@ -use syntax::ast::{self, AstNode, Pat}; +use syntax::ast::{self, AstNode}; use crate::{AssistContext, AssistId, AssistKind, Assists}; @@ -31,27 +31,16 @@ pub(crate) fn convert_two_arm_bool_match_to_matches_macro( return None; } - let mut normal_arm = None; - let mut normal_expr = None; - let mut wildcard_expr = None; - for arm in match_arm_list.arms() { - if matches!(arm.pat(), Some(Pat::WildcardPat(_))) && arm.guard().is_none() { - wildcard_expr = arm.expr(); - } else if !matches!(arm.pat(), Some(Pat::WildcardPat(_))) { - normal_arm = Some(arm.clone()); - normal_expr = arm.expr(); - } - } + let first_arm = match_arm_list.arms().next()?; + let first_arm_expr = first_arm.expr(); let invert_matches; - if is_bool_literal_expr(&normal_expr, true) && is_bool_literal_expr(&wildcard_expr, false) { + if is_bool_literal_expr(&first_arm_expr, true) { invert_matches = false; - } else if is_bool_literal_expr(&normal_expr, false) - && is_bool_literal_expr(&wildcard_expr, true) - { + } else if is_bool_literal_expr(&first_arm_expr, false) { invert_matches = true; } else { - cov_mark::hit!(non_invert_bool_literal_arms); + cov_mark::hit!(non_bool_literal_match); return None; } @@ -64,10 +53,10 @@ pub(crate) fn convert_two_arm_bool_match_to_matches_macro( target_range, |builder| { let mut arm_str = String::new(); - if let Some(ref pat) = normal_arm.as_ref().unwrap().pat() { + if let Some(ref pat) = first_arm.pat() { arm_str += &pat.to_string(); } - if let Some(ref guard) = normal_arm.as_ref().unwrap().guard() { + if let Some(ref guard) = first_arm.guard() { arm_str += &format!(" {}", &guard.to_string()); } if invert_matches { @@ -129,7 +118,7 @@ fn foo(a: Option<u32>) -> bool { #[test] fn not_applicable_non_bool_literal_arms() { - cov_mark::check!(non_invert_bool_literal_arms); + cov_mark::check!(non_bool_literal_match); check_assist_not_applicable( convert_two_arm_bool_match_to_matches_macro, r#" @@ -144,108 +133,84 @@ fn foo(a: Option<u32>) -> bool { } #[test] - fn not_applicable_both_false_arms() { - cov_mark::check!(non_invert_bool_literal_arms); - check_assist_not_applicable( + fn convert_simple_case() { + check_assist( convert_two_arm_bool_match_to_matches_macro, r#" fn foo(a: Option<u32>) -> bool { match a$0 { - Some(val) => false, + Some(_val) => true, _ => false } } - "#, - ); - } - - #[test] - fn not_applicable_both_true_arms() { - cov_mark::check!(non_invert_bool_literal_arms); - check_assist_not_applicable( - convert_two_arm_bool_match_to_matches_macro, +"#, r#" fn foo(a: Option<u32>) -> bool { - match a$0 { - Some(val) => true, - _ => true - } -} - "#, - ); - } - - #[test] - fn not_applicable_non_bool_match() { - cov_mark::check!(non_invert_bool_literal_arms); - check_assist_not_applicable( - convert_two_arm_bool_match_to_matches_macro, - r#" -fn foo(a: Option<u32>) -> u32 { - match a$0 { - Some(_val) => 1, - _ => 0 - } + matches!(a, Some(_val)) } "#, ); } #[test] - fn convert_simple_case() { + fn convert_simple_invert_case() { check_assist( convert_two_arm_bool_match_to_matches_macro, r#" fn foo(a: Option<u32>) -> bool { match a$0 { - Some(_val) => true, - _ => false + Some(_val) => false, + _ => true } } "#, r#" fn foo(a: Option<u32>) -> bool { - matches!(a, Some(_val)) + !matches!(a, Some(_val)) } "#, ); } #[test] - fn convert_simple_invert_case() { + fn convert_with_guard_case() { check_assist( convert_two_arm_bool_match_to_matches_macro, r#" fn foo(a: Option<u32>) -> bool { match a$0 { - Some(_val) => false, - _ => true + Some(val) if val > 3 => true, + _ => false } } "#, r#" fn foo(a: Option<u32>) -> bool { - !matches!(a, Some(_val)) + matches!(a, Some(val) if val > 3) } "#, ); } #[test] - fn convert_with_guard_case() { + fn convert_enum_match_cases() { check_assist( convert_two_arm_bool_match_to_matches_macro, r#" -fn foo(a: Option<u32>) -> bool { +enum X { A, B } + +fn foo(a: X) -> bool { match a$0 { - Some(val) if val > 3 => true, + X::A => true, _ => false } } "#, r#" -fn foo(a: Option<u32>) -> bool { - matches!(a, Some(val) if val > 3) +enum X { A, B } + +fn foo(a: X) -> bool { + matches!(a, X::A) } "#, ); |
