diff options
| author | lh123 <1585086582@qq.com> | 2025-01-16 19:40:42 +0800 |
|---|---|---|
| committer | lh123 <1585086582@qq.com> | 2025-01-16 19:40:42 +0800 |
| commit | 1f32c2a9ec0655941c68ff5c77bee2a03acf61fb (patch) | |
| tree | e03c7b031976aa21fbd37b721253ef71c17c0026 /src/tools/rust-analyzer/crates/ide-completion | |
| parent | 341a6d5bbaae3c032a7db1b3a512d4537daa87ee (diff) | |
| download | rust-1f32c2a9ec0655941c68ff5c77bee2a03acf61fb.tar.gz rust-1f32c2a9ec0655941c68ff5c77bee2a03acf61fb.zip | |
don't complete `raw` in `&mut $0`
Diffstat (limited to 'src/tools/rust-analyzer/crates/ide-completion')
4 files changed, 31 insertions, 7 deletions
diff --git a/src/tools/rust-analyzer/crates/ide-completion/src/completions/expr.rs b/src/tools/rust-analyzer/crates/ide-completion/src/completions/expr.rs index 49a96e27e70..db18b531d7c 100644 --- a/src/tools/rust-analyzer/crates/ide-completion/src/completions/expr.rs +++ b/src/tools/rust-analyzer/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/src/tools/rust-analyzer/crates/ide-completion/src/context.rs b/src/tools/rust-analyzer/crates/ide-completion/src/context.rs index 3705e2c73d6..b3b456d556d 100644 --- a/src/tools/rust-analyzer/crates/ide-completion/src/context.rs +++ b/src/tools/rust-analyzer/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/src/tools/rust-analyzer/crates/ide-completion/src/context/analysis.rs b/src/tools/rust-analyzer/crates/ide-completion/src/context/analysis.rs index 1a5609baf9c..3c4d489c0ff 100644 --- a/src/tools/rust-analyzer/crates/ide-completion/src/context/analysis.rs +++ b/src/tools/rust-analyzer/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/src/tools/rust-analyzer/crates/ide-completion/src/tests/expression.rs b/src/tools/rust-analyzer/crates/ide-completion/src/tests/expression.rs index 69378747340..e117dbf4bdf 100644 --- a/src/tools/rust-analyzer/crates/ide-completion/src/tests/expression.rs +++ b/src/tools/rust-analyzer/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 + "#]], ) } |
