Skip to content

Commit f49ac9a

Browse files
committed
fix(parser): parenthesized sub-expressions in arithmetic (trim_outer shadowing bug)
parse_expr trimmed outer parens in two statements: let start = trim_outer(..).0; let end = trim_outer(.., start, ..).1; // uses the already-incremented start so the second call saw a range no longer starting with '(' and left the closing ')' in range -> every parenthesized expression became Expr::Unknown (RS0015). Collapse to a single tuple destructure. Now (a+b), (a+b)*c, a*(b+c), ((a+b)*c)-a all parse+eval. Regression fixture: tests/fixtures/pass/paren-grouping-arithmetic.rss. cargo test green. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
1 parent d20dd60 commit f49ac9a

3 files changed

Lines changed: 18 additions & 4 deletions

File tree

.claude/scheduled_tasks.lock

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{"sessionId":"a5283d36-5897-48c1-b2a0-489912035d4c","pid":2925204,"procStart":"19492512","acquiredAt":1780991634075}

crates/rsscript/src/syntax/parser.rs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2217,8 +2217,7 @@ fn split_match_pattern_guard(tokens: &[Token], start: usize, end: usize) -> Opti
22172217
}
22182218

22192219
fn parse_match_pattern(tokens: &[Token], start: usize, end: usize) -> Option<MatchPattern> {
2220-
let start = trim_outer(tokens, start, end).0;
2221-
let end = trim_outer(tokens, start, end).1;
2220+
let (start, end) = trim_outer(tokens, start, end);
22222221
if start >= end {
22232222
return None;
22242223
}
@@ -2441,8 +2440,7 @@ fn starts_like_constructor(name: &str) -> bool {
24412440
}
24422441

24432442
fn parse_expr(tokens: &[Token], start: usize, end: usize) -> Option<Expr> {
2444-
let start = trim_outer(tokens, start, end).0;
2445-
let end = trim_outer(tokens, start, end).1;
2443+
let (start, end) = trim_outer(tokens, start, end);
24462444
if start >= end {
24472445
return None;
24482446
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
// Regression: parenthesized sub-expressions in arithmetic must parse (trim_outer
2+
// double-call bug left the closing paren in range, yielding RS0015 Unknown).
3+
fn compute(a: Int, b: Int, c: Int) -> Int {
4+
let g = (a + b)
5+
let h = (a + b) * c
6+
let i = a * (b + c)
7+
let j = ((a + b) * c) - a
8+
let k = (a + b) / c
9+
return ((g + h) + i) + ((j + k) + 0)
10+
}
11+
12+
fn main() -> Unit {
13+
Log.write(message: read Int.to_string(value: read compute(a: 2, b: 3, c: 4)))
14+
return Unit
15+
}

0 commit comments

Comments
 (0)