1- use syntax:: ast:: { edit:: AstNodeEdit , AstNode , HasName , LetStmt , Pat } ;
1+ use hir:: Semantics ;
2+ use ide_db:: RootDatabase ;
3+ use syntax:: ast:: { edit:: AstNodeEdit , AstNode , HasName , LetStmt , Name , Pat } ;
24use syntax:: T ;
35
46use crate :: { AssistContext , AssistId , AssistKind , Assists } ;
57
68/// Gets a list of binders in a pattern, and whether they are mut.
7- fn binders_in_pat ( pat : & Pat ) -> Option < Vec < ( String , bool ) > > {
9+ fn binders_in_pat (
10+ acc : & mut Vec < ( Name , bool ) > ,
11+ pat : & Pat ,
12+ sem : & Semantics < RootDatabase > ,
13+ ) -> Option < ( ) > {
814 use Pat :: * ;
915 match pat {
1016 IdentPat ( p) => {
11- let ident = p. name ( ) ?. text ( ) . to_string ( ) ;
17+ let ident = p. name ( ) ?;
1218 let ismut = p. ref_token ( ) . is_none ( ) && p. mut_token ( ) . is_some ( ) ;
13- let mut res = vec ! [ ( ident, ismut) ] ;
19+ acc . push ( ( ident, ismut) ) ;
1420 if let Some ( inner) = p. pat ( ) {
15- res . extend ( binders_in_pat ( & inner) ? ) ;
21+ binders_in_pat ( acc , & inner, sem ) ? ;
1622 }
17- Some ( res )
23+ Some ( ( ) )
1824 }
19- BoxPat ( p) => p. pat ( ) . and_then ( |p| binders_in_pat ( & p ) ) ,
20- RestPat ( _) | LiteralPat ( _) | PathPat ( _) | WildcardPat ( _) | ConstBlockPat ( _) => Some ( vec ! [ ] ) ,
25+ BoxPat ( p) => p. pat ( ) . and_then ( |p| binders_in_pat ( acc , & p , sem ) ) ,
26+ RestPat ( _) | LiteralPat ( _) | PathPat ( _) | WildcardPat ( _) | ConstBlockPat ( _) => Some ( ( ) ) ,
2127 OrPat ( p) => {
22- let mut v = vec ! [ ] ;
2328 for p in p. pats ( ) {
24- v . extend ( binders_in_pat ( & p ) ? ) ;
29+ binders_in_pat ( acc , & p , sem ) ? ;
2530 }
26- Some ( v )
31+ Some ( ( ) )
2732 }
28- ParenPat ( p) => p. pat ( ) . and_then ( |p| binders_in_pat ( & p ) ) ,
33+ ParenPat ( p) => p. pat ( ) . and_then ( |p| binders_in_pat ( acc , & p , sem ) ) ,
2934 RangePat ( p) => {
30- let mut start = if let Some ( st) = p. start ( ) { binders_in_pat ( & st) ? } else { vec ! [ ] } ;
31- let end = if let Some ( st) = p. end ( ) { binders_in_pat ( & st) ? } else { vec ! [ ] } ;
32- start. extend ( end) ;
33- Some ( start)
35+ if let Some ( st) = p. start ( ) {
36+ binders_in_pat ( acc, & st, sem) ?
37+ }
38+ if let Some ( ed) = p. end ( ) {
39+ binders_in_pat ( acc, & ed, sem) ?
40+ }
41+ Some ( ( ) )
3442 }
3543 RecordPat ( p) => {
36- let mut v = vec ! [ ] ;
3744 for f in p. record_pat_field_list ( ) ?. fields ( ) {
3845 let pat = f. pat ( ) ?;
39- v . extend ( binders_in_pat ( & pat) ? ) ;
46+ binders_in_pat ( acc , & pat, sem ) ? ;
4047 }
41- Some ( v )
48+ Some ( ( ) )
4249 }
43- RefPat ( p) => p. pat ( ) . and_then ( |p| binders_in_pat ( & p ) ) ,
50+ RefPat ( p) => p. pat ( ) . and_then ( |p| binders_in_pat ( acc , & p , sem ) ) ,
4451 SlicePat ( p) => {
45- let mut v = vec ! [ ] ;
4652 for p in p. pats ( ) {
47- v . extend ( binders_in_pat ( & p ) ? ) ;
53+ binders_in_pat ( acc , & p , sem ) ? ;
4854 }
49- Some ( v )
55+ Some ( ( ) )
5056 }
5157 TuplePat ( p) => {
52- let mut v = vec ! [ ] ;
5358 for p in p. fields ( ) {
54- v . extend ( binders_in_pat ( & p ) ? ) ;
59+ binders_in_pat ( acc , & p , sem ) ? ;
5560 }
56- Some ( v )
61+ Some ( ( ) )
5762 }
5863 TupleStructPat ( p) => {
59- let mut v = vec ! [ ] ;
6064 for p in p. fields ( ) {
61- v . extend ( binders_in_pat ( & p ) ? ) ;
65+ binders_in_pat ( acc , & p , sem ) ? ;
6266 }
63- Some ( v )
67+ Some ( ( ) )
6468 }
6569 // don't support macro pat yet
6670 MacroPat ( _) => None ,
6771 }
6872}
6973
70- fn binders_to_str ( binders : & [ ( String , bool ) ] , addmut : bool ) -> String {
74+ fn binders_to_str ( binders : & [ ( Name , bool ) ] , addmut : bool ) -> String {
7175 let vars = binders
7276 . iter ( )
7377 . map (
@@ -119,7 +123,8 @@ pub(crate) fn convert_let_else_to_match(acc: &mut Assists, ctx: &AssistContext)
119123 return None ;
120124 }
121125 let pat = let_stmt. pat ( ) ?;
122- let binders = binders_in_pat ( & pat) ?;
126+ let mut binders = Vec :: new ( ) ;
127+ binders_in_pat ( & mut binders, & pat, & ctx. sema ) ?;
123128
124129 let target = let_stmt. syntax ( ) . text_range ( ) ;
125130 acc. add (
@@ -139,7 +144,7 @@ pub(crate) fn convert_let_else_to_match(acc: &mut Assists, ctx: &AssistContext)
139144 // remove the mut from the pattern
140145 for ( b, ismut) in binders. iter ( ) {
141146 if * ismut {
142- pat_no_mut = pat_no_mut. replace ( & format ! ( "mut {b}" ) , b ) ;
147+ pat_no_mut = pat_no_mut. replace ( & format ! ( "mut {b}" ) , & b . to_string ( ) ) ;
143148 }
144149 }
145150
0 commit comments