@@ -50,45 +50,49 @@ pub(crate) fn fill_match_arms(ctx: AssistCtx) -> Option<Assist> {
50
50
return None ;
51
51
}
52
52
53
- let db = ctx. db ;
54
- ctx. add_assist ( AssistId ( "fill_match_arms" ) , "Fill match arms" , |edit| {
55
- let mut arms: Vec < MatchArm > = match_arm_list. arms ( ) . collect ( ) ;
56
- if arms. len ( ) == 1 {
57
- if let Some ( Pat :: PlaceholderPat ( ..) ) = arms[ 0 ] . pat ( ) {
58
- arms. clear ( ) ;
59
- }
53
+ let mut arms: Vec < MatchArm > = match_arm_list. arms ( ) . collect ( ) ;
54
+ if arms. len ( ) == 1 {
55
+ if let Some ( Pat :: PlaceholderPat ( ..) ) = arms[ 0 ] . pat ( ) {
56
+ arms. clear ( ) ;
60
57
}
58
+ }
61
59
62
- let mut has_partial_match = false ;
63
- let variants : Vec < MatchArm > = variants
64
- . into_iter ( )
65
- . filter_map ( |variant| build_pat ( db , module , variant ) )
66
- . filter ( |variant_pat| {
67
- !arms . iter ( ) . filter_map ( |arm| arm . pat ( ) . map ( |_| arm ) ) . any ( |arm | {
68
- let pat = arm. pat ( ) . unwrap ( ) ;
69
-
70
- // Special casee OrPat as separate top-level pats
71
- let pats : Vec < Pat > = match Pat :: from ( pat . clone ( ) ) {
72
- Pat :: OrPat ( pats ) => pats . pats ( ) . collect :: < Vec < _ > > ( ) ,
73
- _ => vec ! [ pat ] ,
74
- } ;
75
-
76
- pats . iter ( ) . any ( |pat| {
77
- match does_arm_pat_match_variant ( pat , arm . guard ( ) , variant_pat ) {
78
- ArmMatch :: Yes => true ,
79
- ArmMatch :: No => false ,
80
- ArmMatch :: Partial => {
81
- has_partial_match = true ;
82
- true
83
- }
60
+ let mut has_partial_match = false ;
61
+ let db = ctx . db ;
62
+ let missing_arms : Vec < MatchArm > = variants
63
+ . into_iter ( )
64
+ . filter_map ( |variant| build_pat ( db , module , variant ) )
65
+ . filter ( |variant_pat | {
66
+ !arms . iter ( ) . filter_map ( |arm| arm. pat ( ) . map ( |_| arm ) ) . any ( |arm| {
67
+ let pat = arm . pat ( ) . unwrap ( ) ;
68
+
69
+ // Special casee OrPat as separate top-level pats
70
+ let pats : Vec < Pat > = match Pat :: from ( pat . clone ( ) ) {
71
+ Pat :: OrPat ( pats ) => pats . pats ( ) . collect :: < Vec < _ > > ( ) ,
72
+ _ => vec ! [ pat ] ,
73
+ } ;
74
+
75
+ pats . iter ( ) . any ( |pat| {
76
+ match does_arm_pat_match_variant ( pat , arm . guard ( ) , variant_pat ) {
77
+ ArmMatch :: Yes => true ,
78
+ ArmMatch :: No => false ,
79
+ ArmMatch :: Partial => {
80
+ has_partial_match = true ;
81
+ true
84
82
}
85
- } )
83
+ }
86
84
} )
87
85
} )
88
- . map ( |pat| make:: match_arm ( iter:: once ( pat) , make:: expr_unit ( ) ) )
89
- . collect ( ) ;
86
+ } )
87
+ . map ( |pat| make:: match_arm ( iter:: once ( pat) , make:: expr_unit ( ) ) )
88
+ . collect ( ) ;
90
89
91
- arms. extend ( variants) ;
90
+ if missing_arms. is_empty ( ) && !has_partial_match {
91
+ return None ;
92
+ }
93
+
94
+ ctx. add_assist ( AssistId ( "fill_match_arms" ) , "Fill match arms" , |edit| {
95
+ arms. extend ( missing_arms) ;
92
96
if has_partial_match {
93
97
arms. push ( make:: match_arm (
94
98
iter:: once ( make:: placeholder_pat ( ) . into ( ) ) ,
0 commit comments