| ... | ... | @@ -24,7 +24,8 @@ pub fn render(allocator: *mem.Allocator, stream: anytype, tree: *ast.Tree) (meta |
| 24 | 24 | |
| 25 | 25 | var s = stream.*; |
| 26 | 26 | var change_detection_stream = std.io.changeDetectionStream(tree.source, &s); |
| 27 | | var auto_indenting_stream = std.io.autoIndentingStream(indent_delta, &change_detection_stream); |
| 27 | var auto_indenting_stream = std.io.autoIndentingStream(indent_delta, &change_detection_stream, allocator); |
| 28 | defer auto_indenting_stream.deinit(); |
| 28 | 29 | |
| 29 | 30 | try renderRoot(allocator, &auto_indenting_stream, tree); |
| 30 | 31 | |
| ... | ... | @@ -388,11 +389,11 @@ fn renderExpression( |
| 388 | 389 | } |
| 389 | 390 | |
| 390 | 391 | if (block.statements.len == 0) { |
| 391 | | stream.pushIndentNextLine(); |
| 392 | try stream.pushIndentNextLine(); |
| 392 | 393 | defer stream.popIndent(); |
| 393 | 394 | try renderToken(tree, stream, block.lbrace, Space.None); |
| 394 | 395 | } else { |
| 395 | | stream.pushIndentNextLine(); |
| 396 | try stream.pushIndentNextLine(); |
| 396 | 397 | defer stream.popIndent(); |
| 397 | 398 | |
| 398 | 399 | try renderToken(tree, stream, block.lbrace, Space.Newline); |
| ... | ... | @@ -462,7 +463,7 @@ fn renderExpression( |
| 462 | 463 | try renderExpression(allocator, stream, tree, payload, Space.Space); |
| 463 | 464 | } |
| 464 | 465 | |
| 465 | | stream.pushIndentOneShot(); |
| 466 | try stream.pushIndentOneShot(); |
| 466 | 467 | return renderExpression(allocator, stream, tree, infix_op_node.rhs, space); |
| 467 | 468 | }, |
| 468 | 469 | |
| ... | ... | @@ -523,7 +524,7 @@ fn renderExpression( |
| 523 | 524 | }; |
| 524 | 525 | |
| 525 | 526 | try renderToken(tree, stream, infix_op_node.op_token, after_op_space); |
| 526 | | stream.pushIndentOneShot(); |
| 527 | try stream.pushIndentOneShot(); |
| 527 | 528 | return renderExpression(allocator, stream, tree, infix_op_node.rhs, space); |
| 528 | 529 | }, |
| 529 | 530 | |
| ... | ... | @@ -717,7 +718,7 @@ fn renderExpression( |
| 717 | 718 | } |
| 718 | 719 | |
| 719 | 720 | { |
| 720 | | stream.pushIndent(); |
| 721 | try stream.pushIndent(); |
| 721 | 722 | defer stream.popIndent(); |
| 722 | 723 | try renderToken(tree, stream, lbrace, Space.None); |
| 723 | 724 | } |
| ... | ... | @@ -782,7 +783,8 @@ fn renderExpression( |
| 782 | 783 | |
| 783 | 784 | // Null stream for counting the printed length of each expression |
| 784 | 785 | var counting_stream = std.io.countingOutStream(std.io.null_out_stream); |
| 785 | | var auto_indenting_stream = std.io.autoIndentingStream(indent_delta, &counting_stream); |
| 786 | var auto_indenting_stream = std.io.autoIndentingStream(indent_delta, &counting_stream, allocator); |
| 787 | defer auto_indenting_stream.deinit(); |
| 786 | 788 | |
| 787 | 789 | for (exprs) |expr, i| { |
| 788 | 790 | counting_stream.bytes_written = 0; |
| ... | ... | @@ -794,7 +796,7 @@ fn renderExpression( |
| 794 | 796 | } |
| 795 | 797 | |
| 796 | 798 | { |
| 797 | | stream.pushIndentNextLine(); |
| 799 | try stream.pushIndentNextLine(); |
| 798 | 800 | defer stream.popIndent(); |
| 799 | 801 | try renderToken(tree, stream, lbrace, Space.Newline); |
| 800 | 802 | |
| ... | ... | @@ -878,7 +880,7 @@ fn renderExpression( |
| 878 | 880 | } |
| 879 | 881 | |
| 880 | 882 | { |
| 881 | | stream.pushIndentNextLine(); |
| 883 | try stream.pushIndentNextLine(); |
| 882 | 884 | defer stream.popIndent(); |
| 883 | 885 | try renderToken(tree, stream, lbrace, Space.None); |
| 884 | 886 | } |
| ... | ... | @@ -900,7 +902,8 @@ fn renderExpression( |
| 900 | 902 | // render field expressions until a LF is found |
| 901 | 903 | for (field_inits) |field_init| { |
| 902 | 904 | var find_stream = std.io.findByteOutStream('\n', &std.io.null_out_stream); |
| 903 | | var auto_indenting_stream = std.io.autoIndentingStream(indent_delta, &find_stream); |
| 905 | var auto_indenting_stream = std.io.autoIndentingStream(indent_delta, &find_stream, allocator); |
| 906 | defer auto_indenting_stream.deinit(); |
| 904 | 907 | |
| 905 | 908 | try renderExpression(allocator, &auto_indenting_stream, tree, field_init, Space.None); |
| 906 | 909 | if (find_stream.byte_found) break :blk false; |
| ... | ... | @@ -960,7 +963,7 @@ fn renderExpression( |
| 960 | 963 | .node => |node| try renderExpression(allocator, stream, tree, node, Space.None), |
| 961 | 964 | } |
| 962 | 965 | |
| 963 | | stream.pushIndentNextLine(); |
| 966 | try stream.pushIndentNextLine(); |
| 964 | 967 | defer stream.popIndent(); |
| 965 | 968 | |
| 966 | 969 | try renderToken(tree, stream, lbrace, Space.Newline); |
| ... | ... | @@ -1008,7 +1011,7 @@ fn renderExpression( |
| 1008 | 1011 | |
| 1009 | 1012 | const params = call.params(); |
| 1010 | 1013 | for (params) |param_node, i| { |
| 1011 | | stream.pushIndent(); |
| 1014 | try stream.pushIndent(); |
| 1012 | 1015 | defer stream.popIndent(); |
| 1013 | 1016 | |
| 1014 | 1017 | if (i + 1 < params.len) { |
| ... | ... | @@ -1028,7 +1031,7 @@ fn renderExpression( |
| 1028 | 1031 | |
| 1029 | 1032 | const params = call.params(); |
| 1030 | 1033 | for (params) |param_node, i| { |
| 1031 | | if (param_node.*.tag == .MultilineStringLiteral) stream.pushIndentOneShot(); |
| 1034 | if (param_node.*.tag == .MultilineStringLiteral) try stream.pushIndentOneShot(); |
| 1032 | 1035 | |
| 1033 | 1036 | try renderExpression(allocator, stream, tree, param_node, Space.None); |
| 1034 | 1037 | |
| ... | ... | @@ -1055,7 +1058,7 @@ fn renderExpression( |
| 1055 | 1058 | { |
| 1056 | 1059 | const new_space = if (ends_with_comment) Space.Newline else Space.None; |
| 1057 | 1060 | |
| 1058 | | stream.pushIndent(); |
| 1061 | try stream.pushIndent(); |
| 1059 | 1062 | defer stream.popIndent(); |
| 1060 | 1063 | try renderExpression(allocator, stream, tree, suffix_op.index_expr, new_space); |
| 1061 | 1064 | } |
| ... | ... | @@ -1191,7 +1194,7 @@ fn renderExpression( |
| 1191 | 1194 | |
| 1192 | 1195 | try renderToken(tree, stream, grouped_expr.lparen, Space.None); |
| 1193 | 1196 | { |
| 1194 | | stream.pushIndentOneShot(); |
| 1197 | try stream.pushIndentOneShot(); |
| 1195 | 1198 | try renderExpression(allocator, stream, tree, grouped_expr.expr, Space.None); |
| 1196 | 1199 | } |
| 1197 | 1200 | return renderToken(tree, stream, grouped_expr.rparen, space); |
| ... | ... | @@ -1251,7 +1254,7 @@ fn renderExpression( |
| 1251 | 1254 | |
| 1252 | 1255 | if (container_decl.fields_and_decls_len == 0) { |
| 1253 | 1256 | { |
| 1254 | | stream.pushIndentNextLine(); |
| 1257 | try stream.pushIndentNextLine(); |
| 1255 | 1258 | defer stream.popIndent(); |
| 1256 | 1259 | try renderToken(tree, stream, container_decl.lbrace_token, Space.None); // { |
| 1257 | 1260 | } |
| ... | ... | @@ -1286,7 +1289,7 @@ fn renderExpression( |
| 1286 | 1289 | |
| 1287 | 1290 | if (src_has_trailing_comma or !src_has_only_fields) { |
| 1288 | 1291 | // One declaration per line |
| 1289 | | stream.pushIndentNextLine(); |
| 1292 | try stream.pushIndentNextLine(); |
| 1290 | 1293 | defer stream.popIndent(); |
| 1291 | 1294 | try renderToken(tree, stream, container_decl.lbrace_token, .Newline); // { |
| 1292 | 1295 | |
| ... | ... | @@ -1302,7 +1305,7 @@ fn renderExpression( |
| 1302 | 1305 | // their own line |
| 1303 | 1306 | try renderToken(tree, stream, container_decl.lbrace_token, .Newline); // { |
| 1304 | 1307 | |
| 1305 | | stream.pushIndent(); |
| 1308 | try stream.pushIndent(); |
| 1306 | 1309 | defer stream.popIndent(); |
| 1307 | 1310 | |
| 1308 | 1311 | for (fields_and_decls) |decl, i| { |
| ... | ... | @@ -1358,7 +1361,7 @@ fn renderExpression( |
| 1358 | 1361 | |
| 1359 | 1362 | if (src_has_trailing_comma) { |
| 1360 | 1363 | { |
| 1361 | | stream.pushIndent(); |
| 1364 | try stream.pushIndent(); |
| 1362 | 1365 | defer stream.popIndent(); |
| 1363 | 1366 | |
| 1364 | 1367 | try renderToken(tree, stream, lbrace, Space.Newline); // { |
| ... | ... | @@ -1448,7 +1451,7 @@ fn renderExpression( |
| 1448 | 1451 | } |
| 1449 | 1452 | } else { |
| 1450 | 1453 | // one param per line |
| 1451 | | stream.pushIndent(); |
| 1454 | try stream.pushIndent(); |
| 1452 | 1455 | defer stream.popIndent(); |
| 1453 | 1456 | try renderToken(tree, stream, lparen, Space.Newline); // ( |
| 1454 | 1457 | |
| ... | ... | @@ -1527,7 +1530,7 @@ fn renderExpression( |
| 1527 | 1530 | } |
| 1528 | 1531 | } else { |
| 1529 | 1532 | // one param per line |
| 1530 | | stream.pushIndent(); |
| 1533 | try stream.pushIndent(); |
| 1531 | 1534 | defer stream.popIndent(); |
| 1532 | 1535 | try renderToken(tree, stream, lparen, Space.Newline); // ( |
| 1533 | 1536 | |
| ... | ... | @@ -1624,7 +1627,7 @@ fn renderExpression( |
| 1624 | 1627 | try renderToken(tree, stream, rparen, Space.Space); // ) |
| 1625 | 1628 | |
| 1626 | 1629 | { |
| 1627 | | stream.pushIndentNextLine(); |
| 1630 | try stream.pushIndentNextLine(); |
| 1628 | 1631 | defer stream.popIndent(); |
| 1629 | 1632 | try renderToken(tree, stream, lbrace, Space.Newline); // { |
| 1630 | 1633 | |
| ... | ... | @@ -1708,7 +1711,7 @@ fn renderExpression( |
| 1708 | 1711 | if (same_line) { |
| 1709 | 1712 | return renderExpression(allocator, stream, tree, else_node.body, space); |
| 1710 | 1713 | } else { |
| 1711 | | stream.pushIndent(); |
| 1714 | try stream.pushIndent(); |
| 1712 | 1715 | defer stream.popIndent(); |
| 1713 | 1716 | return renderExpression(allocator, stream, tree, else_node.body, space); |
| 1714 | 1717 | } |
| ... | ... | @@ -1772,7 +1775,7 @@ fn renderExpression( |
| 1772 | 1775 | } |
| 1773 | 1776 | |
| 1774 | 1777 | { |
| 1775 | | if (!body_is_block) stream.pushIndent(); |
| 1778 | if (!body_is_block) try stream.pushIndent(); |
| 1776 | 1779 | defer if (!body_is_block) stream.popIndent(); |
| 1777 | 1780 | try renderExpression(allocator, stream, tree, while_node.body, after_body_space); |
| 1778 | 1781 | } |
| ... | ... | @@ -1823,7 +1826,7 @@ fn renderExpression( |
| 1823 | 1826 | }; |
| 1824 | 1827 | |
| 1825 | 1828 | { |
| 1826 | | if (!body_on_same_line) stream.pushIndent(); |
| 1829 | if (!body_on_same_line) try stream.pushIndent(); |
| 1827 | 1830 | defer if (!body_on_same_line) stream.popIndent(); |
| 1828 | 1831 | try renderExpression(allocator, stream, tree, for_node.body, space_after_body); // { body } |
| 1829 | 1832 | } |
| ... | ... | @@ -1879,7 +1882,7 @@ fn renderExpression( |
| 1879 | 1882 | const else_is_block = nodeIsBlock(@"else".body); |
| 1880 | 1883 | |
| 1881 | 1884 | { |
| 1882 | | stream.pushIndent(); |
| 1885 | try stream.pushIndent(); |
| 1883 | 1886 | defer stream.popIndent(); |
| 1884 | 1887 | try renderExpression(allocator, stream, tree, if_node.body, Space.Newline); |
| 1885 | 1888 | } |
| ... | ... | @@ -1900,12 +1903,12 @@ fn renderExpression( |
| 1900 | 1903 | try renderExpression(allocator, stream, tree, payload, Space.Newline); |
| 1901 | 1904 | } |
| 1902 | 1905 | |
| 1903 | | stream.pushIndent(); |
| 1906 | try stream.pushIndent(); |
| 1904 | 1907 | defer stream.popIndent(); |
| 1905 | 1908 | return renderExpression(allocator, stream, tree, @"else".body, space); |
| 1906 | 1909 | } |
| 1907 | 1910 | } else { |
| 1908 | | stream.pushIndent(); |
| 1911 | try stream.pushIndent(); |
| 1909 | 1912 | defer stream.popIndent(); |
| 1910 | 1913 | return renderExpression(allocator, stream, tree, if_node.body, space); |
| 1911 | 1914 | } |
| ... | ... | @@ -1946,7 +1949,7 @@ fn renderExpression( |
| 1946 | 1949 | } |
| 1947 | 1950 | |
| 1948 | 1951 | asmblk: { |
| 1949 | | stream.pushIndent(); |
| 1952 | try stream.pushIndent(); |
| 1950 | 1953 | defer stream.popIndent(); |
| 1951 | 1954 | |
| 1952 | 1955 | if (asm_node.outputs.len == 0 and asm_node.inputs.len == 0 and asm_node.clobbers.len == 0) { |
| ... | ... | @@ -1965,7 +1968,7 @@ fn renderExpression( |
| 1965 | 1968 | } else blk: { |
| 1966 | 1969 | try renderToken(tree, stream, colon1, Space.Space); // : |
| 1967 | 1970 | |
| 1968 | | stream.pushIndentN(2); |
| 1971 | try stream.pushIndentN(2); |
| 1969 | 1972 | defer stream.popIndent(); |
| 1970 | 1973 | |
| 1971 | 1974 | for (asm_node.outputs) |*asm_output, i| { |
| ... | ... | @@ -1996,7 +1999,7 @@ fn renderExpression( |
| 1996 | 1999 | break :blk tree.nextToken(colon2); |
| 1997 | 2000 | } else blk: { |
| 1998 | 2001 | try renderToken(tree, stream, colon2, Space.Space); // : |
| 1999 | | stream.pushIndentN(2); |
| 2002 | try stream.pushIndentN(2); |
| 2000 | 2003 | defer stream.popIndent(); |
| 2001 | 2004 | for (asm_node.inputs) |*asm_input, i| { |
| 2002 | 2005 | if (i + 1 < asm_node.inputs.len) { |
| ... | ... | @@ -2022,7 +2025,7 @@ fn renderExpression( |
| 2022 | 2025 | }; |
| 2023 | 2026 | |
| 2024 | 2027 | try renderToken(tree, stream, colon3, Space.Space); // : |
| 2025 | | stream.pushIndentN(2); |
| 2028 | try stream.pushIndentN(2); |
| 2026 | 2029 | defer stream.popIndent(); |
| 2027 | 2030 | for (asm_node.clobbers) |clobber_node, i| { |
| 2028 | 2031 | if (i + 1 >= asm_node.clobbers.len) { |
| ... | ... | @@ -2075,7 +2078,7 @@ fn renderArrayType( |
| 2075 | 2078 | const new_space = if (ends_with_comment) Space.Newline else Space.None; |
| 2076 | 2079 | { |
| 2077 | 2080 | const do_indent = (starts_with_comment or ends_with_comment); |
| 2078 | | if (do_indent) stream.pushIndent(); |
| 2081 | if (do_indent) try stream.pushIndent(); |
| 2079 | 2082 | defer if (do_indent) stream.popIndent(); |
| 2080 | 2083 | |
| 2081 | 2084 | try renderToken(tree, stream, lbracket, Space.None); // [ |
| ... | ... | @@ -2209,7 +2212,7 @@ fn renderVarDecl( |
| 2209 | 2212 | if (var_decl.getTrailer("init_node")) |init_node| { |
| 2210 | 2213 | const s = if (init_node.tag == .MultilineStringLiteral) Space.None else Space.Space; |
| 2211 | 2214 | try renderToken(tree, stream, var_decl.getTrailer("eq_token").?, s); // = |
| 2212 | | stream.pushIndentOneShot(); |
| 2215 | try stream.pushIndentOneShot(); |
| 2213 | 2216 | try renderExpression(allocator, stream, tree, init_node, Space.None); |
| 2214 | 2217 | } |
| 2215 | 2218 | |