authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2018-05-28 17:43:17-04:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2018-05-28 17:43:17-04:00
log530da363521ca7c3b22e6451874cef24d49683cc
treef9f90c80b4a2685122ebbc034dde9083f68c2654
parent6c1fda3f99ebef60f4cb45b6bd66e76c85483c36

zig fmt: fix enum decl with no trailing comma

See #1003

2 files changed, 46 insertions(+), 35 deletions(-)

std/zig/parser_test.zig+12
...@@ -1,3 +1,15 @@...@@ -1,3 +1,15 @@
1test "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
1test "zig fmt: switch comment before prong" {13test "zig fmt: switch comment before prong" {
2 try testCanonical(14 try testCanonical(
3 \\comptime {15 \\comptime {
std/zig/render.zig+34-35
...@@ -110,22 +110,29 @@ fn renderTopLevelDecl(allocator: &mem.Allocator, stream: var, tree: &ast.Tree, i...@@ -110,22 +110,29 @@ fn renderTopLevelDecl(allocator: &mem.Allocator, stream: var, tree: &ast.Tree, i
110110
111 try renderDocComments(tree, stream, tag, indent);111 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;113 if (tag.type_expr == null and tag.value_expr == null) {
114 try renderToken(tree, stream, tag.name_token, indent, name_space); // name114 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
116 if (tag.type_expr) |type_expr| {123 if (tag.type_expr) |type_expr| {
117 try renderToken(tree, stream, tree.nextToken(tag.name_token), indent, Space.Space); // :124 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;126 if (tag.value_expr == null) {
120 try renderExpression(allocator, stream, tree, indent, type_expr, after_type_space);127 return renderTrailingComma(allocator, stream, tree, indent, type_expr, Space.Newline); // type,
121 }128 } else {
122129 try renderExpression(allocator, stream, tree, indent, type_expr, Space.Space); // type
123 if (tag.value_expr) |value_expr| {130 }
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 }131 }
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,
129 },136 },
130137
131 ast.Node.Id.EnumTag => {138 ast.Node.Id.EnumTag => {
...@@ -133,15 +140,14 @@ fn renderTopLevelDecl(allocator: &mem.Allocator, stream: var, tree: &ast.Tree, i...@@ -133,15 +140,14 @@ fn renderTopLevelDecl(allocator: &mem.Allocator, stream: var, tree: &ast.Tree, i
133140
134 try renderDocComments(tree, stream, tag, indent);141 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
139 if (tag.value) |value| {143 if (tag.value) |value| {
144 try renderToken(tree, stream, tag.name_token, indent, Space.Space); // name
145
140 try renderToken(tree, stream, tree.nextToken(tag.name_token), indent, Space.Space); // =146 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
142 }150 }
143
144 try renderToken(tree, stream, tree.nextToken(decl.lastToken()), indent, Space.Newline); // ,
145 },151 },
146152
147 ast.Node.Id.Comptime => {153 ast.Node.Id.Comptime => {
...@@ -1584,7 +1590,6 @@ const Space = enum {...@@ -1584,7 +1590,6 @@ const Space = enum {
1584 NoNewline,1590 NoNewline,
1585 NoIndent,1591 NoIndent,
1586 NoComment,1592 NoComment,
1587 IgnoreEmptyComment,
1588};1593};
15891594
1590fn renderToken(tree: &ast.Tree, stream: var, token_index: ast.TokenIndex, indent: usize, space: Space) (@typeOf(stream).Child.Error || Error)!void {1595fn renderToken(tree: &ast.Tree, stream: var, token_index: ast.TokenIndex, indent: usize, space: Space) (@typeOf(stream).Child.Error || Error)!void {
...@@ -1604,7 +1609,7 @@ fn renderToken(tree: &ast.Tree, stream: var, token_index: ast.TokenIndex, indent...@@ -1604,7 +1609,7 @@ fn renderToken(tree: &ast.Tree, stream: var, token_index: ast.TokenIndex, indent
1604 return stream.write("\n");1609 return stream.write("\n");
1605 }1610 }
1606 },1611 },
1607 Space.Space, Space.IgnoreEmptyComment => return stream.writeByte(' '),1612 Space.Space => return stream.writeByte(' '),
1608 Space.NoComment => unreachable,1613 Space.NoComment => unreachable,
1609 }1614 }
1610 }1615 }
...@@ -1612,7 +1617,6 @@ fn renderToken(tree: &ast.Tree, stream: var, token_index: ast.TokenIndex, indent...@@ -1612,7 +1617,6 @@ fn renderToken(tree: &ast.Tree, stream: var, token_index: ast.TokenIndex, indent
1612 const comment_is_empty = mem.trimRight(u8, tree.tokenSlicePtr(next_token), " ").len == 2;1617 const comment_is_empty = mem.trimRight(u8, tree.tokenSlicePtr(next_token), " ").len == 2;
1613 if (comment_is_empty) {1618 if (comment_is_empty) {
1614 switch (space) {1619 switch (space) {
1615 Space.IgnoreEmptyComment => return stream.writeByte(' '),
1616 Space.Newline => return stream.writeByte('\n'),1620 Space.Newline => return stream.writeByte('\n'),
1617 else => {},1621 else => {},
1618 }1622 }
...@@ -1644,7 +1648,7 @@ fn renderToken(tree: &ast.Tree, stream: var, token_index: ast.TokenIndex, indent...@@ -1644,7 +1648,7 @@ fn renderToken(tree: &ast.Tree, stream: var, token_index: ast.TokenIndex, indent
1644 }1648 }
1645 },1649 },
1646 Space.NoNewline => {},1650 Space.NoNewline => {},
1647 Space.NoComment, Space.IgnoreEmptyComment => unreachable,1651 Space.NoComment => unreachable,
1648 }1652 }
1649 return;1653 return;
1650 }1654 }
...@@ -1681,7 +1685,7 @@ fn renderToken(tree: &ast.Tree, stream: var, token_index: ast.TokenIndex, indent...@@ -1681,7 +1685,7 @@ fn renderToken(tree: &ast.Tree, stream: var, token_index: ast.TokenIndex, indent
1681 try stream.writeByteNTimes(' ', next_line_indent);1685 try stream.writeByteNTimes(' ', next_line_indent);
1682 },1686 },
1683 Space.NoNewline => {},1687 Space.NoNewline => {},
1684 Space.NoComment, Space.IgnoreEmptyComment => unreachable,1688 Space.NoComment => unreachable,
1685 }1689 }
1686 return;1690 return;
1687 }1691 }
...@@ -1720,27 +1724,22 @@ fn renderTrailingComma(allocator: &mem.Allocator, stream: var, tree: &ast.Tree,...@@ -1720,27 +1724,22 @@ fn renderTrailingComma(allocator: &mem.Allocator, stream: var, tree: &ast.Tree,
1720 }1724 }
1721}1725}
17221726
1723fn renderTrailingCommaAndEmptyComment(allocator: &mem.Allocator, stream: var, tree: &ast.Tree, indent: usize, base: &ast.Node) (@typeOf(stream).Child.Error || Error)!void1727fn renderTokenAndTrailingComma(tree: &ast.Tree, stream: var, token_index: ast.TokenIndex, indent: usize, space: Space) (@typeOf(stream).Child.Error || Error)!void {
1724{1728 const end_token = token_index + 1;
1725 const end_token = base.lastToken() + 1;
1726 switch (tree.tokens.at(end_token).id) {1729 switch (tree.tokens.at(end_token).id) {
1727 Token.Id.Comma => {1730 Token.Id.Comma => {
1728 try renderExpression(allocator, stream, tree, indent, base, Space.None);1731 try renderToken(tree, stream, token_index, indent, Space.None);
1729 try renderToken(tree, stream, end_token, indent, Space.Space); // ,1732 try renderToken(tree, stream, end_token, indent, 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 }
1735 },1733 },
1736 Token.Id.LineComment => {1734 Token.Id.LineComment => {
1737 try renderExpression(allocator, stream, tree, indent, base, Space.NoComment);1735 try renderToken(tree, stream, token_index, indent, Space.NoComment);
1738 try stream.write(", ");1736 try stream.write(", ");
1739 try renderToken(tree, stream, end_token, indent, Space.Newline);1737 try renderToken(tree, stream, end_token, indent, space);
1740 },1738 },
1741 else => {1739 else => {
1742 try renderExpression(allocator, stream, tree, indent, base, Space.None);1740 try renderToken(tree, stream, token_index, indent, Space.None);
1743 try stream.write(", //\n");1741 try stream.write(",\n");
1742 assert(space == Space.Newline);
1744 },1743 },
1745 }1744 }
1746}1745}