| ... | @@ -177,6 +177,8 @@ pub const Parser = struct { | ... | @@ -177,6 +177,8 @@ pub const Parser = struct { |
| 177 | FieldInitListItemOrEnd: ListSave(&ast.NodeFieldInitializer), | 177 | FieldInitListItemOrEnd: ListSave(&ast.NodeFieldInitializer), |
| 178 | FieldInitListCommaOrEnd: ListSave(&ast.NodeFieldInitializer), | 178 | FieldInitListCommaOrEnd: ListSave(&ast.NodeFieldInitializer), |
| 179 | FieldListCommaOrEnd: &ast.NodeContainerDecl, | 179 | FieldListCommaOrEnd: &ast.NodeContainerDecl, |
| | 180 | IdentifierListItemOrEnd: ListSave(&ast.NodeIdentifier), |
| | 181 | IdentifierListCommaOrEnd: ListSave(&ast.NodeIdentifier), |
| 180 | SwitchCaseOrEnd: ListSave(&ast.NodeSwitchCase), | 182 | SwitchCaseOrEnd: ListSave(&ast.NodeSwitchCase), |
| 181 | SuspendBody: &ast.NodeSuspend, | 183 | SuspendBody: &ast.NodeSuspend, |
| 182 | AsyncEnd: AsyncEndCtx, | 184 | AsyncEnd: AsyncEndCtx, |
| ... | @@ -1683,11 +1685,8 @@ pub const Parser = struct { | ... | @@ -1683,11 +1685,8 @@ pub const Parser = struct { |
| 1683 | | 1685 | |
| 1684 | }, | 1686 | }, |
| 1685 | Token.Id.Keyword_error => { | 1687 | Token.Id.Keyword_error => { |
| 1686 | const next = self.getNextToken(); | 1688 | if (self.eatToken(Token.Id.LBrace) == null) { |
| 1687 | | | |
| 1688 | if (next.id != Token.Id.LBrace) { | | |
| 1689 | dest_ptr.store(&(try self.createLiteral(arena, ast.NodeErrorType, token)).base); | 1689 | dest_ptr.store(&(try self.createLiteral(arena, ast.NodeErrorType, token)).base); |
| 1690 | self.putBackToken(next); | | |
| 1691 | continue; | 1690 | continue; |
| 1692 | } | 1691 | } |
| 1693 | | 1692 | |
| ... | @@ -1700,43 +1699,12 @@ pub const Parser = struct { | ... | @@ -1700,43 +1699,12 @@ pub const Parser = struct { |
| 1700 | } | 1699 | } |
| 1701 | ); | 1700 | ); |
| 1702 | | 1701 | |
| 1703 | while (true) { | 1702 | stack.append(State { |
| 1704 | const t = self.getNextToken(); | 1703 | .IdentifierListItemOrEnd = ListSave(&ast.NodeIdentifier) { |
| 1705 | switch (t.id) { | 1704 | .list = &node.decls, |
| 1706 | Token.Id.RBrace => { | 1705 | .ptr = &node.rbrace_token, |
| 1707 | node.rbrace_token = t; | | |
| 1708 | break; | | |
| 1709 | }, | | |
| 1710 | Token.Id.Identifier => { | | |
| 1711 | try node.decls.append( | | |
| 1712 | try self.createLiteral(arena, ast.NodeIdentifier, t) | | |
| 1713 | ); | | |
| 1714 | }, | | |
| 1715 | else => { | | |
| 1716 | try self.parseError(&stack, token, "expected {} or {}, found {}", | | |
| 1717 | @tagName(Token.Id.RBrace), | | |
| 1718 | @tagName(Token.Id.Identifier), | | |
| 1719 | @tagName(token.id)); | | |
| 1720 | continue; | | |
| 1721 | } | | |
| 1722 | } | | |
| 1723 | | | |
| 1724 | const t2 = self.getNextToken(); | | |
| 1725 | switch (t2.id) { | | |
| 1726 | Token.Id.RBrace => { | | |
| 1727 | node.rbrace_token = t; | | |
| 1728 | break; | | |
| 1729 | }, | | |
| 1730 | Token.Id.Comma => continue, | | |
| 1731 | else => { | | |
| 1732 | try self.parseError(&stack, token, "expected {} or {}, found {}", | | |
| 1733 | @tagName(Token.Id.RBrace), | | |
| 1734 | @tagName(Token.Id.Comma), | | |
| 1735 | @tagName(token.id)); | | |
| 1736 | continue; | | |
| 1737 | } | | |
| 1738 | } | 1706 | } |
| 1739 | } | 1707 | }) catch unreachable; |
| 1740 | continue; | 1708 | continue; |
| 1741 | }, | 1709 | }, |
| 1742 | Token.Id.Keyword_packed => { | 1710 | Token.Id.Keyword_packed => { |
| ... | @@ -2082,6 +2050,24 @@ pub const Parser = struct { | ... | @@ -2082,6 +2050,24 @@ pub const Parser = struct { |
| 2082 | }); | 2050 | }); |
| 2083 | }, | 2051 | }, |
| 2084 | | 2052 | |
| | 2053 | State.IdentifierListItemOrEnd => |list_state| { |
| | 2054 | if (self.eatToken(Token.Id.RBrace)) |rbrace| { |
| | 2055 | *list_state.ptr = rbrace; |
| | 2056 | continue; |
| | 2057 | } |
| | 2058 | |
| | 2059 | const node = try self.createLiteral(arena, ast.NodeIdentifier, Token(undefined)); |
| | 2060 | try list_state.list.append(node); |
| | 2061 | |
| | 2062 | stack.append(State { .IdentifierListCommaOrEnd = list_state }) catch unreachable; |
| | 2063 | try stack.append(State { |
| | 2064 | .ExpectTokenSave = ExpectTokenSave { |
| | 2065 | .id = Token.Id.Identifier, |
| | 2066 | .ptr = &node.token, |
| | 2067 | } |
| | 2068 | }); |
| | 2069 | }, |
| | 2070 | |
| 2085 | State.SwitchCaseOrEnd => |list_state| { | 2071 | State.SwitchCaseOrEnd => |list_state| { |
| 2086 | if (self.eatToken(Token.Id.RBrace)) |rbrace| { | 2072 | if (self.eatToken(Token.Id.RBrace)) |rbrace| { |
| 2087 | *list_state.ptr = rbrace; | 2073 | *list_state.ptr = rbrace; |
| ... | @@ -2139,6 +2125,11 @@ pub const Parser = struct { | ... | @@ -2139,6 +2125,11 @@ pub const Parser = struct { |
| 2139 | continue; | 2125 | continue; |
| 2140 | }, | 2126 | }, |
| 2141 | | 2127 | |
| | 2128 | State.IdentifierListCommaOrEnd => |list_state| { |
| | 2129 | try self.commaOrEnd(&stack, Token.Id.RBrace, list_state.ptr, State { .IdentifierListItemOrEnd = list_state }); |
| | 2130 | continue; |
| | 2131 | }, |
| | 2132 | |
| 2142 | State.SwitchCaseCommaOrEnd => |list_state| { | 2133 | State.SwitchCaseCommaOrEnd => |list_state| { |
| 2143 | try self.commaOrEnd(&stack, Token.Id.RBrace, list_state.ptr, State { .SwitchCaseOrEnd = list_state }); | 2134 | try self.commaOrEnd(&stack, Token.Id.RBrace, list_state.ptr, State { .SwitchCaseOrEnd = list_state }); |
| 2144 | continue; | 2135 | continue; |