authorgravatar for lachlan@lakebythewoods.xyzLachlan Easton <lachlan@lakebythewoods.xyz> 2020-08-30 10:32:21+10:00
committergravatar for lachlan@lakebythewoods.xyzLachlan Easton <lachlan@lakebythewoods.xyz> 2020-08-30 10:32:21+10:00
log50c8a53188bdd20321990b7a4999f534b9e613dd
treeedc5d0a481dc18a160848956451d483e36fc83ff
parent7d950210a64f51cba6c4edaacbd9c67f12e72604

Use ArrayList instead of fixed array for auto_indenting_stream


3 files changed, 82 insertions(+), 69 deletions(-)

lib/std/io/auto_indenting_stream.zig+43-33
...@@ -1,26 +1,36 @@...@@ -1,26 +1,36 @@
1const std = @import("../std.zig");1const std = @import("../std.zig");
2const io = std.io;2const io = std.io;
3const mem = std.mem;3const mem = std.mem;
4const Allocator = mem.Allocator;
5const ArrayList = std.ArrayList;
4const assert = std.debug.assert;6const assert = std.debug.assert;
57
6/// Automatically inserts indentation of written data by keeping8/// Automatically inserts indentation of written data by keeping
7/// track of the current indentation level9/// track of the current indentation level
8pub fn AutoIndentingStream(comptime indent_delta: u8, comptime WriterType: type) type {10pub fn AutoIndentingStream(comptime indent_delta: usize, comptime WriterType: type) type {
9 return struct {11 return struct {
10 const Self = @This();12 const Self = @This();
11 pub const Error = WriterType.Error;13 pub const Error = WriterType.Error;
14 pub const PushError = Allocator.Error;
12 pub const Writer = io.Writer(*Self, Error, write);15 pub const Writer = io.Writer(*Self, Error, write);
16 const Stack = ArrayList(usize);
1317
14 writer_pointer: *WriterType,18 writer_pointer: *WriterType,
19 indent_stack: Stack,
20
15 current_line_empty: bool = true,21 current_line_empty: bool = true,
16 indent_stack: [255]u8 = undefined,22 indent_one_shot_count: usize = 0, // automatically popped when applied
17 indent_stack_top: u8 = 0,23 applied_indent: usize = 0, // the most recently applied indent
18 indent_one_shot_count: u8 = 0, // automatically popped when applied24 indent_next_line: usize = 0, // not used until the next line
19 applied_indent: u8 = 0, // the most recently applied indent25
20 indent_next_line: u8 = 0, // not used until the next line26 pub fn init(writer_pointer: *WriterType, allocator: *Allocator) Self {
27 var indent_stack = Stack.init(allocator);
28 return Self{ .writer_pointer = writer_pointer, .indent_stack = indent_stack };
29 }
2130
22 pub fn init(writer_pointer: *WriterType) Self {31 /// Release all allocated memory.
23 return Self{ .writer_pointer = writer_pointer };32 pub fn deinit(self: Self) void {
33 self.indent_stack.deinit();
24 }34 }
2535
26 pub fn writer(self: *Self) Writer {36 pub fn writer(self: *Self) Writer {
...@@ -39,7 +49,7 @@ pub fn AutoIndentingStream(comptime indent_delta: u8, comptime WriterType: type)...@@ -39,7 +49,7 @@ pub fn AutoIndentingStream(comptime indent_delta: u8, comptime WriterType: type)
39 if (bytes.len == 0)49 if (bytes.len == 0)
40 return @as(usize, 0);50 return @as(usize, 0);
4151
42 try self.writer_pointer.outStream().writeAll(bytes);52 try self.writer_pointer.writer().writeAll(bytes);
43 if (bytes[bytes.len - 1] == '\n')53 if (bytes[bytes.len - 1] == '\n')
44 self.resetLine();54 self.resetLine();
45 return bytes.len;55 return bytes.len;
...@@ -61,53 +71,52 @@ pub fn AutoIndentingStream(comptime indent_delta: u8, comptime WriterType: type)...@@ -61,53 +71,52 @@ pub fn AutoIndentingStream(comptime indent_delta: u8, comptime WriterType: type)
61 }71 }
6272
63 /// Push default indentation73 /// Push default indentation
64 pub fn pushIndent(self: *Self) void {74 pub fn pushIndent(self: *Self) PushError!void {
65 // Doesn't actually write any indentation. Just primes the stream to be able to write the correct indentation if it needs to.75 // Doesn't actually write any indentation.
66 self.pushIndentN(indent_delta);76 // Just primes the stream to be able to write the correct indentation if it needs to.
77 try self.pushIndentN(indent_delta);
67 }78 }
6879
69 /// Push an indent of arbitrary width80 /// Push an indent of arbitrary width
70 pub fn pushIndentN(self: *Self, n: u8) void {81 pub fn pushIndentN(self: *Self, n: usize) PushError!void {
71 assert(self.indent_stack_top < std.math.maxInt(u8));82 try self.indent_stack.append(n);
72 self.indent_stack[self.indent_stack_top] = n;
73 self.indent_stack_top += 1;
74 }83 }
7584
76 /// Push an indent that is automatically popped after being applied85 /// Push an indent that is automatically popped after being applied
77 pub fn pushIndentOneShot(self: *Self) void {86 pub fn pushIndentOneShot(self: *Self) PushError!void {
78 self.indent_one_shot_count += 1;87 self.indent_one_shot_count += 1;
79 self.pushIndent();88 try self.pushIndent();
80 }89 }
8190
82 /// Turns all one-shot indents into regular indents91 /// Turns all one-shot indents into regular indents
83 /// Returns number of indents that must now be manually popped92 /// Returns number of indents that must now be manually popped
84 pub fn lockOneShotIndent(self: *Self) u8 {93 pub fn lockOneShotIndent(self: *Self) usize {
85 var locked_count = self.indent_one_shot_count;94 var locked_count = self.indent_one_shot_count;
86 self.indent_one_shot_count = 0;95 self.indent_one_shot_count = 0;
87 return locked_count;96 return locked_count;
88 }97 }
8998
90 /// Push an indent that should not take effect until the next line99 /// Push an indent that should not take effect until the next line
91 pub fn pushIndentNextLine(self: *Self) void {100 pub fn pushIndentNextLine(self: *Self) PushError!void {
92 self.indent_next_line += 1;101 self.indent_next_line += 1;
93 self.pushIndent();102 try self.pushIndent();
94 }103 }
95104
96 pub fn popIndent(self: *Self) void {105 pub fn popIndent(self: *Self) void {
97 assert(self.indent_stack_top != 0);106 assert(self.indent_stack.items.len != 0);
98 self.indent_stack_top -= 1;107 self.indent_stack.items.len -= 1;
99 self.indent_next_line = std.math.min(self.indent_stack_top, self.indent_next_line); // Tentative indent may have been popped before there was a newline108 self.indent_next_line = std.math.min(self.indent_stack.items.len, self.indent_next_line); // Tentative indent may have been popped before there was a newline
100 }109 }
101110
102 /// Writes ' ' bytes if the current line is empty111 /// Writes ' ' bytes if the current line is empty
103 fn applyIndent(self: *Self) Error!void {112 fn applyIndent(self: *Self) Error!void {
104 const current_indent = self.currentIndent();113 const current_indent = self.currentIndent();
105 if (self.current_line_empty and current_indent > 0) {114 if (self.current_line_empty and current_indent > 0) {
106 try self.writer_pointer.outStream().writeByteNTimes(' ', current_indent);115 try self.writer_pointer.writer().writeByteNTimes(' ', current_indent);
107 self.applied_indent = current_indent;116 self.applied_indent = current_indent;
108 }117 }
109118
110 self.indent_stack_top -= self.indent_one_shot_count;119 self.indent_stack.items.len -= self.indent_one_shot_count;
111 self.indent_one_shot_count = 0;120 self.indent_one_shot_count = 0;
112 self.current_line_empty = false;121 self.current_line_empty = false;
113 }122 }
...@@ -118,11 +127,11 @@ pub fn AutoIndentingStream(comptime indent_delta: u8, comptime WriterType: type)...@@ -118,11 +127,11 @@ pub fn AutoIndentingStream(comptime indent_delta: u8, comptime WriterType: type)
118 return self.applied_indent > self.currentIndent();127 return self.applied_indent > self.currentIndent();
119 }128 }
120129
121 fn currentIndent(self: *Self) u8 {130 fn currentIndent(self: *Self) usize {
122 var indent_current: u8 = 0;131 var indent_current: usize = 0;
123 if (self.indent_stack_top > 0) {132 if (self.indent_stack.items.len > 0) {
124 const stack_top = self.indent_stack_top - self.indent_next_line;133 const stack_top = self.indent_stack.items.len - self.indent_next_line;
125 for (self.indent_stack[0..stack_top]) |indent| {134 for (self.indent_stack.items[0..stack_top]) |indent| {
126 indent_current += indent;135 indent_current += indent;
127 }136 }
128 }137 }
...@@ -132,9 +141,10 @@ pub fn AutoIndentingStream(comptime indent_delta: u8, comptime WriterType: type)...@@ -132,9 +141,10 @@ pub fn AutoIndentingStream(comptime indent_delta: u8, comptime WriterType: type)
132}141}
133142
134pub fn autoIndentingStream(143pub fn autoIndentingStream(
135 comptime indent_delta: u8,144 comptime indent_delta: usize,
136 underlying_stream: anytype,145 underlying_stream: anytype,
146 allocator: *Allocator,
137) AutoIndentingStream(indent_delta, @TypeOf(underlying_stream).Child) {147) AutoIndentingStream(indent_delta, @TypeOf(underlying_stream).Child) {
138 comptime assert(@typeInfo(@TypeOf(underlying_stream)) == .Pointer);148 comptime assert(@typeInfo(@TypeOf(underlying_stream)) == .Pointer);
139 return AutoIndentingStream(indent_delta, @TypeOf(underlying_stream).Child).init(underlying_stream);149 return AutoIndentingStream(indent_delta, @TypeOf(underlying_stream).Child).init(underlying_stream, allocator);
140}150}
lib/std/io/find_byte_out_stream.zig+2-2
...@@ -8,7 +8,7 @@ pub fn FindByteOutStream(comptime WriterType: type) type {...@@ -8,7 +8,7 @@ pub fn FindByteOutStream(comptime WriterType: type) type {
8 return struct {8 return struct {
9 const Self = @This();9 const Self = @This();
10 pub const Error = WriterType.Error;10 pub const Error = WriterType.Error;
11 pub const OutStream = io.OutStream(*Self, Error, write);11 pub const Writer = io.Writer(*Self, Error, write);
1212
13 writer_pointer: *WriterType,13 writer_pointer: *WriterType,
14 byte_found: bool,14 byte_found: bool,
...@@ -22,7 +22,7 @@ pub fn FindByteOutStream(comptime WriterType: type) type {...@@ -22,7 +22,7 @@ pub fn FindByteOutStream(comptime WriterType: type) type {
22 };22 };
23 }23 }
2424
25 pub fn outStream(self: *Self) OutStream {25 pub fn writer(self: *Self) Writer {
26 return .{ .context = self };26 return .{ .context = self };
27 }27 }
2828
lib/std/zig/render.zig+37-34
...@@ -24,7 +24,8 @@ pub fn render(allocator: *mem.Allocator, stream: anytype, tree: *ast.Tree) (meta...@@ -24,7 +24,8 @@ pub fn render(allocator: *mem.Allocator, stream: anytype, tree: *ast.Tree) (meta
2424
25 var s = stream.*;25 var s = stream.*;
26 var change_detection_stream = std.io.changeDetectionStream(tree.source, &s);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();
2829
29 try renderRoot(allocator, &auto_indenting_stream, tree);30 try renderRoot(allocator, &auto_indenting_stream, tree);
3031
...@@ -388,11 +389,11 @@ fn renderExpression(...@@ -388,11 +389,11 @@ fn renderExpression(
388 }389 }
389390
390 if (block.statements.len == 0) {391 if (block.statements.len == 0) {
391 stream.pushIndentNextLine();392 try stream.pushIndentNextLine();
392 defer stream.popIndent();393 defer stream.popIndent();
393 try renderToken(tree, stream, block.lbrace, Space.None);394 try renderToken(tree, stream, block.lbrace, Space.None);
394 } else {395 } else {
395 stream.pushIndentNextLine();396 try stream.pushIndentNextLine();
396 defer stream.popIndent();397 defer stream.popIndent();
397398
398 try renderToken(tree, stream, block.lbrace, Space.Newline);399 try renderToken(tree, stream, block.lbrace, Space.Newline);
...@@ -462,7 +463,7 @@ fn renderExpression(...@@ -462,7 +463,7 @@ fn renderExpression(
462 try renderExpression(allocator, stream, tree, payload, Space.Space);463 try renderExpression(allocator, stream, tree, payload, Space.Space);
463 }464 }
464465
465 stream.pushIndentOneShot();466 try stream.pushIndentOneShot();
466 return renderExpression(allocator, stream, tree, infix_op_node.rhs, space);467 return renderExpression(allocator, stream, tree, infix_op_node.rhs, space);
467 },468 },
468469
...@@ -523,7 +524,7 @@ fn renderExpression(...@@ -523,7 +524,7 @@ fn renderExpression(
523 };524 };
524525
525 try renderToken(tree, stream, infix_op_node.op_token, after_op_space);526 try renderToken(tree, stream, infix_op_node.op_token, after_op_space);
526 stream.pushIndentOneShot();527 try stream.pushIndentOneShot();
527 return renderExpression(allocator, stream, tree, infix_op_node.rhs, space);528 return renderExpression(allocator, stream, tree, infix_op_node.rhs, space);
528 },529 },
529530
...@@ -717,7 +718,7 @@ fn renderExpression(...@@ -717,7 +718,7 @@ fn renderExpression(
717 }718 }
718719
719 {720 {
720 stream.pushIndent();721 try stream.pushIndent();
721 defer stream.popIndent();722 defer stream.popIndent();
722 try renderToken(tree, stream, lbrace, Space.None);723 try renderToken(tree, stream, lbrace, Space.None);
723 }724 }
...@@ -782,7 +783,8 @@ fn renderExpression(...@@ -782,7 +783,8 @@ fn renderExpression(
782783
783 // Null stream for counting the printed length of each expression784 // Null stream for counting the printed length of each expression
784 var counting_stream = std.io.countingOutStream(std.io.null_out_stream);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();
786788
787 for (exprs) |expr, i| {789 for (exprs) |expr, i| {
788 counting_stream.bytes_written = 0;790 counting_stream.bytes_written = 0;
...@@ -794,7 +796,7 @@ fn renderExpression(...@@ -794,7 +796,7 @@ fn renderExpression(
794 }796 }
795797
796 {798 {
797 stream.pushIndentNextLine();799 try stream.pushIndentNextLine();
798 defer stream.popIndent();800 defer stream.popIndent();
799 try renderToken(tree, stream, lbrace, Space.Newline);801 try renderToken(tree, stream, lbrace, Space.Newline);
800802
...@@ -878,7 +880,7 @@ fn renderExpression(...@@ -878,7 +880,7 @@ fn renderExpression(
878 }880 }
879881
880 {882 {
881 stream.pushIndentNextLine();883 try stream.pushIndentNextLine();
882 defer stream.popIndent();884 defer stream.popIndent();
883 try renderToken(tree, stream, lbrace, Space.None);885 try renderToken(tree, stream, lbrace, Space.None);
884 }886 }
...@@ -900,7 +902,8 @@ fn renderExpression(...@@ -900,7 +902,8 @@ fn renderExpression(
900 // render field expressions until a LF is found902 // render field expressions until a LF is found
901 for (field_inits) |field_init| {903 for (field_inits) |field_init| {
902 var find_stream = std.io.findByteOutStream('\n', &std.io.null_out_stream);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();
904907
905 try renderExpression(allocator, &auto_indenting_stream, tree, field_init, Space.None);908 try renderExpression(allocator, &auto_indenting_stream, tree, field_init, Space.None);
906 if (find_stream.byte_found) break :blk false;909 if (find_stream.byte_found) break :blk false;
...@@ -960,7 +963,7 @@ fn renderExpression(...@@ -960,7 +963,7 @@ fn renderExpression(
960 .node => |node| try renderExpression(allocator, stream, tree, node, Space.None),963 .node => |node| try renderExpression(allocator, stream, tree, node, Space.None),
961 }964 }
962965
963 stream.pushIndentNextLine();966 try stream.pushIndentNextLine();
964 defer stream.popIndent();967 defer stream.popIndent();
965968
966 try renderToken(tree, stream, lbrace, Space.Newline);969 try renderToken(tree, stream, lbrace, Space.Newline);
...@@ -1008,7 +1011,7 @@ fn renderExpression(...@@ -1008,7 +1011,7 @@ fn renderExpression(
10081011
1009 const params = call.params();1012 const params = call.params();
1010 for (params) |param_node, i| {1013 for (params) |param_node, i| {
1011 stream.pushIndent();1014 try stream.pushIndent();
1012 defer stream.popIndent();1015 defer stream.popIndent();
10131016
1014 if (i + 1 < params.len) {1017 if (i + 1 < params.len) {
...@@ -1028,7 +1031,7 @@ fn renderExpression(...@@ -1028,7 +1031,7 @@ fn renderExpression(
10281031
1029 const params = call.params();1032 const params = call.params();
1030 for (params) |param_node, i| {1033 for (params) |param_node, i| {
1031 if (param_node.*.tag == .MultilineStringLiteral) stream.pushIndentOneShot();1034 if (param_node.*.tag == .MultilineStringLiteral) try stream.pushIndentOneShot();
10321035
1033 try renderExpression(allocator, stream, tree, param_node, Space.None);1036 try renderExpression(allocator, stream, tree, param_node, Space.None);
10341037
...@@ -1055,7 +1058,7 @@ fn renderExpression(...@@ -1055,7 +1058,7 @@ fn renderExpression(
1055 {1058 {
1056 const new_space = if (ends_with_comment) Space.Newline else Space.None;1059 const new_space = if (ends_with_comment) Space.Newline else Space.None;
10571060
1058 stream.pushIndent();1061 try stream.pushIndent();
1059 defer stream.popIndent();1062 defer stream.popIndent();
1060 try renderExpression(allocator, stream, tree, suffix_op.index_expr, new_space);1063 try renderExpression(allocator, stream, tree, suffix_op.index_expr, new_space);
1061 }1064 }
...@@ -1191,7 +1194,7 @@ fn renderExpression(...@@ -1191,7 +1194,7 @@ fn renderExpression(
11911194
1192 try renderToken(tree, stream, grouped_expr.lparen, Space.None);1195 try renderToken(tree, stream, grouped_expr.lparen, Space.None);
1193 {1196 {
1194 stream.pushIndentOneShot();1197 try stream.pushIndentOneShot();
1195 try renderExpression(allocator, stream, tree, grouped_expr.expr, Space.None);1198 try renderExpression(allocator, stream, tree, grouped_expr.expr, Space.None);
1196 }1199 }
1197 return renderToken(tree, stream, grouped_expr.rparen, space);1200 return renderToken(tree, stream, grouped_expr.rparen, space);
...@@ -1251,7 +1254,7 @@ fn renderExpression(...@@ -1251,7 +1254,7 @@ fn renderExpression(
12511254
1252 if (container_decl.fields_and_decls_len == 0) {1255 if (container_decl.fields_and_decls_len == 0) {
1253 {1256 {
1254 stream.pushIndentNextLine();1257 try stream.pushIndentNextLine();
1255 defer stream.popIndent();1258 defer stream.popIndent();
1256 try renderToken(tree, stream, container_decl.lbrace_token, Space.None); // {1259 try renderToken(tree, stream, container_decl.lbrace_token, Space.None); // {
1257 }1260 }
...@@ -1286,7 +1289,7 @@ fn renderExpression(...@@ -1286,7 +1289,7 @@ fn renderExpression(
12861289
1287 if (src_has_trailing_comma or !src_has_only_fields) {1290 if (src_has_trailing_comma or !src_has_only_fields) {
1288 // One declaration per line1291 // One declaration per line
1289 stream.pushIndentNextLine();1292 try stream.pushIndentNextLine();
1290 defer stream.popIndent();1293 defer stream.popIndent();
1291 try renderToken(tree, stream, container_decl.lbrace_token, .Newline); // {1294 try renderToken(tree, stream, container_decl.lbrace_token, .Newline); // {
12921295
...@@ -1302,7 +1305,7 @@ fn renderExpression(...@@ -1302,7 +1305,7 @@ fn renderExpression(
1302 // their own line1305 // their own line
1303 try renderToken(tree, stream, container_decl.lbrace_token, .Newline); // {1306 try renderToken(tree, stream, container_decl.lbrace_token, .Newline); // {
13041307
1305 stream.pushIndent();1308 try stream.pushIndent();
1306 defer stream.popIndent();1309 defer stream.popIndent();
13071310
1308 for (fields_and_decls) |decl, i| {1311 for (fields_and_decls) |decl, i| {
...@@ -1358,7 +1361,7 @@ fn renderExpression(...@@ -1358,7 +1361,7 @@ fn renderExpression(
13581361
1359 if (src_has_trailing_comma) {1362 if (src_has_trailing_comma) {
1360 {1363 {
1361 stream.pushIndent();1364 try stream.pushIndent();
1362 defer stream.popIndent();1365 defer stream.popIndent();
13631366
1364 try renderToken(tree, stream, lbrace, Space.Newline); // {1367 try renderToken(tree, stream, lbrace, Space.Newline); // {
...@@ -1448,7 +1451,7 @@ fn renderExpression(...@@ -1448,7 +1451,7 @@ fn renderExpression(
1448 }1451 }
1449 } else {1452 } else {
1450 // one param per line1453 // one param per line
1451 stream.pushIndent();1454 try stream.pushIndent();
1452 defer stream.popIndent();1455 defer stream.popIndent();
1453 try renderToken(tree, stream, lparen, Space.Newline); // (1456 try renderToken(tree, stream, lparen, Space.Newline); // (
14541457
...@@ -1527,7 +1530,7 @@ fn renderExpression(...@@ -1527,7 +1530,7 @@ fn renderExpression(
1527 }1530 }
1528 } else {1531 } else {
1529 // one param per line1532 // one param per line
1530 stream.pushIndent();1533 try stream.pushIndent();
1531 defer stream.popIndent();1534 defer stream.popIndent();
1532 try renderToken(tree, stream, lparen, Space.Newline); // (1535 try renderToken(tree, stream, lparen, Space.Newline); // (
15331536
...@@ -1624,7 +1627,7 @@ fn renderExpression(...@@ -1624,7 +1627,7 @@ fn renderExpression(
1624 try renderToken(tree, stream, rparen, Space.Space); // )1627 try renderToken(tree, stream, rparen, Space.Space); // )
16251628
1626 {1629 {
1627 stream.pushIndentNextLine();1630 try stream.pushIndentNextLine();
1628 defer stream.popIndent();1631 defer stream.popIndent();
1629 try renderToken(tree, stream, lbrace, Space.Newline); // {1632 try renderToken(tree, stream, lbrace, Space.Newline); // {
16301633
...@@ -1708,7 +1711,7 @@ fn renderExpression(...@@ -1708,7 +1711,7 @@ fn renderExpression(
1708 if (same_line) {1711 if (same_line) {
1709 return renderExpression(allocator, stream, tree, else_node.body, space);1712 return renderExpression(allocator, stream, tree, else_node.body, space);
1710 } else {1713 } else {
1711 stream.pushIndent();1714 try stream.pushIndent();
1712 defer stream.popIndent();1715 defer stream.popIndent();
1713 return renderExpression(allocator, stream, tree, else_node.body, space);1716 return renderExpression(allocator, stream, tree, else_node.body, space);
1714 }1717 }
...@@ -1772,7 +1775,7 @@ fn renderExpression(...@@ -1772,7 +1775,7 @@ fn renderExpression(
1772 }1775 }
17731776
1774 {1777 {
1775 if (!body_is_block) stream.pushIndent();1778 if (!body_is_block) try stream.pushIndent();
1776 defer if (!body_is_block) stream.popIndent();1779 defer if (!body_is_block) stream.popIndent();
1777 try renderExpression(allocator, stream, tree, while_node.body, after_body_space);1780 try renderExpression(allocator, stream, tree, while_node.body, after_body_space);
1778 }1781 }
...@@ -1823,7 +1826,7 @@ fn renderExpression(...@@ -1823,7 +1826,7 @@ fn renderExpression(
1823 };1826 };
18241827
1825 {1828 {
1826 if (!body_on_same_line) stream.pushIndent();1829 if (!body_on_same_line) try stream.pushIndent();
1827 defer if (!body_on_same_line) stream.popIndent();1830 defer if (!body_on_same_line) stream.popIndent();
1828 try renderExpression(allocator, stream, tree, for_node.body, space_after_body); // { body }1831 try renderExpression(allocator, stream, tree, for_node.body, space_after_body); // { body }
1829 }1832 }
...@@ -1879,7 +1882,7 @@ fn renderExpression(...@@ -1879,7 +1882,7 @@ fn renderExpression(
1879 const else_is_block = nodeIsBlock(@"else".body);1882 const else_is_block = nodeIsBlock(@"else".body);
18801883
1881 {1884 {
1882 stream.pushIndent();1885 try stream.pushIndent();
1883 defer stream.popIndent();1886 defer stream.popIndent();
1884 try renderExpression(allocator, stream, tree, if_node.body, Space.Newline);1887 try renderExpression(allocator, stream, tree, if_node.body, Space.Newline);
1885 }1888 }
...@@ -1900,12 +1903,12 @@ fn renderExpression(...@@ -1900,12 +1903,12 @@ fn renderExpression(
1900 try renderExpression(allocator, stream, tree, payload, Space.Newline);1903 try renderExpression(allocator, stream, tree, payload, Space.Newline);
1901 }1904 }
19021905
1903 stream.pushIndent();1906 try stream.pushIndent();
1904 defer stream.popIndent();1907 defer stream.popIndent();
1905 return renderExpression(allocator, stream, tree, @"else".body, space);1908 return renderExpression(allocator, stream, tree, @"else".body, space);
1906 }1909 }
1907 } else {1910 } else {
1908 stream.pushIndent();1911 try stream.pushIndent();
1909 defer stream.popIndent();1912 defer stream.popIndent();
1910 return renderExpression(allocator, stream, tree, if_node.body, space);1913 return renderExpression(allocator, stream, tree, if_node.body, space);
1911 }1914 }
...@@ -1946,7 +1949,7 @@ fn renderExpression(...@@ -1946,7 +1949,7 @@ fn renderExpression(
1946 }1949 }
19471950
1948 asmblk: {1951 asmblk: {
1949 stream.pushIndent();1952 try stream.pushIndent();
1950 defer stream.popIndent();1953 defer stream.popIndent();
19511954
1952 if (asm_node.outputs.len == 0 and asm_node.inputs.len == 0 and asm_node.clobbers.len == 0) {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,7 +1968,7 @@ fn renderExpression(
1965 } else blk: {1968 } else blk: {
1966 try renderToken(tree, stream, colon1, Space.Space); // :1969 try renderToken(tree, stream, colon1, Space.Space); // :
19671970
1968 stream.pushIndentN(2);1971 try stream.pushIndentN(2);
1969 defer stream.popIndent();1972 defer stream.popIndent();
19701973
1971 for (asm_node.outputs) |*asm_output, i| {1974 for (asm_node.outputs) |*asm_output, i| {
...@@ -1996,7 +1999,7 @@ fn renderExpression(...@@ -1996,7 +1999,7 @@ fn renderExpression(
1996 break :blk tree.nextToken(colon2);1999 break :blk tree.nextToken(colon2);
1997 } else blk: {2000 } else blk: {
1998 try renderToken(tree, stream, colon2, Space.Space); // :2001 try renderToken(tree, stream, colon2, Space.Space); // :
1999 stream.pushIndentN(2);2002 try stream.pushIndentN(2);
2000 defer stream.popIndent();2003 defer stream.popIndent();
2001 for (asm_node.inputs) |*asm_input, i| {2004 for (asm_node.inputs) |*asm_input, i| {
2002 if (i + 1 < asm_node.inputs.len) {2005 if (i + 1 < asm_node.inputs.len) {
...@@ -2022,7 +2025,7 @@ fn renderExpression(...@@ -2022,7 +2025,7 @@ fn renderExpression(
2022 };2025 };
20232026
2024 try renderToken(tree, stream, colon3, Space.Space); // :2027 try renderToken(tree, stream, colon3, Space.Space); // :
2025 stream.pushIndentN(2);2028 try stream.pushIndentN(2);
2026 defer stream.popIndent();2029 defer stream.popIndent();
2027 for (asm_node.clobbers) |clobber_node, i| {2030 for (asm_node.clobbers) |clobber_node, i| {
2028 if (i + 1 >= asm_node.clobbers.len) {2031 if (i + 1 >= asm_node.clobbers.len) {
...@@ -2075,7 +2078,7 @@ fn renderArrayType(...@@ -2075,7 +2078,7 @@ fn renderArrayType(
2075 const new_space = if (ends_with_comment) Space.Newline else Space.None;2078 const new_space = if (ends_with_comment) Space.Newline else Space.None;
2076 {2079 {
2077 const do_indent = (starts_with_comment or ends_with_comment);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 defer if (do_indent) stream.popIndent();2082 defer if (do_indent) stream.popIndent();
20802083
2081 try renderToken(tree, stream, lbracket, Space.None); // [2084 try renderToken(tree, stream, lbracket, Space.None); // [
...@@ -2209,7 +2212,7 @@ fn renderVarDecl(...@@ -2209,7 +2212,7 @@ fn renderVarDecl(
2209 if (var_decl.getTrailer("init_node")) |init_node| {2212 if (var_decl.getTrailer("init_node")) |init_node| {
2210 const s = if (init_node.tag == .MultilineStringLiteral) Space.None else Space.Space;2213 const s = if (init_node.tag == .MultilineStringLiteral) Space.None else Space.Space;
2211 try renderToken(tree, stream, var_decl.getTrailer("eq_token").?, s); // =2214 try renderToken(tree, stream, var_decl.getTrailer("eq_token").?, s); // =
2212 stream.pushIndentOneShot();2215 try stream.pushIndentOneShot();
2213 try renderExpression(allocator, stream, tree, init_node, Space.None);2216 try renderExpression(allocator, stream, tree, init_node, Space.None);
2214 }2217 }
22152218