mirror of
https://github.com/rust-lang/rust-analyzer
synced 2024-12-29 06:23:25 +00:00
Auto merge of #14848 - bm-w:fix/highlight-let-else-return, r=Veykril
Fix `preorder_expr` skipping the `else` block of let-else statements Fixes exit/yield points not getting highlighted in such blocks for `highlight_related` (#14813; and possibly other bugs in features that use `preorder_expr`).
This commit is contained in:
commit
e8ae2d3976
2 changed files with 46 additions and 1 deletions
|
@ -52,7 +52,9 @@ pub fn preorder_expr(start: &ast::Expr, cb: &mut dyn FnMut(WalkEvent<ast::Expr>)
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
if let Some(let_stmt) = node.parent().and_then(ast::LetStmt::cast) {
|
if let Some(let_stmt) = node.parent().and_then(ast::LetStmt::cast) {
|
||||||
if Some(node.clone()) != let_stmt.initializer().map(|it| it.syntax().clone()) {
|
if let_stmt.initializer().map(|it| it.syntax() != &node).unwrap_or(true)
|
||||||
|
&& let_stmt.let_else().map(|it| it.syntax() != &node).unwrap_or(true)
|
||||||
|
{
|
||||||
// skipping potential const pat expressions in let statements
|
// skipping potential const pat expressions in let statements
|
||||||
preorder.skip_subtree();
|
preorder.skip_subtree();
|
||||||
continue;
|
continue;
|
||||||
|
|
|
@ -692,6 +692,29 @@ pub async$0 fn foo() {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_hl_let_else_yield_points() {
|
||||||
|
check(
|
||||||
|
r#"
|
||||||
|
pub async fn foo() {
|
||||||
|
// ^^^^^
|
||||||
|
let x = foo()
|
||||||
|
.await$0
|
||||||
|
// ^^^^^
|
||||||
|
.await;
|
||||||
|
// ^^^^^
|
||||||
|
|| { 0.await };
|
||||||
|
let Some(_) = None else {
|
||||||
|
foo().await
|
||||||
|
// ^^^^^
|
||||||
|
};
|
||||||
|
(async { 0.await }).await
|
||||||
|
// ^^^^^
|
||||||
|
}
|
||||||
|
"#,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_hl_yield_nested_fn() {
|
fn test_hl_yield_nested_fn() {
|
||||||
check(
|
check(
|
||||||
|
@ -788,6 +811,26 @@ async fn foo() {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_hl_let_else_exit_points() {
|
||||||
|
check(
|
||||||
|
r#"
|
||||||
|
fn$0 foo() -> u32 {
|
||||||
|
//^^
|
||||||
|
let Some(bar) = None else {
|
||||||
|
return 0;
|
||||||
|
// ^^^^^^
|
||||||
|
};
|
||||||
|
|
||||||
|
0?;
|
||||||
|
// ^
|
||||||
|
0xDEAD_BEEF
|
||||||
|
// ^^^^^^^^^^^
|
||||||
|
}
|
||||||
|
"#,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_hl_prefer_ref_over_tail_exit() {
|
fn test_hl_prefer_ref_over_tail_exit() {
|
||||||
check(
|
check(
|
||||||
|
|
Loading…
Reference in a new issue