Commit 122a74724c

Andrew Kelley <superjoe30@gmail.com>
2018-05-28 22:23:33
zig fmt: use simple newlines rather than empty comments to hint
now the first row of an array literal is the hint to zig fmt for how long each row should be. See #1003
1 parent 3fed108
Changed files (2)
std/zig/parser_test.zig
@@ -29,34 +29,36 @@ test "zig fmt: array literal with hint" {
         \\    6,
         \\    7 };
         \\const a = []u8{
-        \\    1, 2,
+        \\    1,
+        \\    2,
         \\    3, 4, //
         \\    5, 6, //
         \\    7, 8, //
         \\};
     ,
         \\const a = []u8{
-        \\    1, 2, //
-        \\    3, 4, //
-        \\    5, 6, //
+        \\    1, 2,
+        \\    3, 4,
+        \\    5, 6,
         \\    7,
         \\};
         \\const a = []u8{
-        \\    1, 2, //
-        \\    3, 4, //
-        \\    5, 6, //
-        \\    7, 8, //
+        \\    1, 2,
+        \\    3, 4,
+        \\    5, 6,
+        \\    7, 8,
         \\};
         \\const a = []u8{
-        \\    1, 2, //
-        \\    3, 4, //
+        \\    1, 2,
+        \\    3, 4,
         \\    5, 6, // blah
-        \\    7, 8, //
+        \\    7, 8,
         \\};
         \\const a = []u8{
-        \\    1, 2, //
-        \\    3, 4, //
-        \\    5, 6, //
+        \\    1, 2,
+        \\    3, //
+        \\        4,
+        \\    5, 6,
         \\    7,
         \\};
         \\const a = []u8{
@@ -231,12 +233,18 @@ test "zig fmt: add trailing comma to array literal" {
         \\   };
         \\    return []u16{'m', 's', 'y', 's',
         \\      '-'};
+        \\    return []u16{'m', 's', 'y', 's', '-'};
         \\}
     ,
         \\comptime {
-        \\    return []u16{ 'm', 's', 'y', 's', '-' // hi
+        \\    return []u16{
+        \\        'm', 's', 'y', 's', '-', // hi
+        \\    };
+        \\    return []u16{
+        \\        'm', 's', 'y', 's',
+        \\        '-',
         \\    };
-        \\    return []u16{ 'm', 's', 'y', 's', '-'};
+        \\    return []u16{ 'm', 's', 'y', 's', '-' };
         \\}
         \\
     );
std/zig/render.zig
@@ -534,36 +534,42 @@ fn renderExpression(allocator: &mem.Allocator, stream: var, tree: &ast.Tree, ind
 
                     // scan to find row size
                     const maybe_row_size: ?usize = blk: {
-                        var count: usize = 0;
+                        var count: usize = 1;
                         var it = exprs.iterator(0);
-                        var prev_token = (??it.peek()).*.lastToken() + 1;
-                        while (it.next()) |expr| {
-                            const expr_last_token = expr.*.lastToken() + 1;
-                            const next_token = tree.tokens.at(expr_last_token + 1);
-                            const loc = tree.tokenLocationPtr(tree.tokens.at(prev_token).end, next_token);
-                            if (loc.line != 0) break :blk null;
-                            if (next_token.id == Token.Id.LineComment) {
-                                const trimmed = mem.trimRight(u8, tree.tokenSlicePtr(next_token), " ");
-                                if (trimmed.len == 2) {
-                                    break :blk count;
-                                } else {
-                                    break :blk null;
+                        while (true) {
+                            const expr = (??it.next()).*;
+                            if (it.peek()) |next_expr| {
+                                const expr_last_token = expr.*.lastToken() + 1;
+                                const loc = tree.tokenLocation(tree.tokens.at(expr_last_token).end, next_expr.*.firstToken());
+                                if (loc.line != 0) break :blk count;
+                                count += 1;
+                            } else {
+                                const expr_last_token = expr.*.lastToken();
+                                const loc = tree.tokenLocation(tree.tokens.at(expr_last_token).end, suffix_op.rtoken);
+                                if (loc.line == 0) {
+                                    // all on one line
+                                    const src_has_trailing_comma = trailblk: {
+                                        const maybe_comma = tree.prevToken(suffix_op.rtoken);
+                                        break :trailblk tree.tokens.at(maybe_comma).id == Token.Id.Comma;
+                                    };
+                                    if (src_has_trailing_comma) {
+                                        break :blk 1; // force row size 1
+                                    } else {
+                                        break :blk null; // no newlines
+                                    }
                                 }
+                                break :blk count;
                             }
-                            prev_token = expr_last_token;
-                            count += 1;
                         }
-                        break :blk null;
                     };
 
-
                     if (maybe_row_size) |row_size| {
                         const new_indent = indent + indent_delta;
                         try renderToken(tree, stream, lbrace, new_indent, Space.Newline);
                         try stream.writeByteNTimes(' ', new_indent);
 
                         var it = exprs.iterator(0);
-                        var i: usize = 0;
+                        var i: usize = 1;
                         while (it.next()) |expr| {
                             if (it.peek()) |next_expr| {
                                 try renderExpression(allocator, stream, tree, new_indent, expr.*, Space.None);
@@ -571,23 +577,16 @@ fn renderExpression(allocator: &mem.Allocator, stream: var, tree: &ast.Tree, ind
                                 const comma = tree.nextToken(expr.*.lastToken());
 
                                 if (i != row_size) {
-                                    try renderToken(tree, stream, comma, new_indent, Space.IgnoreEmptyComment); // ,
+                                    try renderToken(tree, stream, comma, new_indent, Space.Space); // ,
                                     i += 1;
                                     continue;
                                 }
-                                i = 0;
-
-                                try renderToken(tree, stream, comma, new_indent, Space.NoIndent); // ,
+                                i = 1;
 
-                                const next_token = tree.tokens.at(comma + 1);
-                                if (next_token.id != Token.Id.LineComment) {
-                                    try stream.print(" //\n");
-                                }
+                                try renderToken(tree, stream, comma, new_indent, Space.Newline); // ,
 
                                 try renderExtraNewline(tree, stream, next_expr.*);
                                 try stream.writeByteNTimes(' ', new_indent);
-                            } else if (i == row_size) {
-                                try renderTrailingCommaAndEmptyComment(allocator, stream, tree, new_indent, expr.*); // , //
                             } else {
                                 try renderTrailingComma(allocator, stream, tree, new_indent, expr.*, Space.Newline); // ,
                             }
@@ -595,50 +594,22 @@ fn renderExpression(allocator: &mem.Allocator, stream: var, tree: &ast.Tree, ind
                         try stream.writeByteNTimes(' ', indent);
                         try renderToken(tree, stream, suffix_op.rtoken, indent, space);
                         return;
-                    }
-
-                    const src_has_trailing_comma = blk: {
-                        const maybe_comma = tree.prevToken(suffix_op.rtoken);
-                        break :blk tree.tokens.at(maybe_comma).id == Token.Id.Comma;
-                    };
-                    if (!src_has_trailing_comma) {
+                    } else {
                         try renderToken(tree, stream, lbrace, indent, Space.Space);
                         var it = exprs.iterator(0);
                         while (it.next()) |expr| {
-                            try renderExpression(allocator, stream, tree, indent, expr.*, Space.None);
-
                             if (it.peek()) |next_expr| {
+                                try renderExpression(allocator, stream, tree, indent, expr.*, Space.None);
                                 const comma = tree.nextToken(expr.*.lastToken());
                                 try renderToken(tree, stream, comma, indent, Space.Space); // ,
+                            } else {
+                                try renderExpression(allocator, stream, tree, indent, expr.*, Space.Space);
                             }
                         }
 
                         try renderToken(tree, stream, suffix_op.rtoken, indent, space);
                         return;
                     }
-
-                    const new_indent = indent + indent_delta;
-                    try renderToken(tree, stream, lbrace, new_indent, Space.Newline);
-                    try stream.writeByteNTimes(' ', new_indent);
-
-                    var it = exprs.iterator(0);
-                    while (it.next()) |expr| {
-
-                        if (it.peek()) |next_expr| {
-                            try renderExpression(allocator, stream, tree, new_indent, expr.*, Space.None);
-
-                            const comma = tree.nextToken(expr.*.lastToken());
-                            try renderToken(tree, stream, comma, new_indent, Space.Newline); // ,
-
-                            try renderExtraNewline(tree, stream, next_expr.*);
-                            try stream.writeByteNTimes(' ', new_indent);
-                        } else {
-                            try renderTrailingComma(allocator, stream, tree, new_indent, expr.*, Space.Newline);
-                        }
-                    }
-
-                    try stream.writeByteNTimes(' ', indent);
-                    try renderToken(tree, stream, suffix_op.rtoken, indent, space);
                 },
             }
         },