Skip to content

Commit 349365d

Browse files
committed
zig fmt: better multiline string formatting
1 parent cabf7fa commit 349365d

File tree

3 files changed

+59
-18
lines changed

3 files changed

+59
-18
lines changed

std/zig/parser_test.zig

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,32 @@
1+
test "zig fmt: multiline string with backslash at end of line" {
2+
try testCanonical(
3+
\\comptime {
4+
\\ err(
5+
\\ \\\
6+
\\ );
7+
\\}
8+
\\
9+
);
10+
}
11+
12+
test "zig fmt: multiline string parameter in fn call with trailing comma" {
13+
try testCanonical(
14+
\\fn foo() void {
15+
\\ try stdout.print(
16+
\\ \\ZIG_CMAKE_BINARY_DIR {}
17+
\\ \\ZIG_C_HEADER_FILES {}
18+
\\ \\ZIG_DIA_GUIDS_LIB {}
19+
\\ \\
20+
\\ ,
21+
\\ std.cstr.toSliceConst(c.ZIG_CMAKE_BINARY_DIR),
22+
\\ std.cstr.toSliceConst(c.ZIG_CXX_COMPILER),
23+
\\ std.cstr.toSliceConst(c.ZIG_DIA_GUIDS_LIB),
24+
\\ );
25+
\\}
26+
\\
27+
);
28+
}
29+
130
test "zig fmt: trailing comma on fn call" {
231
try testCanonical(
332
\\comptime {

std/zig/render.zig

Lines changed: 30 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -393,15 +393,21 @@ fn renderExpression(allocator: &mem.Allocator, stream: var, tree: &ast.Tree, ind
393393
var it = call_info.params.iterator(0);
394394
while (true) {
395395
const param_node = ??it.next();
396-
try stream.writeByteNTimes(' ', new_indent);
396+
397+
const param_node_new_indent = if (param_node.*.id == ast.Node.Id.MultilineStringLiteral) blk: {
398+
break :blk indent;
399+
} else blk: {
400+
try stream.writeByteNTimes(' ', new_indent);
401+
break :blk new_indent;
402+
};
397403

398404
if (it.peek()) |next_node| {
399-
try renderExpression(allocator, stream, tree, new_indent, param_node.*, Space.None);
405+
try renderExpression(allocator, stream, tree, param_node_new_indent, param_node.*, Space.None);
400406
const comma = tree.nextToken(param_node.*.lastToken());
401407
try renderToken(tree, stream, comma, new_indent, Space.Newline); // ,
402408
try renderExtraNewline(tree, stream, next_node.*);
403409
} else {
404-
try renderTrailingComma(allocator, stream, tree, new_indent, param_node.*, Space.Newline);
410+
try renderTrailingComma(allocator, stream, tree, param_node_new_indent, param_node.*, Space.Newline);
405411
try stream.writeByteNTimes(' ', indent);
406412
try renderToken(tree, stream, suffix_op.rtoken, indent, space);
407413
return;
@@ -1502,7 +1508,13 @@ fn renderToken(tree: &ast.Tree, stream: var, token_index: ast.TokenIndex, indent
15021508
if (next_token.id != Token.Id.LineComment) {
15031509
switch (space) {
15041510
Space.None, Space.NoNewline, Space.NoIndent => return,
1505-
Space.Newline => return stream.write("\n"),
1511+
Space.Newline => {
1512+
if (next_token.id == Token.Id.MultilineStringLiteralLine) {
1513+
return;
1514+
} else {
1515+
return stream.write("\n");
1516+
}
1517+
},
15061518
Space.Space => return stream.writeByte(' '),
15071519
Space.NoComment => unreachable,
15081520
}
@@ -1526,7 +1538,13 @@ fn renderToken(tree: &ast.Tree, stream: var, token_index: ast.TokenIndex, indent
15261538
};
15271539
try stream.writeByteNTimes(' ', next_line_indent);
15281540
},
1529-
Space.Newline, Space.NoIndent => try stream.write("\n"),
1541+
Space.Newline, Space.NoIndent => {
1542+
if (next_token.id == Token.Id.MultilineStringLiteralLine) {
1543+
return;
1544+
} else {
1545+
return stream.write("\n");
1546+
}
1547+
},
15301548
Space.NoNewline => {},
15311549
Space.NoComment => unreachable,
15321550
}
@@ -1547,7 +1565,13 @@ fn renderToken(tree: &ast.Tree, stream: var, token_index: ast.TokenIndex, indent
15471565
next_token = tree.tokens.at(token_index + offset);
15481566
if (next_token.id != Token.Id.LineComment) {
15491567
switch (space) {
1550-
Space.Newline, Space.NoIndent => try stream.writeByte('\n'),
1568+
Space.Newline, Space.NoIndent => {
1569+
if (next_token.id == Token.Id.MultilineStringLiteralLine) {
1570+
return;
1571+
} else {
1572+
return stream.write("\n");
1573+
}
1574+
},
15511575
Space.None, Space.Space => {
15521576
try stream.writeByte('\n');
15531577

std/zig/tokenizer.zig

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -217,7 +217,6 @@ pub const Tokenizer = struct {
217217
StringLiteral,
218218
StringLiteralBackslash,
219219
MultilineStringLiteralLine,
220-
MultilineStringLiteralLineBackslash,
221220
CharLiteral,
222221
CharLiteralBackslash,
223222
CharLiteralEscape1,
@@ -655,23 +654,13 @@ pub const Tokenizer = struct {
655654
},
656655

657656
State.MultilineStringLiteralLine => switch (c) {
658-
'\\' => {
659-
state = State.MultilineStringLiteralLineBackslash;
660-
},
661657
'\n' => {
662658
self.index += 1;
663659
break;
664660
},
665661
else => self.checkLiteralCharacter(),
666662
},
667663

668-
State.MultilineStringLiteralLineBackslash => switch (c) {
669-
'\n' => break, // Look for this error later.
670-
else => {
671-
state = State.MultilineStringLiteralLine;
672-
},
673-
},
674-
675664
State.Bang => switch (c) {
676665
'=' => {
677666
result.id = Token.Id.BangEqual;
@@ -1010,7 +999,6 @@ pub const Tokenizer = struct {
1010999
State.FloatExponentUnsignedHex,
10111000
State.SawAtSign,
10121001
State.Backslash,
1013-
State.MultilineStringLiteralLineBackslash,
10141002
State.CharLiteral,
10151003
State.CharLiteralBackslash,
10161004
State.CharLiteralEscape1,

0 commit comments

Comments
 (0)