Unnamed repository; edit this file 'description' to name the repository.
Include dereferences in consuming postfix completions (e.g. `call`)
Chayim Refael Friedman 2024-09-22
parent 9274703 · commit 7c01594
-rw-r--r--crates/ide-completion/src/completions/postfix.rs31
1 files changed, 31 insertions, 0 deletions
diff --git a/crates/ide-completion/src/completions/postfix.rs b/crates/ide-completion/src/completions/postfix.rs
index 2ede799c87..d3579fd8cc 100644
--- a/crates/ide-completion/src/completions/postfix.rs
+++ b/crates/ide-completion/src/completions/postfix.rs
@@ -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;
@@ -875,4 +887,23 @@ fn main() {
"#,
);
}
+
+ #[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);
+}
+"#,
+ );
+ }
}