Skip to content

Commit 530da36

Browse files
committed
zig fmt: fix enum decl with no trailing comma
See #1003
1 parent 6c1fda3 commit 530da36

File tree

2 files changed

+46
-35
lines changed

2 files changed

+46
-35
lines changed

std/zig/parser_test.zig

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,15 @@
1+
test "zig fmt: enum decl with no trailing comma" {
2+
try testTransform(
3+
\\const StrLitKind = enum {Normal, C};
4+
,
5+
\\const StrLitKind = enum {
6+
\\ Normal,
7+
\\ C,
8+
\\};
9+
\\
10+
);
11+
}
12+
113
test "zig fmt: switch comment before prong" {
214
try testCanonical(
315
\\comptime {

std/zig/render.zig

Lines changed: 34 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -110,38 +110,44 @@ fn renderTopLevelDecl(allocator: &mem.Allocator, stream: var, tree: &ast.Tree, i
110110

111111
try renderDocComments(tree, stream, tag, indent);
112112

113-
const name_space = if (tag.type_expr == null and tag.value_expr != null) Space.Space else Space.None;
114-
try renderToken(tree, stream, tag.name_token, indent, name_space); // name
113+
if (tag.type_expr == null and tag.value_expr == null) {
114+
return renderTokenAndTrailingComma(tree, stream, tag.name_token, indent, Space.Newline); // name,
115+
}
116+
117+
if (tag.type_expr == null) {
118+
try renderToken(tree, stream, tag.name_token, indent, Space.Space); // name
119+
} else {
120+
try renderToken(tree, stream, tag.name_token, indent, Space.None); // name
121+
}
115122

116123
if (tag.type_expr) |type_expr| {
117124
try renderToken(tree, stream, tree.nextToken(tag.name_token), indent, Space.Space); // :
118125

119-
const after_type_space = if (tag.value_expr == null) Space.None else Space.Space;
120-
try renderExpression(allocator, stream, tree, indent, type_expr, after_type_space);
121-
}
122-
123-
if (tag.value_expr) |value_expr| {
124-
try renderToken(tree, stream, tree.prevToken(value_expr.firstToken()), indent, Space.Space); // =
125-
try renderExpression(allocator, stream, tree, indent, value_expr, Space.None);
126+
if (tag.value_expr == null) {
127+
return renderTrailingComma(allocator, stream, tree, indent, type_expr, Space.Newline); // type,
128+
} else {
129+
try renderExpression(allocator, stream, tree, indent, type_expr, Space.Space); // type
130+
}
126131
}
127132

128-
try renderToken(tree, stream, tree.nextToken(decl.lastToken()), indent, Space.Newline); // ,
133+
const value_expr = ??tag.value_expr;
134+
try renderToken(tree, stream, tree.prevToken(value_expr.firstToken()), indent, Space.Space); // =
135+
try renderTrailingComma(allocator, stream, tree, indent, value_expr, Space.Newline); // value,
129136
},
130137

131138
ast.Node.Id.EnumTag => {
132139
const tag = @fieldParentPtr(ast.Node.EnumTag, "base", decl);
133140

134141
try renderDocComments(tree, stream, tag, indent);
135142

136-
const after_name_space = if (tag.value == null) Space.None else Space.Space;
137-
try renderToken(tree, stream, tag.name_token, indent, after_name_space); // name
138-
139143
if (tag.value) |value| {
144+
try renderToken(tree, stream, tag.name_token, indent, Space.Space); // name
145+
140146
try renderToken(tree, stream, tree.nextToken(tag.name_token), indent, Space.Space); // =
141-
try renderExpression(allocator, stream, tree, indent, value, Space.None);
147+
try renderTrailingComma(allocator, stream, tree, indent, value, Space.Newline);
148+
} else {
149+
try renderTokenAndTrailingComma(tree, stream, tag.name_token, indent, Space.Newline); // name
142150
}
143-
144-
try renderToken(tree, stream, tree.nextToken(decl.lastToken()), indent, Space.Newline); // ,
145151
},
146152

147153
ast.Node.Id.Comptime => {
@@ -1584,7 +1590,6 @@ const Space = enum {
15841590
NoNewline,
15851591
NoIndent,
15861592
NoComment,
1587-
IgnoreEmptyComment,
15881593
};
15891594

15901595
fn renderToken(tree: &ast.Tree, stream: var, token_index: ast.TokenIndex, indent: usize, space: Space) (@typeOf(stream).Child.Error || Error)!void {
@@ -1604,15 +1609,14 @@ fn renderToken(tree: &ast.Tree, stream: var, token_index: ast.TokenIndex, indent
16041609
return stream.write("\n");
16051610
}
16061611
},
1607-
Space.Space, Space.IgnoreEmptyComment => return stream.writeByte(' '),
1612+
Space.Space => return stream.writeByte(' '),
16081613
Space.NoComment => unreachable,
16091614
}
16101615
}
16111616

16121617
const comment_is_empty = mem.trimRight(u8, tree.tokenSlicePtr(next_token), " ").len == 2;
16131618
if (comment_is_empty) {
16141619
switch (space) {
1615-
Space.IgnoreEmptyComment => return stream.writeByte(' '),
16161620
Space.Newline => return stream.writeByte('\n'),
16171621
else => {},
16181622
}
@@ -1644,7 +1648,7 @@ fn renderToken(tree: &ast.Tree, stream: var, token_index: ast.TokenIndex, indent
16441648
}
16451649
},
16461650
Space.NoNewline => {},
1647-
Space.NoComment, Space.IgnoreEmptyComment => unreachable,
1651+
Space.NoComment => unreachable,
16481652
}
16491653
return;
16501654
}
@@ -1681,7 +1685,7 @@ fn renderToken(tree: &ast.Tree, stream: var, token_index: ast.TokenIndex, indent
16811685
try stream.writeByteNTimes(' ', next_line_indent);
16821686
},
16831687
Space.NoNewline => {},
1684-
Space.NoComment, Space.IgnoreEmptyComment => unreachable,
1688+
Space.NoComment => unreachable,
16851689
}
16861690
return;
16871691
}
@@ -1720,27 +1724,22 @@ fn renderTrailingComma(allocator: &mem.Allocator, stream: var, tree: &ast.Tree,
17201724
}
17211725
}
17221726

1723-
fn renderTrailingCommaAndEmptyComment(allocator: &mem.Allocator, stream: var, tree: &ast.Tree, indent: usize, base: &ast.Node) (@typeOf(stream).Child.Error || Error)!void
1724-
{
1725-
const end_token = base.lastToken() + 1;
1727+
fn renderTokenAndTrailingComma(tree: &ast.Tree, stream: var, token_index: ast.TokenIndex, indent: usize, space: Space) (@typeOf(stream).Child.Error || Error)!void {
1728+
const end_token = token_index + 1;
17261729
switch (tree.tokens.at(end_token).id) {
17271730
Token.Id.Comma => {
1728-
try renderExpression(allocator, stream, tree, indent, base, Space.None);
1729-
try renderToken(tree, stream, end_token, indent, Space.Space); // ,
1730-
1731-
const next_token = tree.tokens.at(end_token + 1);
1732-
if (next_token.id != Token.Id.LineComment) {
1733-
try stream.print("//\n");
1734-
}
1731+
try renderToken(tree, stream, token_index, indent, Space.None);
1732+
try renderToken(tree, stream, end_token, indent, space); // ,
17351733
},
17361734
Token.Id.LineComment => {
1737-
try renderExpression(allocator, stream, tree, indent, base, Space.NoComment);
1735+
try renderToken(tree, stream, token_index, indent, Space.NoComment);
17381736
try stream.write(", ");
1739-
try renderToken(tree, stream, end_token, indent, Space.Newline);
1737+
try renderToken(tree, stream, end_token, indent, space);
17401738
},
17411739
else => {
1742-
try renderExpression(allocator, stream, tree, indent, base, Space.None);
1743-
try stream.write(", //\n");
1740+
try renderToken(tree, stream, token_index, indent, Space.None);
1741+
try stream.write(",\n");
1742+
assert(space == Space.Newline);
17441743
},
17451744
}
17461745
}

0 commit comments

Comments
 (0)