@@ -295,7 +295,7 @@ fn build_usage_edit(
295
295
Some ( field_expr) => Some ( {
296
296
let field_name: SmolStr = field_expr. name_ref ( ) ?. to_string ( ) . into ( ) ;
297
297
let new_field_name = field_names. get ( & field_name) ?;
298
- let new_expr = make. expr_path ( ast:: make:: ext:: ident_path ( new_field_name) ) ;
298
+ let new_expr = ast :: make:: expr_path ( ast:: make:: ext:: ident_path ( new_field_name) ) ;
299
299
300
300
// If struct binding is a reference, we might need to deref field usages
301
301
if data. is_ref {
@@ -305,7 +305,7 @@ fn build_usage_edit(
305
305
ref_data. wrap_expr ( new_expr) . syntax ( ) . clone_for_update ( ) ,
306
306
)
307
307
} else {
308
- ( field_expr. syntax ( ) . clone ( ) , new_expr. syntax ( ) . clone ( ) )
308
+ ( field_expr. syntax ( ) . clone ( ) , new_expr. syntax ( ) . clone_for_update ( ) )
309
309
}
310
310
} ) ,
311
311
None => Some ( (
@@ -697,6 +697,52 @@ mod tests {
697
697
)
698
698
}
699
699
700
+ #[ test]
701
+ fn ref_not_add_parenthesis_and_deref_record ( ) {
702
+ check_assist (
703
+ destructure_struct_binding,
704
+ r#"
705
+ struct Foo { bar: i32, baz: i32 }
706
+
707
+ fn main() {
708
+ let $0foo = &Foo { bar: 1, baz: 2 };
709
+ let _ = &foo.bar;
710
+ }
711
+ "# ,
712
+ r#"
713
+ struct Foo { bar: i32, baz: i32 }
714
+
715
+ fn main() {
716
+ let Foo { bar, baz } = &Foo { bar: 1, baz: 2 };
717
+ let _ = bar;
718
+ }
719
+ "# ,
720
+ )
721
+ }
722
+
723
+ #[ test]
724
+ fn ref_not_add_parenthesis_and_deref_tuple ( ) {
725
+ check_assist (
726
+ destructure_struct_binding,
727
+ r#"
728
+ struct Foo(i32, i32);
729
+
730
+ fn main() {
731
+ let $0foo = &Foo(1, 2);
732
+ let _ = &foo.0;
733
+ }
734
+ "# ,
735
+ r#"
736
+ struct Foo(i32, i32);
737
+
738
+ fn main() {
739
+ let Foo(_0, _1) = &Foo(1, 2);
740
+ let _ = _0;
741
+ }
742
+ "# ,
743
+ )
744
+ }
745
+
700
746
#[ test]
701
747
fn record_struct_name_collision ( ) {
702
748
check_assist (
0 commit comments