diff --git a/lib/std/zig/parser_test.zig b/lib/std/zig/parser_test.zig index f193e1b6ef3de796c5414edcefad1a16b031b45c..2e7a37668444cd9ec16010cc999ddec314f3ea03 100644 --- a/lib/std/zig/parser_test.zig +++ b/lib/std/zig/parser_test.zig @@ -26,6 +26,21 @@ test "zig fmt: c pointer type" { ); } +test "zig fmt: builtin call with trailing comma" { + try testCanonical( + \\pub fn main() void { + \\ @breakpoint(); + \\ _ = @boolToInt(a); + \\ _ = @call( + \\ a, + \\ b, + \\ c, + \\ ); + \\} + \\ + ); +} + test "zig fmt: asm expression with comptime content" { try testCanonical( \\comptime { diff --git a/lib/std/zig/render.zig b/lib/std/zig/render.zig index 6e1ee4a601c76750987b973b10012ba40744d2a5..d3553bb0bd06a34c76e3816b40601790b0d5944b 100644 --- a/lib/std/zig/render.zig +++ b/lib/std/zig/render.zig @@ -1263,17 +1263,41 @@ fn renderExpression( try renderToken(tree, stream, builtin_call.builtin_token, indent, start_col, Space.None); // @name } - try renderToken(tree, stream, tree.nextToken(builtin_call.builtin_token), indent, start_col, Space.None); // ( + const src_params_trailing_comma = blk: { + if (builtin_call.params.len < 2) break :blk false; + const last_node = builtin_call.params.at(builtin_call.params.len - 1).*; + const maybe_comma = tree.nextToken(last_node.lastToken()); + break :blk tree.tokens.at(maybe_comma).id == .Comma; + }; - var it = builtin_call.params.iterator(0); - while (it.next()) |param_node| { - try renderExpression(allocator, stream, tree, indent, start_col, param_node.*, Space.None); + const lparen = tree.nextToken(builtin_call.builtin_token); - if (it.peek() != null) { - const comma_token = tree.nextToken(param_node.*.lastToken()); - try renderToken(tree, stream, comma_token, indent, start_col, Space.Space); // , + if (!src_params_trailing_comma) { + try renderToken(tree, stream, lparen, indent, start_col, Space.None); // ( + + // render all on one line, no trailing comma + var it = builtin_call.params.iterator(0); + while (it.next()) |param_node| { + try renderExpression(allocator, stream, tree, indent, start_col, param_node.*, Space.None); + + if (it.peek() != null) { + const comma_token = tree.nextToken(param_node.*.lastToken()); + try renderToken(tree, stream, comma_token, indent, start_col, Space.Space); // , + } + } + } else { + // one param per line + const new_indent = indent + indent_delta; + try renderToken(tree, stream, lparen, new_indent, start_col, Space.Newline); // ( + + var it = builtin_call.params.iterator(0); + while (it.next()) |param_node| { + try stream.writeByteNTimes(' ', new_indent); + try renderExpression(allocator, stream, tree, indent, start_col, param_node.*, Space.Comma); } + try stream.writeByteNTimes(' ', indent); } + return renderToken(tree, stream, builtin_call.rparen_token, indent, start_col, space); // ) },