Commit f34abbf260

LemonBoy <thatlemon@gmail.com>
2020-02-01 14:43:31
fmt: Handle declarations in line with the opening brace
1 parent 3640c68
Changed files (2)
lib/std/zig/parser_test.zig
@@ -992,12 +992,10 @@ test "zig fmt: empty block with only comment" {
 }
 
 test "zig fmt: no trailing comma on struct decl" {
-    try testTransform(
+    try testCanonical(
         \\const RoundParam = struct {
         \\    k: usize, s: u32, t: u32
         \\};
-    ,
-        \\const RoundParam = struct { k: usize, s: u32, t: u32 };
         \\
     );
 }
lib/std/zig/render.zig
@@ -1179,6 +1179,12 @@ fn renderExpression(
                 break :blk tree.tokens.at(maybe_comma).id == .Comma;
             };
 
+            // Check if the first declaration and the { are on the same line
+            const src_has_newline = !tree.tokensOnSameLine(
+                container_decl.fields_and_decls.at(0).*.firstToken(),
+                container_decl.rbrace_token,
+            );
+
             // We can only print all the elements in-line if all the
             // declarations inside are fields
             const src_has_only_fields = blk: {
@@ -1205,6 +1211,19 @@ fn renderExpression(
                 }
 
                 try stream.writeByteNTimes(' ', indent);
+            } else if (src_has_newline) {
+                // All the declarations on the same line, but place the items on
+                // their own line
+                try renderToken(tree, stream, container_decl.lbrace_token, indent, start_col, .Newline); // {
+
+                const new_indent = indent + indent_delta;
+                try stream.writeByteNTimes(' ', new_indent);
+
+                var it = container_decl.fields_and_decls.iterator(0);
+                while (it.next()) |decl| {
+                    const space_after_decl: Space = if (it.peek() == null) .Newline else .Space;
+                    try renderContainerDecl(allocator, stream, tree, new_indent, start_col, decl.*, space_after_decl);
+                }
             } else {
                 // All the declarations on the same line
                 try renderToken(tree, stream, container_decl.lbrace_token, indent, start_col, .Space); // {