@@ -5,7 +5,7 @@ use hir::{Adt, HasSource, ModuleDef, Semantics};
5
5
use ide_db:: helpers:: { mod_path_to_ast, FamousDefs } ;
6
6
use ide_db:: RootDatabase ;
7
7
use itertools:: Itertools ;
8
- use syntax:: ast:: { self , make , AstNode , HasName , MatchArm , Pat } ;
8
+ use syntax:: ast:: { self , AstNode , HasName , MatchArm , MatchArmList , MatchExpr , Pat , make } ;
9
9
use syntax:: TextRange ;
10
10
11
11
use crate :: {
@@ -39,15 +39,21 @@ use crate::{
39
39
pub ( crate ) fn add_missing_match_arms ( acc : & mut Assists , ctx : & AssistContext ) -> Option < ( ) > {
40
40
let match_expr = ctx. find_node_at_offset_with_descend :: < ast:: MatchExpr > ( ) ?;
41
41
let match_arm_list = match_expr. match_arm_list ( ) ?;
42
+ let target_range : TextRange ;
42
43
43
- let available_range = TextRange :: new (
44
- ctx. sema . original_range ( match_expr. syntax ( ) ) . range . start ( ) ,
45
- ctx. sema . original_range ( match_arm_list. syntax ( ) ) . range . start ( ) ,
46
- ) ;
44
+ if !cursor_inside_simple_match_arm_list ( & ctx, & match_expr, & match_arm_list) {
45
+ target_range = TextRange :: new (
46
+ ctx. sema . original_range ( match_expr. syntax ( ) ) . range . start ( ) ,
47
+ ctx. sema . original_range ( match_arm_list. syntax ( ) ) . range . start ( ) ,
48
+ ) ;
47
49
48
- let cursor_in_range = available_range. contains_range ( ctx. selection_trimmed ( ) ) ;
49
- if !cursor_in_range {
50
- return None ;
50
+ let cursor_in_range = target_range. contains_range ( ctx. selection_trimmed ( ) ) ;
51
+ if !cursor_in_range {
52
+ return None ;
53
+ }
54
+ }
55
+ else {
56
+ target_range = ctx. sema . original_range ( match_expr. syntax ( ) ) . range ;
51
57
}
52
58
53
59
let expr = match_expr. expr ( ) ?;
@@ -134,7 +140,7 @@ pub(crate) fn add_missing_match_arms(acc: &mut Assists, ctx: &AssistContext) ->
134
140
acc. add (
135
141
AssistId ( "add_missing_match_arms" , AssistKind :: QuickFix ) ,
136
142
"Fill match arms" ,
137
- available_range ,
143
+ target_range ,
138
144
|builder| {
139
145
let new_match_arm_list = match_arm_list. clone_for_update ( ) ;
140
146
let missing_arms = missing_pats
@@ -186,6 +192,14 @@ pub(crate) fn add_missing_match_arms(acc: &mut Assists, ctx: &AssistContext) ->
186
192
)
187
193
}
188
194
195
+ fn cursor_inside_simple_match_arm_list ( ctx : & AssistContext , match_expr : & MatchExpr , match_arm_list : & MatchArmList ) -> bool {
196
+ // println!("---\n{:#?}\n{:#?}\n---", match_expr, match_arm_list);
197
+ if match_arm_list. arms ( ) . next ( ) == None {
198
+ return true ;
199
+ }
200
+ false
201
+ }
202
+
189
203
fn is_variant_missing ( existing_pats : & [ Pat ] , var : & Pat ) -> bool {
190
204
!existing_pats. iter ( ) . any ( |pat| does_pat_match_variant ( pat, var) )
191
205
}
@@ -320,10 +334,7 @@ fn main() {
320
334
check_assist_not_applicable (
321
335
add_missing_match_arms,
322
336
r#"
323
- enum A {
324
- X,
325
- Y
326
- }
337
+ enum A { X, Y }
327
338
328
339
fn foo(a: A) {
329
340
$0 match a {
@@ -339,10 +350,7 @@ fn foo(a: A) {
339
350
check_assist_not_applicable (
340
351
add_missing_match_arms,
341
352
r#"
342
- enum A {
343
- X,
344
- Y
345
- }
353
+ enum A { X, Y }
346
354
347
355
fn foo(a: A) {
348
356
match a {$0
@@ -637,7 +645,7 @@ enum A { As, Bs, Cs(String), Ds(String, String), Es { x: usize, y: usize } }
637
645
638
646
fn main() {
639
647
let a = A::As;
640
- match a$0 { }
648
+ match a {$0 }
641
649
}
642
650
"# ,
643
651
r#"
@@ -900,7 +908,7 @@ fn foo(a: &mut A) {
900
908
}
901
909
902
910
#[ test]
903
- fn add_missing_match_arms_target ( ) {
911
+ fn add_missing_match_arms_target_simple ( ) {
904
912
check_assist_target (
905
913
add_missing_match_arms,
906
914
r#"
@@ -909,6 +917,23 @@ enum E { X, Y }
909
917
fn main() {
910
918
match E::X$0 {}
911
919
}
920
+ "# ,
921
+ "match E::X {}" ,
922
+ ) ;
923
+ }
924
+
925
+ #[ test]
926
+ fn add_missing_match_arms_target_complex ( ) {
927
+ check_assist_target (
928
+ add_missing_match_arms,
929
+ r#"
930
+ enum E { X, Y }
931
+
932
+ fn main() {
933
+ match E::X$0 {
934
+ E::X => {}
935
+ }
936
+ }
912
937
"# ,
913
938
"match E::X " ,
914
939
) ;
@@ -922,16 +947,16 @@ fn main() {
922
947
enum E { X, Y }
923
948
924
949
fn main() {
925
- match E::X $0 {
926
- _ => {}
950
+ match E::X {
951
+ $0_ => {}
927
952
}
928
953
}
929
954
"# ,
930
955
r#"
931
956
enum E { X, Y }
932
957
933
958
fn main() {
934
- match E::X {
959
+ match E::X {
935
960
$0E::X => todo!(),
936
961
E::Y => todo!(),
937
962
}
0 commit comments