mirror of
https://github.com/rust-lang/rust-analyzer.git
synced 2025-10-01 11:31:15 +00:00
fix: Simplify logics to allow two-arm enum match.
This commit is contained in:
parent
4661a60aa9
commit
a5d2463b1d
@ -1,4 +1,4 @@
|
|||||||
use syntax::ast::{self, AstNode, Pat};
|
use syntax::ast::{self, AstNode};
|
||||||
|
|
||||||
use crate::{AssistContext, AssistId, AssistKind, Assists};
|
use crate::{AssistContext, AssistId, AssistKind, Assists};
|
||||||
|
|
||||||
@ -31,27 +31,16 @@ pub(crate) fn convert_two_arm_bool_match_to_matches_macro(
|
|||||||
return None;
|
return None;
|
||||||
}
|
}
|
||||||
|
|
||||||
let mut normal_arm = None;
|
let first_arm = match_arm_list.arms().next()?;
|
||||||
let mut normal_expr = None;
|
let first_arm_expr = first_arm.expr();
|
||||||
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 invert_matches;
|
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;
|
invert_matches = false;
|
||||||
} else if is_bool_literal_expr(&normal_expr, false)
|
} else if is_bool_literal_expr(&first_arm_expr, false) {
|
||||||
&& is_bool_literal_expr(&wildcard_expr, true)
|
|
||||||
{
|
|
||||||
invert_matches = true;
|
invert_matches = true;
|
||||||
} else {
|
} else {
|
||||||
cov_mark::hit!(non_invert_bool_literal_arms);
|
cov_mark::hit!(non_bool_literal_match);
|
||||||
return None;
|
return None;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -64,10 +53,10 @@ pub(crate) fn convert_two_arm_bool_match_to_matches_macro(
|
|||||||
target_range,
|
target_range,
|
||||||
|builder| {
|
|builder| {
|
||||||
let mut arm_str = String::new();
|
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();
|
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());
|
arm_str += &format!(" {}", &guard.to_string());
|
||||||
}
|
}
|
||||||
if invert_matches {
|
if invert_matches {
|
||||||
@ -129,7 +118,7 @@ fn foo(a: Option<u32>) -> bool {
|
|||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn not_applicable_non_bool_literal_arms() {
|
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(
|
check_assist_not_applicable(
|
||||||
convert_two_arm_bool_match_to_matches_macro,
|
convert_two_arm_bool_match_to_matches_macro,
|
||||||
r#"
|
r#"
|
||||||
@ -143,54 +132,6 @@ 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(
|
|
||||||
convert_two_arm_bool_match_to_matches_macro,
|
|
||||||
r#"
|
|
||||||
fn foo(a: Option<u32>) -> bool {
|
|
||||||
match a$0 {
|
|
||||||
Some(val) => false,
|
|
||||||
_ => 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
|
|
||||||
}
|
|
||||||
}
|
|
||||||
"#,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn convert_simple_case() {
|
fn convert_simple_case() {
|
||||||
check_assist(
|
check_assist(
|
||||||
@ -251,6 +192,30 @@ fn foo(a: Option<u32>) -> bool {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn convert_enum_match_cases() {
|
||||||
|
check_assist(
|
||||||
|
convert_two_arm_bool_match_to_matches_macro,
|
||||||
|
r#"
|
||||||
|
enum X { A, B }
|
||||||
|
|
||||||
|
fn foo(a: X) -> bool {
|
||||||
|
match a$0 {
|
||||||
|
X::A => true,
|
||||||
|
_ => false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
"#,
|
||||||
|
r#"
|
||||||
|
enum X { A, B }
|
||||||
|
|
||||||
|
fn foo(a: X) -> bool {
|
||||||
|
matches!(a, X::A)
|
||||||
|
}
|
||||||
|
"#,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn convert_target_simple() {
|
fn convert_target_simple() {
|
||||||
check_assist_target(
|
check_assist_target(
|
||||||
|
Loading…
x
Reference in New Issue
Block a user