| ... | ... | @@ -2976,53 +2976,48 @@ const Parser = struct { |
| 2976 | 2976 | /// <- SwitchItem (COMMA SwitchItem)* COMMA? |
| 2977 | 2977 | /// / KEYWORD_else |
| 2978 | 2978 | 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(.{ |
| 2983 | 2997 | .tag = .switch_case_one, |
| 2984 | 2998 | .main_token = arrow_token, |
| 2985 | 2999 | .data = .{ |
| 2986 | 3000 | .lhs = 0, |
| 2987 | 3001 | .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(.{ |
| 2997 | 3005 | .tag = .switch_case_one, |
| 2998 | 3006 | .main_token = arrow_token, |
| 2999 | 3007 | .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)), |
| 3001 | 3017 | .rhs = try p.expectAssignExpr(), |
| 3002 | 3018 | }, |
| 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 | }), |
| 3014 | 3020 | } |
| 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 | | }); |
| 3026 | 3021 | } |
| 3027 | 3022 | |
| 3028 | 3023 | /// SwitchItem <- Expr (DOT3 Expr)? |