1- use syntax:: ast:: { self , AstNode , Pat } ;
1+ use syntax:: ast:: { self , AstNode } ;
22
33use 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#"
152140fn 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#"
168148fn 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#"
199160fn 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#"
207168fn 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#"
219180fn 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#"
227188fn 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