@@ -294,6 +294,18 @@ fn include_references(initial_element: &ast::Expr) -> (ast::Expr, ast::Expr) {
294
294
295
295
let mut new_element_opt = initial_element. clone ( ) ;
296
296
297
+ while let Some ( parent_deref_element) =
298
+ resulting_element. syntax ( ) . parent ( ) . and_then ( ast:: PrefixExpr :: cast)
299
+ {
300
+ if parent_deref_element. op_kind ( ) != Some ( ast:: UnaryOp :: Deref ) {
301
+ break ;
302
+ }
303
+
304
+ resulting_element = ast:: Expr :: from ( parent_deref_element) ;
305
+
306
+ new_element_opt = make:: expr_prefix ( syntax:: T ![ * ] , new_element_opt) ;
307
+ }
308
+
297
309
if let Some ( first_ref_expr) = resulting_element. syntax ( ) . parent ( ) . and_then ( ast:: RefExpr :: cast) {
298
310
if let Some ( expr) = first_ref_expr. expr ( ) {
299
311
resulting_element = expr;
@@ -302,9 +314,10 @@ fn include_references(initial_element: &ast::Expr) -> (ast::Expr, ast::Expr) {
302
314
while let Some ( parent_ref_element) =
303
315
resulting_element. syntax ( ) . parent ( ) . and_then ( ast:: RefExpr :: cast)
304
316
{
317
+ let exclusive = parent_ref_element. mut_token ( ) . is_some ( ) ;
305
318
resulting_element = ast:: Expr :: from ( parent_ref_element) ;
306
319
307
- new_element_opt = make:: expr_ref ( new_element_opt, false ) ;
320
+ new_element_opt = make:: expr_ref ( new_element_opt, exclusive ) ;
308
321
}
309
322
} else {
310
323
// If we do not find any ref expressions, restore
@@ -855,4 +868,42 @@ fn test() {
855
868
expect ! [ [ r#""# ] ] ,
856
869
) ;
857
870
}
871
+
872
+ #[ test]
873
+ fn mut_ref_consuming ( ) {
874
+ check_edit (
875
+ "call" ,
876
+ r#"
877
+ fn main() {
878
+ let mut x = &mut 2;
879
+ &mut x.$0;
880
+ }
881
+ "# ,
882
+ r#"
883
+ fn main() {
884
+ let mut x = &mut 2;
885
+ ${1}(&mut x);
886
+ }
887
+ "# ,
888
+ ) ;
889
+ }
890
+
891
+ #[ test]
892
+ fn deref_consuming ( ) {
893
+ check_edit (
894
+ "call" ,
895
+ r#"
896
+ fn main() {
897
+ let mut x = &mut 2;
898
+ &mut *x.$0;
899
+ }
900
+ "# ,
901
+ r#"
902
+ fn main() {
903
+ let mut x = &mut 2;
904
+ ${1}(&mut *x);
905
+ }
906
+ "# ,
907
+ ) ;
908
+ }
858
909
}
0 commit comments