aboutsummaryrefslogtreecommitdiff
path: root/lib/std
diff options
context:
space:
mode:
authorIsaac Freund <ifreund@ifreund.xyz>2021-02-23 19:17:11 +0100
committerIsaac Freund <ifreund@ifreund.xyz>2021-02-23 19:17:11 +0100
commit0f24b61ed543ad4879c5f9ef607bd856ce016f75 (patch)
tree985d39d41f4dfe8612c02f473b58cb07e130650d /lib/std
parent5820bd0e64ce58cca045a5dfe5ba03d9979eece8 (diff)
downloadzig-0f24b61ed543ad4879c5f9ef607bd856ce016f75.tar.gz
zig-0f24b61ed543ad4879c5f9ef607bd856ce016f75.zip
zig fmt: insert trailing comma in struct init with comment
Diffstat (limited to 'lib/std')
-rw-r--r--lib/std/zig/parser_test.zig51
-rw-r--r--lib/std/zig/render.zig22
2 files changed, 37 insertions, 36 deletions
diff --git a/lib/std/zig/parser_test.zig b/lib/std/zig/parser_test.zig
index 825a144b61..903528c711 100644
--- a/lib/std/zig/parser_test.zig
+++ b/lib/std/zig/parser_test.zig
@@ -3552,31 +3552,32 @@ test "zig fmt: comment after params" {
// );
//}
-//test "zig fmt: comments at several places in struct init" {
-// try testTransform(
-// \\var bar = Bar{
-// \\ .x = 10, // test
-// \\ .y = "test"
-// \\ // test
-// \\};
-// \\
-// ,
-// \\var bar = Bar{
-// \\ .x = 10, // test
-// \\ .y = "test", // test
-// \\};
-// \\
-// );
-//
-// try testCanonical(
-// \\var bar = Bar{ // test
-// \\ .x = 10, // test
-// \\ .y = "test",
-// \\ // test
-// \\};
-// \\
-// );
-//}
+test "zig fmt: comments at several places in struct init" {
+ try testTransform(
+ \\var bar = Bar{
+ \\ .x = 10, // test
+ \\ .y = "test"
+ \\ // test
+ \\};
+ \\
+ ,
+ \\var bar = Bar{
+ \\ .x = 10, // test
+ \\ .y = "test",
+ \\ // test
+ \\};
+ \\
+ );
+
+ try testCanonical(
+ \\var bar = Bar{ // test
+ \\ .x = 10, // test
+ \\ .y = "test",
+ \\ // test
+ \\};
+ \\
+ );
+}
test "zig fmt: container doc comments" {
try testCanonical(
diff --git a/lib/std/zig/render.zig b/lib/std/zig/render.zig
index acb881164e..be807a05b6 100644
--- a/lib/std/zig/render.zig
+++ b/lib/std/zig/render.zig
@@ -411,18 +411,18 @@ fn renderExpression(gpa: *Allocator, ais: *Ais, tree: ast.Tree, node: ast.Node.I
.struct_init_one, .struct_init_one_comma => {
var fields: [1]ast.Node.Index = undefined;
- return renderStructInit(gpa, ais, tree, tree.structInitOne(&fields, node), space);
+ return renderStructInit(gpa, ais, tree, node, tree.structInitOne(&fields, node), space);
},
.struct_init_dot_two, .struct_init_dot_two_comma => {
var fields: [2]ast.Node.Index = undefined;
- return renderStructInit(gpa, ais, tree, tree.structInitDotTwo(&fields, node), space);
+ return renderStructInit(gpa, ais, tree, node, tree.structInitDotTwo(&fields, node), space);
},
.struct_init_dot,
.struct_init_dot_comma,
- => return renderStructInit(gpa, ais, tree, tree.structInitDot(node), space),
+ => return renderStructInit(gpa, ais, tree, node, tree.structInitDot(node), space),
.struct_init,
.struct_init_comma,
- => return renderStructInit(gpa, ais, tree, tree.structInit(node), space),
+ => return renderStructInit(gpa, ais, tree, node, tree.structInit(node), space),
.call_one, .call_one_comma, .async_call_one, .async_call_one_comma => {
var params: [1]ast.Node.Index = undefined;
@@ -1564,11 +1564,11 @@ fn renderBlock(
try renderToken(ais, tree, tree.lastToken(block_node), space); // rbrace
}
-// TODO: handle comments between fields
fn renderStructInit(
gpa: *Allocator,
ais: *Ais,
tree: ast.Tree,
+ struct_node: ast.Node.Index,
struct_init: ast.full.StructInit,
space: Space,
) Error!void {
@@ -1582,9 +1582,10 @@ fn renderStructInit(
try renderToken(ais, tree, struct_init.ast.lbrace, .none); // lbrace
return renderToken(ais, tree, struct_init.ast.lbrace + 1, space); // rbrace
}
- const last_field = struct_init.ast.fields[struct_init.ast.fields.len - 1];
- const last_field_token = tree.lastToken(last_field);
- if (token_tags[last_field_token + 1] == .comma) {
+
+ const rbrace = tree.lastToken(struct_node);
+ const trailing_comma = token_tags[rbrace - 1] == .comma;
+ if (trailing_comma or hasComment(tree, struct_init.ast.lbrace, rbrace)) {
// Render one field init per line.
ais.pushIndentNextLine();
try renderToken(ais, tree, struct_init.ast.lbrace, .newline);
@@ -1604,7 +1605,6 @@ fn renderStructInit(
}
ais.popIndent();
- return renderToken(ais, tree, last_field_token + 2, space); // rbrace
} else {
// Render all on one line, no trailing comma.
try renderToken(ais, tree, struct_init.ast.lbrace, .space);
@@ -1616,9 +1616,9 @@ fn renderStructInit(
try renderToken(ais, tree, init_token - 1, .space); // =
try renderExpression(gpa, ais, tree, field_init, .comma_space);
}
-
- return renderToken(ais, tree, last_field_token + 1, space); // rbrace
}
+
+ return renderToken(ais, tree, rbrace, space);
}
// TODO: handle comments between elements