| ... | @@ -726,15 +726,21 @@ fn renderExpression( | ... | @@ -726,15 +726,21 @@ fn renderExpression( |
| 726 | expr_widths[i] = width; | 726 | expr_widths[i] = width; |
| 727 | } | 727 | } |
| 728 | | 728 | |
| 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 | } |
| 732 | | 735 | |
| 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); |
| 739 | | 745 | |
| 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); // , |
| 754 | | 760 | |
| 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 | }, |
| 1040 | | 1051 | |
| 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); |
| 1043 | | 1056 | |
| 1044 | var skip_first_indent = true; | 1057 | var skip_first_indent = true; |