authorgravatar for matthew.h.borkowski@gmail.comMatthew Borkowski <matthew.h.borkowski@gmail.com> 2021-06-11 17:59:41-04:00
committergravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2021-06-13 16:37:53+03:00
log3692fb039d0f8d16ffce35e0062e51ab79192c9d
treece08e888c440b01b399e75ee69565df82e09c359
parent51beb7148061d5fd26521d4e4c387c27bf398a78

parse.zig: simplify parseSwitchProng and make one item cases with trailing commas produce .switch_case_one nodes


1 files changed, 31 insertions(+), 36 deletions(-)

lib/std/zig/parse.zig+31-36
......@@ -2976,53 +2976,48 @@ const Parser = struct {
29762976 /// <- SwitchItem (COMMA SwitchItem)* COMMA?
29772977 /// / KEYWORD_else
29782978 fn parseSwitchProng(p: *Parser) !Node.Index {
2979 if (p.eatToken(.keyword_else)) |_| {
2980 const arrow_token = try p.expectToken(.equal_angle_bracket_right);
2981 _ = try p.parsePtrPayload();
2982 return p.addNode(.{
2979 const scratch_top = p.scratch.items.len;
2980 defer p.scratch.shrinkRetainingCapacity(scratch_top);
2981
2982 if (p.eatToken(.keyword_else) == null) {
2983 while (true) {
2984 const item = try p.parseSwitchItem();
2985 if (item == 0) break;
2986 try p.scratch.append(p.gpa, item);
2987 if (p.eatToken(.comma) == null) break;
2988 }
2989 if (scratch_top == p.scratch.items.len) return null_node;
2990 }
2991 const arrow_token = try p.expectToken(.equal_angle_bracket_right);
2992 _ = try p.parsePtrPayload();
2993
2994 const items = p.scratch.items[scratch_top..];
2995 switch(items.len) {
2996 0 => return p.addNode(.{
29832997 .tag = .switch_case_one,
29842998 .main_token = arrow_token,
29852999 .data = .{
29863000 .lhs = 0,
29873001 .rhs = try p.expectAssignExpr(),
2988 },
2989 });
2990 }
2991 const first_item = try p.parseSwitchItem();
2992 if (first_item == 0) return null_node;
2993
2994 if (p.eatToken(.equal_angle_bracket_right)) |arrow_token| {
2995 _ = try p.parsePtrPayload();
2996 return p.addNode(.{
3002 }
3003 }),
3004 1 => return p.addNode(.{
29973005 .tag = .switch_case_one,
29983006 .main_token = arrow_token,
29993007 .data = .{
3000 .lhs = first_item,
3008 .lhs = items[0],
3009 .rhs = try p.expectAssignExpr(),
3010 }
3011 }),
3012 else => return p.addNode(.{
3013 .tag = .switch_case,
3014 .main_token = arrow_token,
3015 .data = .{
3016 .lhs = try p.addExtra(try p.listToSpan(items)),
30013017 .rhs = try p.expectAssignExpr(),
30023018 },
3003 });
3004 }
3005
3006 const scratch_top = p.scratch.items.len;
3007 defer p.scratch.shrinkRetainingCapacity(scratch_top);
3008
3009 try p.scratch.append(p.gpa, first_item);
3010 while (p.eatToken(.comma)) |_| {
3011 const next_item = try p.parseSwitchItem();
3012 if (next_item == 0) break;
3013 try p.scratch.append(p.gpa, next_item);
3019 }),
30143020 }
3015 const span = try p.listToSpan(p.scratch.items[scratch_top..]);
3016 const arrow_token = try p.expectToken(.equal_angle_bracket_right);
3017 _ = try p.parsePtrPayload();
3018 return p.addNode(.{
3019 .tag = .switch_case,
3020 .main_token = arrow_token,
3021 .data = .{
3022 .lhs = try p.addExtra(span),
3023 .rhs = try p.expectAssignExpr(),
3024 },
3025 });
30263021 }
30273022
30283023 /// SwitchItem <- Expr (DOT3 Expr)?