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:
bors 2023-05-19 07:41:46 +00:00
commit e8ae2d3976
2 changed files with 46 additions and 1 deletions

View file

@ -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;

View file

@ -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(