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 {...@@ -741,8 +741,8 @@ fn renderExpression(r: *Render, node: Ast.Node.Index, space: Space) Error!void {
741 try renderToken(r, lbrace, .none);741 try renderToken(r, lbrace, .none);
742 try renderIdentifier(r, lbrace + 1, .none, .eagerly_unquote); // identifier742 try renderIdentifier(r, lbrace + 1, .none, .eagerly_unquote); // identifier
743 return renderToken(r, rbrace, space);743 return renderToken(r, rbrace, space);
744 } else if (tree.tokenTag(rbrace - 1) == .comma) {744 } else if (!isOneLineErrorSetDecl(tree, lbrace, rbrace)) {
745 // There is a trailing comma so render each member on a new line.745 // Render each member on a new line.
746 try ais.pushIndent(.normal);746 try ais.pushIndent(.normal);
747 try renderToken(r, lbrace, .newline);747 try renderToken(r, lbrace, .newline);
748 var i = lbrace + 1;748 var i = lbrace + 1;
...@@ -755,19 +755,17 @@ fn renderExpression(r: *Render, node: Ast.Node.Index, space: Space) Error!void {...@@ -755,19 +755,17 @@ fn renderExpression(r: *Render, node: Ast.Node.Index, space: Space) Error!void {
755 try renderIdentifier(r, i, .comma, .eagerly_unquote);755 try renderIdentifier(r, i, .comma, .eagerly_unquote);
756 ais.popSpace();756 ais.popSpace();
757 },757 },
758 .comma => {},
759 else => unreachable,758 else => unreachable,
760 }759 }
761 }760 }
762 ais.popIndent();761 ais.popIndent();
763 return renderToken(r, rbrace, space);762 return renderToken(r, rbrace, space);
764 } else {763 } else {
765 // There is no trailing comma so render everything on one line.764 // Render each member on one line.
766 try renderToken(r, lbrace, .space);765 try renderToken(r, lbrace, .space);
767 var i = lbrace + 1;766 var i = lbrace + 1;
768 while (i < rbrace) : (i += 1) {767 while (i < rbrace) : (i += 1) {
769 switch (tree.tokenTag(i)) {768 switch (tree.tokenTag(i)) {
770 .doc_comment => unreachable, // TODO
771 .identifier => try renderIdentifier(r, i, .comma_space, .eagerly_unquote),769 .identifier => try renderIdentifier(r, i, .comma_space, .eagerly_unquote),
772 .comma => {},770 .comma => {},
773 else => unreachable,771 else => unreachable,
...@@ -2231,6 +2229,18 @@ fn renderArrayInit(...@@ -2231,6 +2229,18 @@ fn renderArrayInit(
2231 return renderToken(r, rbrace, space); // rbrace2229 return renderToken(r, rbrace, space); // rbrace
2232}2230}
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
2234fn renderContainerDecl(2244fn renderContainerDecl(
2235 r: *Render,2245 r: *Render,
2236 container_decl_node: Ast.Node.Index,2246 container_decl_node: Ast.Node.Index,
...@@ -2885,6 +2895,16 @@ fn hasMultilineString(tree: Ast, start_token: Ast.TokenIndex, end_token: Ast.Tok...@@ -2885,6 +2895,16 @@ fn hasMultilineString(tree: Ast, start_token: Ast.TokenIndex, end_token: Ast.Tok
2885 ) != null;2895 ) != null;
2886}2896}
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
2888/// Assumes that start is the first byte past the previous token and2908/// Assumes that start is the first byte past the previous token and
2889/// that end is the last byte before the next token.2909/// that end is the last byte before the next token.
2890fn renderComments(r: *Render, start: usize, end: usize) Error!bool {2910fn 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" {...@@ -6054,6 +6054,37 @@ test "zig fmt: extern addrspace in struct" {
6054 );6054 );
6055}6055}
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
6057test "zig fmt: field accesses on number literals" {6088test "zig fmt: field accesses on number literals" {
6058 try testCanonical(6089 try testCanonical(
6059 \\const a = 0xF .A;6090 \\const a = 0xF .A;