| ... | @@ -257,7 +257,7 @@ fn parseContainerMembers(p: *Parse) Allocator.Error!Members { | ... | @@ -257,7 +257,7 @@ fn parseContainerMembers(p: *Parse) Allocator.Error!Members { |
| 257 | while (true) { | 257 | while (true) { |
| 258 | const doc_comment = try p.eatDocComments(); | 258 | const doc_comment = try p.eatDocComments(); |
| 259 | | 259 | |
| 260 | switch (p.tokenTag(p.tok_i)) { | 260 | sw: switch (p.tokenTag(p.tok_i)) { |
| 261 | .keyword_test => { | 261 | .keyword_test => { |
| 262 | if (doc_comment) |some| { | 262 | if (doc_comment) |some| { |
| 263 | try p.warnMsg(.{ .tag = .test_doc_comment, .token = some }); | 263 | try p.warnMsg(.{ .tag = .test_doc_comment, .token = some }); |
| ... | @@ -348,17 +348,7 @@ fn parseContainerMembers(p: *Parse) Allocator.Error!Members { | ... | @@ -348,17 +348,7 @@ fn parseContainerMembers(p: *Parse) Allocator.Error!Members { |
| 348 | p.findNextContainerMember(); | 348 | p.findNextContainerMember(); |
| 349 | }, | 349 | }, |
| 350 | }, | 350 | }, |
| 351 | .keyword_pub => { | 351 | .keyword_pub, |
| 352 | p.tok_i += 1; | | |
| 353 | const opt_top_level_decl = try p.expectTopLevelDeclRecoverable(); | | |
| 354 | if (opt_top_level_decl) |top_level_decl| { | | |
| 355 | if (field_state == .seen) { | | |
| 356 | field_state = .{ .end = top_level_decl }; | | |
| 357 | } | | |
| 358 | try p.scratch.append(p.gpa, top_level_decl); | | |
| 359 | } | | |
| 360 | trailing = p.tokenTag(p.tok_i - 1) == .semicolon; | | |
| 361 | }, | | |
| 362 | .keyword_const, | 352 | .keyword_const, |
| 363 | .keyword_var, | 353 | .keyword_var, |
| 364 | .keyword_threadlocal, | 354 | .keyword_threadlocal, |
| ... | @@ -367,7 +357,27 @@ fn parseContainerMembers(p: *Parse) Allocator.Error!Members { | ... | @@ -367,7 +357,27 @@ fn parseContainerMembers(p: *Parse) Allocator.Error!Members { |
| 367 | .keyword_inline, | 357 | .keyword_inline, |
| 368 | .keyword_noinline, | 358 | .keyword_noinline, |
| 369 | .keyword_fn, | 359 | .keyword_fn, |
| 370 | => { | 360 | => |t| { |
| | 361 | if (t == .keyword_extern) { |
| | 362 | switch (p.tokenTag(p.tok_i + 1)) { |
| | 363 | .keyword_struct, |
| | 364 | .keyword_union, |
| | 365 | .keyword_enum, |
| | 366 | .keyword_opaque, |
| | 367 | => |ct| continue :sw ct, |
| | 368 | else => {}, |
| | 369 | } |
| | 370 | } |
| | 371 | if (t == .keyword_inline) { |
| | 372 | switch (p.tokenTag(p.tok_i + 1)) { |
| | 373 | .keyword_for, |
| | 374 | .keyword_while, |
| | 375 | => |ct| continue :sw ct, |
| | 376 | else => {}, |
| | 377 | } |
| | 378 | } |
| | 379 | |
| | 380 | p.tok_i += @intFromBool(t == .keyword_pub); |
| 371 | const opt_top_level_decl = try p.expectTopLevelDeclRecoverable(); | 381 | const opt_top_level_decl = try p.expectTopLevelDeclRecoverable(); |
| 372 | if (opt_top_level_decl) |top_level_decl| { | 382 | if (opt_top_level_decl) |top_level_decl| { |
| 373 | if (field_state == .seen) { | 383 | if (field_state == .seen) { |
| ... | @@ -588,7 +598,8 @@ fn expectTestDeclRecoverable(p: *Parse) error{OutOfMemory}!?Node.Index { | ... | @@ -588,7 +598,8 @@ fn expectTestDeclRecoverable(p: *Parse) error{OutOfMemory}!?Node.Index { |
| 588 | } | 598 | } |
| 589 | | 599 | |
| 590 | /// Decl | 600 | /// Decl |
| 591 | /// <- (KEYWORD_export / KEYWORD_extern STRINGLITERALSINGLE? / KEYWORD_inline / KEYWORD_noinline)? FnProto (SEMICOLON / Block) | 601 | /// <- (KEYWORD_export / KEYWORD_inline / KEYWORD_noinline)? FnProto (SEMICOLON / Block) |
| | 602 | /// / KEYWORD_extern STRINGLITERALSINGLE? FnProto SEMICOLON |
| 592 | /// / (KEYWORD_export / KEYWORD_extern STRINGLITERALSINGLE?)? KEYWORD_threadlocal? VarDecl | 603 | /// / (KEYWORD_export / KEYWORD_extern STRINGLITERALSINGLE?)? KEYWORD_threadlocal? VarDecl |
| 593 | fn expectTopLevelDecl(p: *Parse) !?Node.Index { | 604 | fn expectTopLevelDecl(p: *Parse) !?Node.Index { |
| 594 | const extern_export_inline_token = p.nextToken(); | 605 | const extern_export_inline_token = p.nextToken(); |
| ... | @@ -665,7 +676,7 @@ fn expectTopLevelDeclRecoverable(p: *Parse) error{OutOfMemory}!?Node.Index { | ... | @@ -665,7 +676,7 @@ fn expectTopLevelDeclRecoverable(p: *Parse) error{OutOfMemory}!?Node.Index { |
| 665 | }; | 676 | }; |
| 666 | } | 677 | } |
| 667 | | 678 | |
| 668 | /// FnProto <- KEYWORD_fn IDENTIFIER? LPAREN ParamDeclList RPAREN ByteAlign? AddrSpace? LinkSection? CallConv? EXCLAMATIONMARK? TypeExpr | 679 | /// FnProto <- KEYWORD_fn IDENTIFIER? LPAREN ParamDeclList RPAREN ByteAlign? AddrSpace? LinkSection? CallConv? EXCLAMATIONMARK? TypeExpr !ExprSuffix |
| 669 | fn parseFnProto(p: *Parse) !?Node.Index { | 680 | fn parseFnProto(p: *Parse) !?Node.Index { |
| 670 | const fn_token = p.eatToken(.keyword_fn) orelse return null; | 681 | const fn_token = p.eatToken(.keyword_fn) orelse return null; |
| 671 | | 682 | |
| ... | @@ -853,7 +864,7 @@ fn parseGlobalVarDecl(p: *Parse) !?Node.Index { | ... | @@ -853,7 +864,7 @@ fn parseGlobalVarDecl(p: *Parse) !?Node.Index { |
| 853 | return var_decl; | 864 | return var_decl; |
| 854 | } | 865 | } |
| 855 | | 866 | |
| 856 | /// ContainerField <- doc_comment? KEYWORD_comptime? !KEYWORD_fn (IDENTIFIER COLON)? TypeExpr ByteAlign? (EQUAL Expr)? | 867 | /// ContainerField <- doc_comment? (KEYWORD_comptime / !KEYWORD_comptime) !KEYWORD_fn (IDENTIFIER COLON / !(IDENTIFIER COLON))? TypeExpr ByteAlign? (EQUAL Expr)? |
| 857 | fn expectContainerField(p: *Parse) !Node.Index { | 868 | fn expectContainerField(p: *Parse) !Node.Index { |
| 858 | _ = p.eatToken(.keyword_comptime); | 869 | _ = p.eatToken(.keyword_comptime); |
| 859 | const main_token = p.tok_i; | 870 | const main_token = p.tok_i; |
| ... | @@ -895,16 +906,23 @@ fn expectContainerField(p: *Parse) !Node.Index { | ... | @@ -895,16 +906,23 @@ fn expectContainerField(p: *Parse) !Node.Index { |
| 895 | } | 906 | } |
| 896 | } | 907 | } |
| 897 | | 908 | |
| 898 | /// Statement | 909 | /// BlockStatement |
| 899 | /// <- KEYWORD_comptime ComptimeStatement | 910 | /// <- Statement |
| 900 | /// / KEYWORD_nosuspend BlockExprStatement | | |
| 901 | /// / KEYWORD_suspend BlockExprStatement | | |
| 902 | /// / KEYWORD_defer BlockExprStatement | 911 | /// / KEYWORD_defer BlockExprStatement |
| 903 | /// / KEYWORD_errdefer Payload? BlockExprStatement | 912 | /// / KEYWORD_errdefer Payload? BlockExprStatement |
| 904 | /// / IfStatement | 913 | /// / !ExprStatement (KEYWORD_comptime !BlockExpr)? VarAssignStatement |
| | 914 | /// |
| | 915 | /// Statement |
| | 916 | /// <- ExprStatement |
| | 917 | /// / KEYWORD_suspend BlockExprStatement |
| | 918 | /// / !ExprStatement (KEYWORD_comptime !BlockExpr)? AssignExpr SEMICOLON |
| | 919 | /// |
| | 920 | /// ExprStatement |
| | 921 | /// <- IfStatement |
| 905 | /// / LabeledStatement | 922 | /// / LabeledStatement |
| 906 | /// / VarDeclExprStatement | 923 | /// / KEYWORD_nosuspend BlockExprStatement |
| 907 | fn expectStatement(p: *Parse, allow_defer_var: bool) Error!Node.Index { | 924 | /// / KEYWORD_comptime BlockExpr |
| | 925 | fn expectStatement(p: *Parse, is_block_level: bool) Error!Node.Index { |
| 908 | if (p.eatToken(.keyword_comptime)) |comptime_token| { | 926 | if (p.eatToken(.keyword_comptime)) |comptime_token| { |
| 909 | const opt_block_expr = try p.parseBlockExpr(); | 927 | const opt_block_expr = try p.parseBlockExpr(); |
| 910 | if (opt_block_expr) |block_expr| { | 928 | if (opt_block_expr) |block_expr| { |
| ... | @@ -915,7 +933,7 @@ fn expectStatement(p: *Parse, allow_defer_var: bool) Error!Node.Index { | ... | @@ -915,7 +933,7 @@ fn expectStatement(p: *Parse, allow_defer_var: bool) Error!Node.Index { |
| 915 | }); | 933 | }); |
| 916 | } | 934 | } |
| 917 | | 935 | |
| 918 | if (allow_defer_var) { | 936 | if (is_block_level) { |
| 919 | return p.expectVarDeclExprStatement(comptime_token); | 937 | return p.expectVarDeclExprStatement(comptime_token); |
| 920 | } else { | 938 | } else { |
| 921 | const assign = try p.expectAssignExpr(); | 939 | const assign = try p.expectAssignExpr(); |
| ... | @@ -949,12 +967,12 @@ fn expectStatement(p: *Parse, allow_defer_var: bool) Error!Node.Index { | ... | @@ -949,12 +967,12 @@ fn expectStatement(p: *Parse, allow_defer_var: bool) Error!Node.Index { |
| 949 | .data = .{ .node = block_expr }, | 967 | .data = .{ .node = block_expr }, |
| 950 | }); | 968 | }); |
| 951 | }, | 969 | }, |
| 952 | .keyword_defer => if (allow_defer_var) return p.addNode(.{ | 970 | .keyword_defer => if (is_block_level) return p.addNode(.{ |
| 953 | .tag = .@"defer", | 971 | .tag = .@"defer", |
| 954 | .main_token = p.nextToken(), | 972 | .main_token = p.nextToken(), |
| 955 | .data = .{ .node = try p.expectBlockExprStatement() }, | 973 | .data = .{ .node = try p.expectBlockExprStatement() }, |
| 956 | }), | 974 | }), |
| 957 | .keyword_errdefer => if (allow_defer_var) return p.addNode(.{ | 975 | .keyword_errdefer => if (is_block_level) return p.addNode(.{ |
| 958 | .tag = .@"errdefer", | 976 | .tag = .@"errdefer", |
| 959 | .main_token = p.nextToken(), | 977 | .main_token = p.nextToken(), |
| 960 | .data = .{ .opt_token_and_node = .{ | 978 | .data = .{ .opt_token_and_node = .{ |
| ... | @@ -979,7 +997,7 @@ fn expectStatement(p: *Parse, allow_defer_var: bool) Error!Node.Index { | ... | @@ -979,7 +997,7 @@ fn expectStatement(p: *Parse, allow_defer_var: bool) Error!Node.Index { |
| 979 | | 997 | |
| 980 | if (try p.parseLabeledStatement()) |labeled_statement| return labeled_statement; | 998 | if (try p.parseLabeledStatement()) |labeled_statement| return labeled_statement; |
| 981 | | 999 | |
| 982 | if (allow_defer_var) { | 1000 | if (is_block_level) { |
| 983 | return p.expectVarDeclExprStatement(null); | 1001 | return p.expectVarDeclExprStatement(null); |
| 984 | } else { | 1002 | } else { |
| 985 | const assign = try p.expectAssignExpr(); | 1003 | const assign = try p.expectAssignExpr(); |
| ... | @@ -1007,8 +1025,10 @@ fn expectComptimeStatement(p: *Parse, comptime_token: TokenIndex) !Node.Index { | ... | @@ -1007,8 +1025,10 @@ fn expectComptimeStatement(p: *Parse, comptime_token: TokenIndex) !Node.Index { |
| 1007 | } | 1025 | } |
| 1008 | | 1026 | |
| 1009 | /// VarDeclExprStatement | 1027 | /// VarDeclExprStatement |
| 1010 | /// <- VarDeclProto (COMMA (VarDeclProto / Expr))* EQUAL Expr SEMICOLON | 1028 | /// <- Expr |
| 1011 | /// / Expr (AssignOp Expr / (COMMA (VarDeclProto / Expr))+ EQUAL Expr)? SEMICOLON | 1029 | /// / VarAssignStatement |
| | 1030 | /// |
| | 1031 | /// VarAssignStatement <- (VarDeclProto / Expr) (COMMA (VarDeclProto / Expr))* EQUAL Expr SEMICOLON |
| 1012 | fn expectVarDeclExprStatement(p: *Parse, comptime_token: ?TokenIndex) !Node.Index { | 1032 | fn expectVarDeclExprStatement(p: *Parse, comptime_token: ?TokenIndex) !Node.Index { |
| 1013 | const scratch_top = p.scratch.items.len; | 1033 | const scratch_top = p.scratch.items.len; |
| 1014 | defer p.scratch.shrinkRetainingCapacity(scratch_top); | 1034 | defer p.scratch.shrinkRetainingCapacity(scratch_top); |
| ... | @@ -1140,7 +1160,7 @@ fn expectStatementRecoverable(p: *Parse) Error!?Node.Index { | ... | @@ -1140,7 +1160,7 @@ fn expectStatementRecoverable(p: *Parse) Error!?Node.Index { |
| 1140 | | 1160 | |
| 1141 | /// IfStatement | 1161 | /// IfStatement |
| 1142 | /// <- IfPrefix BlockExpr ( KEYWORD_else Payload? Statement )? | 1162 | /// <- IfPrefix BlockExpr ( KEYWORD_else Payload? Statement )? |
| 1143 | /// / IfPrefix AssignExpr ( SEMICOLON / KEYWORD_else Payload? Statement ) | 1163 | /// / IfPrefix !BlockExpr AssignExpr ( SEMICOLON / KEYWORD_else Payload? Statement ) |
| 1144 | fn expectIfStatement(p: *Parse) !Node.Index { | 1164 | fn expectIfStatement(p: *Parse) !Node.Index { |
| 1145 | const if_token = p.assertToken(.keyword_if); | 1165 | const if_token = p.assertToken(.keyword_if); |
| 1146 | _ = try p.expectToken(.l_paren); | 1166 | _ = try p.expectToken(.l_paren); |
| ... | @@ -1235,8 +1255,8 @@ fn parseLoopStatement(p: *Parse) !?Node.Index { | ... | @@ -1235,8 +1255,8 @@ fn parseLoopStatement(p: *Parse) !?Node.Index { |
| 1235 | } | 1255 | } |
| 1236 | | 1256 | |
| 1237 | /// ForStatement | 1257 | /// ForStatement |
| 1238 | /// <- ForPrefix BlockExpr ( KEYWORD_else Statement )? | 1258 | /// <- ForPrefix BlockExpr ( KEYWORD_else Statement / !KEYWORD_else ) |
| 1239 | /// / ForPrefix AssignExpr ( SEMICOLON / KEYWORD_else Statement ) | 1259 | /// / ForPrefix !BlockExpr AssignExpr ( SEMICOLON / KEYWORD_else Statement ) |
| 1240 | fn parseForStatement(p: *Parse) !?Node.Index { | 1260 | fn parseForStatement(p: *Parse) !?Node.Index { |
| 1241 | const for_token = p.eatToken(.keyword_for) orelse return null; | 1261 | const for_token = p.eatToken(.keyword_for) orelse return null; |
| 1242 | | 1262 | |
| ... | @@ -1293,7 +1313,7 @@ fn parseForStatement(p: *Parse) !?Node.Index { | ... | @@ -1293,7 +1313,7 @@ fn parseForStatement(p: *Parse) !?Node.Index { |
| 1293 | /// | 1313 | /// |
| 1294 | /// WhileStatement | 1314 | /// WhileStatement |
| 1295 | /// <- WhilePrefix BlockExpr ( KEYWORD_else Payload? Statement )? | 1315 | /// <- WhilePrefix BlockExpr ( KEYWORD_else Payload? Statement )? |
| 1296 | /// / WhilePrefix AssignExpr ( SEMICOLON / KEYWORD_else Payload? Statement ) | 1316 | /// / WhilePrefix !BlockExpr AssignExpr ( SEMICOLON / KEYWORD_else Payload? Statement ) |
| 1297 | fn parseWhileStatement(p: *Parse) !?Node.Index { | 1317 | fn parseWhileStatement(p: *Parse) !?Node.Index { |
| 1298 | const while_token = p.eatToken(.keyword_while) orelse return null; | 1318 | const while_token = p.eatToken(.keyword_while) orelse return null; |
| 1299 | _ = try p.expectToken(.l_paren); | 1319 | _ = try p.expectToken(.l_paren); |
| ... | @@ -1383,7 +1403,7 @@ fn parseWhileStatement(p: *Parse) !?Node.Index { | ... | @@ -1383,7 +1403,7 @@ fn parseWhileStatement(p: *Parse) !?Node.Index { |
| 1383 | | 1403 | |
| 1384 | /// BlockExprStatement | 1404 | /// BlockExprStatement |
| 1385 | /// <- BlockExpr | 1405 | /// <- BlockExpr |
| 1386 | /// / AssignExpr SEMICOLON | 1406 | /// / !BlockExpr AssignExpr SEMICOLON |
| 1387 | fn parseBlockExprStatement(p: *Parse) !?Node.Index { | 1407 | fn parseBlockExprStatement(p: *Parse) !?Node.Index { |
| 1388 | const block_expr = try p.parseBlockExpr(); | 1408 | const block_expr = try p.parseBlockExpr(); |
| 1389 | if (block_expr) |expr| return expr; | 1409 | if (block_expr) |expr| return expr; |
| ... | @@ -1685,18 +1705,20 @@ fn expectPrefixExpr(p: *Parse) Error!Node.Index { | ... | @@ -1685,18 +1705,20 @@ fn expectPrefixExpr(p: *Parse) Error!Node.Index { |
| 1685 | /// PrefixTypeOp | 1705 | /// PrefixTypeOp |
| 1686 | /// <- QUESTIONMARK | 1706 | /// <- QUESTIONMARK |
| 1687 | /// / KEYWORD_anyframe MINUSRARROW | 1707 | /// / KEYWORD_anyframe MINUSRARROW |
| 1688 | /// / SliceTypeStart (ByteAlign / AddrSpace / KEYWORD_const / KEYWORD_volatile / KEYWORD_allowzero)* | 1708 | /// / (ManyPtrTypeStart / SliceTypeStart) KEYWORD_allowzero? ByteAlign? AddrSpace? KEYWORD_const? KEYWORD_volatile? |
| | 1709 | /// / SinglePtrTypeStart KEYWORD_allowzero? BitAlign? AddrSpace? KEYWORD_const? KEYWORD_volatile? |
| 1689 | /// / PtrTypeStart (AddrSpace / KEYWORD_align LPAREN Expr (COLON Expr COLON Expr)? RPAREN / KEYWORD_const / KEYWORD_volatile / KEYWORD_allowzero)* | 1710 | /// / PtrTypeStart (AddrSpace / KEYWORD_align LPAREN Expr (COLON Expr COLON Expr)? RPAREN / KEYWORD_const / KEYWORD_volatile / KEYWORD_allowzero)* |
| 1690 | /// / ArrayTypeStart | 1711 | /// / ArrayTypeStart |
| 1691 | /// | 1712 | /// |
| 1692 | /// SliceTypeStart <- LBRACKET (COLON Expr)? RBRACKET | 1713 | /// SliceTypeStart <- LBRACKET (COLON Expr)? RBRACKET |
| 1693 | /// | 1714 | /// |
| 1694 | /// PtrTypeStart | 1715 | /// SinglePtrTypeStart <- ASTERISK / ASTERISK2 |
| 1695 | /// <- ASTERISK | 1716 | /// |
| 1696 | /// / ASTERISK2 | 1717 | /// ManyPtrTypeStart <- LBRACKET ASTERISK (LETTERC / COLON Expr)? RBRACKET |
| 1697 | /// / LBRACKET ASTERISK (LETTERC / COLON Expr)? RBRACKET | 1718 | /// |
| | 1719 | /// ArrayTypeStart <- LBRACKET Expr !(ASTERISK / ASTERISK2) (COLON Expr)? RBRACKET |
| 1698 | /// | 1720 | /// |
| 1699 | /// ArrayTypeStart <- LBRACKET Expr (COLON Expr)? RBRACKET | 1721 | /// BitAlign <- KEYWORD_align LPAREN Expr (COLON Expr COLON Expr)? RPAREN |
| 1700 | fn parseTypeExpr(p: *Parse) Error!?Node.Index { | 1722 | fn parseTypeExpr(p: *Parse) Error!?Node.Index { |
| 1701 | switch (p.tokenTag(p.tok_i)) { | 1723 | switch (p.tokenTag(p.tok_i)) { |
| 1702 | .question_mark => return try p.addNode(.{ | 1724 | .question_mark => return try p.addNode(.{ |
| ... | @@ -1962,12 +1984,12 @@ fn expectTypeExpr(p: *Parse) Error!Node.Index { | ... | @@ -1962,12 +1984,12 @@ fn expectTypeExpr(p: *Parse) Error!Node.Index { |
| 1962 | /// PrimaryExpr | 1984 | /// PrimaryExpr |
| 1963 | /// <- AsmExpr | 1985 | /// <- AsmExpr |
| 1964 | /// / IfExpr | 1986 | /// / IfExpr |
| 1965 | /// / KEYWORD_break BreakLabel? Expr? | 1987 | /// / KEYWORD_break (BreakLabel / !BreakLabel) (Expr !ExprSuffix / !SinglePtrTypeStart) |
| 1966 | /// / KEYWORD_comptime Expr | 1988 | /// / KEYWORD_comptime Expr !ExprSuffix |
| 1967 | /// / KEYWORD_nosuspend Expr | 1989 | /// / KEYWORD_nosuspend Expr !ExprSuffix |
| 1968 | /// / KEYWORD_continue BreakLabel? Expr? | 1990 | /// / KEYWORD_continue (BreakLabel / !BreakLabel) (Expr !ExprSuffix / !SinglePtrTypeStart) |
| 1969 | /// / KEYWORD_resume Expr | 1991 | /// / KEYWORD_resume Expr !ExprSuffix |
| 1970 | /// / KEYWORD_return Expr? | 1992 | /// / KEYWORD_return (Expr !ExprSuffix / !SinglePtrTypeStart) |
| 1971 | /// / BlockLabel? LoopExpr | 1993 | /// / BlockLabel? LoopExpr |
| 1972 | /// / Block | 1994 | /// / Block |
| 1973 | /// / CurlySuffixExpr | 1995 | /// / CurlySuffixExpr |
| ... | @@ -2042,10 +2064,6 @@ fn parsePrimaryExpr(p: *Parse) !?Node.Index { | ... | @@ -2042,10 +2064,6 @@ fn parsePrimaryExpr(p: *Parse) !?Node.Index { |
| 2042 | p.tok_i += 2; | 2064 | p.tok_i += 2; |
| 2043 | return try p.parseWhileExpr(); | 2065 | return try p.parseWhileExpr(); |
| 2044 | }, | 2066 | }, |
| 2045 | .l_brace => { | | |
| 2046 | p.tok_i += 2; | | |
| 2047 | return try p.parseBlock(); | | |
| 2048 | }, | | |
| 2049 | else => return try p.parseCurlySuffixExpr(), | 2067 | else => return try p.parseCurlySuffixExpr(), |
| 2050 | } | 2068 | } |
| 2051 | } else { | 2069 | } else { |
| ... | @@ -2067,12 +2085,12 @@ fn parsePrimaryExpr(p: *Parse) !?Node.Index { | ... | @@ -2067,12 +2085,12 @@ fn parsePrimaryExpr(p: *Parse) !?Node.Index { |
| 2067 | } | 2085 | } |
| 2068 | } | 2086 | } |
| 2069 | | 2087 | |
| 2070 | /// IfExpr <- IfPrefix Expr (KEYWORD_else Payload? Expr)? | 2088 | /// IfExpr <- IfPrefix Expr (KEYWORD_else Payload? Expr)? !ExprSuffix |
| 2071 | fn parseIfExpr(p: *Parse) !?Node.Index { | 2089 | fn parseIfExpr(p: *Parse) !?Node.Index { |
| 2072 | return try p.parseIf(expectExpr); | 2090 | return try p.parseIf(expectExpr); |
| 2073 | } | 2091 | } |
| 2074 | | 2092 | |
| 2075 | /// Block <- LBRACE Statement* RBRACE | 2093 | /// Block <- LBRACE BlockStatement* RBRACE |
| 2076 | fn parseBlock(p: *Parse) !?Node.Index { | 2094 | fn parseBlock(p: *Parse) !?Node.Index { |
| 2077 | const lbrace = p.eatToken(.l_brace) orelse return null; | 2095 | const lbrace = p.eatToken(.l_brace) orelse return null; |
| 2078 | const scratch_top = p.scratch.items.len; | 2096 | const scratch_top = p.scratch.items.len; |
| ... | @@ -2177,7 +2195,7 @@ fn forPrefix(p: *Parse) Error!usize { | ... | @@ -2177,7 +2195,7 @@ fn forPrefix(p: *Parse) Error!usize { |
| 2177 | | 2195 | |
| 2178 | /// WhilePrefix <- KEYWORD_while LPAREN Expr RPAREN PtrPayload? WhileContinueExpr? | 2196 | /// WhilePrefix <- KEYWORD_while LPAREN Expr RPAREN PtrPayload? WhileContinueExpr? |
| 2179 | /// | 2197 | /// |
| 2180 | /// WhileExpr <- WhilePrefix Expr (KEYWORD_else Payload? Expr)? | 2198 | /// WhileExpr <- WhilePrefix Expr (KEYWORD_else Payload? Expr)? !ExprSuffi |
| 2181 | fn parseWhileExpr(p: *Parse) !?Node.Index { | 2199 | fn parseWhileExpr(p: *Parse) !?Node.Index { |
| 2182 | const while_token = p.eatToken(.keyword_while) orelse return null; | 2200 | const while_token = p.eatToken(.keyword_while) orelse return null; |
| 2183 | _ = try p.expectToken(.l_paren); | 2201 | _ = try p.expectToken(.l_paren); |
| ... | @@ -2409,10 +2427,10 @@ fn parseSuffixExpr(p: *Parse) !?Node.Index { | ... | @@ -2409,10 +2427,10 @@ fn parseSuffixExpr(p: *Parse) !?Node.Index { |
| 2409 | /// / FnProto | 2427 | /// / FnProto |
| 2410 | /// / GroupedExpr | 2428 | /// / GroupedExpr |
| 2411 | /// / LabeledTypeExpr | 2429 | /// / LabeledTypeExpr |
| 2412 | /// / IDENTIFIER | 2430 | /// / IDENTIFIER !(COLON LabelableExpr) |
| 2413 | /// / IfTypeExpr | 2431 | /// / IfTypeExpr |
| 2414 | /// / INTEGER | 2432 | /// / INTEGER |
| 2415 | /// / KEYWORD_comptime TypeExpr | 2433 | /// / KEYWORD_comptime TypeExpr !ExprSuffix |
| 2416 | /// / KEYWORD_error DOT IDENTIFIER | 2434 | /// / KEYWORD_error DOT IDENTIFIER |
| 2417 | /// / KEYWORD_anyframe | 2435 | /// / KEYWORD_anyframe |
| 2418 | /// / KEYWORD_unreachable | 2436 | /// / KEYWORD_unreachable |
| ... | @@ -2431,7 +2449,7 @@ fn parseSuffixExpr(p: *Parse) !?Node.Index { | ... | @@ -2431,7 +2449,7 @@ fn parseSuffixExpr(p: *Parse) !?Node.Index { |
| 2431 | /// | 2449 | /// |
| 2432 | /// GroupedExpr <- LPAREN Expr RPAREN | 2450 | /// GroupedExpr <- LPAREN Expr RPAREN |
| 2433 | /// | 2451 | /// |
| 2434 | /// IfTypeExpr <- IfPrefix TypeExpr (KEYWORD_else Payload? TypeExpr)? | 2452 | /// IfTypeExpr <- IfPrefix TypeExpr (KEYWORD_else Payload? TypeExpr)? !ExprSuffix |
| 2435 | /// | 2453 | /// |
| 2436 | /// LabeledTypeExpr | 2454 | /// LabeledTypeExpr |
| 2437 | /// <- BlockLabel Block | 2455 | /// <- BlockLabel Block |
| ... | @@ -2711,7 +2729,7 @@ fn expectPrimaryTypeExpr(p: *Parse) !Node.Index { | ... | @@ -2711,7 +2729,7 @@ fn expectPrimaryTypeExpr(p: *Parse) !Node.Index { |
| 2711 | | 2729 | |
| 2712 | /// WhilePrefix <- KEYWORD_while LPAREN Expr RPAREN PtrPayload? WhileContinueExpr? | 2730 | /// WhilePrefix <- KEYWORD_while LPAREN Expr RPAREN PtrPayload? WhileContinueExpr? |
| 2713 | /// | 2731 | /// |
| 2714 | /// WhileTypeExpr <- WhilePrefix TypeExpr (KEYWORD_else Payload? TypeExpr)? | 2732 | /// WhileTypeExpr <- WhilePrefix TypeExpr (KEYWORD_else Payload? TypeExpr)? !ExprSuffix |
| 2715 | fn parseWhileTypeExpr(p: *Parse) !?Node.Index { | 2733 | fn parseWhileTypeExpr(p: *Parse) !?Node.Index { |
| 2716 | const while_token = p.eatToken(.keyword_while) orelse return null; | 2734 | const while_token = p.eatToken(.keyword_while) orelse return null; |
| 2717 | _ = try p.expectToken(.l_paren); | 2735 | _ = try p.expectToken(.l_paren); |
| ... | @@ -2876,7 +2894,7 @@ fn expectAsmExpr(p: *Parse) !Node.Index { | ... | @@ -2876,7 +2894,7 @@ fn expectAsmExpr(p: *Parse) !Node.Index { |
| 2876 | }); | 2894 | }); |
| 2877 | } | 2895 | } |
| 2878 | | 2896 | |
| 2879 | /// AsmOutputItem <- LBRACKET IDENTIFIER RBRACKET STRINGLITERAL LPAREN (MINUSRARROW TypeExpr / IDENTIFIER) RPAREN | 2897 | /// AsmOutputItem <- LBRACKET IDENTIFIER RBRACKET STRINGLITERALSINGLE LPAREN (MINUSRARROW TypeExpr / IDENTIFIER) RPAREN |
| 2880 | fn parseAsmOutputItem(p: *Parse) !?Node.Index { | 2898 | fn parseAsmOutputItem(p: *Parse) !?Node.Index { |
| 2881 | _ = p.eatToken(.l_bracket) orelse return null; | 2899 | _ = p.eatToken(.l_bracket) orelse return null; |
| 2882 | const identifier = try p.expectToken(.identifier); | 2900 | const identifier = try p.expectToken(.identifier); |
| ... | @@ -2902,7 +2920,7 @@ fn parseAsmOutputItem(p: *Parse) !?Node.Index { | ... | @@ -2902,7 +2920,7 @@ fn parseAsmOutputItem(p: *Parse) !?Node.Index { |
| 2902 | }); | 2920 | }); |
| 2903 | } | 2921 | } |
| 2904 | | 2922 | |
| 2905 | /// AsmInputItem <- LBRACKET IDENTIFIER RBRACKET STRINGLITERAL LPAREN Expr RPAREN | 2923 | /// AsmInputItem <- LBRACKET IDENTIFIER RBRACKET STRINGLITERALSINGLE LPAREN Expr RPAREN |
| 2906 | fn parseAsmInputItem(p: *Parse) !?Node.Index { | 2924 | fn parseAsmInputItem(p: *Parse) !?Node.Index { |
| 2907 | _ = p.eatToken(.l_bracket) orelse return null; | 2925 | _ = p.eatToken(.l_bracket) orelse return null; |
| 2908 | const identifier = try p.expectToken(.identifier); | 2926 | const identifier = try p.expectToken(.identifier); |
| ... | @@ -2923,9 +2941,7 @@ fn parseAsmInputItem(p: *Parse) !?Node.Index { | ... | @@ -2923,9 +2941,7 @@ fn parseAsmInputItem(p: *Parse) !?Node.Index { |
| 2923 | | 2941 | |
| 2924 | /// BreakLabel <- COLON IDENTIFIER | 2942 | /// BreakLabel <- COLON IDENTIFIER |
| 2925 | fn parseBreakLabel(p: *Parse) Error!OptionalTokenIndex { | 2943 | fn parseBreakLabel(p: *Parse) Error!OptionalTokenIndex { |
| 2926 | _ = p.eatToken(.colon) orelse return .none; | 2944 | return if (p.eatTokens(&.{ .colon, .identifier })) |i| .fromToken(i + 1) else .none; |
| 2927 | const next_token = try p.expectToken(.identifier); | | |
| 2928 | return .fromToken(next_token); | | |
| 2929 | } | 2945 | } |
| 2930 | | 2946 | |
| 2931 | /// BlockLabel <- IDENTIFIER COLON | 2947 | /// BlockLabel <- IDENTIFIER COLON |
| ... | @@ -2950,12 +2966,7 @@ fn expectFieldInit(p: *Parse) !Node.Index { | ... | @@ -2950,12 +2966,7 @@ fn expectFieldInit(p: *Parse) !Node.Index { |
| 2950 | | 2966 | |
| 2951 | /// WhileContinueExpr <- COLON LPAREN AssignExpr RPAREN | 2967 | /// WhileContinueExpr <- COLON LPAREN AssignExpr RPAREN |
| 2952 | fn parseWhileContinueExpr(p: *Parse) !?Node.Index { | 2968 | fn parseWhileContinueExpr(p: *Parse) !?Node.Index { |
| 2953 | _ = p.eatToken(.colon) orelse { | 2969 | _ = p.eatToken(.colon) orelse return null; |
| 2954 | if (p.tokenTag(p.tok_i) == .l_paren and | | |
| 2955 | p.tokensOnSameLine(p.tok_i - 1, p.tok_i)) | | |
| 2956 | return p.fail(.expected_continue_expr); | | |
| 2957 | return null; | | |
| 2958 | }; | | |
| 2959 | _ = try p.expectToken(.l_paren); | 2970 | _ = try p.expectToken(.l_paren); |
| 2960 | const node = try p.parseAssignExpr() orelse return p.fail(.expected_expr_or_assignment); | 2971 | const node = try p.parseAssignExpr() orelse return p.fail(.expected_expr_or_assignment); |
| 2961 | _ = try p.expectToken(.r_paren); | 2972 | _ = try p.expectToken(.r_paren); |
| ... | @@ -2993,9 +3004,7 @@ fn parseAddrSpace(p: *Parse) !?Node.Index { | ... | @@ -2993,9 +3004,7 @@ fn parseAddrSpace(p: *Parse) !?Node.Index { |
| 2993 | /// such as in the case of anytype and `...`. Caller must look for rparen to find | 3004 | /// such as in the case of anytype and `...`. Caller must look for rparen to find |
| 2994 | /// out when there are no more param decls left. | 3005 | /// out when there are no more param decls left. |
| 2995 | /// | 3006 | /// |
| 2996 | /// ParamDecl | 3007 | /// ParamDecl <- doc_comment? (KEYWORD_noalias / KEYWORD_comptime / !KEYWORD_comptime) (IDENTIFIER COLON / !(IDENTIFIER_COLON)) ParamType |
| 2997 | /// <- doc_comment? (KEYWORD_noalias / KEYWORD_comptime)? (IDENTIFIER COLON)? ParamType | | |
| 2998 | /// / DOT3 | | |
| 2999 | /// | 3008 | /// |
| 3000 | /// ParamType | 3009 | /// ParamType |
| 3001 | /// <- KEYWORD_anytype | 3010 | /// <- KEYWORD_anytype |
| ... | @@ -3482,7 +3491,7 @@ fn parseSwitchProngList(p: *Parse) !Node.SubRange { | ... | @@ -3482,7 +3491,7 @@ fn parseSwitchProngList(p: *Parse) !Node.SubRange { |
| 3482 | return p.listToSpan(p.scratch.items[scratch_top..]); | 3491 | return p.listToSpan(p.scratch.items[scratch_top..]); |
| 3483 | } | 3492 | } |
| 3484 | | 3493 | |
| 3485 | /// ParamDeclList <- (ParamDecl COMMA)* ParamDecl? | 3494 | /// ParamDeclList <- (ParamDecl COMMA)* (ParamDecl / DOT3 COMMA?)? |
| 3486 | fn parseParamDeclList(p: *Parse) !SmallSpan { | 3495 | fn parseParamDeclList(p: *Parse) !SmallSpan { |
| 3487 | _ = try p.expectToken(.l_paren); | 3496 | _ = try p.expectToken(.l_paren); |
| 3488 | const scratch_top = p.scratch.items.len; | 3497 | const scratch_top = p.scratch.items.len; |
| ... | @@ -3604,9 +3613,9 @@ fn parseIf(p: *Parse, comptime bodyParseFn: fn (p: *Parse) Error!Node.Index) !?N | ... | @@ -3604,9 +3613,9 @@ fn parseIf(p: *Parse, comptime bodyParseFn: fn (p: *Parse) Error!Node.Index) !?N |
| 3604 | }); | 3613 | }); |
| 3605 | } | 3614 | } |
| 3606 | | 3615 | |
| 3607 | /// ForExpr <- ForPrefix Expr (KEYWORD_else Expr)? | 3616 | /// ForExpr <- ForPrefix Expr (KEYWORD_else Expr / !KEYWORD_else) !ExprSuffix |
| 3608 | /// | 3617 | /// |
| 3609 | /// ForTypeExpr <- ForPrefix TypeExpr (KEYWORD_else TypeExpr)? | 3618 | /// ForTypeExpr <- ForPrefix TypeExpr (KEYWORD_else TypeExpr / !KEYWORD_else) !ExprSuffix |
| 3610 | fn parseFor(p: *Parse, comptime bodyParseFn: fn (p: *Parse) Error!Node.Index) !?Node.Index { | 3619 | fn parseFor(p: *Parse, comptime bodyParseFn: fn (p: *Parse) Error!Node.Index) !?Node.Index { |
| 3611 | const for_token = p.eatToken(.keyword_for) orelse return null; | 3620 | const for_token = p.eatToken(.keyword_for) orelse return null; |
| 3612 | | 3621 | |