authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2024-01-03 13:10:26-08:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2024-01-03 13:10:26-08:00
logce480dedbb1e8b9a13a0f138d8aa1ec04b7884c8
treeaf6dc37df0dc6a3ff4278cecb0655579aa8e880b
parenta9337bef2d54201ab304bb3428479339ecaacbac
parent75b3feee05eb8b08fc6441a7e45fd9269ae7bee4
signaturebadge-question-mark Signed by PGP key 4AEE18F83AFDEB23

Merge pull request #18403 from FnControlOption/parse

std.zig: Miscellaneous cleanup

2 files changed, 78 insertions(+), 126 deletions(-)

lib/std/zig/Ast.zig+8-8
......@@ -1433,8 +1433,8 @@ pub fn containerField(tree: Ast, node: Node.Index) full.ContainerField {
14331433 return tree.fullContainerFieldComponents(.{
14341434 .main_token = main_token,
14351435 .type_expr = data.lhs,
1436 .value_expr = extra.value_expr,
14371436 .align_expr = extra.align_expr,
1437 .value_expr = extra.value_expr,
14381438 .tuple_like = tree.tokens.items(.tag)[main_token] != .identifier or
14391439 tree.tokens.items(.tag)[main_token + 1] != .colon,
14401440 });
......@@ -1447,8 +1447,8 @@ pub fn containerFieldInit(tree: Ast, node: Node.Index) full.ContainerField {
14471447 return tree.fullContainerFieldComponents(.{
14481448 .main_token = main_token,
14491449 .type_expr = data.lhs,
1450 .value_expr = data.rhs,
14511450 .align_expr = 0,
1451 .value_expr = data.rhs,
14521452 .tuple_like = tree.tokens.items(.tag)[main_token] != .identifier or
14531453 tree.tokens.items(.tag)[main_token + 1] != .colon,
14541454 });
......@@ -1461,8 +1461,8 @@ pub fn containerFieldAlign(tree: Ast, node: Node.Index) full.ContainerField {
14611461 return tree.fullContainerFieldComponents(.{
14621462 .main_token = main_token,
14631463 .type_expr = data.lhs,
1464 .value_expr = 0,
14651464 .align_expr = data.rhs,
1465 .value_expr = 0,
14661466 .tuple_like = tree.tokens.items(.tag)[main_token] != .identifier or
14671467 tree.tokens.items(.tag)[main_token + 1] != .colon,
14681468 });
......@@ -2565,8 +2565,8 @@ pub const full = struct {
25652565 pub const Components = struct {
25662566 main_token: TokenIndex,
25672567 type_expr: Node.Index,
2568 value_expr: Node.Index,
25692568 align_expr: Node.Index,
2569 value_expr: Node.Index,
25702570 tuple_like: bool,
25712571 };
25722572
......@@ -3269,13 +3269,13 @@ pub const Node = struct {
32693269 /// main_token is the `fn` keyword.
32703270 /// extern function declarations use this tag.
32713271 fn_proto_multi,
3272 /// `fn (a: b) rhs addrspace(e) linksection(f) callconv(g)`. `FnProtoOne[lhs]`.
3272 /// `fn (a: b) addrspace(e) linksection(f) callconv(g) rhs`. `FnProtoOne[lhs]`.
32733273 /// zero or one parameters.
32743274 /// anytype and ... parameters are omitted from the AST tree.
32753275 /// main_token is the `fn` keyword.
32763276 /// extern function declarations use this tag.
32773277 fn_proto_one,
3278 /// `fn (a: b, c: d) rhs addrspace(e) linksection(f) callconv(g)`. `FnProto[lhs]`.
3278 /// `fn (a: b, c: d) addrspace(e) linksection(f) callconv(g) rhs`. `FnProto[lhs]`.
32793279 /// anytype and ... parameters are omitted from the AST tree.
32803280 /// main_token is the `fn` keyword.
32813281 /// extern function declarations use this tag.
......@@ -3427,8 +3427,8 @@ pub const Node = struct {
34273427 };
34283428
34293429 pub const ArrayTypeSentinel = struct {
3430 elem_type: Index,
34313430 sentinel: Index,
3431 elem_type: Index,
34323432 };
34333433
34343434 pub const PtrType = struct {
......@@ -3458,8 +3458,8 @@ pub const Node = struct {
34583458 };
34593459
34603460 pub const ContainerField = struct {
3461 value_expr: Index,
34623461 align_expr: Index,
3462 value_expr: Index,
34633463 };
34643464
34653465 pub const GlobalVarDecl = struct {
lib/std/zig/Parse.zig+70-118
......@@ -210,7 +210,7 @@ pub fn parseZon(p: *Parse) !void {
210210/// ContainerDeclaration <- TestDecl / ComptimeDecl / doc_comment? KEYWORD_pub? Decl
211211///
212212/// ComptimeDecl <- KEYWORD_comptime Block
213fn parseContainerMembers(p: *Parse) !Members {
213fn parseContainerMembers(p: *Parse) Allocator.Error!Members {
214214 const scratch_top = p.scratch.items.len;
215215 defer p.scratch.shrinkRetainingCapacity(scratch_top);
216216
......@@ -565,12 +565,9 @@ fn findNextStmt(p: *Parse) void {
565565/// TestDecl <- KEYWORD_test (STRINGLITERALSINGLE / IDENTIFIER)? Block
566566fn expectTestDecl(p: *Parse) !Node.Index {
567567 const test_token = p.assertToken(.keyword_test);
568 const name_token = switch (p.token_tags[p.nextToken()]) {
569 .string_literal, .identifier => p.tok_i - 1,
570 else => blk: {
571 p.tok_i -= 1;
572 break :blk null;
573 },
568 const name_token = switch (p.token_tags[p.tok_i]) {
569 .string_literal, .identifier => p.nextToken(),
570 else => null,
574571 };
575572 const block_node = try p.parseBlock();
576573 if (block_node == 0) return p.fail(.expected_block);
......@@ -922,8 +919,8 @@ fn expectContainerField(p: *Parse) !Node.Index {
922919 .data = .{
923920 .lhs = type_expr,
924921 .rhs = try p.addExtra(Node.ContainerField{
925 .value_expr = value_expr,
926922 .align_expr = align_expr,
923 .value_expr = value_expr,
927924 }),
928925 },
929926 });
......@@ -2051,9 +2048,9 @@ fn parseTypeExpr(p: *Parse) Error!Node.Index {
20512048 .main_token = lbracket,
20522049 .data = .{
20532050 .lhs = len_expr,
2054 .rhs = try p.addExtra(.{
2055 .elem_type = elem_type,
2051 .rhs = try p.addExtra(Node.ArrayTypeSentinel{
20562052 .sentinel = sentinel,
2053 .elem_type = elem_type,
20572054 }),
20582055 },
20592056 });
......@@ -2090,10 +2087,9 @@ fn parsePrimaryExpr(p: *Parse) !Node.Index {
20902087 .keyword_asm => return p.expectAsmExpr(),
20912088 .keyword_if => return p.parseIfExpr(),
20922089 .keyword_break => {
2093 p.tok_i += 1;
20942090 return p.addNode(.{
20952091 .tag = .@"break",
2096 .main_token = p.tok_i - 1,
2092 .main_token = p.nextToken(),
20972093 .data = .{
20982094 .lhs = try p.parseBreakLabel(),
20992095 .rhs = try p.parseExpr(),
......@@ -2101,10 +2097,9 @@ fn parsePrimaryExpr(p: *Parse) !Node.Index {
21012097 });
21022098 },
21032099 .keyword_continue => {
2104 p.tok_i += 1;
21052100 return p.addNode(.{
21062101 .tag = .@"continue",
2107 .main_token = p.tok_i - 1,
2102 .main_token = p.nextToken(),
21082103 .data = .{
21092104 .lhs = try p.parseBreakLabel(),
21102105 .rhs = undefined,
......@@ -2112,10 +2107,9 @@ fn parsePrimaryExpr(p: *Parse) !Node.Index {
21122107 });
21132108 },
21142109 .keyword_comptime => {
2115 p.tok_i += 1;
21162110 return p.addNode(.{
21172111 .tag = .@"comptime",
2118 .main_token = p.tok_i - 1,
2112 .main_token = p.nextToken(),
21192113 .data = .{
21202114 .lhs = try p.expectExpr(),
21212115 .rhs = undefined,
......@@ -2123,10 +2117,9 @@ fn parsePrimaryExpr(p: *Parse) !Node.Index {
21232117 });
21242118 },
21252119 .keyword_nosuspend => {
2126 p.tok_i += 1;
21272120 return p.addNode(.{
21282121 .tag = .@"nosuspend",
2129 .main_token = p.tok_i - 1,
2122 .main_token = p.nextToken(),
21302123 .data = .{
21312124 .lhs = try p.expectExpr(),
21322125 .rhs = undefined,
......@@ -2134,10 +2127,9 @@ fn parsePrimaryExpr(p: *Parse) !Node.Index {
21342127 });
21352128 },
21362129 .keyword_resume => {
2137 p.tok_i += 1;
21382130 return p.addNode(.{
21392131 .tag = .@"resume",
2140 .main_token = p.tok_i - 1,
2132 .main_token = p.nextToken(),
21412133 .data = .{
21422134 .lhs = try p.expectExpr(),
21432135 .rhs = undefined,
......@@ -2145,10 +2137,9 @@ fn parsePrimaryExpr(p: *Parse) !Node.Index {
21452137 });
21462138 },
21472139 .keyword_return => {
2148 p.tok_i += 1;
21492140 return p.addNode(.{
21502141 .tag = .@"return",
2151 .main_token = p.tok_i - 1,
2142 .main_token = p.nextToken(),
21522143 .data = .{
21532144 .lhs = try p.parseExpr(),
21542145 .rhs = undefined,
......@@ -2161,14 +2152,14 @@ fn parsePrimaryExpr(p: *Parse) !Node.Index {
21612152 .keyword_inline => {
21622153 p.tok_i += 3;
21632154 switch (p.token_tags[p.tok_i]) {
2164 .keyword_for => return p.parseForExpr(),
2155 .keyword_for => return p.parseFor(expectExpr),
21652156 .keyword_while => return p.parseWhileExpr(),
21662157 else => return p.fail(.expected_inlinable),
21672158 }
21682159 },
21692160 .keyword_for => {
21702161 p.tok_i += 2;
2171 return p.parseForExpr();
2162 return p.parseFor(expectExpr);
21722163 },
21732164 .keyword_while => {
21742165 p.tok_i += 2;
......@@ -2187,12 +2178,12 @@ fn parsePrimaryExpr(p: *Parse) !Node.Index {
21872178 .keyword_inline => {
21882179 p.tok_i += 1;
21892180 switch (p.token_tags[p.tok_i]) {
2190 .keyword_for => return p.parseForExpr(),
2181 .keyword_for => return p.parseFor(expectExpr),
21912182 .keyword_while => return p.parseWhileExpr(),
21922183 else => return p.fail(.expected_inlinable),
21932184 }
21942185 },
2195 .keyword_for => return p.parseForExpr(),
2186 .keyword_for => return p.parseFor(expectExpr),
21962187 .keyword_while => return p.parseWhileExpr(),
21972188 .l_brace => return p.parseBlock(),
21982189 else => return p.parseCurlySuffixExpr(),
......@@ -2257,46 +2248,6 @@ fn parseBlock(p: *Parse) !Node.Index {
22572248 }
22582249}
22592250
2260/// ForExpr <- ForPrefix Expr (KEYWORD_else Expr)?
2261fn parseForExpr(p: *Parse) !Node.Index {
2262 const for_token = p.eatToken(.keyword_for) orelse return null_node;
2263
2264 const scratch_top = p.scratch.items.len;
2265 defer p.scratch.shrinkRetainingCapacity(scratch_top);
2266 const inputs = try p.forPrefix();
2267
2268 const then_expr = try p.expectExpr();
2269 var has_else = false;
2270 if (p.eatToken(.keyword_else)) |_| {
2271 try p.scratch.append(p.gpa, then_expr);
2272 const else_expr = try p.expectExpr();
2273 try p.scratch.append(p.gpa, else_expr);
2274 has_else = true;
2275 } else if (inputs == 1) {
2276 return p.addNode(.{
2277 .tag = .for_simple,
2278 .main_token = for_token,
2279 .data = .{
2280 .lhs = p.scratch.items[scratch_top],
2281 .rhs = then_expr,
2282 },
2283 });
2284 } else {
2285 try p.scratch.append(p.gpa, then_expr);
2286 }
2287 return p.addNode(.{
2288 .tag = .@"for",
2289 .main_token = for_token,
2290 .data = .{
2291 .lhs = (try p.listToSpan(p.scratch.items[scratch_top..])).start,
2292 .rhs = @as(u32, @bitCast(Node.For{
2293 .inputs = @as(u31, @intCast(inputs)),
2294 .has_else = has_else,
2295 })),
2296 },
2297 });
2298}
2299
23002251/// ForPrefix <- KEYWORD_for LPAREN ForInput (COMMA ForInput)* COMMA? RPAREN ForPayload
23012252///
23022253/// ForInput <- Expr (DOT2 Expr?)?
......@@ -2793,14 +2744,14 @@ fn parsePrimaryTypeExpr(p: *Parse) !Node.Index {
27932744 .keyword_inline => {
27942745 p.tok_i += 3;
27952746 switch (p.token_tags[p.tok_i]) {
2796 .keyword_for => return p.parseForTypeExpr(),
2747 .keyword_for => return p.parseFor(expectTypeExpr),
27972748 .keyword_while => return p.parseWhileTypeExpr(),
27982749 else => return p.fail(.expected_inlinable),
27992750 }
28002751 },
28012752 .keyword_for => {
28022753 p.tok_i += 2;
2803 return p.parseForTypeExpr();
2754 return p.parseFor(expectTypeExpr);
28042755 },
28052756 .keyword_while => {
28062757 p.tok_i += 2;
......@@ -2831,12 +2782,12 @@ fn parsePrimaryTypeExpr(p: *Parse) !Node.Index {
28312782 .keyword_inline => {
28322783 p.tok_i += 1;
28332784 switch (p.token_tags[p.tok_i]) {
2834 .keyword_for => return p.parseForTypeExpr(),
2785 .keyword_for => return p.parseFor(expectTypeExpr),
28352786 .keyword_while => return p.parseWhileTypeExpr(),
28362787 else => return p.fail(.expected_inlinable),
28372788 }
28382789 },
2839 .keyword_for => return p.parseForTypeExpr(),
2790 .keyword_for => return p.parseFor(expectTypeExpr),
28402791 .keyword_while => return p.parseWhileTypeExpr(),
28412792 .period => switch (p.token_tags[p.tok_i + 1]) {
28422793 .identifier => return p.addNode(.{
......@@ -3029,46 +2980,6 @@ fn expectPrimaryTypeExpr(p: *Parse) !Node.Index {
30292980 return node;
30302981}
30312982
3032/// ForTypeExpr <- ForPrefix TypeExpr (KEYWORD_else TypeExpr)?
3033fn parseForTypeExpr(p: *Parse) !Node.Index {
3034 const for_token = p.eatToken(.keyword_for) orelse return null_node;
3035
3036 const scratch_top = p.scratch.items.len;
3037 defer p.scratch.shrinkRetainingCapacity(scratch_top);
3038 const inputs = try p.forPrefix();
3039
3040 const then_expr = try p.expectTypeExpr();
3041 var has_else = false;
3042 if (p.eatToken(.keyword_else)) |_| {
3043 try p.scratch.append(p.gpa, then_expr);
3044 const else_expr = try p.expectTypeExpr();
3045 try p.scratch.append(p.gpa, else_expr);
3046 has_else = true;
3047 } else if (inputs == 1) {
3048 return p.addNode(.{
3049 .tag = .for_simple,
3050 .main_token = for_token,
3051 .data = .{
3052 .lhs = p.scratch.items[scratch_top],
3053 .rhs = then_expr,
3054 },
3055 });
3056 } else {
3057 try p.scratch.append(p.gpa, then_expr);
3058 }
3059 return p.addNode(.{
3060 .tag = .@"for",
3061 .main_token = for_token,
3062 .data = .{
3063 .lhs = (try p.listToSpan(p.scratch.items[scratch_top..])).start,
3064 .rhs = @as(u32, @bitCast(Node.For{
3065 .inputs = @as(u31, @intCast(inputs)),
3066 .has_else = has_else,
3067 })),
3068 },
3069 });
3070}
3071
30722983/// WhilePrefix <- KEYWORD_while LPAREN Expr RPAREN PtrPayload? WhileContinueExpr?
30732984///
30742985/// WhileTypeExpr <- WhilePrefix TypeExpr (KEYWORD_else Payload? TypeExpr)?
......@@ -3279,7 +3190,7 @@ fn parseAsmInputItem(p: *Parse) !Node.Index {
32793190
32803191/// BreakLabel <- COLON IDENTIFIER
32813192fn parseBreakLabel(p: *Parse) !TokenIndex {
3282 _ = p.eatToken(.colon) orelse return @as(TokenIndex, 0);
3193 _ = p.eatToken(.colon) orelse return null_node;
32833194 return p.expectToken(.identifier);
32843195}
32853196
......@@ -3397,7 +3308,7 @@ fn expectParamDecl(p: *Parse) !Node.Index {
33973308
33983309/// Payload <- PIPE IDENTIFIER PIPE
33993310fn parsePayload(p: *Parse) !TokenIndex {
3400 _ = p.eatToken(.pipe) orelse return @as(TokenIndex, 0);
3311 _ = p.eatToken(.pipe) orelse return null_node;
34013312 const identifier = try p.expectToken(.identifier);
34023313 _ = try p.expectToken(.pipe);
34033314 return identifier;
......@@ -3405,7 +3316,7 @@ fn parsePayload(p: *Parse) !TokenIndex {
34053316
34063317/// PtrPayload <- PIPE ASTERISK? IDENTIFIER PIPE
34073318fn parsePtrPayload(p: *Parse) !TokenIndex {
3408 _ = p.eatToken(.pipe) orelse return @as(TokenIndex, 0);
3319 _ = p.eatToken(.pipe) orelse return null_node;
34093320 _ = p.eatToken(.asterisk);
34103321 const identifier = try p.expectToken(.identifier);
34113322 _ = try p.expectToken(.pipe);
......@@ -3416,7 +3327,7 @@ fn parsePtrPayload(p: *Parse) !TokenIndex {
34163327///
34173328/// PtrIndexPayload <- PIPE ASTERISK? IDENTIFIER (COMMA IDENTIFIER)? PIPE
34183329fn parsePtrIndexPayload(p: *Parse) !TokenIndex {
3419 _ = p.eatToken(.pipe) orelse return @as(TokenIndex, 0);
3330 _ = p.eatToken(.pipe) orelse return null_node;
34203331 _ = p.eatToken(.asterisk);
34213332 const identifier = try p.expectToken(.identifier);
34223333 if (p.eatToken(.comma) != null) {
......@@ -3925,8 +3836,7 @@ fn parseParamDeclList(p: *Parse) !SmallSpan {
39253836/// ExprList <- (Expr COMMA)* Expr?
39263837fn parseBuiltinCall(p: *Parse) !Node.Index {
39273838 const builtin_token = p.assertToken(.builtin);
3928 if (p.token_tags[p.nextToken()] != .l_paren) {
3929 p.tok_i -= 1;
3839 _ = p.eatToken(.l_paren) orelse {
39303840 try p.warn(.expected_param_list);
39313841 // Pretend this was an identifier so we can continue parsing.
39323842 return p.addNode(.{
......@@ -3937,7 +3847,7 @@ fn parseBuiltinCall(p: *Parse) !Node.Index {
39373847 .rhs = undefined,
39383848 },
39393849 });
3940 }
3850 };
39413851 const scratch_top = p.scratch.items.len;
39423852 defer p.scratch.shrinkRetainingCapacity(scratch_top);
39433853 while (true) {
......@@ -4031,8 +3941,50 @@ fn parseIf(p: *Parse, comptime bodyParseFn: fn (p: *Parse) Error!Node.Index) !No
40313941 });
40323942}
40333943
3944/// ForExpr <- ForPrefix Expr (KEYWORD_else Expr)?
3945///
3946/// ForTypeExpr <- ForPrefix TypeExpr (KEYWORD_else TypeExpr)?
3947fn parseFor(p: *Parse, comptime bodyParseFn: fn (p: *Parse) Error!Node.Index) !Node.Index {
3948 const for_token = p.eatToken(.keyword_for) orelse return null_node;
3949
3950 const scratch_top = p.scratch.items.len;
3951 defer p.scratch.shrinkRetainingCapacity(scratch_top);
3952 const inputs = try p.forPrefix();
3953
3954 const then_expr = try bodyParseFn(p);
3955 var has_else = false;
3956 if (p.eatToken(.keyword_else)) |_| {
3957 try p.scratch.append(p.gpa, then_expr);
3958 const else_expr = try bodyParseFn(p);
3959 try p.scratch.append(p.gpa, else_expr);
3960 has_else = true;
3961 } else if (inputs == 1) {
3962 return p.addNode(.{
3963 .tag = .for_simple,
3964 .main_token = for_token,
3965 .data = .{
3966 .lhs = p.scratch.items[scratch_top],
3967 .rhs = then_expr,
3968 },
3969 });
3970 } else {
3971 try p.scratch.append(p.gpa, then_expr);
3972 }
3973 return p.addNode(.{
3974 .tag = .@"for",
3975 .main_token = for_token,
3976 .data = .{
3977 .lhs = (try p.listToSpan(p.scratch.items[scratch_top..])).start,
3978 .rhs = @as(u32, @bitCast(Node.For{
3979 .inputs = @as(u31, @intCast(inputs)),
3980 .has_else = has_else,
3981 })),
3982 },
3983 });
3984}
3985
40343986/// Skips over doc comment tokens. Returns the first one, if any.
4035fn eatDocComments(p: *Parse) !?TokenIndex {
3987fn eatDocComments(p: *Parse) Allocator.Error!?TokenIndex {
40363988 if (p.eatToken(.doc_comment)) |tok| {
40373989 var first_line = tok;
40383990 if (tok > 0 and tokensOnSameLine(p, tok - 1, tok)) {