| ... | ... | @@ -747,6 +747,10 @@ fn renderExpression( |
| 747 | 747 | defer allocator.free(widths); |
| 748 | 748 | mem.set(usize, widths, 0); |
| 749 | 749 | |
| 750 | var expr_newlines = try allocator.alloc(bool, row_exprs.len); |
| 751 | defer allocator.free(expr_newlines); |
| 752 | mem.set(bool, expr_newlines, false); |
| 753 | |
| 750 | 754 | var expr_widths = widths[0 .. widths.len - row_size]; |
| 751 | 755 | var column_widths = widths[widths.len - row_size ..]; |
| 752 | 756 | |
| ... | ... | @@ -791,7 +795,7 @@ fn renderExpression( |
| 791 | 795 | var auto_indenting_stream = std.io.autoIndentingStream(indent_delta, counting_stream.writer()); |
| 792 | 796 | |
| 793 | 797 | // Calculate size of columns in current section |
| 794 | | var c: usize = 0; |
| 798 | var column_counter: usize = 0; |
| 795 | 799 | var single_line = true; |
| 796 | 800 | for (section_exprs) |expr, i| { |
| 797 | 801 | if (i + 1 < section_exprs.len) { |
| ... | ... | @@ -800,40 +804,42 @@ fn renderExpression( |
| 800 | 804 | try renderExpression(allocator, &auto_indenting_stream, tree, expr, Space.None); |
| 801 | 805 | const width = @intCast(usize, counting_stream.bytes_written); |
| 802 | 806 | expr_widths[i] = width; |
| 807 | expr_newlines[i] = line_find_stream.byte_found; |
| 803 | 808 | |
| 804 | 809 | if (!line_find_stream.byte_found) { |
| 805 | | const col = c % row_size; |
| 806 | | column_widths[col] = std.math.max(column_widths[col], width); |
| 810 | const column = column_counter % row_size; |
| 811 | column_widths[column] = std.math.max(column_widths[column], width); |
| 807 | 812 | |
| 808 | 813 | const expr_last_token = expr.*.lastToken() + 1; |
| 809 | 814 | const next_expr = section_exprs[i + 1]; |
| 810 | 815 | const loc = tree.tokenLocation(tree.token_locs[expr_last_token].start, next_expr.*.firstToken()); |
| 811 | 816 | if (loc.line == 0) { |
| 812 | | c += 1; |
| 817 | column_counter += 1; |
| 813 | 818 | } else { |
| 814 | 819 | single_line = false; |
| 815 | | c = 0; |
| 820 | column_counter = 0; |
| 816 | 821 | } |
| 817 | 822 | } else { |
| 818 | 823 | single_line = false; |
| 819 | | c = 0; |
| 824 | column_counter = 0; |
| 820 | 825 | } |
| 821 | 826 | } else { |
| 822 | 827 | counting_stream.bytes_written = 0; |
| 823 | 828 | try renderExpression(allocator, &auto_indenting_stream, tree, expr, Space.None); |
| 824 | 829 | const width = @intCast(usize, counting_stream.bytes_written); |
| 825 | 830 | expr_widths[i] = width; |
| 831 | expr_newlines[i] = line_find_stream.byte_found; |
| 826 | 832 | |
| 827 | 833 | if (!line_find_stream.byte_found) { |
| 828 | | const col = c % row_size; |
| 829 | | column_widths[col] = std.math.max(column_widths[col], width); |
| 834 | const column = column_counter % row_size; |
| 835 | column_widths[column] = std.math.max(column_widths[column], width); |
| 830 | 836 | } |
| 831 | 837 | break; |
| 832 | 838 | } |
| 833 | 839 | } |
| 834 | 840 | |
| 835 | 841 | // Render exprs in current section |
| 836 | | c = 0; |
| 842 | column_counter = 0; |
| 837 | 843 | var last_col_index: usize = row_size - 1; |
| 838 | 844 | for (section_exprs) |expr, i| { |
| 839 | 845 | if (i + 1 < section_exprs.len) { |
| ... | ... | @@ -842,18 +848,15 @@ fn renderExpression( |
| 842 | 848 | |
| 843 | 849 | const comma = tree.nextToken(expr.*.lastToken()); |
| 844 | 850 | |
| 845 | | if (c != last_col_index) { |
| 846 | | line_find_stream.byte_found = false; |
| 847 | | try renderExpression(allocator, &auto_indenting_stream, tree, expr, Space.None); |
| 848 | | try renderExpression(allocator, &auto_indenting_stream, tree, next_expr, Space.None); |
| 849 | | if (!line_find_stream.byte_found) { |
| 851 | if (column_counter != last_col_index) { |
| 852 | if (!expr_newlines[i] and !expr_newlines[i + 1]) { |
| 850 | 853 | // Neither the current or next expression is multiline |
| 851 | 854 | try renderToken(tree, ais, comma, Space.Space); // , |
| 852 | | assert(column_widths[c % row_size] >= expr_widths[i]); |
| 853 | | const padding = column_widths[c % row_size] - expr_widths[i]; |
| 855 | assert(column_widths[column_counter % row_size] >= expr_widths[i]); |
| 856 | const padding = column_widths[column_counter % row_size] - expr_widths[i]; |
| 854 | 857 | try ais.writer().writeByteNTimes(' ', padding); |
| 855 | 858 | |
| 856 | | c += 1; |
| 859 | column_counter += 1; |
| 857 | 860 | continue; |
| 858 | 861 | } |
| 859 | 862 | } |
| ... | ... | @@ -862,7 +865,7 @@ fn renderExpression( |
| 862 | 865 | continue; |
| 863 | 866 | } |
| 864 | 867 | |
| 865 | | c = 0; |
| 868 | column_counter = 0; |
| 866 | 869 | try renderToken(tree, ais, comma, Space.Newline); // , |
| 867 | 870 | try renderExtraNewline(tree, ais, next_expr); |
| 868 | 871 | } else { |
| ... | ... | @@ -1091,7 +1094,6 @@ fn renderExpression( |
| 1091 | 1094 | try renderExpression(allocator, ais, tree, param_node, Space.None); |
| 1092 | 1095 | |
| 1093 | 1096 | if (i + 1 < params.len) { |
| 1094 | | const next_param = params[i + 1]; |
| 1095 | 1097 | const comma = tree.nextToken(param_node.lastToken()); |
| 1096 | 1098 | try renderToken(tree, ais, comma, Space.Space); |
| 1097 | 1099 | } |