motiejus/zig

fork of https://codeberg.org/ziglang/zig
git clone https://git.jakstys.lt/motiejus/zig.git
Log | Tree | Refs | README | LICENSE

commit 4c8caf33437d8ce55450a51dfbf89db69c65680e (tree)
parent 515d4920e79ca3c631f243f6a1d7fb6b48aa91cd
Author: Isaac Freund <ifreund@ifreund.xyz>
Date:   Wed, 10 Feb 2021 19:40:19 +0100

zig fmt: implement Tree.lastToken() for all nodes

Diffstat:
Mlib/std/zig/ast.zig | 22++++++++++++++++------
Mlib/std/zig/parser_test.zig | 19+++++++++++++++++++
2 files changed, 35 insertions(+), 6 deletions(-)

diff --git a/lib/std/zig/ast.zig b/lib/std/zig/ast.zig @@ -538,6 +538,7 @@ pub const Tree = struct { .ArrayType, .SwitchCaseOne, .SwitchCase, + .SwitchRange, => n = datas[n].rhs, .FieldAccess, @@ -580,8 +581,21 @@ pub const Tree = struct { } n = tree.extra_data[params.end - 1]; // last parameter }, - .CallComma, .AsyncCallComma => { - end_offset += 2; // for the comma+rparen + .TaggedUnionEnumTag => { + const members = tree.extraData(datas[n].rhs, Node.SubRange); + if (members.end - members.start == 0) { + end_offset += 4; // for the rparen + rparen + lbrace + rbrace + n = datas[n].lhs; + } else { + end_offset += 1; // for the rbrace + n = tree.extra_data[members.end - 1]; // last parameter + } + }, + .CallComma, + .AsyncCallComma, + .TaggedUnionEnumTagComma, + => { + end_offset += 2; // for the comma + rparen/rbrace const params = tree.extraData(datas[n].rhs, Node.SubRange); assert(params.end > params.start); n = tree.extra_data[params.end - 1]; // last parameter @@ -942,10 +956,6 @@ pub const Tree = struct { const extra = tree.extraData(datas[n].rhs, Node.ArrayTypeSentinel); n = extra.elem_type; }, - - .TaggedUnionEnumTag => unreachable, // TODO - .TaggedUnionEnumTagComma => unreachable, // TODO - .SwitchRange => unreachable, // TODO }; } diff --git a/lib/std/zig/parser_test.zig b/lib/std/zig/parser_test.zig @@ -841,6 +841,25 @@ test "zig fmt: tagged union with enum values" { ); } +test "zig fmt: tagged union enum tag last token" { + try testCanonical( + \\test { + \\ const U = union(enum(u32)) {}; + \\} + \\ + \\test { + \\ const U = union(enum(u32)) { foo }; + \\} + \\ + \\test { + \\ const U = union(enum(u32)) { + \\ foo, + \\ }; + \\} + \\ + ); +} + test "zig fmt: allowzero pointer" { try testCanonical( \\const T = [*]allowzero const u8;