Unnamed repository; edit this file 'description' to name the repository.
-rw-r--r--crates/ide-completion/src/completions/expr.rs13
-rw-r--r--crates/ide-completion/src/context.rs1
-rw-r--r--crates/ide-completion/src/context/analysis.rs4
-rw-r--r--crates/ide-completion/src/tests/expression.rs20
4 files changed, 31 insertions, 7 deletions
diff --git a/crates/ide-completion/src/completions/expr.rs b/crates/ide-completion/src/completions/expr.rs
index 49a96e27e7..db18b531d7 100644
--- a/crates/ide-completion/src/completions/expr.rs
+++ b/crates/ide-completion/src/completions/expr.rs
@@ -62,6 +62,7 @@ pub(crate) fn complete_expr_path(
in_condition,
incomplete_let,
ref ref_expr_parent,
+ after_amp,
ref is_func_update,
ref innermost_ret_ty,
ref impl_,
@@ -69,14 +70,12 @@ pub(crate) fn complete_expr_path(
..
} = expr_ctx;
- let has_raw_token =
- ref_expr_parent.as_ref().map(|it| it.raw_token().is_some()).unwrap_or(false);
- let has_const_token =
- ref_expr_parent.as_ref().map(|it| it.const_token().is_some()).unwrap_or(false);
- let has_mut_token =
- ref_expr_parent.as_ref().map(|it| it.mut_token().is_some()).unwrap_or(false);
+ let (has_raw_token, has_const_token, has_mut_token) = ref_expr_parent
+ .as_ref()
+ .map(|it| (it.raw_token().is_some(), it.const_token().is_some(), it.mut_token().is_some()))
+ .unwrap_or((false, false, false));
- let wants_raw_token = ref_expr_parent.is_some() && !has_raw_token;
+ let wants_raw_token = ref_expr_parent.is_some() && !has_raw_token && after_amp;
let wants_const_token =
ref_expr_parent.is_some() && has_raw_token && !has_const_token && !has_mut_token;
let wants_mut_token = if ref_expr_parent.is_some() {
diff --git a/crates/ide-completion/src/context.rs b/crates/ide-completion/src/context.rs
index 3705e2c73d..b3b456d556 100644
--- a/crates/ide-completion/src/context.rs
+++ b/crates/ide-completion/src/context.rs
@@ -146,6 +146,7 @@ pub(crate) struct PathExprCtx {
pub(crate) in_condition: bool,
pub(crate) incomplete_let: bool,
pub(crate) ref_expr_parent: Option<ast::RefExpr>,
+ pub(crate) after_amp: bool,
/// The surrounding RecordExpression we are completing a functional update
pub(crate) is_func_update: Option<ast::RecordExpr>,
pub(crate) self_param: Option<hir::SelfParam>,
diff --git a/crates/ide-completion/src/context/analysis.rs b/crates/ide-completion/src/context/analysis.rs
index 1a5609baf9..3c4d489c0f 100644
--- a/crates/ide-completion/src/context/analysis.rs
+++ b/crates/ide-completion/src/context/analysis.rs
@@ -1151,6 +1151,9 @@ fn classify_name_ref(
let after_if_expr = after_if_expr(it.clone());
let ref_expr_parent =
path.as_single_name_ref().and_then(|_| it.parent()).and_then(ast::RefExpr::cast);
+ let after_amp = non_trivia_sibling(it.clone().into(), Direction::Prev)
+ .map(|it| it.kind() == SyntaxKind::AMP)
+ .unwrap_or(false);
let (innermost_ret_ty, self_param) = {
let find_ret_ty = |it: SyntaxNode| {
if let Some(item) = ast::Item::cast(it.clone()) {
@@ -1220,6 +1223,7 @@ fn classify_name_ref(
after_if_expr,
in_condition,
ref_expr_parent,
+ after_amp,
is_func_update,
innermost_ret_ty,
self_param,
diff --git a/crates/ide-completion/src/tests/expression.rs b/crates/ide-completion/src/tests/expression.rs
index 6937874734..e117dbf4bd 100644
--- a/crates/ide-completion/src/tests/expression.rs
+++ b/crates/ide-completion/src/tests/expression.rs
@@ -522,6 +522,26 @@ fn completes_after_ref_expr() {
kw while
kw while let
"#]],
+ );
+ check(
+ r#"fn main() { let _ = &mut $0 }"#,
+ expect![[r#"
+ fn main() fn()
+ bt u32 u32
+ kw crate::
+ kw false
+ kw for
+ kw if
+ kw if let
+ kw loop
+ kw match
+ kw return
+ kw self::
+ kw true
+ kw unsafe
+ kw while
+ kw while let
+ "#]],
)
}