authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2018-05-25 01:45:14-04:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2018-05-25 01:45:14-04:00
log000c01a36aeef162d743ebf4bd8ee67380f26672
tree60c3229c48ad57a4fa67de5604eab46cda688f3c
parent08f95d0c2fac127558c84f7dfb469ac43fb4f425

zig fmt: handle missing trailing comma in array literals


2 files changed, 50 insertions(+), 22 deletions(-)

std/zig/parser_test.zig+20
......@@ -1,3 +1,23 @@
1test "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
121test "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
......@@ -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
1463fn 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}