diff options
| author | Veikka Tuominen <git@vexu.eu> | 2022-11-22 13:28:04 +0200 |
|---|---|---|
| committer | Veikka Tuominen <git@vexu.eu> | 2022-11-23 12:13:39 +0200 |
| commit | 4cea15f12bdaf1603d60cf80e767dd8f2bb48b26 (patch) | |
| tree | 1935cf1f2eb2dabef43b77e58ec4ea1b90bfa7bf /lib/std | |
| parent | d5da2a6114926fae44f31eeab0706578f090dca8 (diff) | |
| download | zig-4cea15f12bdaf1603d60cf80e767dd8f2bb48b26.tar.gz zig-4cea15f12bdaf1603d60cf80e767dd8f2bb48b26.zip | |
std.zig.Ast: simplify usage of tuple_like container fields
Diffstat (limited to 'lib/std')
| -rw-r--r-- | lib/std/zig/Ast.zig | 11 | ||||
| -rw-r--r-- | lib/std/zig/parser_test.zig | 2 | ||||
| -rw-r--r-- | lib/std/zig/render.zig | 39 |
3 files changed, 28 insertions, 24 deletions
diff --git a/lib/std/zig/Ast.zig b/lib/std/zig/Ast.zig index be4d0819de..0966978ab8 100644 --- a/lib/std/zig/Ast.zig +++ b/lib/std/zig/Ast.zig @@ -2277,6 +2277,17 @@ pub const full = struct { pub fn firstToken(cf: ContainerField) TokenIndex { return cf.comptime_token orelse cf.ast.main_token; } + + pub fn convertToNonTupleLike(cf: *ContainerField, nodes: NodeList.Slice) void { + if (!cf.ast.tuple_like) return; + if (cf.ast.type_expr == 0) return; + if (nodes.items(.tag)[cf.ast.type_expr] != .identifier) return; + + const ident = nodes.items(.main_token)[cf.ast.type_expr]; + cf.ast.tuple_like = false; + cf.ast.main_token = ident; + cf.ast.type_expr = 0; + } }; pub const FnProto = struct { diff --git a/lib/std/zig/parser_test.zig b/lib/std/zig/parser_test.zig index 1b2cb1729b..e554c51f70 100644 --- a/lib/std/zig/parser_test.zig +++ b/lib/std/zig/parser_test.zig @@ -5824,7 +5824,7 @@ test "recovery: invalid comptime" { try testError( \\comptime , &[_]Error{ - .expected_block_or_field, + .expected_type_expr, }); } diff --git a/lib/std/zig/render.zig b/lib/std/zig/render.zig index f738db20e7..2c9ed8632f 100644 --- a/lib/std/zig/render.zig +++ b/lib/std/zig/render.zig @@ -40,7 +40,7 @@ pub fn renderTree(buffer: *std.ArrayList(u8), tree: Ast) Error!void { /// Render all members in the given slice, keeping empty lines where appropriate fn renderMembers(gpa: Allocator, ais: *Ais, tree: Ast, members: []const Ast.Node.Index) Error!void { if (members.len == 0) return; - var any_non_tuple_like_fields = false; + var is_tuple = true; for (members) |member| { const tuple_like = switch (tree.nodes.items(.tag)[member]) { .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 else => continue, }; if (!tuple_like) { - any_non_tuple_like_fields = true; + is_tuple = false; break; } } - try renderMember(gpa, ais, tree, members[0], any_non_tuple_like_fields, .newline); + try renderMember(gpa, ais, tree, members[0], is_tuple, .newline); for (members[1..]) |member| { try renderExtraNewline(ais, tree, member); - try renderMember(gpa, ais, tree, member, any_non_tuple_like_fields, .newline); + try renderMember(gpa, ais, tree, member, is_tuple, .newline); } } @@ -65,7 +65,7 @@ fn renderMember( ais: *Ais, tree: Ast, decl: Ast.Node.Index, - any_non_tuple_like_fields: bool, + is_tuple: bool, space: Space, ) Error!void { const token_tags = tree.tokens.items(.tag); @@ -181,9 +181,9 @@ fn renderMember( try renderExpression(gpa, ais, tree, datas[decl].rhs, space); }, - .container_field_init => return renderContainerField(gpa, ais, tree, tree.containerFieldInit(decl), any_non_tuple_like_fields, space), - .container_field_align => return renderContainerField(gpa, ais, tree, tree.containerFieldAlign(decl), any_non_tuple_like_fields, space), - .container_field => return renderContainerField(gpa, ais, tree, tree.containerField(decl), any_non_tuple_like_fields, space), + .container_field_init => return renderContainerField(gpa, ais, tree, tree.containerFieldInit(decl), is_tuple, space), + .container_field_align => return renderContainerField(gpa, ais, tree, tree.containerFieldAlign(decl), is_tuple, space), + .container_field => return renderContainerField(gpa, ais, tree, tree.containerField(decl), is_tuple, space), .@"comptime" => return renderExpression(gpa, ais, tree, decl, space), .root => unreachable, @@ -1179,18 +1179,11 @@ fn renderContainerField( ais: *Ais, tree: Ast, field_param: Ast.full.ContainerField, - any_non_tuple_like_fields: bool, + is_tuple: bool, space: Space, ) Error!void { var field = field_param; - if (field.ast.tuple_like and any_non_tuple_like_fields and field.ast.type_expr != 0 - and tree.nodes.items(.tag)[field.ast.type_expr] == .identifier - ) { - const ident = tree.nodes.items(.main_token)[field.ast.type_expr]; - field.ast.tuple_like = false; - field.ast.main_token = ident; - field.ast.type_expr = 0; - } + if (!is_tuple) field.convertToNonTupleLike(tree.nodes); if (field.comptime_token) |t| { try renderToken(ais, tree, t, .space); // comptime @@ -1935,8 +1928,8 @@ fn renderContainerDecl( try renderToken(ais, tree, layout_token, .space); } - var any_non_tuple_like_fields = token_tags[container_decl.ast.main_token] != .keyword_struct; - if (!any_non_tuple_like_fields) for (container_decl.ast.members) |member| { + var is_tuple = token_tags[container_decl.ast.main_token] == .keyword_struct; + if (is_tuple) for (container_decl.ast.members) |member| { const tuple_like = switch (tree.nodes.items(.tag)[member]) { .container_field_init => tree.containerFieldInit(member).ast.tuple_like, .container_field_align => tree.containerFieldAlign(member).ast.tuple_like, @@ -1944,7 +1937,7 @@ fn renderContainerDecl( else => continue, }; if (!tuple_like) { - any_non_tuple_like_fields = true; + is_tuple = false; break; } }; @@ -2015,7 +2008,7 @@ fn renderContainerDecl( // Print all the declarations on the same line. try renderToken(ais, tree, lbrace, .space); // lbrace for (container_decl.ast.members) |member| { - try renderMember(gpa, ais, tree, member, any_non_tuple_like_fields, .space); + try renderMember(gpa, ais, tree, member, is_tuple, .space); } return renderToken(ais, tree, rbrace, space); // rbrace } @@ -2033,9 +2026,9 @@ fn renderContainerDecl( .container_field_init, .container_field_align, .container_field, - => try renderMember(gpa, ais, tree, member, any_non_tuple_like_fields, .comma), + => try renderMember(gpa, ais, tree, member, is_tuple, .comma), - else => try renderMember(gpa, ais, tree, member, any_non_tuple_like_fields, .newline), + else => try renderMember(gpa, ais, tree, member, is_tuple, .newline), } } ais.popIndent(); |
