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 {...@@ -1325,21 +1325,30 @@ pub fn parse(allocator: &mem.Allocator, source: []const u8) !ast.Tree {
1325 continue;1325 continue;
1326 } else {1326 } else {
1327 prevToken(&tok_it, &tree);1327 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() } });
1329 continue;1330 continue;
1330 }1331 }
1331 },1332 },
1332 State.SwitchCaseItem => |node| {1333 State.SwitchCaseItemOrEnd => |switch_case| {
1333 stack.append(State{ .SwitchCaseItemCommaOrEnd = node }) catch unreachable;1334 const token = nextToken(&tok_it, &tree);
1334 try stack.append(State{ .RangeExpressionBegin = OptionalCtx{ .Required = try node.items.addOne() } });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 }
1335 },1344 },
1336 State.SwitchCaseItemCommaOrEnd => |node| {1345 State.SwitchCaseItemCommaOrEnd => |switch_case| {
1337 switch (expectCommaOrEnd(&tok_it, &tree, Token.Id.EqualAngleBracketRight)) {1346 switch (expectCommaOrEnd(&tok_it, &tree, Token.Id.EqualAngleBracketRight)) {
1338 ExpectCommaOrEndResult.end_token => |end_token| {1347 ExpectCommaOrEndResult.end_token => |end_token| {
1339 if (end_token) |t| {1348 if (end_token) |t| {
1340 node.arrow_token = t;1349 switch_case.arrow_token = t;
1341 } else {1350 } else {
1342 stack.append(State{ .SwitchCaseItem = node }) catch unreachable;1351 stack.append(State{ .SwitchCaseItemOrEnd = switch_case }) catch unreachable;
1343 }1352 }
1344 continue;1353 continue;
1345 },1354 },
...@@ -2828,8 +2837,8 @@ const State = union(enum) {...@@ -2828,8 +2837,8 @@ const State = union(enum) {
2828 SwitchCaseOrEnd: ListSave(ast.Node.Switch.CaseList),2837 SwitchCaseOrEnd: ListSave(ast.Node.Switch.CaseList),
2829 SwitchCaseCommaOrEnd: ListSave(ast.Node.Switch.CaseList),2838 SwitchCaseCommaOrEnd: ListSave(ast.Node.Switch.CaseList),
2830 SwitchCaseFirstItem: &ast.Node.SwitchCase,2839 SwitchCaseFirstItem: &ast.Node.SwitchCase,
2831 SwitchCaseItem: &ast.Node.SwitchCase,
2832 SwitchCaseItemCommaOrEnd: &ast.Node.SwitchCase,2840 SwitchCaseItemCommaOrEnd: &ast.Node.SwitchCase,
2841 SwitchCaseItemOrEnd: &ast.Node.SwitchCase,
28332842
2834 SuspendBody: &ast.Node.Suspend,2843 SuspendBody: &ast.Node.Suspend,
2835 AsyncAllocator: &ast.Node.AsyncAttribute,2844 AsyncAllocator: &ast.Node.AsyncAttribute,
std/zig/parser_test.zig+28-7
...@@ -1,3 +1,27 @@...@@ -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
1test "zig fmt: slice align" {25test "zig fmt: slice align" {
2 try testCanonical(26 try testCanonical(
3 \\const A = struct {27 \\const A = struct {
...@@ -7,7 +31,7 @@ test "zig fmt: slice align" {...@@ -7,7 +31,7 @@ test "zig fmt: slice align" {
7 );31 );
8}32}
933
10test "zig fmt: first thing in file is line comment" {34test "zig fmt: add trailing comma to array literal" {
11 try testTransform(35 try testTransform(
12 \\comptime {36 \\comptime {
13 \\ return []u16{'m', 's', 'y', 's', '-' // hi37 \\ return []u16{'m', 's', 'y', 's', '-' // hi
...@@ -217,13 +241,11 @@ test "zig fmt: add comma on last switch prong" {...@@ -217,13 +241,11 @@ test "zig fmt: add comma on last switch prong" {
217 \\test "aoeu" {241 \\test "aoeu" {
218 \\ switch (self.init_arg_expr) {242 \\ switch (self.init_arg_expr) {
219 \\ InitArg.Type => |t| {},243 \\ InitArg.Type => |t| {},
220 \\ InitArg.None,244 \\ InitArg.None, InitArg.Enum => {},
221 \\ InitArg.Enum => {},
222 \\ }245 \\ }
223 \\ switch (self.init_arg_expr) {246 \\ switch (self.init_arg_expr) {
224 \\ InitArg.Type => |t| {},247 \\ InitArg.Type => |t| {},
225 \\ InitArg.None,248 \\ InitArg.None, InitArg.Enum => {}, //line comment
226 \\ InitArg.Enum => {}, //line comment
227 \\ }249 \\ }
228 \\}250 \\}
229 \\251 \\
...@@ -1003,8 +1025,7 @@ test "zig fmt: switch" {...@@ -1003,8 +1025,7 @@ test "zig fmt: switch" {
1003 \\ switch (0) {1025 \\ switch (0) {
1004 \\ 0 => {},1026 \\ 0 => {},
1005 \\ 1 => unreachable,1027 \\ 1 => unreachable,
1006 \\ 2,1028 \\ 2, 3 => {},
1007 \\ 3 => {},
1008 \\ 4 ... 7 => {},1029 \\ 4 ... 7 => {},
1009 \\ 1 + 4 * 3 + 22 => {},1030 \\ 1 + 4 * 3 + 22 => {},
1010 \\ else => {1031 \\ else => {
std/zig/render.zig+34-10
...@@ -939,17 +939,41 @@ fn renderExpression(allocator: &mem.Allocator, stream: var, tree: &ast.Tree, ind...@@ -939,17 +939,41 @@ fn renderExpression(allocator: &mem.Allocator, stream: var, tree: &ast.Tree, ind
939 ast.Node.Id.SwitchCase => {939 ast.Node.Id.SwitchCase => {
940 const switch_case = @fieldParentPtr(ast.Node.SwitchCase, "base", base);940 const switch_case = @fieldParentPtr(ast.Node.SwitchCase, "base", base);
941941
942 var it = switch_case.items.iterator(0);942 assert(switch_case.items.len != 0);
943 while (it.next()) |node| {943 const src_has_trailing_comma = blk: {
944 if (it.peek()) |next_node| {944 const last_node = switch_case.items.at(switch_case.items.len - 1).*;
945 try renderExpression(allocator, stream, tree, indent, node.*, Space.None);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());949 if (switch_case.items.len == 1 or !src_has_trailing_comma) {
948 try renderToken(tree, stream, comma_token, indent, Space.Newline); // ,950 var it = switch_case.items.iterator(0);
949 try renderExtraNewline(tree, stream, next_node.*);951 while (it.next()) |node| {
950 try stream.writeByteNTimes(' ', indent);952 if (it.peek()) |next_node| {
951 } else {953 try renderExpression(allocator, stream, tree, indent, node.*, Space.None);
952 try renderExpression(allocator, stream, tree, indent, node.*, Space.Space);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 }
953 }977 }
954 }978 }
955979