commit 9cb1c1ee48a073832f3a74ca6b3c669cf8446d7d (tree)
parent 0cf392776c404c06f3b11fd908e91683e6606f83
Author: Motiejus Jakštys <motiejus.jakstys@chronosphere.io>
Date: Tue, 10 Feb 2026 18:39:13 +0000
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>
Diffstat:
2 files changed, 47 insertions(+), 5 deletions(-)
diff --git a/parser.c b/parser.c
@@ -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);
diff --git a/parser_test.zig b/parser_test.zig
@@ -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 {}