Commit c9bc8b9d0c

Vexu <git@vexu.eu>
2020-12-09 11:58:04
zig fmt: improve var decl initializer formatting
1 parent fd4c98c
Changed files (2)
lib/std/zig/parser_test.zig
@@ -274,6 +274,51 @@ test "recovery: missing block after for/while loops" {
     });
 }
 
+test "zig fmt: respect line breaks after var declarations" {
+    try testCanonical(
+        \\const crc =
+        \\    lookup_tables[0][p[7]] ^
+        \\    lookup_tables[1][p[6]] ^
+        \\    lookup_tables[2][p[5]] ^
+        \\    lookup_tables[3][p[4]] ^
+        \\    lookup_tables[4][@truncate(u8, self.crc >> 24)] ^
+        \\    lookup_tables[5][@truncate(u8, self.crc >> 16)] ^
+        \\    lookup_tables[6][@truncate(u8, self.crc >> 8)] ^
+        \\    lookup_tables[7][@truncate(u8, self.crc >> 0)];
+        \\
+    );    
+}
+
+test "zig fmt: multiline string mixed with comments" {
+    try testCanonical(
+        \\const s1 =
+        \\    //\\one
+        \\    \\two)
+        \\    \\three
+        \\;
+        \\const s2 =
+        \\    \\one
+        \\    \\two)
+        \\    //\\three
+        \\;
+        \\const s3 =
+        \\    \\one
+        \\    //\\two)
+        \\    \\three
+        \\;
+        \\const s4 =
+        \\    \\one
+        \\    //\\two
+        \\    \\three
+        \\    //\\four
+        \\    \\five
+        \\;
+        \\const a =
+        \\    1;
+        \\
+    );
+}
+
 test "zig fmt: empty file" {
     try testCanonical(
         \\
@@ -3224,7 +3269,8 @@ test "zig fmt: integer literals with underscore separators" {
         \\ 1_234_567
         \\ +(0b0_1-0o7_0+0xff_FF ) +  0_0;
     ,
-        \\const x = 1_234_567 + (0b0_1 - 0o7_0 + 0xff_FF) + 0_0;
+        \\const x =
+        \\    1_234_567 + (0b0_1 - 0o7_0 + 0xff_FF) + 0_0;
         \\
     );
 }
lib/std/zig/render.zig
@@ -2209,10 +2209,10 @@ fn renderAsmOutput(
     try ais.writer().writeAll(" (");
 
     switch (asm_output.kind) {
-        ast.Node.Asm.Output.Kind.Variable => |variable_name| {
+        .Variable => |variable_name| {
             try renderExpression(allocator, ais, tree, &variable_name.base, Space.None);
         },
-        ast.Node.Asm.Output.Kind.Return => |return_type| {
+        .Return => |return_type| {
             try ais.writer().writeAll("-> ");
             try renderExpression(allocator, ais, tree, return_type, Space.None);
         },
@@ -2304,8 +2304,17 @@ fn renderVarDecl(
     }
 
     if (var_decl.getInitNode()) |init_node| {
-        const s = if (init_node.tag == .MultilineStringLiteral) Space.None else Space.Space;
-        try renderToken(tree, ais, var_decl.getEqToken().?, s); // =
+        const eq_token = var_decl.getEqToken().?;
+        const eq_space = blk: {
+            const loc = tree.tokenLocation(tree.token_locs[eq_token].end, tree.nextToken(eq_token));
+            break :blk if (loc.line == 0) Space.Space else Space.Newline;
+        };
+
+        {
+            ais.pushIndent();
+            defer ais.popIndent();
+            try renderToken(tree, ais, eq_token, eq_space); // =
+        }
         ais.pushIndentOneShot();
         try renderExpression(allocator, ais, tree, init_node, Space.None);
     }
@@ -2470,20 +2479,20 @@ fn renderTokenOffset(
 
     var loc = tree.tokenLocationLoc(token_loc.end, next_token_loc);
     if (loc.line == 0) {
-        try ais.writer().print(" {}", .{mem.trimRight(u8, tree.tokenSliceLoc(next_token_loc), " ")});
+        if (tree.token_ids[token_index] != .MultilineStringLiteralLine) {
+            try ais.writer().writeByte(' ');
+        }
+        try ais.writer().writeAll(mem.trimRight(u8, tree.tokenSliceLoc(next_token_loc), " "));
         offset = 2;
         token_loc = next_token_loc;
         next_token_loc = tree.token_locs[token_index + offset];
         next_token_id = tree.token_ids[token_index + offset];
         if (next_token_id != .LineComment) {
             switch (space) {
-                Space.None, Space.Space => {
-                    try ais.insertNewline();
-                },
-                Space.SpaceOrOutdent => {
+                .None, .Space, .SpaceOrOutdent => {
                     try ais.insertNewline();
                 },
-                Space.Newline => {
+                .Newline => {
                     if (next_token_id == .MultilineStringLiteralLine) {
                         return;
                     } else {
@@ -2491,8 +2500,8 @@ fn renderTokenOffset(
                         return;
                     }
                 },
-                Space.NoNewline => {},
-                Space.NoComment, Space.Comma, Space.BlockStart => unreachable,
+                .NoNewline => {},
+                .NoComment, .Comma, .BlockStart => unreachable,
             }
             return;
         }
@@ -2513,7 +2522,7 @@ fn renderTokenOffset(
         next_token_id = tree.token_ids[token_index + offset];
         if (next_token_id != .LineComment) {
             switch (space) {
-                Space.Newline => {
+                .Newline => {
                     if (next_token_id == .MultilineStringLiteralLine) {
                         return;
                     } else {
@@ -2521,14 +2530,11 @@ fn renderTokenOffset(
                         return;
                     }
                 },
-                Space.None, Space.Space => {
-                    try ais.insertNewline();
-                },
-                Space.SpaceOrOutdent => {
+                .None, .Space, .SpaceOrOutdent => {
                     try ais.insertNewline();
                 },
-                Space.NoNewline => {},
-                Space.NoComment, Space.Comma, Space.BlockStart => unreachable,
+                .NoNewline => {},
+                .NoComment, .Comma, .BlockStart => unreachable,
             }
             return;
         }