| ... | @@ -159,101 +159,99 @@ pub const Error = union(enum) { | ... | @@ -159,101 +159,99 @@ pub const Error = union(enum) { |
| 159 | | 159 | |
| 160 | pub fn render(self: *const Error, tokens: *Tree.TokenList, stream: var) !void { | 160 | pub fn render(self: *const Error, tokens: *Tree.TokenList, stream: var) !void { |
| 161 | switch (self.*) { | 161 | switch (self.*) { |
| 162 | // TODO https://github.com/ziglang/zig/issues/683 | 162 | .InvalidToken => |*x| return x.render(tokens, stream), |
| 163 | @TagType(Error).InvalidToken => |*x| return x.render(tokens, stream), | 163 | .ExpectedContainerMembers => |*x| return x.render(tokens, stream), |
| 164 | @TagType(Error).ExpectedContainerMembers => |*x| return x.render(tokens, stream), | 164 | .ExpectedStringLiteral => |*x| return x.render(tokens, stream), |
| 165 | @TagType(Error).ExpectedStringLiteral => |*x| return x.render(tokens, stream), | 165 | .ExpectedIntegerLiteral => |*x| return x.render(tokens, stream), |
| 166 | @TagType(Error).ExpectedIntegerLiteral => |*x| return x.render(tokens, stream), | 166 | .ExpectedPubItem => |*x| return x.render(tokens, stream), |
| 167 | @TagType(Error).ExpectedPubItem => |*x| return x.render(tokens, stream), | 167 | .ExpectedIdentifier => |*x| return x.render(tokens, stream), |
| 168 | @TagType(Error).ExpectedIdentifier => |*x| return x.render(tokens, stream), | 168 | .ExpectedStatement => |*x| return x.render(tokens, stream), |
| 169 | @TagType(Error).ExpectedStatement => |*x| return x.render(tokens, stream), | 169 | .ExpectedVarDeclOrFn => |*x| return x.render(tokens, stream), |
| 170 | @TagType(Error).ExpectedVarDeclOrFn => |*x| return x.render(tokens, stream), | 170 | .ExpectedVarDecl => |*x| return x.render(tokens, stream), |
| 171 | @TagType(Error).ExpectedVarDecl => |*x| return x.render(tokens, stream), | 171 | .ExpectedReturnType => |*x| return x.render(tokens, stream), |
| 172 | @TagType(Error).ExpectedReturnType => |*x| return x.render(tokens, stream), | 172 | .ExpectedAggregateKw => |*x| return x.render(tokens, stream), |
| 173 | @TagType(Error).ExpectedAggregateKw => |*x| return x.render(tokens, stream), | 173 | .UnattachedDocComment => |*x| return x.render(tokens, stream), |
| 174 | @TagType(Error).UnattachedDocComment => |*x| return x.render(tokens, stream), | 174 | .ExpectedEqOrSemi => |*x| return x.render(tokens, stream), |
| 175 | @TagType(Error).ExpectedEqOrSemi => |*x| return x.render(tokens, stream), | 175 | .ExpectedSemiOrLBrace => |*x| return x.render(tokens, stream), |
| 176 | @TagType(Error).ExpectedSemiOrLBrace => |*x| return x.render(tokens, stream), | 176 | .ExpectedSemiOrElse => |*x| return x.render(tokens, stream), |
| 177 | @TagType(Error).ExpectedSemiOrElse => |*x| return x.render(tokens, stream), | 177 | .ExpectedLabelOrLBrace => |*x| return x.render(tokens, stream), |
| 178 | @TagType(Error).ExpectedLabelOrLBrace => |*x| return x.render(tokens, stream), | 178 | .ExpectedLBrace => |*x| return x.render(tokens, stream), |
| 179 | @TagType(Error).ExpectedLBrace => |*x| return x.render(tokens, stream), | 179 | .ExpectedColonOrRParen => |*x| return x.render(tokens, stream), |
| 180 | @TagType(Error).ExpectedColonOrRParen => |*x| return x.render(tokens, stream), | 180 | .ExpectedLabelable => |*x| return x.render(tokens, stream), |
| 181 | @TagType(Error).ExpectedLabelable => |*x| return x.render(tokens, stream), | 181 | .ExpectedInlinable => |*x| return x.render(tokens, stream), |
| 182 | @TagType(Error).ExpectedInlinable => |*x| return x.render(tokens, stream), | 182 | .ExpectedAsmOutputReturnOrType => |*x| return x.render(tokens, stream), |
| 183 | @TagType(Error).ExpectedAsmOutputReturnOrType => |*x| return x.render(tokens, stream), | 183 | .ExpectedCall => |*x| return x.render(tokens, stream), |
| 184 | @TagType(Error).ExpectedCall => |*x| return x.render(tokens, stream), | 184 | .ExpectedCallOrFnProto => |*x| return x.render(tokens, stream), |
| 185 | @TagType(Error).ExpectedCallOrFnProto => |*x| return x.render(tokens, stream), | 185 | .ExpectedSliceOrRBracket => |*x| return x.render(tokens, stream), |
| 186 | @TagType(Error).ExpectedSliceOrRBracket => |*x| return x.render(tokens, stream), | 186 | .ExtraAlignQualifier => |*x| return x.render(tokens, stream), |
| 187 | @TagType(Error).ExtraAlignQualifier => |*x| return x.render(tokens, stream), | 187 | .ExtraConstQualifier => |*x| return x.render(tokens, stream), |
| 188 | @TagType(Error).ExtraConstQualifier => |*x| return x.render(tokens, stream), | 188 | .ExtraVolatileQualifier => |*x| return x.render(tokens, stream), |
| 189 | @TagType(Error).ExtraVolatileQualifier => |*x| return x.render(tokens, stream), | 189 | .ExtraAllowZeroQualifier => |*x| return x.render(tokens, stream), |
| 190 | @TagType(Error).ExtraAllowZeroQualifier => |*x| return x.render(tokens, stream), | 190 | .ExpectedTypeExpr => |*x| return x.render(tokens, stream), |
| 191 | @TagType(Error).ExpectedTypeExpr => |*x| return x.render(tokens, stream), | 191 | .ExpectedPrimaryTypeExpr => |*x| return x.render(tokens, stream), |
| 192 | @TagType(Error).ExpectedPrimaryTypeExpr => |*x| return x.render(tokens, stream), | 192 | .ExpectedParamType => |*x| return x.render(tokens, stream), |
| 193 | @TagType(Error).ExpectedParamType => |*x| return x.render(tokens, stream), | 193 | .ExpectedExpr => |*x| return x.render(tokens, stream), |
| 194 | @TagType(Error).ExpectedExpr => |*x| return x.render(tokens, stream), | 194 | .ExpectedPrimaryExpr => |*x| return x.render(tokens, stream), |
| 195 | @TagType(Error).ExpectedPrimaryExpr => |*x| return x.render(tokens, stream), | 195 | .ExpectedToken => |*x| return x.render(tokens, stream), |
| 196 | @TagType(Error).ExpectedToken => |*x| return x.render(tokens, stream), | 196 | .ExpectedCommaOrEnd => |*x| return x.render(tokens, stream), |
| 197 | @TagType(Error).ExpectedCommaOrEnd => |*x| return x.render(tokens, stream), | 197 | .ExpectedParamList => |*x| return x.render(tokens, stream), |
| 198 | @TagType(Error).ExpectedParamList => |*x| return x.render(tokens, stream), | 198 | .ExpectedPayload => |*x| return x.render(tokens, stream), |
| 199 | @TagType(Error).ExpectedPayload => |*x| return x.render(tokens, stream), | 199 | .ExpectedBlockOrAssignment => |*x| return x.render(tokens, stream), |
| 200 | @TagType(Error).ExpectedBlockOrAssignment => |*x| return x.render(tokens, stream), | 200 | .ExpectedBlockOrExpression => |*x| return x.render(tokens, stream), |
| 201 | @TagType(Error).ExpectedBlockOrExpression => |*x| return x.render(tokens, stream), | 201 | .ExpectedExprOrAssignment => |*x| return x.render(tokens, stream), |
| 202 | @TagType(Error).ExpectedExprOrAssignment => |*x| return x.render(tokens, stream), | 202 | .ExpectedPrefixExpr => |*x| return x.render(tokens, stream), |
| 203 | @TagType(Error).ExpectedPrefixExpr => |*x| return x.render(tokens, stream), | 203 | .ExpectedLoopExpr => |*x| return x.render(tokens, stream), |
| 204 | @TagType(Error).ExpectedLoopExpr => |*x| return x.render(tokens, stream), | 204 | .ExpectedDerefOrUnwrap => |*x| return x.render(tokens, stream), |
| 205 | @TagType(Error).ExpectedDerefOrUnwrap => |*x| return x.render(tokens, stream), | 205 | .ExpectedSuffixOp => |*x| return x.render(tokens, stream), |
| 206 | @TagType(Error).ExpectedSuffixOp => |*x| return x.render(tokens, stream), | | |
| 207 | } | 206 | } |
| 208 | } | 207 | } |
| 209 | | 208 | |
| 210 | pub fn loc(self: *const Error) TokenIndex { | 209 | pub fn loc(self: *const Error) TokenIndex { |
| 211 | switch (self.*) { | 210 | switch (self.*) { |
| 212 | // TODO https://github.com/ziglang/zig/issues/683 | 211 | .InvalidToken => |x| return x.token, |
| 213 | @TagType(Error).InvalidToken => |x| return x.token, | 212 | .ExpectedContainerMembers => |x| return x.token, |
| 214 | @TagType(Error).ExpectedContainerMembers => |x| return x.token, | 213 | .ExpectedStringLiteral => |x| return x.token, |
| 215 | @TagType(Error).ExpectedStringLiteral => |x| return x.token, | 214 | .ExpectedIntegerLiteral => |x| return x.token, |
| 216 | @TagType(Error).ExpectedIntegerLiteral => |x| return x.token, | 215 | .ExpectedPubItem => |x| return x.token, |
| 217 | @TagType(Error).ExpectedPubItem => |x| return x.token, | 216 | .ExpectedIdentifier => |x| return x.token, |
| 218 | @TagType(Error).ExpectedIdentifier => |x| return x.token, | 217 | .ExpectedStatement => |x| return x.token, |
| 219 | @TagType(Error).ExpectedStatement => |x| return x.token, | 218 | .ExpectedVarDeclOrFn => |x| return x.token, |
| 220 | @TagType(Error).ExpectedVarDeclOrFn => |x| return x.token, | 219 | .ExpectedVarDecl => |x| return x.token, |
| 221 | @TagType(Error).ExpectedVarDecl => |x| return x.token, | 220 | .ExpectedReturnType => |x| return x.token, |
| 222 | @TagType(Error).ExpectedReturnType => |x| return x.token, | 221 | .ExpectedAggregateKw => |x| return x.token, |
| 223 | @TagType(Error).ExpectedAggregateKw => |x| return x.token, | 222 | .UnattachedDocComment => |x| return x.token, |
| 224 | @TagType(Error).UnattachedDocComment => |x| return x.token, | 223 | .ExpectedEqOrSemi => |x| return x.token, |
| 225 | @TagType(Error).ExpectedEqOrSemi => |x| return x.token, | 224 | .ExpectedSemiOrLBrace => |x| return x.token, |
| 226 | @TagType(Error).ExpectedSemiOrLBrace => |x| return x.token, | 225 | .ExpectedSemiOrElse => |x| return x.token, |
| 227 | @TagType(Error).ExpectedSemiOrElse => |x| return x.token, | 226 | .ExpectedLabelOrLBrace => |x| return x.token, |
| 228 | @TagType(Error).ExpectedLabelOrLBrace => |x| return x.token, | 227 | .ExpectedLBrace => |x| return x.token, |
| 229 | @TagType(Error).ExpectedLBrace => |x| return x.token, | 228 | .ExpectedColonOrRParen => |x| return x.token, |
| 230 | @TagType(Error).ExpectedColonOrRParen => |x| return x.token, | 229 | .ExpectedLabelable => |x| return x.token, |
| 231 | @TagType(Error).ExpectedLabelable => |x| return x.token, | 230 | .ExpectedInlinable => |x| return x.token, |
| 232 | @TagType(Error).ExpectedInlinable => |x| return x.token, | 231 | .ExpectedAsmOutputReturnOrType => |x| return x.token, |
| 233 | @TagType(Error).ExpectedAsmOutputReturnOrType => |x| return x.token, | 232 | .ExpectedCall => |x| return x.node.firstToken(), |
| 234 | @TagType(Error).ExpectedCall => |x| return x.node.firstToken(), | 233 | .ExpectedCallOrFnProto => |x| return x.node.firstToken(), |
| 235 | @TagType(Error).ExpectedCallOrFnProto => |x| return x.node.firstToken(), | 234 | .ExpectedSliceOrRBracket => |x| return x.token, |
| 236 | @TagType(Error).ExpectedSliceOrRBracket => |x| return x.token, | 235 | .ExtraAlignQualifier => |x| return x.token, |
| 237 | @TagType(Error).ExtraAlignQualifier => |x| return x.token, | 236 | .ExtraConstQualifier => |x| return x.token, |
| 238 | @TagType(Error).ExtraConstQualifier => |x| return x.token, | 237 | .ExtraVolatileQualifier => |x| return x.token, |
| 239 | @TagType(Error).ExtraVolatileQualifier => |x| return x.token, | 238 | .ExtraAllowZeroQualifier => |x| return x.token, |
| 240 | @TagType(Error).ExtraAllowZeroQualifier => |x| return x.token, | 239 | .ExpectedTypeExpr => |x| return x.token, |
| 241 | @TagType(Error).ExpectedTypeExpr => |x| return x.token, | 240 | .ExpectedPrimaryTypeExpr => |x| return x.token, |
| 242 | @TagType(Error).ExpectedPrimaryTypeExpr => |x| return x.token, | 241 | .ExpectedParamType => |x| return x.token, |
| 243 | @TagType(Error).ExpectedParamType => |x| return x.token, | 242 | .ExpectedExpr => |x| return x.token, |
| 244 | @TagType(Error).ExpectedExpr => |x| return x.token, | 243 | .ExpectedPrimaryExpr => |x| return x.token, |
| 245 | @TagType(Error).ExpectedPrimaryExpr => |x| return x.token, | 244 | .ExpectedToken => |x| return x.token, |
| 246 | @TagType(Error).ExpectedToken => |x| return x.token, | 245 | .ExpectedCommaOrEnd => |x| return x.token, |
| 247 | @TagType(Error).ExpectedCommaOrEnd => |x| return x.token, | 246 | .ExpectedParamList => |x| return x.token, |
| 248 | @TagType(Error).ExpectedParamList => |x| return x.token, | 247 | .ExpectedPayload => |x| return x.token, |
| 249 | @TagType(Error).ExpectedPayload => |x| return x.token, | 248 | .ExpectedBlockOrAssignment => |x| return x.token, |
| 250 | @TagType(Error).ExpectedBlockOrAssignment => |x| return x.token, | 249 | .ExpectedBlockOrExpression => |x| return x.token, |
| 251 | @TagType(Error).ExpectedBlockOrExpression => |x| return x.token, | 250 | .ExpectedExprOrAssignment => |x| return x.token, |
| 252 | @TagType(Error).ExpectedExprOrAssignment => |x| return x.token, | 251 | .ExpectedPrefixExpr => |x| return x.token, |
| 253 | @TagType(Error).ExpectedPrefixExpr => |x| return x.token, | 252 | .ExpectedLoopExpr => |x| return x.token, |
| 254 | @TagType(Error).ExpectedLoopExpr => |x| return x.token, | 253 | .ExpectedDerefOrUnwrap => |x| return x.token, |
| 255 | @TagType(Error).ExpectedDerefOrUnwrap => |x| return x.token, | 254 | .ExpectedSuffixOp => |x| return x.token, |
| 256 | @TagType(Error).ExpectedSuffixOp => |x| return x.token, | | |
| 257 | } | 255 | } |
| 258 | } | 256 | } |
| 259 | | 257 | |
| ... | @@ -320,8 +318,19 @@ pub const Error = union(enum) { | ... | @@ -320,8 +318,19 @@ pub const Error = union(enum) { |
| 320 | expected_id: Token.Id, | 318 | expected_id: Token.Id, |
| 321 | | 319 | |
| 322 | pub fn render(self: *const ExpectedToken, tokens: *Tree.TokenList, stream: var) !void { | 320 | pub fn render(self: *const ExpectedToken, tokens: *Tree.TokenList, stream: var) !void { |
| 323 | const token_name = @tagName(tokens.at(self.token).id); | 321 | const found_token = tokens.at(self.token); |
| 324 | return stream.print("expected {}, found {}", @tagName(self.expected_id), token_name); | 322 | switch (found_token.id) { |
| | 323 | .Invalid_ampersands => { |
| | 324 | return stream.print("`&&` is invalid. Note that `and` is boolean AND."); |
| | 325 | }, |
| | 326 | .Invalid => { |
| | 327 | return stream.print("expected {}, found invalid bytes", @tagName(self.expected_id)); |
| | 328 | }, |
| | 329 | else => { |
| | 330 | const token_name = @tagName(found_token.id); |
| | 331 | return stream.print("expected {}, found {}", @tagName(self.expected_id), token_name); |
| | 332 | }, |
| | 333 | } |
| 325 | } | 334 | } |
| 326 | }; | 335 | }; |
| 327 | | 336 | |
| ... | @@ -1708,15 +1717,15 @@ pub const Node = struct { | ... | @@ -1708,15 +1717,15 @@ pub const Node = struct { |
| 1708 | i -= 1; | 1717 | i -= 1; |
| 1709 | | 1718 | |
| 1710 | switch (self.op) { | 1719 | switch (self.op) { |
| 1711 | @TagType(Op).Call => |*call_info| { | 1720 | .Call => |*call_info| { |
| 1712 | if (i < call_info.params.len) return call_info.params.at(i).*; | 1721 | if (i < call_info.params.len) return call_info.params.at(i).*; |
| 1713 | i -= call_info.params.len; | 1722 | i -= call_info.params.len; |
| 1714 | }, | 1723 | }, |
| 1715 | Op.ArrayAccess => |index_expr| { | 1724 | .ArrayAccess => |index_expr| { |
| 1716 | if (i < 1) return index_expr; | 1725 | if (i < 1) return index_expr; |
| 1717 | i -= 1; | 1726 | i -= 1; |
| 1718 | }, | 1727 | }, |
| 1719 | @TagType(Op).Slice => |range| { | 1728 | .Slice => |range| { |
| 1720 | if (i < 1) return range.start; | 1729 | if (i < 1) return range.start; |
| 1721 | i -= 1; | 1730 | i -= 1; |
| 1722 | | 1731 | |
| ... | @@ -1725,16 +1734,16 @@ pub const Node = struct { | ... | @@ -1725,16 +1734,16 @@ pub const Node = struct { |
| 1725 | i -= 1; | 1734 | i -= 1; |
| 1726 | } | 1735 | } |
| 1727 | }, | 1736 | }, |
| 1728 | Op.ArrayInitializer => |*exprs| { | 1737 | .ArrayInitializer => |*exprs| { |
| 1729 | if (i < exprs.len) return exprs.at(i).*; | 1738 | if (i < exprs.len) return exprs.at(i).*; |
| 1730 | i -= exprs.len; | 1739 | i -= exprs.len; |
| 1731 | }, | 1740 | }, |
| 1732 | Op.StructInitializer => |*fields| { | 1741 | .StructInitializer => |*fields| { |
| 1733 | if (i < fields.len) return fields.at(i).*; | 1742 | if (i < fields.len) return fields.at(i).*; |
| 1734 | i -= fields.len; | 1743 | i -= fields.len; |
| 1735 | }, | 1744 | }, |
| 1736 | Op.UnwrapOptional, | 1745 | .UnwrapOptional, |
| 1737 | Op.Deref, | 1746 | .Deref, |
| 1738 | => {}, | 1747 | => {}, |
| 1739 | } | 1748 | } |
| 1740 | | 1749 | |
| ... | @@ -1743,7 +1752,7 @@ pub const Node = struct { | ... | @@ -1743,7 +1752,7 @@ pub const Node = struct { |
| 1743 | | 1752 | |
| 1744 | pub fn firstToken(self: *const SuffixOp) TokenIndex { | 1753 | pub fn firstToken(self: *const SuffixOp) TokenIndex { |
| 1745 | switch (self.op) { | 1754 | switch (self.op) { |
| 1746 | @TagType(Op).Call => |*call_info| if (call_info.async_attr) |async_attr| return async_attr.firstToken(), | 1755 | .Call => |*call_info| if (call_info.async_attr) |async_attr| return async_attr.firstToken(), |
| 1747 | else => {}, | 1756 | else => {}, |
| 1748 | } | 1757 | } |
| 1749 | return self.lhs.firstToken(); | 1758 | return self.lhs.firstToken(); |