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