Commit afd0290918

LemonBoy <thatlemon@gmail.com>
2020-01-02 22:16:31
Trailing comma is respected for builtin calls
1 parent a90fa45
Changed files (2)
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 {
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;
+            };
+
+            const lparen = tree.nextToken(builtin_call.builtin_token);
+
+            if (!src_params_trailing_comma) {
+                try renderToken(tree, stream, lparen, indent, start_col, Space.None); // (
 
-            var it = builtin_call.params.iterator(0);
-            while (it.next()) |param_node| {
-                try renderExpression(allocator, stream, tree, indent, start_col, param_node.*, 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); // (
 
-                if (it.peek() != null) {
-                    const comma_token = tree.nextToken(param_node.*.lastToken());
-                    try renderToken(tree, stream, comma_token, indent, start_col, Space.Space); // ,
+                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); // )
         },