Unnamed repository; edit this file 'description' to name the repository.
-rw-r--r--crates/ide-completion/src/context/analysis.rs10
-rw-r--r--crates/ide-completion/src/tests/expression.rs10
2 files changed, 17 insertions, 3 deletions
diff --git a/crates/ide-completion/src/context/analysis.rs b/crates/ide-completion/src/context/analysis.rs
index 6eb1727b33..7d6fa55300 100644
--- a/crates/ide-completion/src/context/analysis.rs
+++ b/crates/ide-completion/src/context/analysis.rs
@@ -1171,19 +1171,23 @@ fn classify_name_ref<'db>(
Some(res)
};
- let is_in_condition = |it: &ast::Expr| {
+ fn is_in_condition(it: &ast::Expr) -> bool {
(|| {
let parent = it.syntax().parent()?;
if let Some(expr) = ast::WhileExpr::cast(parent.clone()) {
Some(expr.condition()? == *it)
- } else if let Some(expr) = ast::IfExpr::cast(parent) {
+ } else if let Some(expr) = ast::IfExpr::cast(parent.clone()) {
Some(expr.condition()? == *it)
+ } else if let Some(expr) = ast::BinExpr::cast(parent)
+ && expr.op_token()?.kind() == T![&&]
+ {
+ Some(is_in_condition(&expr.into()))
} else {
None
}
})()
.unwrap_or(false)
- };
+ }
let make_path_kind_expr = |expr: ast::Expr| {
let it = expr.syntax();
diff --git a/crates/ide-completion/src/tests/expression.rs b/crates/ide-completion/src/tests/expression.rs
index 33f729f016..07eaeea97e 100644
--- a/crates/ide-completion/src/tests/expression.rs
+++ b/crates/ide-completion/src/tests/expression.rs
@@ -2275,3 +2275,13 @@ fn foo() {
"#]],
);
}
+
+#[test]
+fn let_in_condition() {
+ check_edit("let", r#"fn f() { if $0 {} }"#, r#"fn f() { if let $1 = $0 {} }"#);
+}
+
+#[test]
+fn let_in_let_chain() {
+ check_edit("let", r#"fn f() { if true && $0 {} }"#, r#"fn f() { if true && let $1 = $0 {} }"#);
+}