authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2018-05-25 20:34:53-04:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2018-05-25 20:34:53-04:00
log4405897cbd9105fddb512545594f336b597d91e9
tree30bb19a7f9bf30eccb0d472cd58ccdef92daa040
parenta630d3e851a62c0e8971cbd2183e215606f35ab1

zig fmt: support trailing comma on switch case items


3 files changed, 79 insertions(+), 25 deletions(-)

std/zig/parse.zig+17-8
......@@ -1325,21 +1325,30 @@ pub fn parse(allocator: &mem.Allocator, source: []const u8) !ast.Tree {
13251325 continue;
13261326 } else {
13271327 prevToken(&tok_it, &tree);
1328 try stack.append(State{ .SwitchCaseItem = switch_case });
1328 stack.append(State{ .SwitchCaseItemCommaOrEnd = switch_case }) catch unreachable;
1329 try stack.append(State{ .RangeExpressionBegin = OptionalCtx{ .Required = try switch_case.items.addOne() } });
13291330 continue;
13301331 }
13311332 },
1332 State.SwitchCaseItem => |node| {
1333 stack.append(State{ .SwitchCaseItemCommaOrEnd = node }) catch unreachable;
1334 try stack.append(State{ .RangeExpressionBegin = OptionalCtx{ .Required = try node.items.addOne() } });
1333 State.SwitchCaseItemOrEnd => |switch_case| {
1334 const token = nextToken(&tok_it, &tree);
1335 if (token.ptr.id == Token.Id.EqualAngleBracketRight) {
1336 switch_case.arrow_token = token.index;
1337 continue;
1338 } else {
1339 prevToken(&tok_it, &tree);
1340 stack.append(State{ .SwitchCaseItemCommaOrEnd = switch_case }) catch unreachable;
1341 try stack.append(State{ .RangeExpressionBegin = OptionalCtx{ .Required = try switch_case.items.addOne() } });
1342 continue;
1343 }
13351344 },
1336 State.SwitchCaseItemCommaOrEnd => |node| {
1345 State.SwitchCaseItemCommaOrEnd => |switch_case| {
13371346 switch (expectCommaOrEnd(&tok_it, &tree, Token.Id.EqualAngleBracketRight)) {
13381347 ExpectCommaOrEndResult.end_token => |end_token| {
13391348 if (end_token) |t| {
1340 node.arrow_token = t;
1349 switch_case.arrow_token = t;
13411350 } else {
1342 stack.append(State{ .SwitchCaseItem = node }) catch unreachable;
1351 stack.append(State{ .SwitchCaseItemOrEnd = switch_case }) catch unreachable;
13431352 }
13441353 continue;
13451354 },
......@@ -2828,8 +2837,8 @@ const State = union(enum) {
28282837 SwitchCaseOrEnd: ListSave(ast.Node.Switch.CaseList),
28292838 SwitchCaseCommaOrEnd: ListSave(ast.Node.Switch.CaseList),
28302839 SwitchCaseFirstItem: &ast.Node.SwitchCase,
2831 SwitchCaseItem: &ast.Node.SwitchCase,
28322840 SwitchCaseItemCommaOrEnd: &ast.Node.SwitchCase,
2841 SwitchCaseItemOrEnd: &ast.Node.SwitchCase,
28332842
28342843 SuspendBody: &ast.Node.Suspend,
28352844 AsyncAllocator: &ast.Node.AsyncAttribute,
std/zig/parser_test.zig+28-7
......@@ -1,3 +1,27 @@
1test "zig fmt: switch cases trailing comma" {
2 try testTransform(
3 \\fn switch_cases(x: i32) void {
4 \\ switch (x) {
5 \\ 1,2,3 => {},
6 \\ 4,5, => {},
7 \\ 6...8, => {},
8 \\ else => {},
9 \\ }
10 \\}
11 ,
12 \\fn switch_cases(x: i32) void {
13 \\ switch (x) {
14 \\ 1, 2, 3 => {},
15 \\ 4,
16 \\ 5, => {},
17 \\ 6 ... 8 => {},
18 \\ else => {},
19 \\ }
20 \\}
21 \\
22 );
23}
24
125test "zig fmt: slice align" {
226 try testCanonical(
327 \\const A = struct {
......@@ -7,7 +31,7 @@ test "zig fmt: slice align" {
731 );
832}
933
10test "zig fmt: first thing in file is line comment" {
34test "zig fmt: add trailing comma to array literal" {
1135 try testTransform(
1236 \\comptime {
1337 \\ return []u16{'m', 's', 'y', 's', '-' // hi
......@@ -217,13 +241,11 @@ test "zig fmt: add comma on last switch prong" {
217241 \\test "aoeu" {
218242 \\ switch (self.init_arg_expr) {
219243 \\ InitArg.Type => |t| {},
220 \\ InitArg.None,
221 \\ InitArg.Enum => {},
244 \\ InitArg.None, InitArg.Enum => {},
222245 \\ }
223246 \\ switch (self.init_arg_expr) {
224247 \\ InitArg.Type => |t| {},
225 \\ InitArg.None,
226 \\ InitArg.Enum => {}, //line comment
248 \\ InitArg.None, InitArg.Enum => {}, //line comment
227249 \\ }
228250 \\}
229251 \\
......@@ -1003,8 +1025,7 @@ test "zig fmt: switch" {
10031025 \\ switch (0) {
10041026 \\ 0 => {},
10051027 \\ 1 => unreachable,
1006 \\ 2,
1007 \\ 3 => {},
1028 \\ 2, 3 => {},
10081029 \\ 4 ... 7 => {},
10091030 \\ 1 + 4 * 3 + 22 => {},
10101031 \\ else => {
std/zig/render.zig+34-10
......@@ -939,17 +939,41 @@ fn renderExpression(allocator: &mem.Allocator, stream: var, tree: &ast.Tree, ind
939939 ast.Node.Id.SwitchCase => {
940940 const switch_case = @fieldParentPtr(ast.Node.SwitchCase, "base", base);
941941
942 var it = switch_case.items.iterator(0);
943 while (it.next()) |node| {
944 if (it.peek()) |next_node| {
945 try renderExpression(allocator, stream, tree, indent, node.*, Space.None);
942 assert(switch_case.items.len != 0);
943 const src_has_trailing_comma = blk: {
944 const last_node = switch_case.items.at(switch_case.items.len - 1).*;
945 const maybe_comma = tree.nextToken(last_node.lastToken());
946 break :blk tree.tokens.at(maybe_comma).id == Token.Id.Comma;
947 };
946948
947 const comma_token = tree.nextToken(node.*.lastToken());
948 try renderToken(tree, stream, comma_token, indent, Space.Newline); // ,
949 try renderExtraNewline(tree, stream, next_node.*);
950 try stream.writeByteNTimes(' ', indent);
951 } else {
952 try renderExpression(allocator, stream, tree, indent, node.*, Space.Space);
949 if (switch_case.items.len == 1 or !src_has_trailing_comma) {
950 var it = switch_case.items.iterator(0);
951 while (it.next()) |node| {
952 if (it.peek()) |next_node| {
953 try renderExpression(allocator, stream, tree, indent, node.*, Space.None);
954
955 const comma_token = tree.nextToken(node.*.lastToken());
956 try renderToken(tree, stream, comma_token, indent, Space.Space); // ,
957 try renderExtraNewline(tree, stream, next_node.*);
958 } else {
959 try renderExpression(allocator, stream, tree, indent, node.*, Space.Space);
960 }
961 }
962 } else {
963 var it = switch_case.items.iterator(0);
964 while (true) {
965 const node = ??it.next();
966 if (it.peek()) |next_node| {
967 try renderExpression(allocator, stream, tree, indent, node.*, Space.None);
968
969 const comma_token = tree.nextToken(node.*.lastToken());
970 try renderToken(tree, stream, comma_token, indent, Space.Newline); // ,
971 try renderExtraNewline(tree, stream, next_node.*);
972 try stream.writeByteNTimes(' ', indent);
973 } else {
974 try renderTrailingComma(allocator, stream, tree, indent, node.*, Space.Space);
975 break;
976 }
953977 }
954978 }
955979