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 {...@@ -2277,6 +2277,17 @@ pub const full = struct {
2277 pub fn firstToken(cf: ContainerField) TokenIndex {2277 pub fn firstToken(cf: ContainerField) TokenIndex {
2278 return cf.comptime_token orelse cf.ast.main_token;2278 return cf.comptime_token orelse cf.ast.main_token;
2279 }2279 }
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 }
2280 };2291 };
22812292
2282 pub const FnProto = struct {2293 pub const FnProto = struct {
lib/std/zig/parser_test.zig+1-1
...@@ -5824,7 +5824,7 @@ test "recovery: invalid comptime" {...@@ -5824,7 +5824,7 @@ test "recovery: invalid comptime" {
5824 try testError(5824 try testError(
5825 \\comptime5825 \\comptime
5826 , &[_]Error{5826 , &[_]Error{
5827 .expected_block_or_field,5827 .expected_type_expr,
5828 });5828 });
5829}5829}
58305830
lib/std/zig/render.zig+16-23
...@@ -40,7 +40,7 @@ pub fn renderTree(buffer: *std.ArrayList(u8), tree: Ast) Error!void {...@@ -40,7 +40,7 @@ pub fn renderTree(buffer: *std.ArrayList(u8), tree: Ast) Error!void {
40/// Render all members in the given slice, keeping empty lines where appropriate40/// Render all members in the given slice, keeping empty lines where appropriate
41fn renderMembers(gpa: Allocator, ais: *Ais, tree: Ast, members: []const Ast.Node.Index) Error!void {41fn renderMembers(gpa: Allocator, ais: *Ais, tree: Ast, members: []const Ast.Node.Index) Error!void {
42 if (members.len == 0) return;42 if (members.len == 0) return;
43 var any_non_tuple_like_fields = false;43 var is_tuple = true;
44 for (members) |member| {44 for (members) |member| {
45 const tuple_like = switch (tree.nodes.items(.tag)[member]) {45 const tuple_like = switch (tree.nodes.items(.tag)[member]) {
46 .container_field_init => tree.containerFieldInit(member).ast.tuple_like,46 .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...@@ -49,14 +49,14 @@ fn renderMembers(gpa: Allocator, ais: *Ais, tree: Ast, members: []const Ast.Node
49 else => continue,49 else => continue,
50 };50 };
51 if (!tuple_like) {51 if (!tuple_like) {
52 any_non_tuple_like_fields = true;52 is_tuple = false;
53 break;53 break;
54 }54 }
55 }55 }
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);
57 for (members[1..]) |member| {57 for (members[1..]) |member| {
58 try renderExtraNewline(ais, tree, member);58 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);
60 }60 }
61}61}
6262
...@@ -65,7 +65,7 @@ fn renderMember(...@@ -65,7 +65,7 @@ fn renderMember(
65 ais: *Ais,65 ais: *Ais,
66 tree: Ast,66 tree: Ast,
67 decl: Ast.Node.Index,67 decl: Ast.Node.Index,
68 any_non_tuple_like_fields: bool,68 is_tuple: bool,
69 space: Space,69 space: Space,
70) Error!void {70) Error!void {
71 const token_tags = tree.tokens.items(.tag);71 const token_tags = tree.tokens.items(.tag);
...@@ -181,9 +181,9 @@ fn renderMember(...@@ -181,9 +181,9 @@ fn renderMember(
181 try renderExpression(gpa, ais, tree, datas[decl].rhs, space);181 try renderExpression(gpa, ais, tree, datas[decl].rhs, space);
182 },182 },
183183
184 .container_field_init => return renderContainerField(gpa, ais, tree, tree.containerFieldInit(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), any_non_tuple_like_fields, 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), any_non_tuple_like_fields, space),186 .container_field => return renderContainerField(gpa, ais, tree, tree.containerField(decl), is_tuple, space),
187 .@"comptime" => return renderExpression(gpa, ais, tree, decl, space),187 .@"comptime" => return renderExpression(gpa, ais, tree, decl, space),
188188
189 .root => unreachable,189 .root => unreachable,
...@@ -1179,18 +1179,11 @@ fn renderContainerField(...@@ -1179,18 +1179,11 @@ fn renderContainerField(
1179 ais: *Ais,1179 ais: *Ais,
1180 tree: Ast,1180 tree: Ast,
1181 field_param: Ast.full.ContainerField,1181 field_param: Ast.full.ContainerField,
1182 any_non_tuple_like_fields: bool,1182 is_tuple: bool,
1183 space: Space,1183 space: Space,
1184) Error!void {1184) Error!void {
1185 var field = field_param;1185 var field = field_param;
1186 if (field.ast.tuple_like and any_non_tuple_like_fields and field.ast.type_expr != 01186 if (!is_tuple) field.convertToNonTupleLike(tree.nodes);
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 }
11941187
1195 if (field.comptime_token) |t| {1188 if (field.comptime_token) |t| {
1196 try renderToken(ais, tree, t, .space); // comptime1189 try renderToken(ais, tree, t, .space); // comptime
...@@ -1935,8 +1928,8 @@ fn renderContainerDecl(...@@ -1935,8 +1928,8 @@ fn renderContainerDecl(
1935 try renderToken(ais, tree, layout_token, .space);1928 try renderToken(ais, tree, layout_token, .space);
1936 }1929 }
19371930
1938 var any_non_tuple_like_fields = token_tags[container_decl.ast.main_token] != .keyword_struct;1931 var is_tuple = token_tags[container_decl.ast.main_token] == .keyword_struct;
1939 if (!any_non_tuple_like_fields) for (container_decl.ast.members) |member| {1932 if (is_tuple) for (container_decl.ast.members) |member| {
1940 const tuple_like = switch (tree.nodes.items(.tag)[member]) {1933 const tuple_like = switch (tree.nodes.items(.tag)[member]) {
1941 .container_field_init => tree.containerFieldInit(member).ast.tuple_like,1934 .container_field_init => tree.containerFieldInit(member).ast.tuple_like,
1942 .container_field_align => tree.containerFieldAlign(member).ast.tuple_like,1935 .container_field_align => tree.containerFieldAlign(member).ast.tuple_like,
...@@ -1944,7 +1937,7 @@ fn renderContainerDecl(...@@ -1944,7 +1937,7 @@ fn renderContainerDecl(
1944 else => continue,1937 else => continue,
1945 };1938 };
1946 if (!tuple_like) {1939 if (!tuple_like) {
1947 any_non_tuple_like_fields = true;1940 is_tuple = false;
1948 break;1941 break;
1949 }1942 }
1950 };1943 };
...@@ -2015,7 +2008,7 @@ fn renderContainerDecl(...@@ -2015,7 +2008,7 @@ fn renderContainerDecl(
2015 // Print all the declarations on the same line.2008 // Print all the declarations on the same line.
2016 try renderToken(ais, tree, lbrace, .space); // lbrace2009 try renderToken(ais, tree, lbrace, .space); // lbrace
2017 for (container_decl.ast.members) |member| {2010 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);
2019 }2012 }
2020 return renderToken(ais, tree, rbrace, space); // rbrace2013 return renderToken(ais, tree, rbrace, space); // rbrace
2021 }2014 }
...@@ -2033,9 +2026,9 @@ fn renderContainerDecl(...@@ -2033,9 +2026,9 @@ fn renderContainerDecl(
2033 .container_field_init,2026 .container_field_init,
2034 .container_field_align,2027 .container_field_align,
2035 .container_field,2028 .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),
2039 }2032 }
2040 }2033 }
2041 ais.popIndent();2034 ais.popIndent();
src/AstGen.zig+10-35
...@@ -4499,21 +4499,15 @@ fn structDeclInner(...@@ -4499,21 +4499,15 @@ fn structDeclInner(
4499 .decl => continue,4499 .decl => continue,
4500 .field => |field| field,4500 .field => |field| field,
4501 };4501 };
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
4513 if (!is_tuple) {4503 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
4515 const field_name = try astgen.identAsString(member.ast.main_token);4507 const field_name = try astgen.identAsString(member.ast.main_token);
4516 wip_members.appendToField(field_name);4508 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", .{});
4517 }4511 }
45184512
4519 const doc_comment_index = try astgen.docCommentAsString(member.firstToken());4513 const doc_comment_index = try astgen.docCommentAsString(member.firstToken());
...@@ -4683,14 +4677,8 @@ fn unionDeclInner(...@@ -4683,14 +4677,8 @@ fn unionDeclInner(
4683 .decl => continue,4677 .decl => continue,
4684 .field => |field| field,4678 .field => |field| field,
4685 };4679 };
4686 if (member.ast.tuple_like and member.ast.type_expr != 0 and4680 member.convertToNonTupleLike(astgen.tree.nodes);
4687 astgen.tree.nodes.items(.tag)[member.ast.type_expr] == .identifier)4681 if (member.ast.tuple_like) {
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) {
4694 return astgen.failTok(member.ast.main_token, "union field missing name", .{});4682 return astgen.failTok(member.ast.main_token, "union field missing name", .{});
4695 }4683 }
4696 if (member.comptime_token) |comptime_token| {4684 if (member.comptime_token) |comptime_token| {
...@@ -4845,14 +4833,8 @@ fn containerDecl(...@@ -4845,14 +4833,8 @@ fn containerDecl(
4845 continue;4833 continue;
4846 },4834 },
4847 };4835 };
4848 if (member.ast.tuple_like and member.ast.type_expr != 0 and4836 member.convertToNonTupleLike(astgen.tree.nodes);
4849 astgen.tree.nodes.items(.tag)[member.ast.type_expr] == .identifier)4837 if (member.ast.tuple_like) {
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) {
4856 return astgen.failTok(member.ast.main_token, "enum field missing name", .{});4838 return astgen.failTok(member.ast.main_token, "enum field missing name", .{});
4857 }4839 }
4858 if (member.comptime_token) |comptime_token| {4840 if (member.comptime_token) |comptime_token| {
...@@ -4978,14 +4960,7 @@ fn containerDecl(...@@ -4978,14 +4960,7 @@ fn containerDecl(
4978 .decl => continue,4960 .decl => continue,
4979 .field => |field| field,4961 .field => |field| field,
4980 };4962 };
4981 if (member.ast.tuple_like and member.ast.type_expr != 0 and4963 member.convertToNonTupleLike(astgen.tree.nodes);
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 }
4989 assert(member.comptime_token == null);4964 assert(member.comptime_token == null);
4990 assert(member.ast.type_expr == 0);4965 assert(member.ast.type_expr == 0);
4991 assert(member.ast.align_expr == 0);4966 assert(member.ast.align_expr == 0);