| author | |
| committer | |
| log | 4405897cbd9105fddb512545594f336b597d91e9 |
| tree | 30bb19a7f9bf30eccb0d472cd58ccdef92daa040 |
| parent | a630d3e851a62c0e8971cbd2183e215606f35ab1 |
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 | 1325 | continue; |
| 1326 | 1326 | } else { |
| 1327 | 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 | 1330 | continue; |
| 1330 | 1331 | } |
| 1331 | 1332 | }, |
| 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 | } | |
| 1335 | 1344 | }, |
| 1336 | State.SwitchCaseItemCommaOrEnd => |node| { | |
| 1345 | State.SwitchCaseItemCommaOrEnd => |switch_case| { | |
| 1337 | 1346 | switch (expectCommaOrEnd(&tok_it, &tree, Token.Id.EqualAngleBracketRight)) { |
| 1338 | 1347 | ExpectCommaOrEndResult.end_token => |end_token| { |
| 1339 | 1348 | if (end_token) |t| { |
| 1340 | node.arrow_token = t; | |
| 1349 | switch_case.arrow_token = t; | |
| 1341 | 1350 | } else { |
| 1342 | stack.append(State{ .SwitchCaseItem = node }) catch unreachable; | |
| 1351 | stack.append(State{ .SwitchCaseItemOrEnd = switch_case }) catch unreachable; | |
| 1343 | 1352 | } |
| 1344 | 1353 | continue; |
| 1345 | 1354 | }, |
| ... | ... | @@ -2828,8 +2837,8 @@ const State = union(enum) { |
| 2828 | 2837 | SwitchCaseOrEnd: ListSave(ast.Node.Switch.CaseList), |
| 2829 | 2838 | SwitchCaseCommaOrEnd: ListSave(ast.Node.Switch.CaseList), |
| 2830 | 2839 | SwitchCaseFirstItem: &ast.Node.SwitchCase, |
| 2831 | SwitchCaseItem: &ast.Node.SwitchCase, | |
| 2832 | 2840 | SwitchCaseItemCommaOrEnd: &ast.Node.SwitchCase, |
| 2841 | SwitchCaseItemOrEnd: &ast.Node.SwitchCase, | |
| 2833 | 2842 | |
| 2834 | 2843 | SuspendBody: &ast.Node.Suspend, |
| 2835 | 2844 | AsyncAllocator: &ast.Node.AsyncAttribute, |
std/zig/parser_test.zig+28-7| ... | ... | @@ -1,3 +1,27 @@ |
| 1 | test "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 | ||
| 1 | 25 | test "zig fmt: slice align" { |
| 2 | 26 | try testCanonical( |
| 3 | 27 | \\const A = struct { |
| ... | ... | @@ -7,7 +31,7 @@ test "zig fmt: slice align" { |
| 7 | 31 | ); |
| 8 | 32 | } |
| 9 | 33 | |
| 10 | test "zig fmt: first thing in file is line comment" { | |
| 34 | test "zig fmt: add trailing comma to array literal" { | |
| 11 | 35 | try testTransform( |
| 12 | 36 | \\comptime { |
| 13 | 37 | \\ return []u16{'m', 's', 'y', 's', '-' // hi |
| ... | ... | @@ -217,13 +241,11 @@ test "zig fmt: add comma on last switch prong" { |
| 217 | 241 | \\test "aoeu" { |
| 218 | 242 | \\ switch (self.init_arg_expr) { |
| 219 | 243 | \\ InitArg.Type => |t| {}, |
| 220 | \\ InitArg.None, | |
| 221 | \\ InitArg.Enum => {}, | |
| 244 | \\ InitArg.None, InitArg.Enum => {}, | |
| 222 | 245 | \\ } |
| 223 | 246 | \\ switch (self.init_arg_expr) { |
| 224 | 247 | \\ InitArg.Type => |t| {}, |
| 225 | \\ InitArg.None, | |
| 226 | \\ InitArg.Enum => {}, //line comment | |
| 248 | \\ InitArg.None, InitArg.Enum => {}, //line comment | |
| 227 | 249 | \\ } |
| 228 | 250 | \\} |
| 229 | 251 | \\ |
| ... | ... | @@ -1003,8 +1025,7 @@ test "zig fmt: switch" { |
| 1003 | 1025 | \\ switch (0) { |
| 1004 | 1026 | \\ 0 => {}, |
| 1005 | 1027 | \\ 1 => unreachable, |
| 1006 | \\ 2, | |
| 1007 | \\ 3 => {}, | |
| 1028 | \\ 2, 3 => {}, | |
| 1008 | 1029 | \\ 4 ... 7 => {}, |
| 1009 | 1030 | \\ 1 + 4 * 3 + 22 => {}, |
| 1010 | 1031 | \\ else => { |
std/zig/render.zig+34-10| ... | ... | @@ -939,17 +939,41 @@ fn renderExpression(allocator: &mem.Allocator, stream: var, tree: &ast.Tree, ind |
| 939 | 939 | ast.Node.Id.SwitchCase => { |
| 940 | 940 | const switch_case = @fieldParentPtr(ast.Node.SwitchCase, "base", base); |
| 941 | 941 | |
| 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 | }; | |
| 946 | 948 | |
| 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 | } | |
| 953 | 977 | } |
| 954 | 978 | } |
| 955 | 979 |