Skip to content

Commit 5d232a9

Browse files
Haofeiclaude
andcommitted
review #1/#6: traverse match guards + object/array literals (await placement, async-lowerability, review facts)
check_await_placement_expr, expr_first_await (AST RS0411 path), and collect_body_facts_in_expr now recurse into match-arm guards and object/array literal children instead of treating them as leaves. 'let xs = [await load()]' is now correctly rejected (RS0411); review facts inside guards/object/array literals are now collected. First slice of the central-traversal fix. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
1 parent d15ec79 commit 5d232a9

3 files changed

Lines changed: 37 additions & 9 deletions

File tree

crates/rsscript/src/analyzer.rs

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4847,6 +4847,10 @@ fn expr_first_await(expr: &Expr) -> Option<crate::diagnostic::Span> {
48474847
| Expr::Try { value, .. } => expr_first_await(value),
48484848
Expr::Closure { body, .. } => block_first_await(body),
48494849
Expr::Match { value, arms, .. } => expr_first_await(value)
4850+
.or_else(|| {
4851+
arms.iter()
4852+
.find_map(|arm| arm.guard.as_ref().and_then(expr_first_await))
4853+
})
48504854
.or_else(|| arms.iter().find_map(|arm| block_first_await(&arm.body))),
48514855
Expr::MapLiteral { entries, .. } => entries
48524856
.iter()
@@ -4856,9 +4860,11 @@ fn expr_first_await(expr: &Expr) -> Option<crate::diagnostic::Span> {
48564860
.iter()
48574861
.find_map(|entry| expr_first_await(&entry.value))
48584862
}),
4859-
Expr::ObjectLiteral { .. }
4860-
| Expr::ArrayLiteral { .. }
4861-
| Expr::Ident(..)
4863+
Expr::ObjectLiteral { fields, .. } => fields
4864+
.iter()
4865+
.find_map(|field| expr_first_await(&field.value)),
4866+
Expr::ArrayLiteral { items, .. } => items.iter().find_map(expr_first_await),
4867+
Expr::Ident(..)
48624868
| Expr::Number(..)
48634869
| Expr::String(..)
48644870
| Expr::MultilineString(..)

crates/rsscript/src/checks/body.rs

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2757,6 +2757,9 @@ fn check_await_placement_expr(
27572757
HirExpr::Match { value, arms, .. } => {
27582758
check_await_placement_expr(analyzer, value, function_is_async);
27592759
for arm in arms {
2760+
if let Some(guard) = &arm.guard {
2761+
check_await_placement_expr(analyzer, guard, function_is_async);
2762+
}
27602763
check_await_placement(analyzer, &arm.body, function_is_async);
27612764
}
27622765
}
@@ -2766,9 +2769,17 @@ fn check_await_placement_expr(
27662769
check_await_placement_expr(analyzer, &entry.value, function_is_async);
27672770
}
27682771
}
2769-
HirExpr::ObjectLiteral { .. }
2770-
| HirExpr::ArrayLiteral { .. }
2771-
| HirExpr::Ident { .. }
2772+
HirExpr::ObjectLiteral { fields, .. } => {
2773+
for field in fields {
2774+
check_await_placement_expr(analyzer, &field.value, function_is_async);
2775+
}
2776+
}
2777+
HirExpr::ArrayLiteral { items, .. } => {
2778+
for item in items {
2779+
check_await_placement_expr(analyzer, item, function_is_async);
2780+
}
2781+
}
2782+
HirExpr::Ident { .. }
27722783
| HirExpr::Number { .. }
27732784
| HirExpr::String { .. }
27742785
| HirExpr::Unknown(_) => {}

crates/rsscript/src/hir.rs

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2366,18 +2366,29 @@ fn collect_body_facts_in_expr(
23662366
Expr::Match { value, arms, .. } => {
23672367
collect_body_facts_in_expr(hir, function_name, value, value_types, facts);
23682368
for arm in arms {
2369+
if let Some(guard) = &arm.guard {
2370+
collect_body_facts_in_expr(hir, function_name, guard, value_types, facts);
2371+
}
23692372
collect_body_facts_in_block(hir, function_name, &arm.body, value_types, facts);
23702373
}
23712374
}
2372-
Expr::ObjectLiteral { .. } => {}
2375+
Expr::ObjectLiteral { fields, .. } => {
2376+
for field in fields {
2377+
collect_body_facts_in_expr(hir, function_name, &field.value, value_types, facts);
2378+
}
2379+
}
23732380
Expr::MapLiteral { entries, .. } => {
23742381
for entry in entries {
23752382
collect_body_facts_in_expr(hir, function_name, &entry.key, value_types, facts);
23762383
collect_body_facts_in_expr(hir, function_name, &entry.value, value_types, facts);
23772384
}
23782385
}
2379-
Expr::ArrayLiteral { .. }
2380-
| Expr::Ident(_, _)
2386+
Expr::ArrayLiteral { items, .. } => {
2387+
for item in items {
2388+
collect_body_facts_in_expr(hir, function_name, item, value_types, facts);
2389+
}
2390+
}
2391+
Expr::Ident(_, _)
23812392
| Expr::Number(_, _)
23822393
| Expr::String(_, _)
23832394
| Expr::MultilineString(_, _)

0 commit comments

Comments
 (0)