Skip to content

Commit a5f028b

Browse files
committed
Auto merge of rust-lang#18161 - ChayimFriedman2:postfix-mut, r=Veykril
fix: Better support references in consuming postfix completions Fixes rust-lang#18155.
2 parents a8eaa9e + ded3a5c commit a5f028b

File tree

1 file changed

+52
-1
lines changed
  • src/tools/rust-analyzer/crates/ide-completion/src/completions

1 file changed

+52
-1
lines changed

src/tools/rust-analyzer/crates/ide-completion/src/completions/postfix.rs

+52-1
Original file line numberDiff line numberDiff line change
@@ -294,6 +294,18 @@ fn include_references(initial_element: &ast::Expr) -> (ast::Expr, ast::Expr) {
294294

295295
let mut new_element_opt = initial_element.clone();
296296

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+
297309
if let Some(first_ref_expr) = resulting_element.syntax().parent().and_then(ast::RefExpr::cast) {
298310
if let Some(expr) = first_ref_expr.expr() {
299311
resulting_element = expr;
@@ -302,9 +314,10 @@ fn include_references(initial_element: &ast::Expr) -> (ast::Expr, ast::Expr) {
302314
while let Some(parent_ref_element) =
303315
resulting_element.syntax().parent().and_then(ast::RefExpr::cast)
304316
{
317+
let exclusive = parent_ref_element.mut_token().is_some();
305318
resulting_element = ast::Expr::from(parent_ref_element);
306319

307-
new_element_opt = make::expr_ref(new_element_opt, false);
320+
new_element_opt = make::expr_ref(new_element_opt, exclusive);
308321
}
309322
} else {
310323
// If we do not find any ref expressions, restore
@@ -855,4 +868,42 @@ fn test() {
855868
expect![[r#""#]],
856869
);
857870
}
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+
}
858909
}

0 commit comments

Comments
 (0)