authorgravatar for timonkruiper@gmail.comTimon Kruiper <timonkruiper@gmail.com> 2019-05-30 00:11:16+02:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2019-05-29 19:56:28-04:00
log4e1f3a9ba35530f129e43e11ac0676c562e4cb98
tree96ed9da1d59fb142b9f989f42f4ba8f30b717f99
parent7bfae39c5ccbf7d39a3fe955c47aaa03f9b637a2

Correct formatting for multiline string in arrays


2 files changed, 36 insertions(+), 4 deletions(-)

std/zig/parser_test.zig+19
...@@ -2209,6 +2209,25 @@ test "zig fmt: inline asm parameter alignment" {...@@ -2209,6 +2209,25 @@ test "zig fmt: inline asm parameter alignment" {
2209 );2209 );
2210}2210}
22112211
2212test "zig fmt: multiline string in array" {
2213 try testCanonical(
2214 \\const Foo = [][]const u8{
2215 \\ \\aaa
2216 \\,
2217 \\ \\bbb
2218 \\};
2219 \\
2220 \\fn bar() void {
2221 \\ const Foo = [][]const u8{
2222 \\ \\aaa
2223 \\ ,
2224 \\ \\bbb
2225 \\ };
2226 \\}
2227 \\
2228 );
2229}
2230
2212const std = @import("std");2231const std = @import("std");
2213const mem = std.mem;2232const mem = std.mem;
2214const warn = std.debug.warn;2233const warn = std.debug.warn;
std/zig/render.zig+17-4
...@@ -726,15 +726,21 @@ fn renderExpression(...@@ -726,15 +726,21 @@ fn renderExpression(
726 expr_widths[i] = width;726 expr_widths[i] = width;
727 }727 }
728728
729 const new_indent = indent + indent_delta;729 var new_indent = indent + indent_delta;
730 try renderToken(tree, stream, lbrace, new_indent, start_col, Space.Newline);730 try renderToken(tree, stream, lbrace, new_indent, start_col, Space.Newline);
731 try stream.writeByteNTimes(' ', new_indent);731
732 if (tree.tokens.at(lbrace + 1).id != Token.Id.MultilineStringLiteralLine) {
733 try stream.writeByteNTimes(' ', new_indent);
734 }
732735
733 it.set(0);736 it.set(0);
734 i = 0;737 i = 0;
735 var col: usize = 1;738 var col: usize = 1;
736 while (it.next()) |expr| : (i += 1) {739 while (it.next()) |expr| : (i += 1) {
737 if (it.peek()) |next_expr| {740 if (it.peek()) |next_expr| {
741 if (expr.*.id == ast.Node.Id.MultilineStringLiteral) {
742 new_indent -= indent_delta;
743 }
738 try renderExpression(allocator, stream, tree, new_indent, start_col, expr.*, Space.None);744 try renderExpression(allocator, stream, tree, new_indent, start_col, expr.*, Space.None);
739745
740 const comma = tree.nextToken(expr.*.lastToken());746 const comma = tree.nextToken(expr.*.lastToken());
...@@ -753,12 +759,17 @@ fn renderExpression(...@@ -753,12 +759,17 @@ fn renderExpression(
753 try renderToken(tree, stream, comma, new_indent, start_col, Space.Newline); // ,759 try renderToken(tree, stream, comma, new_indent, start_col, Space.Newline); // ,
754760
755 try renderExtraNewline(tree, stream, start_col, next_expr.*);761 try renderExtraNewline(tree, stream, start_col, next_expr.*);
756 try stream.writeByteNTimes(' ', new_indent);762 if (next_expr.*.id != ast.Node.Id.MultilineStringLiteral) {
763 try stream.writeByteNTimes(' ', new_indent);
764 }
757 } else {765 } else {
758 try renderExpression(allocator, stream, tree, new_indent, start_col, expr.*, Space.Comma); // ,766 try renderExpression(allocator, stream, tree, new_indent, start_col, expr.*, Space.Comma); // ,
759 }767 }
760 }768 }
761 try stream.writeByteNTimes(' ', indent);769 const last_node = it.prev() orelse unreachable;
770 if (last_node.*.id != ast.Node.Id.MultilineStringLiteral) {
771 try stream.writeByteNTimes(' ', indent);
772 }
762 return renderToken(tree, stream, suffix_op.rtoken, indent, start_col, space);773 return renderToken(tree, stream, suffix_op.rtoken, indent, start_col, space);
763 } else {774 } else {
764 try renderToken(tree, stream, lbrace, indent, start_col, Space.Space);775 try renderToken(tree, stream, lbrace, indent, start_col, Space.Space);
...@@ -1039,6 +1050,8 @@ fn renderExpression(...@@ -1039,6 +1050,8 @@ fn renderExpression(
1039 },1050 },
10401051
1041 ast.Node.Id.MultilineStringLiteral => {1052 ast.Node.Id.MultilineStringLiteral => {
1053 // TODO: Don't indent in this function, but let the caller indent.
1054 // If this has been implemented, a lot of hacky solutions in i.e. ArrayInit and FunctionCall can be removed
1042 const multiline_str_literal = @fieldParentPtr(ast.Node.MultilineStringLiteral, "base", base);1055 const multiline_str_literal = @fieldParentPtr(ast.Node.MultilineStringLiteral, "base", base);
10431056
1044 var skip_first_indent = true;1057 var skip_first_indent = true;