| ... | ... | @@ -1747,6 +1747,9 @@ fn renderArrayInit( |
| 1747 | 1747 | var sub_expr_buffer = std.ArrayList(u8).init(gpa); |
| 1748 | 1748 | defer sub_expr_buffer.deinit(); |
| 1749 | 1749 | |
| 1750 | const sub_expr_buffer_starts = try gpa.alloc(usize, section_exprs.len + 1); |
| 1751 | defer gpa.free(sub_expr_buffer_starts); |
| 1752 | |
| 1750 | 1753 | var auto_indenting_stream = Ais{ |
| 1751 | 1754 | .indent_delta = indent_delta, |
| 1752 | 1755 | .underlying_writer = sub_expr_buffer.writer(), |
| ... | ... | @@ -1757,11 +1760,13 @@ fn renderArrayInit( |
| 1757 | 1760 | var single_line = true; |
| 1758 | 1761 | var contains_newline = false; |
| 1759 | 1762 | for (section_exprs) |expr, i| { |
| 1760 | | sub_expr_buffer.shrinkRetainingCapacity(0); |
| 1763 | const start = sub_expr_buffer.items.len; |
| 1764 | sub_expr_buffer_starts[i] = start; |
| 1765 | |
| 1761 | 1766 | if (i + 1 < section_exprs.len) { |
| 1762 | 1767 | try renderExpression(gpa, &auto_indenting_stream, tree, expr, .none); |
| 1763 | | const width = sub_expr_buffer.items.len; |
| 1764 | | const this_contains_newline = mem.indexOfScalar(u8, sub_expr_buffer.items, '\n') != null; |
| 1768 | const width = sub_expr_buffer.items.len - start; |
| 1769 | const this_contains_newline = mem.indexOfScalar(u8, sub_expr_buffer.items[start..], '\n') != null; |
| 1765 | 1770 | contains_newline = contains_newline or this_contains_newline; |
| 1766 | 1771 | expr_widths[i] = width; |
| 1767 | 1772 | expr_newlines[i] = this_contains_newline; |
| ... | ... | @@ -1779,9 +1784,10 @@ fn renderArrayInit( |
| 1779 | 1784 | column_counter = 0; |
| 1780 | 1785 | } |
| 1781 | 1786 | } else { |
| 1782 | | try renderExpression(gpa, &auto_indenting_stream, tree, expr, .none); |
| 1783 | | const width = sub_expr_buffer.items.len; |
| 1784 | | contains_newline = contains_newline or mem.indexOfScalar(u8, sub_expr_buffer.items, '\n') != null; |
| 1787 | try renderExpression(gpa, &auto_indenting_stream, tree, expr, .comma); |
| 1788 | const width = sub_expr_buffer.items.len - start - 2; |
| 1789 | const this_contains_newline = mem.indexOfScalar(u8, sub_expr_buffer.items[start .. sub_expr_buffer.items.len - 1], '\n') != null; |
| 1790 | contains_newline = contains_newline or this_contains_newline; |
| 1785 | 1791 | expr_widths[i] = width; |
| 1786 | 1792 | expr_newlines[i] = contains_newline; |
| 1787 | 1793 | |
| ... | ... | @@ -1789,21 +1795,38 @@ fn renderArrayInit( |
| 1789 | 1795 | const column = column_counter % row_size; |
| 1790 | 1796 | column_widths[column] = std.math.max(column_widths[column], width); |
| 1791 | 1797 | } |
| 1792 | | break; |
| 1793 | 1798 | } |
| 1794 | 1799 | } |
| 1800 | sub_expr_buffer_starts[section_exprs.len] = sub_expr_buffer.items.len; |
| 1795 | 1801 | |
| 1796 | 1802 | // Render exprs in current section. |
| 1797 | 1803 | column_counter = 0; |
| 1798 | | var last_col_index: usize = row_size - 1; |
| 1799 | 1804 | for (section_exprs) |expr, i| { |
| 1805 | const start = sub_expr_buffer_starts[i]; |
| 1806 | const end = sub_expr_buffer_starts[i + 1]; |
| 1807 | const expr_text = sub_expr_buffer.items[start..end]; |
| 1808 | if (!expr_newlines[i]) { |
| 1809 | try ais.writer().writeAll(expr_text); |
| 1810 | } else { |
| 1811 | var by_line = std.mem.split(u8, expr_text, "\n"); |
| 1812 | var last_line_was_empty = false; |
| 1813 | try ais.writer().writeAll(by_line.next().?); |
| 1814 | while (by_line.next()) |line| { |
| 1815 | if (std.mem.startsWith(u8, line, "//") and last_line_was_empty) { |
| 1816 | try ais.insertNewline(); |
| 1817 | } else { |
| 1818 | try ais.maybeInsertNewline(); |
| 1819 | } |
| 1820 | last_line_was_empty = (line.len == 0); |
| 1821 | try ais.writer().writeAll(line); |
| 1822 | } |
| 1823 | } |
| 1824 | |
| 1800 | 1825 | if (i + 1 < section_exprs.len) { |
| 1801 | 1826 | const next_expr = section_exprs[i + 1]; |
| 1802 | | try renderExpression(gpa, ais, tree, expr, .none); |
| 1803 | | |
| 1804 | 1827 | const comma = tree.lastToken(expr) + 1; |
| 1805 | 1828 | |
| 1806 | | if (column_counter != last_col_index) { |
| 1829 | if (column_counter != row_size - 1) { |
| 1807 | 1830 | if (!expr_newlines[i] and !expr_newlines[i + 1]) { |
| 1808 | 1831 | // Neither the current or next expression is multiline |
| 1809 | 1832 | try renderToken(ais, tree, comma, .space); // , |
| ... | ... | @@ -1815,6 +1838,7 @@ fn renderArrayInit( |
| 1815 | 1838 | continue; |
| 1816 | 1839 | } |
| 1817 | 1840 | } |
| 1841 | |
| 1818 | 1842 | if (single_line and row_size != 1) { |
| 1819 | 1843 | try renderToken(ais, tree, comma, .space); // , |
| 1820 | 1844 | continue; |
| ... | ... | @@ -1823,8 +1847,6 @@ fn renderArrayInit( |
| 1823 | 1847 | column_counter = 0; |
| 1824 | 1848 | try renderToken(ais, tree, comma, .newline); // , |
| 1825 | 1849 | try renderExtraNewline(ais, tree, next_expr); |
| 1826 | | } else { |
| 1827 | | try renderExpression(gpa, ais, tree, expr, .comma); // , |
| 1828 | 1850 | } |
| 1829 | 1851 | } |
| 1830 | 1852 | |
| ... | ... | @@ -2585,7 +2607,7 @@ fn nodeCausesSliceOpSpace(tag: Ast.Node.Tag) bool { |
| 2585 | 2607 | }; |
| 2586 | 2608 | } |
| 2587 | 2609 | |
| 2588 | | // Returns the number of nodes in `expr` that are on the same line as `rtoken`. |
| 2610 | // Returns the number of nodes in `exprs` that are on the same line as `rtoken`. |
| 2589 | 2611 | fn rowSize(tree: Ast, exprs: []const Ast.Node.Index, rtoken: Ast.TokenIndex) usize { |
| 2590 | 2612 | const token_tags = tree.tokens.items(.tag); |
| 2591 | 2613 | |