authorgravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2022-11-22 13:28:04+02:00
committergravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2022-11-23 12:13:39+02:00
log4cea15f12bdaf1603d60cf80e767dd8f2bb48b26
tree1935cf1f2eb2dabef43b77e58ec4ea1b90bfa7bf
parentd5da2a6114926fae44f31eeab0706578f090dca8

std.zig.Ast: simplify usage of tuple_like container fields


4 files changed, 38 insertions(+), 59 deletions(-)

lib/std/zig/Ast.zig+11
......@@ -2277,6 +2277,17 @@ pub const full = struct {
22772277 pub fn firstToken(cf: ContainerField) TokenIndex {
22782278 return cf.comptime_token orelse cf.ast.main_token;
22792279 }
2280
2281 pub fn convertToNonTupleLike(cf: *ContainerField, nodes: NodeList.Slice) void {
2282 if (!cf.ast.tuple_like) return;
2283 if (cf.ast.type_expr == 0) return;
2284 if (nodes.items(.tag)[cf.ast.type_expr] != .identifier) return;
2285
2286 const ident = nodes.items(.main_token)[cf.ast.type_expr];
2287 cf.ast.tuple_like = false;
2288 cf.ast.main_token = ident;
2289 cf.ast.type_expr = 0;
2290 }
22802291 };
22812292
22822293 pub const FnProto = struct {
lib/std/zig/parser_test.zig+1-1
......@@ -5824,7 +5824,7 @@ test "recovery: invalid comptime" {
58245824 try testError(
58255825 \\comptime
58265826 , &[_]Error{
5827 .expected_block_or_field,
5827 .expected_type_expr,
58285828 });
58295829}
58305830
lib/std/zig/render.zig+16-23
......@@ -40,7 +40,7 @@ pub fn renderTree(buffer: *std.ArrayList(u8), tree: Ast) Error!void {
4040/// Render all members in the given slice, keeping empty lines where appropriate
4141fn renderMembers(gpa: Allocator, ais: *Ais, tree: Ast, members: []const Ast.Node.Index) Error!void {
4242 if (members.len == 0) return;
43 var any_non_tuple_like_fields = false;
43 var is_tuple = true;
4444 for (members) |member| {
4545 const tuple_like = switch (tree.nodes.items(.tag)[member]) {
4646 .container_field_init => tree.containerFieldInit(member).ast.tuple_like,
......@@ -49,14 +49,14 @@ fn renderMembers(gpa: Allocator, ais: *Ais, tree: Ast, members: []const Ast.Node
4949 else => continue,
5050 };
5151 if (!tuple_like) {
52 any_non_tuple_like_fields = true;
52 is_tuple = false;
5353 break;
5454 }
5555 }
56 try renderMember(gpa, ais, tree, members[0], any_non_tuple_like_fields, .newline);
56 try renderMember(gpa, ais, tree, members[0], is_tuple, .newline);
5757 for (members[1..]) |member| {
5858 try renderExtraNewline(ais, tree, member);
59 try renderMember(gpa, ais, tree, member, any_non_tuple_like_fields, .newline);
59 try renderMember(gpa, ais, tree, member, is_tuple, .newline);
6060 }
6161}
6262
......@@ -65,7 +65,7 @@ fn renderMember(
6565 ais: *Ais,
6666 tree: Ast,
6767 decl: Ast.Node.Index,
68 any_non_tuple_like_fields: bool,
68 is_tuple: bool,
6969 space: Space,
7070) Error!void {
7171 const token_tags = tree.tokens.items(.tag);
......@@ -181,9 +181,9 @@ fn renderMember(
181181 try renderExpression(gpa, ais, tree, datas[decl].rhs, space);
182182 },
183183
184 .container_field_init => return renderContainerField(gpa, ais, tree, tree.containerFieldInit(decl), any_non_tuple_like_fields, space),
185 .container_field_align => return renderContainerField(gpa, ais, tree, tree.containerFieldAlign(decl), any_non_tuple_like_fields, space),
186 .container_field => return renderContainerField(gpa, ais, tree, tree.containerField(decl), any_non_tuple_like_fields, space),
184 .container_field_init => return renderContainerField(gpa, ais, tree, tree.containerFieldInit(decl), is_tuple, space),
185 .container_field_align => return renderContainerField(gpa, ais, tree, tree.containerFieldAlign(decl), is_tuple, space),
186 .container_field => return renderContainerField(gpa, ais, tree, tree.containerField(decl), is_tuple, space),
187187 .@"comptime" => return renderExpression(gpa, ais, tree, decl, space),
188188
189189 .root => unreachable,
......@@ -1179,18 +1179,11 @@ fn renderContainerField(
11791179 ais: *Ais,
11801180 tree: Ast,
11811181 field_param: Ast.full.ContainerField,
1182 any_non_tuple_like_fields: bool,
1182 is_tuple: bool,
11831183 space: Space,
11841184) Error!void {
11851185 var field = field_param;
1186 if (field.ast.tuple_like and any_non_tuple_like_fields and field.ast.type_expr != 0
1187 and tree.nodes.items(.tag)[field.ast.type_expr] == .identifier
1188 ) {
1189 const ident = tree.nodes.items(.main_token)[field.ast.type_expr];
1190 field.ast.tuple_like = false;
1191 field.ast.main_token = ident;
1192 field.ast.type_expr = 0;
1193 }
1186 if (!is_tuple) field.convertToNonTupleLike(tree.nodes);
11941187
11951188 if (field.comptime_token) |t| {
11961189 try renderToken(ais, tree, t, .space); // comptime
......@@ -1935,8 +1928,8 @@ fn renderContainerDecl(
19351928 try renderToken(ais, tree, layout_token, .space);
19361929 }
19371930
1938 var any_non_tuple_like_fields = token_tags[container_decl.ast.main_token] != .keyword_struct;
1939 if (!any_non_tuple_like_fields) for (container_decl.ast.members) |member| {
1931 var is_tuple = token_tags[container_decl.ast.main_token] == .keyword_struct;
1932 if (is_tuple) for (container_decl.ast.members) |member| {
19401933 const tuple_like = switch (tree.nodes.items(.tag)[member]) {
19411934 .container_field_init => tree.containerFieldInit(member).ast.tuple_like,
19421935 .container_field_align => tree.containerFieldAlign(member).ast.tuple_like,
......@@ -1944,7 +1937,7 @@ fn renderContainerDecl(
19441937 else => continue,
19451938 };
19461939 if (!tuple_like) {
1947 any_non_tuple_like_fields = true;
1940 is_tuple = false;
19481941 break;
19491942 }
19501943 };
......@@ -2015,7 +2008,7 @@ fn renderContainerDecl(
20152008 // Print all the declarations on the same line.
20162009 try renderToken(ais, tree, lbrace, .space); // lbrace
20172010 for (container_decl.ast.members) |member| {
2018 try renderMember(gpa, ais, tree, member, any_non_tuple_like_fields, .space);
2011 try renderMember(gpa, ais, tree, member, is_tuple, .space);
20192012 }
20202013 return renderToken(ais, tree, rbrace, space); // rbrace
20212014 }
......@@ -2033,9 +2026,9 @@ fn renderContainerDecl(
20332026 .container_field_init,
20342027 .container_field_align,
20352028 .container_field,
2036 => try renderMember(gpa, ais, tree, member, any_non_tuple_like_fields, .comma),
2029 => try renderMember(gpa, ais, tree, member, is_tuple, .comma),
20372030
2038 else => try renderMember(gpa, ais, tree, member, any_non_tuple_like_fields, .newline),
2031 else => try renderMember(gpa, ais, tree, member, is_tuple, .newline),
20392032 }
20402033 }
20412034 ais.popIndent();
src/AstGen.zig+10-35
......@@ -4499,21 +4499,15 @@ fn structDeclInner(
44994499 .decl => continue,
45004500 .field => |field| field,
45014501 };
4502 if (member.ast.tuple_like and !is_tuple and member.ast.type_expr != 0 and
4503 astgen.tree.nodes.items(.tag)[member.ast.type_expr] == .identifier)
4504 {
4505 const ident = astgen.tree.nodes.items(.main_token)[member.ast.type_expr];
4506 member.ast.tuple_like = false;
4507 member.ast.main_token = ident;
4508 member.ast.type_expr = 0;
4509 } else if (is_tuple and !member.ast.tuple_like) {
4510 return astgen.failTok(member.ast.main_token, "tuple field has a name", .{});
4511 }
45124502
45134503 if (!is_tuple) {
4514 if (member.ast.tuple_like) return astgen.failTok(member.ast.main_token, "struct field missing name", .{});
4504 member.convertToNonTupleLike(astgen.tree.nodes);
4505 assert(!member.ast.tuple_like);
4506
45154507 const field_name = try astgen.identAsString(member.ast.main_token);
45164508 wip_members.appendToField(field_name);
4509 } else if (!member.ast.tuple_like) {
4510 return astgen.failTok(member.ast.main_token, "tuple field has a name", .{});
45174511 }
45184512
45194513 const doc_comment_index = try astgen.docCommentAsString(member.firstToken());
......@@ -4683,14 +4677,8 @@ fn unionDeclInner(
46834677 .decl => continue,
46844678 .field => |field| field,
46854679 };
4686 if (member.ast.tuple_like and member.ast.type_expr != 0 and
4687 astgen.tree.nodes.items(.tag)[member.ast.type_expr] == .identifier)
4688 {
4689 const ident = astgen.tree.nodes.items(.main_token)[member.ast.type_expr];
4690 member.ast.tuple_like = false;
4691 member.ast.main_token = ident;
4692 member.ast.type_expr = 0;
4693 } else if (member.ast.tuple_like) {
4680 member.convertToNonTupleLike(astgen.tree.nodes);
4681 if (member.ast.tuple_like) {
46944682 return astgen.failTok(member.ast.main_token, "union field missing name", .{});
46954683 }
46964684 if (member.comptime_token) |comptime_token| {
......@@ -4845,14 +4833,8 @@ fn containerDecl(
48454833 continue;
48464834 },
48474835 };
4848 if (member.ast.tuple_like and member.ast.type_expr != 0 and
4849 astgen.tree.nodes.items(.tag)[member.ast.type_expr] == .identifier)
4850 {
4851 const ident = astgen.tree.nodes.items(.main_token)[member.ast.type_expr];
4852 member.ast.tuple_like = false;
4853 member.ast.main_token = ident;
4854 member.ast.type_expr = 0;
4855 } else if (member.ast.tuple_like) {
4836 member.convertToNonTupleLike(astgen.tree.nodes);
4837 if (member.ast.tuple_like) {
48564838 return astgen.failTok(member.ast.main_token, "enum field missing name", .{});
48574839 }
48584840 if (member.comptime_token) |comptime_token| {
......@@ -4978,14 +4960,7 @@ fn containerDecl(
49784960 .decl => continue,
49794961 .field => |field| field,
49804962 };
4981 if (member.ast.tuple_like and member.ast.type_expr != 0 and
4982 astgen.tree.nodes.items(.tag)[member.ast.type_expr] == .identifier)
4983 {
4984 const ident = astgen.tree.nodes.items(.main_token)[member.ast.type_expr];
4985 member.ast.tuple_like = false;
4986 member.ast.main_token = ident;
4987 member.ast.type_expr = 0;
4988 }
4963 member.convertToNonTupleLike(astgen.tree.nodes);
49894964 assert(member.comptime_token == null);
49904965 assert(member.ast.type_expr == 0);
49914966 assert(member.ast.align_expr == 0);