| author | |
| committer | |
| log | 0e6c18c8207cab5d3946f119a51d62f91c1b9028 |
| tree | b1e18987d751ac82beaaecb544753cb260c40595 |
| parent | 4241cd666dbf5117a6c32357c091ca3bc7a0fcd0 |
I was looking at the tokenizer specifically fn testTokenize and the
this statement looked odd:
if (@TagType(Token.Id)(token.id) != @TagType(Token.Id)(expected_token_id)) {
I then saw the TODO and thought I'd remove StrLitKind figuring that
would make testTokenize simpler. It did so I thought I'd prepare this PR.
The tests are still working and stage2 zig seems to work, it compiles and
I was able to use the fmt command.3 files changed, 25 insertions(+), 40 deletions(-)
std/zig/ast.zig+2-2| ... | ... | @@ -211,7 +211,7 @@ pub const Error = union(enum) { |
| 211 | 211 | |
| 212 | 212 | pub const ExpectedToken = struct { |
| 213 | 213 | token: TokenIndex, |
| 214 | expected_id: @TagType(Token.Id), | |
| 214 | expected_id: Token.Id, | |
| 215 | 215 | |
| 216 | 216 | pub fn render(self: *const ExpectedToken, tokens: *Tree.TokenList, stream: var) !void { |
| 217 | 217 | const token_name = @tagName(tokens.at(self.token).id); |
| ... | ... | @@ -221,7 +221,7 @@ pub const Error = union(enum) { |
| 221 | 221 | |
| 222 | 222 | pub const ExpectedCommaOrEnd = struct { |
| 223 | 223 | token: TokenIndex, |
| 224 | end_id: @TagType(Token.Id), | |
| 224 | end_id: Token.Id, | |
| 225 | 225 | |
| 226 | 226 | pub fn render(self: *const ExpectedCommaOrEnd, tokens: *Tree.TokenList, stream: var) !void { |
| 227 | 227 | const token_name = @tagName(tokens.at(self.token).id); |
std/zig/parse.zig+12-12| ... | ... | @@ -2846,12 +2846,12 @@ const ContainerKindCtx = struct { |
| 2846 | 2846 | }; |
| 2847 | 2847 | |
| 2848 | 2848 | const ExpectTokenSave = struct { |
| 2849 | id: @TagType(Token.Id), | |
| 2849 | id: Token.Id, | |
| 2850 | 2850 | ptr: *TokenIndex, |
| 2851 | 2851 | }; |
| 2852 | 2852 | |
| 2853 | 2853 | const OptionalTokenSave = struct { |
| 2854 | id: @TagType(Token.Id), | |
| 2854 | id: Token.Id, | |
| 2855 | 2855 | ptr: *?TokenIndex, |
| 2856 | 2856 | }; |
| 2857 | 2857 | |
| ... | ... | @@ -3066,9 +3066,9 @@ const State = union(enum) { |
| 3066 | 3066 | Identifier: OptionalCtx, |
| 3067 | 3067 | ErrorTag: **ast.Node, |
| 3068 | 3068 | |
| 3069 | IfToken: @TagType(Token.Id), | |
| 3069 | IfToken: Token.Id, | |
| 3070 | 3070 | IfTokenSave: ExpectTokenSave, |
| 3071 | ExpectToken: @TagType(Token.Id), | |
| 3071 | ExpectToken: Token.Id, | |
| 3072 | 3072 | ExpectTokenSave: ExpectTokenSave, |
| 3073 | 3073 | OptionalTokenSave: OptionalTokenSave, |
| 3074 | 3074 | }; |
| ... | ... | @@ -3243,7 +3243,7 @@ const ExpectCommaOrEndResult = union(enum) { |
| 3243 | 3243 | parse_error: Error, |
| 3244 | 3244 | }; |
| 3245 | 3245 | |
| 3246 | fn expectCommaOrEnd(tok_it: *ast.Tree.TokenList.Iterator, tree: *ast.Tree, end: @TagType(Token.Id)) ExpectCommaOrEndResult { | |
| 3246 | fn expectCommaOrEnd(tok_it: *ast.Tree.TokenList.Iterator, tree: *ast.Tree, end: Token.Id) ExpectCommaOrEndResult { | |
| 3247 | 3247 | const token = nextToken(tok_it, tree); |
| 3248 | 3248 | const token_index = token.index; |
| 3249 | 3249 | const token_ptr = token.ptr; |
| ... | ... | @@ -3288,7 +3288,7 @@ fn tokenIdToAssignment(id: *const Token.Id) ?ast.Node.InfixOp.Op { |
| 3288 | 3288 | }; |
| 3289 | 3289 | } |
| 3290 | 3290 | |
| 3291 | fn tokenIdToUnwrapExpr(id: @TagType(Token.Id)) ?ast.Node.InfixOp.Op { | |
| 3291 | fn tokenIdToUnwrapExpr(id: Token.Id) ?ast.Node.InfixOp.Op { | |
| 3292 | 3292 | return switch (id) { |
| 3293 | 3293 | Token.Id.Keyword_catch => ast.Node.InfixOp.Op{ .Catch = null }, |
| 3294 | 3294 | Token.Id.Keyword_orelse => ast.Node.InfixOp.Op{ .UnwrapOptional = void{} }, |
| ... | ... | @@ -3296,7 +3296,7 @@ fn tokenIdToUnwrapExpr(id: @TagType(Token.Id)) ?ast.Node.InfixOp.Op { |
| 3296 | 3296 | }; |
| 3297 | 3297 | } |
| 3298 | 3298 | |
| 3299 | fn tokenIdToComparison(id: @TagType(Token.Id)) ?ast.Node.InfixOp.Op { | |
| 3299 | fn tokenIdToComparison(id: Token.Id) ?ast.Node.InfixOp.Op { | |
| 3300 | 3300 | return switch (id) { |
| 3301 | 3301 | Token.Id.BangEqual => ast.Node.InfixOp.Op{ .BangEqual = void{} }, |
| 3302 | 3302 | Token.Id.EqualEqual => ast.Node.InfixOp.Op{ .EqualEqual = void{} }, |
| ... | ... | @@ -3308,7 +3308,7 @@ fn tokenIdToComparison(id: @TagType(Token.Id)) ?ast.Node.InfixOp.Op { |
| 3308 | 3308 | }; |
| 3309 | 3309 | } |
| 3310 | 3310 | |
| 3311 | fn tokenIdToBitShift(id: @TagType(Token.Id)) ?ast.Node.InfixOp.Op { | |
| 3311 | fn tokenIdToBitShift(id: Token.Id) ?ast.Node.InfixOp.Op { | |
| 3312 | 3312 | return switch (id) { |
| 3313 | 3313 | Token.Id.AngleBracketAngleBracketLeft => ast.Node.InfixOp.Op{ .BitShiftLeft = void{} }, |
| 3314 | 3314 | Token.Id.AngleBracketAngleBracketRight => ast.Node.InfixOp.Op{ .BitShiftRight = void{} }, |
| ... | ... | @@ -3316,7 +3316,7 @@ fn tokenIdToBitShift(id: @TagType(Token.Id)) ?ast.Node.InfixOp.Op { |
| 3316 | 3316 | }; |
| 3317 | 3317 | } |
| 3318 | 3318 | |
| 3319 | fn tokenIdToAddition(id: @TagType(Token.Id)) ?ast.Node.InfixOp.Op { | |
| 3319 | fn tokenIdToAddition(id: Token.Id) ?ast.Node.InfixOp.Op { | |
| 3320 | 3320 | return switch (id) { |
| 3321 | 3321 | Token.Id.Minus => ast.Node.InfixOp.Op{ .Sub = void{} }, |
| 3322 | 3322 | Token.Id.MinusPercent => ast.Node.InfixOp.Op{ .SubWrap = void{} }, |
| ... | ... | @@ -3327,7 +3327,7 @@ fn tokenIdToAddition(id: @TagType(Token.Id)) ?ast.Node.InfixOp.Op { |
| 3327 | 3327 | }; |
| 3328 | 3328 | } |
| 3329 | 3329 | |
| 3330 | fn tokenIdToMultiply(id: @TagType(Token.Id)) ?ast.Node.InfixOp.Op { | |
| 3330 | fn tokenIdToMultiply(id: Token.Id) ?ast.Node.InfixOp.Op { | |
| 3331 | 3331 | return switch (id) { |
| 3332 | 3332 | Token.Id.Slash => ast.Node.InfixOp.Op{ .Div = void{} }, |
| 3333 | 3333 | Token.Id.Asterisk => ast.Node.InfixOp.Op{ .Mult = void{} }, |
| ... | ... | @@ -3339,7 +3339,7 @@ fn tokenIdToMultiply(id: @TagType(Token.Id)) ?ast.Node.InfixOp.Op { |
| 3339 | 3339 | }; |
| 3340 | 3340 | } |
| 3341 | 3341 | |
| 3342 | fn tokenIdToPrefixOp(id: @TagType(Token.Id)) ?ast.Node.PrefixOp.Op { | |
| 3342 | fn tokenIdToPrefixOp(id: Token.Id) ?ast.Node.PrefixOp.Op { | |
| 3343 | 3343 | return switch (id) { |
| 3344 | 3344 | Token.Id.Bang => ast.Node.PrefixOp.Op{ .BoolNot = void{} }, |
| 3345 | 3345 | Token.Id.Tilde => ast.Node.PrefixOp.Op{ .BitNot = void{} }, |
| ... | ... | @@ -3374,7 +3374,7 @@ fn createToCtxLiteral(arena: *mem.Allocator, opt_ctx: *const OptionalCtx, compti |
| 3374 | 3374 | return node; |
| 3375 | 3375 | } |
| 3376 | 3376 | |
| 3377 | fn eatToken(tok_it: *ast.Tree.TokenList.Iterator, tree: *ast.Tree, id: @TagType(Token.Id)) ?TokenIndex { | |
| 3377 | fn eatToken(tok_it: *ast.Tree.TokenList.Iterator, tree: *ast.Tree, id: Token.Id) ?TokenIndex { | |
| 3378 | 3378 | const token = tok_it.peek().?; |
| 3379 | 3379 | |
| 3380 | 3380 | if (token.id == id) { |
std/zig/tokenizer.zig+11-26| ... | ... | @@ -73,17 +73,11 @@ pub const Token = struct { |
| 73 | 73 | return null; |
| 74 | 74 | } |
| 75 | 75 | |
| 76 | /// TODO remove this enum | |
| 77 | const StrLitKind = enum { | |
| 78 | Normal, | |
| 79 | C, | |
| 80 | }; | |
| 81 | ||
| 82 | pub const Id = union(enum) { | |
| 76 | pub const Id = enum { | |
| 83 | 77 | Invalid, |
| 84 | 78 | Identifier, |
| 85 | StringLiteral: StrLitKind, | |
| 86 | MultilineStringLiteralLine: StrLitKind, | |
| 79 | StringLiteral, | |
| 80 | MultilineStringLiteralLine, | |
| 87 | 81 | CharLiteral, |
| 88 | 82 | Eof, |
| 89 | 83 | Builtin, |
| ... | ... | @@ -311,7 +305,7 @@ pub const Tokenizer = struct { |
| 311 | 305 | }, |
| 312 | 306 | '"' => { |
| 313 | 307 | state = State.StringLiteral; |
| 314 | result.id = Token.Id{ .StringLiteral = Token.StrLitKind.Normal }; | |
| 308 | result.id = Token.Id.StringLiteral; | |
| 315 | 309 | }, |
| 316 | 310 | '\'' => { |
| 317 | 311 | state = State.CharLiteral; |
| ... | ... | @@ -390,7 +384,7 @@ pub const Tokenizer = struct { |
| 390 | 384 | }, |
| 391 | 385 | '\\' => { |
| 392 | 386 | state = State.Backslash; |
| 393 | result.id = Token.Id{ .MultilineStringLiteralLine = Token.StrLitKind.Normal }; | |
| 387 | result.id = Token.Id.MultilineStringLiteralLine; | |
| 394 | 388 | }, |
| 395 | 389 | '{' => { |
| 396 | 390 | result.id = Token.Id.LBrace; |
| ... | ... | @@ -591,11 +585,11 @@ pub const Tokenizer = struct { |
| 591 | 585 | State.C => switch (c) { |
| 592 | 586 | '\\' => { |
| 593 | 587 | state = State.Backslash; |
| 594 | result.id = Token.Id{ .MultilineStringLiteralLine = Token.StrLitKind.C }; | |
| 588 | result.id = Token.Id.MultilineStringLiteralLine; | |
| 595 | 589 | }, |
| 596 | 590 | '"' => { |
| 597 | 591 | state = State.StringLiteral; |
| 598 | result.id = Token.Id{ .StringLiteral = Token.StrLitKind.C }; | |
| 592 | result.id = Token.Id.StringLiteral; | |
| 599 | 593 | }, |
| 600 | 594 | 'a'...'z', 'A'...'Z', '_', '0'...'9' => { |
| 601 | 595 | state = State.Identifier; |
| ... | ... | @@ -1218,7 +1212,7 @@ test "tokenizer - invalid token characters" { |
| 1218 | 1212 | |
| 1219 | 1213 | test "tokenizer - invalid literal/comment characters" { |
| 1220 | 1214 | testTokenize("\"\x00\"", []Token.Id{ |
| 1221 | Token.Id{ .StringLiteral = Token.StrLitKind.Normal }, | |
| 1215 | Token.Id.StringLiteral, | |
| 1222 | 1216 | Token.Id.Invalid, |
| 1223 | 1217 | }); |
| 1224 | 1218 | testTokenize("//\x00", []Token.Id{ |
| ... | ... | @@ -1304,7 +1298,7 @@ test "tokenizer - string identifier and builtin fns" { |
| 1304 | 1298 | Token.Id.Equal, |
| 1305 | 1299 | Token.Id.Builtin, |
| 1306 | 1300 | Token.Id.LParen, |
| 1307 | Token.Id{ .StringLiteral = Token.StrLitKind.Normal }, | |
| 1301 | Token.Id.StringLiteral, | |
| 1308 | 1302 | Token.Id.RParen, |
| 1309 | 1303 | Token.Id.Semicolon, |
| 1310 | 1304 | }); |
| ... | ... | @@ -1344,17 +1338,8 @@ fn testTokenize(source: []const u8, expected_tokens: []const Token.Id) void { |
| 1344 | 1338 | var tokenizer = Tokenizer.init(source); |
| 1345 | 1339 | for (expected_tokens) |expected_token_id| { |
| 1346 | 1340 | const token = tokenizer.next(); |
| 1347 | if (@TagType(Token.Id)(token.id) != @TagType(Token.Id)(expected_token_id)) { | |
| 1348 | std.debug.panic("expected {}, found {}\n", @tagName(@TagType(Token.Id)(expected_token_id)), @tagName(@TagType(Token.Id)(token.id))); | |
| 1349 | } | |
| 1350 | switch (expected_token_id) { | |
| 1351 | Token.Id.StringLiteral => |expected_kind| { | |
| 1352 | std.debug.assert(expected_kind == switch (token.id) { | |
| 1353 | Token.Id.StringLiteral => |kind| kind, | |
| 1354 | else => unreachable, | |
| 1355 | }); | |
| 1356 | }, | |
| 1357 | else => {}, | |
| 1341 | if (token.id != expected_token_id) { | |
| 1342 | std.debug.panic("expected {}, found {}\n", @tagName(expected_token_id), @tagName(token.id)); | |
| 1358 | 1343 | } |
| 1359 | 1344 | } |
| 1360 | 1345 | const last_token = tokenizer.next(); |