From afd029091854358e6e88cfc4cbb524022f4ec136 Mon Sep 17 00:00:00 2001 From: LemonBoy Date: Thu, 2 Jan 2020 22:16:31 +0100 Subject: [PATCH] Trailing comma is respected for builtin calls --- lib/std/zig/parser_test.zig | 21 +++++++++++++++++++++ lib/std/zig/render.zig | 37 ++++++++++++++++++++++++++++++------- 2 files changed, 51 insertions(+), 7 deletions(-) diff --git a/lib/std/zig/parser_test.zig b/lib/std/zig/parser_test.zig index f193e1b6e..c5500091f 100644 --- a/lib/std/zig/parser_test.zig +++ b/lib/std/zig/parser_test.zig @@ -26,6 +26,27 @@ test "zig fmt: c pointer type" { ); } +test "zig fmt: builtin call with trailing comma" { + try testCanonical( + \\pub fn main() void { + \\ _ = @intToPtr( + \\ a, + \\ b, + \\ ); + \\ _ = @ptrCast( + \\ a, + \\ b, + \\ ); + \\ _ = @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 6e1ee4a60..1f377e71b 100644 --- a/lib/std/zig/render.zig +++ b/lib/std/zig/render.zig @@ -1263,17 +1263,40 @@ 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: { + const maybe_comma = tree.prevToken(builtin_call.rparen_token); + 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); + // try renderParamDecl(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); // ) },