@@ -58,6 +58,12 @@ pub(crate) fn extract_variable(acc: &mut Assists, ctx: &AssistContext) -> Option
58
58
_ => "" ,
59
59
} ;
60
60
61
+ let parent_ref_expr = to_extract. syntax ( ) . parent ( ) . and_then ( ast:: RefExpr :: cast) ;
62
+ let var_modifier = match parent_ref_expr {
63
+ Some ( expr) if expr. mut_token ( ) . is_some ( ) => "mut " ,
64
+ _ => "" ,
65
+ } ;
66
+
61
67
let anchor = Anchor :: from ( & to_extract) ?;
62
68
let indent = anchor. syntax ( ) . prev_sibling_or_token ( ) ?. as_token ( ) ?. clone ( ) ;
63
69
let target = to_extract. syntax ( ) . text_range ( ) ;
@@ -85,7 +91,7 @@ pub(crate) fn extract_variable(acc: &mut Assists, ctx: &AssistContext) -> Option
85
91
86
92
match anchor {
87
93
Anchor :: Before ( _) | Anchor :: Replace ( _) => {
88
- format_to ! ( buf, "let {} = {}" , var_name, reference_modifier)
94
+ format_to ! ( buf, "let {}{} = {}" , var_modifier , var_name, reference_modifier)
89
95
}
90
96
Anchor :: WrapInBlock ( _) => {
91
97
format_to ! ( buf, "{{ let {} = {}" , var_name, reference_modifier)
@@ -100,8 +106,10 @@ pub(crate) fn extract_variable(acc: &mut Assists, ctx: &AssistContext) -> Option
100
106
}
101
107
match ctx. config . snippet_cap {
102
108
Some ( cap) => {
103
- let snip = buf
104
- . replace ( & format ! ( "let {}" , var_name) , & format ! ( "let $0{}" , var_name) ) ;
109
+ let snip = buf. replace (
110
+ & format ! ( "let {}{}" , var_modifier, var_name) ,
111
+ & format ! ( "let {}$0{}" , var_modifier, var_name) ,
112
+ ) ;
105
113
edit. replace_snippet ( cap, expr_range, snip)
106
114
}
107
115
None => edit. replace ( expr_range, buf) ,
@@ -126,8 +134,10 @@ pub(crate) fn extract_variable(acc: &mut Assists, ctx: &AssistContext) -> Option
126
134
let offset = anchor. syntax ( ) . text_range ( ) . start ( ) ;
127
135
match ctx. config . snippet_cap {
128
136
Some ( cap) => {
129
- let snip =
130
- buf. replace ( & format ! ( "let {}" , var_name) , & format ! ( "let $0{}" , var_name) ) ;
137
+ let snip = buf. replace (
138
+ & format ! ( "let {}{}" , var_modifier, var_name) ,
139
+ & format ! ( "let {}$0{}" , var_modifier, var_name) ,
140
+ ) ;
131
141
edit. insert_snippet ( cap, offset, snip)
132
142
}
133
143
None => edit. insert ( offset, buf) ,
@@ -1247,6 +1257,22 @@ fn foo() {
1247
1257
let local = &S::new();
1248
1258
let $0x = &local.sub;
1249
1259
x.do_thing();
1260
+ }"# ,
1261
+ ) ;
1262
+ }
1263
+
1264
+ #[ test]
1265
+ fn test_extract_var_for_mutable_borrow ( ) {
1266
+ check_assist (
1267
+ extract_variable,
1268
+ r#"
1269
+ fn foo() {
1270
+ let v = &mut $00$0;
1271
+ }"# ,
1272
+ r#"
1273
+ fn foo() {
1274
+ let mut $0var_name = 0;
1275
+ let v = &mut var_name;
1250
1276
}"# ,
1251
1277
) ;
1252
1278
}
0 commit comments