parser: port if-condition-wraps tests, implement catch payload

Port tests:
- "if condition has line break but must not wrap"
- "if condition has line break but must not wrap (no fn call comma)"

Implement catch payload (|err|) parsing in parseExprPrecedence.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-02-10 18:39:13 +00:00
parent 6356c15c70
commit 2dc5993a29
2 changed files with 47 additions and 5 deletions

View File

@@ -1744,11 +1744,8 @@ static AstNodeIndex parseExprPrecedence(Parser* p, int32_t min_prec) {
assert(info.prec != banned_prec);
const AstTokenIndex oper_token = nextToken(p);
if (tok_tag == TOKEN_KEYWORD_CATCH) {
fprintf(stderr, "parsePayload not supported\n");
exit(1);
return 0; // tcc
}
if (tok_tag == TOKEN_KEYWORD_CATCH)
parsePayload(p);
const AstNodeIndex rhs = parseExprPrecedence(p, info.prec + 1);
assert(rhs != 0);

View File

@@ -2009,6 +2009,51 @@ test "zig fmt: if condition wraps" {
);
}
test "zig fmt: if condition has line break but must not wrap" {
try testCanonical(
\\comptime {
\\ if (self.user_input_options.put(
\\ name,
\\ UserInputOption{
\\ .name = name,
\\ .used = false,
\\ },
\\ ) catch unreachable) |*prev_value| {
\\ foo();
\\ bar();
\\ }
\\ if (put(
\\ a,
\\ b,
\\ )) {
\\ foo();
\\ }
\\}
\\
);
}
test "zig fmt: if condition has line break but must not wrap (no fn call comma)" {
try testCanonical(
\\comptime {
\\ if (self.user_input_options.put(name, UserInputOption{
\\ .name = name,
\\ .used = false,
\\ }) catch unreachable) |*prev_value| {
\\ foo();
\\ bar();
\\ }
\\ if (put(
\\ a,
\\ b,
\\ )) {
\\ foo();
\\ }
\\}
\\
);
}
test "zig fmt: pointer of unknown length" {
try testCanonical(
\\fn foo(ptr: [*]u8) void {}