| ... | @@ -2976,53 +2976,48 @@ const Parser = struct { | ... | @@ -2976,53 +2976,48 @@ const Parser = struct { |
| 2976 | /// <- SwitchItem (COMMA SwitchItem)* COMMA? | 2976 | /// <- SwitchItem (COMMA SwitchItem)* COMMA? |
| 2977 | /// / KEYWORD_else | 2977 | /// / KEYWORD_else |
| 2978 | fn parseSwitchProng(p: *Parser) !Node.Index { | 2978 | fn parseSwitchProng(p: *Parser) !Node.Index { |
| 2979 | if (p.eatToken(.keyword_else)) |_| { | 2979 | const scratch_top = p.scratch.items.len; |
| 2980 | const arrow_token = try p.expectToken(.equal_angle_bracket_right); | 2980 | defer p.scratch.shrinkRetainingCapacity(scratch_top); |
| 2981 | _ = try p.parsePtrPayload(); | 2981 | |
| 2982 | return p.addNode(.{ | 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 | .tag = .switch_case_one, | 2997 | .tag = .switch_case_one, |
| 2984 | .main_token = arrow_token, | 2998 | .main_token = arrow_token, |
| 2985 | .data = .{ | 2999 | .data = .{ |
| 2986 | .lhs = 0, | 3000 | .lhs = 0, |
| 2987 | .rhs = try p.expectAssignExpr(), | 3001 | .rhs = try p.expectAssignExpr(), |
| 2988 | }, | 3002 | } |
| 2989 | }); | 3003 | }), |
| 2990 | } | 3004 | 1 => return p.addNode(.{ |
| 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(.{ | | |
| 2997 | .tag = .switch_case_one, | 3005 | .tag = .switch_case_one, |
| 2998 | .main_token = arrow_token, | 3006 | .main_token = arrow_token, |
| 2999 | .data = .{ | 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 | .rhs = try p.expectAssignExpr(), | 3017 | .rhs = try p.expectAssignExpr(), |
| 3002 | }, | 3018 | }, |
| 3003 | }); | 3019 | }), |
| 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); | | |
| 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 | /// SwitchItem <- Expr (DOT3 Expr)? | 3023 | /// SwitchItem <- Expr (DOT3 Expr)? |