From 5fda166acfc7c7c4916b42d9a6810dce0e5b905d Mon Sep 17 00:00:00 2001 From: A4-Tacks Date: Sat, 25 Oct 2025 15:24:37 +0800 Subject: [PATCH] Fix not complete `let` before expr in condition Example --- ```rust fn f() { if $0foo.bar() {} } ``` **Before this PR** "let" not in completion list **After this PR** ```rust fn f() { if let $1 = $0foo.bar() {} } ``` --- .../crates/ide-completion/src/completions/postfix.rs | 2 ++ .../crates/ide-completion/src/tests/expression.rs | 6 ++++++ 2 files changed, 8 insertions(+) diff --git a/src/tools/rust-analyzer/crates/ide-completion/src/completions/postfix.rs b/src/tools/rust-analyzer/crates/ide-completion/src/completions/postfix.rs index 8c2bb961c586..ab3f619fd7f5 100644 --- a/src/tools/rust-analyzer/crates/ide-completion/src/completions/postfix.rs +++ b/src/tools/rust-analyzer/crates/ide-completion/src/completions/postfix.rs @@ -460,6 +460,8 @@ pub(crate) fn is_in_condition(it: &ast::Expr) -> bool { ast::MatchGuard(guard) => guard.condition()? == *it, ast::BinExpr(bin_expr) => (bin_expr.op_token()?.kind() == T![&&]) .then(|| is_in_condition(&bin_expr.into()))?, + ast::Expr(expr) => (expr.syntax().text_range().start() == it.syntax().text_range().start()) + .then(|| is_in_condition(&expr))?, _ => return None, } }) }) 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 67c84f42c1ae..4033aa5d9c5e 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 @@ -3268,6 +3268,12 @@ fn foo() -> (i32, i32) { #[test] fn let_in_condition() { check_edit("let", r#"fn f() { if $0 {} }"#, r#"fn f() { if let $1 = $0 {} }"#); + check_edit("let", r#"fn f() { if $0x {} }"#, r#"fn f() { if let $1 = $0x {} }"#); + check_edit( + "let", + r#"fn f() { if $0foo.bar() {} }"#, + r#"fn f() { if let $1 = $0foo.bar() {} }"#, + ); } #[test]