mirror of
https://github.com/rust-lang/rust-analyzer
synced 2024-12-26 13:03:31 +00:00
Auto merge of #18161 - ChayimFriedman2:postfix-mut, r=Veykril
fix: Better support references in consuming postfix completions Fixes #18155.
This commit is contained in:
commit
f30d4ea9c0
1 changed files with 52 additions and 1 deletions
|
@ -294,6 +294,18 @@ fn include_references(initial_element: &ast::Expr) -> (ast::Expr, ast::Expr) {
|
|||
|
||||
let mut new_element_opt = initial_element.clone();
|
||||
|
||||
while let Some(parent_deref_element) =
|
||||
resulting_element.syntax().parent().and_then(ast::PrefixExpr::cast)
|
||||
{
|
||||
if parent_deref_element.op_kind() != Some(ast::UnaryOp::Deref) {
|
||||
break;
|
||||
}
|
||||
|
||||
resulting_element = ast::Expr::from(parent_deref_element);
|
||||
|
||||
new_element_opt = make::expr_prefix(syntax::T![*], new_element_opt);
|
||||
}
|
||||
|
||||
if let Some(first_ref_expr) = resulting_element.syntax().parent().and_then(ast::RefExpr::cast) {
|
||||
if let Some(expr) = first_ref_expr.expr() {
|
||||
resulting_element = expr;
|
||||
|
@ -302,9 +314,10 @@ fn include_references(initial_element: &ast::Expr) -> (ast::Expr, ast::Expr) {
|
|||
while let Some(parent_ref_element) =
|
||||
resulting_element.syntax().parent().and_then(ast::RefExpr::cast)
|
||||
{
|
||||
let exclusive = parent_ref_element.mut_token().is_some();
|
||||
resulting_element = ast::Expr::from(parent_ref_element);
|
||||
|
||||
new_element_opt = make::expr_ref(new_element_opt, false);
|
||||
new_element_opt = make::expr_ref(new_element_opt, exclusive);
|
||||
}
|
||||
} else {
|
||||
// If we do not find any ref expressions, restore
|
||||
|
@ -855,4 +868,42 @@ fn test() {
|
|||
expect![[r#""#]],
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn mut_ref_consuming() {
|
||||
check_edit(
|
||||
"call",
|
||||
r#"
|
||||
fn main() {
|
||||
let mut x = &mut 2;
|
||||
&mut x.$0;
|
||||
}
|
||||
"#,
|
||||
r#"
|
||||
fn main() {
|
||||
let mut x = &mut 2;
|
||||
${1}(&mut x);
|
||||
}
|
||||
"#,
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn deref_consuming() {
|
||||
check_edit(
|
||||
"call",
|
||||
r#"
|
||||
fn main() {
|
||||
let mut x = &mut 2;
|
||||
&mut *x.$0;
|
||||
}
|
||||
"#,
|
||||
r#"
|
||||
fn main() {
|
||||
let mut x = &mut 2;
|
||||
${1}(&mut *x);
|
||||
}
|
||||
"#,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue