@@ -9,7 +9,8 @@ use ra_syntax::{
9
9
use ra_text_edit:: TextEdit ;
10
10
11
11
use crate :: {
12
- FileId , FilePosition , FileSystemEdit , RangeInfo , SourceChange , SourceFileEdit , TextRange ,
12
+ FilePosition , FileSystemEdit , RangeInfo , Reference , ReferenceKind , SourceChange ,
13
+ SourceFileEdit , TextRange ,
13
14
} ;
14
15
15
16
use super :: find_all_refs;
@@ -46,12 +47,20 @@ fn find_name_and_module_at_offset(
46
47
Some ( ( ast_name, ast_module) )
47
48
}
48
49
49
- fn source_edit_from_file_id_range (
50
- file_id : FileId ,
51
- range : TextRange ,
52
- new_name : & str ,
53
- ) -> SourceFileEdit {
54
- SourceFileEdit { file_id, edit : TextEdit :: replace ( range, new_name. into ( ) ) }
50
+ fn source_edit_from_reference ( reference : Reference , new_name : & str ) -> SourceFileEdit {
51
+ let mut replacement_text = String :: from ( new_name) ;
52
+ let file_id = reference. file_range . file_id ;
53
+ let range = match reference. kind {
54
+ ReferenceKind :: StructFieldShorthand => {
55
+ replacement_text. push_str ( ": " ) ;
56
+ TextRange :: from_to (
57
+ reference. file_range . range . start ( ) ,
58
+ reference. file_range . range . start ( ) ,
59
+ )
60
+ }
61
+ _ => reference. file_range . range ,
62
+ } ;
63
+ SourceFileEdit { file_id, edit : TextEdit :: replace ( range, replacement_text) }
55
64
}
56
65
57
66
fn rename_mod (
@@ -99,13 +108,10 @@ fn rename_mod(
99
108
source_file_edits. push ( edit) ;
100
109
101
110
if let Some ( RangeInfo { range : _, info : refs } ) = find_all_refs ( sema. db , position, None ) {
102
- let ref_edits = refs. references . into_iter ( ) . map ( |reference| {
103
- source_edit_from_file_id_range (
104
- reference. file_range . file_id ,
105
- reference. file_range . range ,
106
- new_name,
107
- )
108
- } ) ;
111
+ let ref_edits = refs
112
+ . references
113
+ . into_iter ( )
114
+ . map ( |reference| source_edit_from_reference ( reference, new_name) ) ;
109
115
source_file_edits. extend ( ref_edits) ;
110
116
}
111
117
@@ -121,13 +127,7 @@ fn rename_reference(
121
127
122
128
let edit = refs
123
129
. into_iter ( )
124
- . map ( |reference| {
125
- source_edit_from_file_id_range (
126
- reference. file_range . file_id ,
127
- reference. file_range . range ,
128
- new_name,
129
- )
130
- } )
130
+ . map ( |reference| source_edit_from_reference ( reference, new_name) )
131
131
. collect :: < Vec < _ > > ( ) ;
132
132
133
133
if edit. is_empty ( ) {
@@ -285,6 +285,64 @@ mod tests {
285
285
) ;
286
286
}
287
287
288
+ #[ test]
289
+ fn test_rename_for_struct_field ( ) {
290
+ test_rename (
291
+ r#"
292
+ struct Foo {
293
+ i<|>: i32,
294
+ }
295
+
296
+ impl Foo {
297
+ fn new(i: i32) -> Self {
298
+ Self { i: i }
299
+ }
300
+ }
301
+ "# ,
302
+ "j" ,
303
+ r#"
304
+ struct Foo {
305
+ j: i32,
306
+ }
307
+
308
+ impl Foo {
309
+ fn new(i: i32) -> Self {
310
+ Self { j: i }
311
+ }
312
+ }
313
+ "# ,
314
+ ) ;
315
+ }
316
+
317
+ #[ test]
318
+ fn test_rename_for_struct_field_shorthand ( ) {
319
+ test_rename (
320
+ r#"
321
+ struct Foo {
322
+ i<|>: i32,
323
+ }
324
+
325
+ impl Foo {
326
+ fn new(i: i32) -> Self {
327
+ Self { i }
328
+ }
329
+ }
330
+ "# ,
331
+ "j" ,
332
+ r#"
333
+ struct Foo {
334
+ j: i32,
335
+ }
336
+
337
+ impl Foo {
338
+ fn new(i: i32) -> Self {
339
+ Self { j: i }
340
+ }
341
+ }
342
+ "# ,
343
+ ) ;
344
+ }
345
+
288
346
#[ test]
289
347
fn test_rename_mod ( ) {
290
348
let ( analysis, position) = analysis_and_position (
0 commit comments