@@ -50,45 +50,49 @@ pub(crate) fn fill_match_arms(ctx: AssistCtx) -> Option<Assist> {
5050 return None ;
5151 }
5252
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 ( ) ;
6057 }
58+ }
6159
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
8482 }
85- } )
83+ }
8684 } )
8785 } )
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 ( ) ;
9089
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) ;
9296 if has_partial_match {
9397 arms. push ( make:: match_arm (
9498 iter:: once ( make:: placeholder_pat ( ) . into ( ) ) ,
0 commit comments