| ... | @@ -717,24 +717,54 @@ fn renderExpression( | ... | @@ -717,24 +717,54 @@ fn renderExpression( |
| 717 | }; | 717 | }; |
| 718 | | 718 | |
| 719 | if (maybe_row_size) |row_size| { | 719 | if (maybe_row_size) |row_size| { |
| | 720 | // A place to store the width of each expression and its column's maximum |
| | 721 | var widths = try allocator.alloc(usize, exprs.len + row_size); |
| | 722 | defer allocator.free(widths); |
| | 723 | mem.set(usize, widths, 0); |
| | 724 | |
| | 725 | var expr_widths = widths[0 .. widths.len - row_size]; |
| | 726 | var column_widths = widths[widths.len - row_size ..]; |
| | 727 | |
| | 728 | // Null stream for counting the printed length of each expression |
| | 729 | var null_stream = std.io.NullOutStream.init(); |
| | 730 | var counting_stream = std.io.CountingOutStream(std.io.NullOutStream.Error).init(&null_stream.stream); |
| | 731 | |
| | 732 | var it = exprs.iterator(0); |
| | 733 | var i: usize = 0; |
| | 734 | |
| | 735 | while (it.next()) |expr| : (i += 1) { |
| | 736 | counting_stream.bytes_written = 0; |
| | 737 | var dummy_col: usize = 0; |
| | 738 | try renderExpression(allocator, &counting_stream.stream, tree, 0, &dummy_col, expr.*, Space.None); |
| | 739 | const width = counting_stream.bytes_written; |
| | 740 | const col = i % row_size; |
| | 741 | column_widths[col] = std.math.max(column_widths[col], width); |
| | 742 | expr_widths[i] = width; |
| | 743 | } |
| | 744 | |
| 720 | const new_indent = indent + indent_delta; | 745 | const new_indent = indent + indent_delta; |
| 721 | try renderToken(tree, stream, lbrace, new_indent, start_col, Space.Newline); | 746 | try renderToken(tree, stream, lbrace, new_indent, start_col, Space.Newline); |
| 722 | try stream.writeByteNTimes(' ', new_indent); | 747 | try stream.writeByteNTimes(' ', new_indent); |
| 723 | | 748 | |
| 724 | var it = exprs.iterator(0); | 749 | it.set(0); |
| 725 | var i: usize = 1; | 750 | i = 0; |
| 726 | while (it.next()) |expr| { | 751 | var col: usize = 1; |
| | 752 | while (it.next()) |expr| : (i += 1) { |
| 727 | if (it.peek()) |next_expr| { | 753 | if (it.peek()) |next_expr| { |
| 728 | try renderExpression(allocator, stream, tree, new_indent, start_col, expr.*, Space.None); | 754 | try renderExpression(allocator, stream, tree, new_indent, start_col, expr.*, Space.None); |
| 729 | | 755 | |
| 730 | const comma = tree.nextToken(expr.*.lastToken()); | 756 | const comma = tree.nextToken(expr.*.lastToken()); |
| 731 | | 757 | |
| 732 | if (i != row_size) { | 758 | if (col != row_size) { |
| 733 | try renderToken(tree, stream, comma, new_indent, start_col, Space.Space); // , | 759 | try renderToken(tree, stream, comma, new_indent, start_col, Space.Space); // , |
| 734 | i += 1; | 760 | |
| | 761 | const padding = column_widths[i % row_size] - expr_widths[i]; |
| | 762 | try stream.writeByteNTimes(' ', padding); |
| | 763 | |
| | 764 | col += 1; |
| 735 | continue; | 765 | continue; |
| 736 | } | 766 | } |
| 737 | i = 1; | 767 | col = 1; |
| 738 | | 768 | |
| 739 | try renderToken(tree, stream, comma, new_indent, start_col, Space.Newline); // , | 769 | try renderToken(tree, stream, comma, new_indent, start_col, Space.Newline); // , |
| 740 | | 770 | |