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
This commit is contained in:
Andrew Kelley 2018-05-28 16:23:33 -04:00
parent 3fed10883b
commit 122a74724c
2 changed files with 55 additions and 76 deletions

View File

@ -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', '-' };
\\}
\\
);

View File

@ -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;
i = 1;
try renderToken(tree, stream, comma, new_indent, Space.NoIndent); // ,
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);
},
}
},