authorgravatar for thatlemon@gmail.comLemonBoy <thatlemon@gmail.com> 2020-02-28 12:06:43+01:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2020-03-18 11:15:22-04:00
log11a4ce42c16c17422cd272f154c9c33231bcc61a
tree7947d3da28ca685619fc46248634003b4331cb3f
parent63a4dbc30d3ef3c7f8a8c6a2ba2087eaab8b830a
signaturelock-open Commit is signed but in an unrecognized format.

zig fmt: Respect trailing commas in error set declarations

The logic is not perfect as it doesn't take into account the presence of doc comments, but it's an improvement over the status quo.

2 files changed, 43 insertions(+), 17 deletions(-)

lib/std/zig/parser_test.zig+2
......@@ -1509,6 +1509,8 @@ test "zig fmt: error set declaration" {
15091509 \\const Error = error{OutOfMemory};
15101510 \\const Error = error{};
15111511 \\
1512 \\const Error = error{ OutOfMemory, OutOfTime };
1513 \\
15121514 );
15131515}
15141516
lib/std/zig/render.zig+41-17
......@@ -1268,25 +1268,51 @@ fn renderExpression(
12681268 }
12691269
12701270 try renderToken(tree, stream, err_set_decl.error_token, indent, start_col, Space.None); // error
1271 try renderToken(tree, stream, lbrace, indent, start_col, Space.Newline); // {
1272 const new_indent = indent + indent_delta;
12731271
1274 var it = err_set_decl.decls.iterator(0);
1275 while (it.next()) |node| {
1276 try stream.writeByteNTimes(' ', new_indent);
1272 const src_has_trailing_comma = blk: {
1273 const maybe_comma = tree.prevToken(err_set_decl.rbrace_token);
1274 break :blk tree.tokens.at(maybe_comma).id == .Comma;
1275 };
12771276
1278 if (it.peek()) |next_node| {
1279 try renderExpression(allocator, stream, tree, new_indent, start_col, node.*, Space.None);
1280 try renderToken(tree, stream, tree.nextToken(node.*.lastToken()), new_indent, start_col, Space.Newline); // ,
1277 if (src_has_trailing_comma) {
1278 try renderToken(tree, stream, lbrace, indent, start_col, Space.Newline); // {
1279 const new_indent = indent + indent_delta;
12811280
1282 try renderExtraNewline(tree, stream, start_col, next_node.*);
1283 } else {
1284 try renderExpression(allocator, stream, tree, new_indent, start_col, node.*, Space.Comma);
1281 var it = err_set_decl.decls.iterator(0);
1282 while (it.next()) |node| {
1283 try stream.writeByteNTimes(' ', new_indent);
1284
1285 if (it.peek()) |next_node| {
1286 try renderExpression(allocator, stream, tree, new_indent, start_col, node.*, Space.None);
1287 try renderToken(tree, stream, tree.nextToken(node.*.lastToken()), new_indent, start_col, Space.Newline); // ,
1288
1289 try renderExtraNewline(tree, stream, start_col, next_node.*);
1290 } else {
1291 try renderExpression(allocator, stream, tree, new_indent, start_col, node.*, Space.Comma);
1292 }
12851293 }
1286 }
12871294
1288 try stream.writeByteNTimes(' ', indent);
1289 return renderToken(tree, stream, err_set_decl.rbrace_token, indent, start_col, space); // }
1295 try stream.writeByteNTimes(' ', indent);
1296 return renderToken(tree, stream, err_set_decl.rbrace_token, indent, start_col, space); // }
1297 } else {
1298 try renderToken(tree, stream, lbrace, indent, start_col, Space.Space); // {
1299
1300 var it = err_set_decl.decls.iterator(0);
1301 while (it.next()) |node| {
1302 if (it.peek()) |next_node| {
1303 try renderExpression(allocator, stream, tree, indent, start_col, node.*, Space.None);
1304
1305 const comma_token = tree.nextToken(node.*.lastToken());
1306 assert(tree.tokens.at(comma_token).id == .Comma);
1307 try renderToken(tree, stream, comma_token, indent, start_col, Space.Space); // ,
1308 try renderExtraNewline(tree, stream, start_col, next_node.*);
1309 } else {
1310 try renderExpression(allocator, stream, tree, indent, start_col, node.*, Space.Space);
1311 }
1312 }
1313
1314 return renderToken(tree, stream, err_set_decl.rbrace_token, indent, start_col, space); // }
1315 }
12901316 },
12911317
12921318 .ErrorTag => {
......@@ -1589,8 +1615,7 @@ fn renderExpression(
15891615 }
15901616 } else {
15911617 var it = switch_case.items.iterator(0);
1592 while (true) {
1593 const node = it.next().?;
1618 while (it.next()) |node| {
15941619 if (it.peek()) |next_node| {
15951620 try renderExpression(allocator, stream, tree, indent, start_col, node.*, Space.None);
15961621
......@@ -1601,7 +1626,6 @@ fn renderExpression(
16011626 } else {
16021627 try renderExpression(allocator, stream, tree, indent, start_col, node.*, Space.Comma);
16031628 try stream.writeByteNTimes(' ', indent);
1604 break;
16051629 }
16061630 }
16071631 }