Skip to content

Commit 000c01a

Browse files
committed
zig fmt: handle missing trailing comma in array literals
1 parent 08f95d0 commit 000c01a

File tree

2 files changed

+50
-22
lines changed

2 files changed

+50
-22
lines changed

std/zig/parser_test.zig

+20
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,23 @@
1+
test "zig fmt: first thing in file is line comment" {
2+
try testTransform(
3+
\\comptime {
4+
\\ return []u16{'m', 's', 'y', 's', '-' // hi
5+
\\ };
6+
\\}
7+
,
8+
\\comptime {
9+
\\ return []u16{
10+
\\ 'm',
11+
\\ 's',
12+
\\ 'y',
13+
\\ 's',
14+
\\ '-', // hi
15+
\\ };
16+
\\}
17+
\\
18+
);
19+
}
20+
121
test "zig fmt: first thing in file is line comment" {
222
try testCanonical(
323
\\// Introspection and determination of system libraries needed by zig.

std/zig/render.zig

+30-22
Original file line numberDiff line numberDiff line change
@@ -490,13 +490,16 @@ fn renderExpression(allocator: &mem.Allocator, stream: var, tree: &ast.Tree, ind
490490
var it = exprs.iterator(0);
491491
while (it.next()) |expr| {
492492
try stream.writeByteNTimes(' ', new_indent);
493-
try renderExpression(allocator, stream, tree, new_indent, expr.*, Space.None);
494-
495-
const comma = tree.nextToken(expr.*.lastToken());
496-
try renderToken(tree, stream, comma, new_indent, Space.Newline); // ,
497493

498494
if (it.peek()) |next_expr| {
495+
try renderExpression(allocator, stream, tree, new_indent, expr.*, Space.None);
496+
497+
const comma = tree.nextToken(expr.*.lastToken());
498+
try renderToken(tree, stream, comma, new_indent, Space.Newline); // ,
499+
499500
try renderExtraNewline(tree, stream, next_expr.*);
501+
} else {
502+
try renderTrailingComma(allocator, stream, tree, indent, expr.*, Space.Newline);
500503
}
501504
}
502505

@@ -950,24 +953,7 @@ fn renderExpression(allocator: &mem.Allocator, stream: var, tree: &ast.Tree, ind
950953
try renderExpression(allocator, stream, tree, indent, payload, Space.Space);
951954
}
952955

953-
// add a trailing comma if necessary
954-
const end_token = switch_case.lastToken() + 1;
955-
switch (tree.tokens.at(end_token).id) {
956-
Token.Id.Comma => {
957-
try renderExpression(allocator, stream, tree, indent, switch_case.expr, Space.None);
958-
try renderToken(tree, stream, end_token, indent, space); // ,
959-
},
960-
Token.Id.LineComment => {
961-
try renderExpression(allocator, stream, tree, indent, switch_case.expr, Space.NoComment);
962-
try stream.write(", ");
963-
try renderToken(tree, stream, end_token, indent, space);
964-
},
965-
else => {
966-
try renderExpression(allocator, stream, tree, indent, switch_case.expr, Space.None);
967-
try stream.write(",\n");
968-
assert(space == Space.Newline);
969-
},
970-
}
956+
try renderTrailingComma(allocator, stream, tree, indent, switch_case.expr, space);
971957
},
972958
ast.Node.Id.SwitchElse => {
973959
const switch_else = @fieldParentPtr(ast.Node.SwitchElse, "base", base);
@@ -1473,3 +1459,25 @@ fn renderDocComments(tree: &ast.Tree, stream: var, node: var, indent: usize) (@t
14731459
try stream.writeByteNTimes(' ', indent);
14741460
}
14751461
}
1462+
1463+
fn renderTrailingComma(allocator: &mem.Allocator, stream: var, tree: &ast.Tree, indent: usize, base: &ast.Node,
1464+
space: Space) (@typeOf(stream).Child.Error || Error)!void
1465+
{
1466+
const end_token = base.lastToken() + 1;
1467+
switch (tree.tokens.at(end_token).id) {
1468+
Token.Id.Comma => {
1469+
try renderExpression(allocator, stream, tree, indent, base, Space.None);
1470+
try renderToken(tree, stream, end_token, indent, space); // ,
1471+
},
1472+
Token.Id.LineComment => {
1473+
try renderExpression(allocator, stream, tree, indent, base, Space.NoComment);
1474+
try stream.write(", ");
1475+
try renderToken(tree, stream, end_token, indent, space);
1476+
},
1477+
else => {
1478+
try renderExpression(allocator, stream, tree, indent, base, Space.None);
1479+
try stream.write(",\n");
1480+
assert(space == Space.Newline);
1481+
},
1482+
}
1483+
}

0 commit comments

Comments
 (0)