zig fmt: fix extra whitespace with multiline strings

Fixes #13937
This commit is contained in:
yujiri8 2022-12-16 22:24:58 +00:00 committed by GitHub
parent 8da9cc85af
commit 68d2f68ed8
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 107 additions and 72 deletions

View file

@ -5500,6 +5500,35 @@ test "zig fmt: canonicalize symbols (keywords)" {
); );
} }
test "zig fmt: no space before newline before multiline string" {
try testCanonical(
\\const S = struct {
\\ text: []const u8,
\\ comment: []const u8,
\\};
\\
\\test {
\\ const s1 = .{
\\ .text =
\\ \\hello
\\ \\world
\\ ,
\\ .comment = "test",
\\ };
\\ _ = s1;
\\ const s2 = .{
\\ .comment = "test",
\\ .text =
\\ \\hello
\\ \\world
\\ ,
\\ };
\\ _ = s2;
\\}
\\
);
}
// Normalize \xNN and \u{NN} escapes and unicode inside @"" escapes. // Normalize \xNN and \u{NN} escapes and unicode inside @"" escapes.
test "zig fmt: canonicalize symbols (character escapes)" { test "zig fmt: canonicalize symbols (character escapes)" {
try testTransform( try testTransform(

View file

@ -1675,7 +1675,12 @@ fn renderStructInit(
try renderToken(ais, tree, struct_init.ast.lbrace + 1, .none); // . try renderToken(ais, tree, struct_init.ast.lbrace + 1, .none); // .
try renderIdentifier(ais, tree, struct_init.ast.lbrace + 2, .space, .eagerly_unquote); // name try renderIdentifier(ais, tree, struct_init.ast.lbrace + 2, .space, .eagerly_unquote); // name
try renderToken(ais, tree, struct_init.ast.lbrace + 3, .space); // = // Don't output a space after the = if expression is a multiline string,
// since then it will start on the next line.
const nodes = tree.nodes.items(.tag);
const expr = nodes[struct_init.ast.fields[0]];
var space_after_equal: Space = if (expr == .multiline_string_literal) .none else .space;
try renderToken(ais, tree, struct_init.ast.lbrace + 3, space_after_equal); // =
try renderExpression(gpa, ais, tree, struct_init.ast.fields[0], .comma); try renderExpression(gpa, ais, tree, struct_init.ast.fields[0], .comma);
for (struct_init.ast.fields[1..]) |field_init| { for (struct_init.ast.fields[1..]) |field_init| {
@ -1683,7 +1688,8 @@ fn renderStructInit(
try renderExtraNewlineToken(ais, tree, init_token - 3); try renderExtraNewlineToken(ais, tree, init_token - 3);
try renderToken(ais, tree, init_token - 3, .none); // . try renderToken(ais, tree, init_token - 3, .none); // .
try renderIdentifier(ais, tree, init_token - 2, .space, .eagerly_unquote); // name try renderIdentifier(ais, tree, init_token - 2, .space, .eagerly_unquote); // name
try renderToken(ais, tree, init_token - 1, .space); // = space_after_equal = if (nodes[field_init] == .multiline_string_literal) .none else .space;
try renderToken(ais, tree, init_token - 1, space_after_equal); // =
try renderExpression(gpa, ais, tree, field_init, .comma); try renderExpression(gpa, ais, tree, field_init, .comma);
} }