authorgravatar for goon.pri.low@gmail.comKendall Condon <goon.pri.low@gmail.com> 2025-07-28 16:37:37-04:00
committergravatar for goon.pri.low@gmail.comKendall Condon <goon.pri.low@gmail.com> 2026-03-12 17:23:17-04:00
log472992ae4553d8057e81c75026923df18e30a9a8
tree31b63515243d81f2630158ddbc49936e4106e24d
parentd5d3e40b6c262875d766946d0edc02b8cd14ee98

zig fmt: implement expanding error sets when comments are present


2 files changed, 56 insertions(+), 5 deletions(-)

lib/std/zig/Ast/Render.zig+25-5
......@@ -741,8 +741,8 @@ fn renderExpression(r: *Render, node: Ast.Node.Index, space: Space) Error!void {
741741 try renderToken(r, lbrace, .none);
742742 try renderIdentifier(r, lbrace + 1, .none, .eagerly_unquote); // identifier
743743 return renderToken(r, rbrace, space);
744 } else if (tree.tokenTag(rbrace - 1) == .comma) {
745 // There is a trailing comma so render each member on a new line.
744 } else if (!isOneLineErrorSetDecl(tree, lbrace, rbrace)) {
745 // Render each member on a new line.
746746 try ais.pushIndent(.normal);
747747 try renderToken(r, lbrace, .newline);
748748 var i = lbrace + 1;
......@@ -755,19 +755,17 @@ fn renderExpression(r: *Render, node: Ast.Node.Index, space: Space) Error!void {
755755 try renderIdentifier(r, i, .comma, .eagerly_unquote);
756756 ais.popSpace();
757757 },
758 .comma => {},
759758 else => unreachable,
760759 }
761760 }
762761 ais.popIndent();
763762 return renderToken(r, rbrace, space);
764763 } else {
765 // There is no trailing comma so render everything on one line.
764 // Render each member on one line.
766765 try renderToken(r, lbrace, .space);
767766 var i = lbrace + 1;
768767 while (i < rbrace) : (i += 1) {
769768 switch (tree.tokenTag(i)) {
770 .doc_comment => unreachable, // TODO
771769 .identifier => try renderIdentifier(r, i, .comma_space, .eagerly_unquote),
772770 .comma => {},
773771 else => unreachable,
......@@ -2231,6 +2229,18 @@ fn renderArrayInit(
22312229 return renderToken(r, rbrace, space); // rbrace
22322230}
22332231
2232fn isOneLineErrorSetDecl(
2233 tree: Ast,
2234 lbrace: Ast.TokenIndex,
2235 rbrace: Ast.TokenIndex,
2236) bool {
2237 // If there is a trailing comma, comment, or document comment, then render each
2238 // item on its own line.
2239 return tree.tokenTag(rbrace - 1) != .comma and
2240 !hasDocComment(tree, lbrace + 1, rbrace) and
2241 !hasComment(tree, lbrace, rbrace);
2242}
2243
22342244fn renderContainerDecl(
22352245 r: *Render,
22362246 container_decl_node: Ast.Node.Index,
......@@ -2885,6 +2895,16 @@ fn hasMultilineString(tree: Ast, start_token: Ast.TokenIndex, end_token: Ast.Tok
28852895 ) != null;
28862896}
28872897
2898/// Returns true if there exists a doc comment between the start
2899/// of token `start_token` and the start of token `end_token`.
2900fn hasDocComment(tree: Ast, start_token: Ast.TokenIndex, end_token: Ast.TokenIndex) bool {
2901 return std.mem.indexOfScalar(
2902 Token.Tag,
2903 tree.tokens.items(.tag)[start_token..end_token],
2904 .doc_comment,
2905 ) != null;
2906}
2907
28882908/// Assumes that start is the first byte past the previous token and
28892909/// that end is the last byte before the next token.
28902910fn renderComments(r: *Render, start: usize, end: usize) Error!bool {
lib/std/zig/parser_test.zig+31
......@@ -6054,6 +6054,37 @@ test "zig fmt: extern addrspace in struct" {
60546054 );
60556055}
60566056
6057test "zig fmt: seperate errors in error sets with comments" {
6058 try testTransform(
6059 \\error{
6060 \\ /// This error is very bad!
6061 \\ A, B}
6062 \\
6063 ,
6064 \\error{
6065 \\ /// This error is very bad!
6066 \\ A,
6067 \\ B,
6068 \\}
6069 \\
6070 );
6071
6072 try testTransform(
6073 \\error{
6074 \\ A, B
6075 \\ // something important
6076 \\}
6077 \\
6078 ,
6079 \\error{
6080 \\ A,
6081 \\ B,
6082 \\ // something important
6083 \\}
6084 \\
6085 );
6086}
6087
60576088test "zig fmt: field accesses on number literals" {
60586089 try testCanonical(
60596090 \\const a = 0xF .A;