authorgravatar for lachlan@lakebythewoods.xyzLachlan Easton <lachlan@lakebythewoods.xyz> 2020-09-02 20:16:28+10:00
committergravatar for lachlan@lakebythewoods.xyzLachlan Easton <lachlan@lakebythewoods.xyz> 2020-09-02 20:16:28+10:00
logbb848dbeeec133b2ca1d6dc42fe9dd04b848b58a
treee1881f719b2c7fff7d09e9c867398fbdf6ed84bd
parent7841c9b7d105a62ccb55f4f6589d5ff31194a013

zig fmt: Patch rename stream to ais (auto indenting stream) & other small refactors


8 files changed, 653 insertions(+), 668 deletions(-)

lib/std/io/auto_indenting_stream.zig+11-13
...@@ -5,13 +5,13 @@ const assert = std.debug.assert;...@@ -5,13 +5,13 @@ const assert = std.debug.assert;
55
6/// Automatically inserts indentation of written data by keeping6/// Automatically inserts indentation of written data by keeping
7/// track of the current indentation level7/// track of the current indentation level
8pub fn AutoIndentingStream(comptime WriterType: type) type {8pub fn AutoIndentingStream(comptime UnderlyingWriter: type) type {
9 return struct {9 return struct {
10 const Self = @This();10 const Self = @This();
11 pub const Error = WriterType.Error;11 pub const Error = UnderlyingWriter.Error;
12 pub const Writer = io.Writer(*Self, Error, write);12 pub const Writer = io.Writer(*Self, Error, write);
1313
14 writer_pointer: *WriterType,14 underlying_writer: UnderlyingWriter,
1515
16 indent_count: usize = 0,16 indent_count: usize = 0,
17 indent_delta: usize,17 indent_delta: usize,
...@@ -20,10 +20,6 @@ pub fn AutoIndentingStream(comptime WriterType: type) type {...@@ -20,10 +20,6 @@ pub fn AutoIndentingStream(comptime WriterType: type) type {
20 applied_indent: usize = 0, // the most recently applied indent20 applied_indent: usize = 0, // the most recently applied indent
21 indent_next_line: usize = 0, // not used until the next line21 indent_next_line: usize = 0, // not used until the next line
2222
23 pub fn init(indent_delta: usize, writer_pointer: *WriterType) Self {
24 return Self{ .writer_pointer = writer_pointer, .indent_delta = indent_delta };
25 }
26
27 pub fn writer(self: *Self) Writer {23 pub fn writer(self: *Self) Writer {
28 return .{ .context = self };24 return .{ .context = self };
29 }25 }
...@@ -55,7 +51,7 @@ pub fn AutoIndentingStream(comptime WriterType: type) type {...@@ -55,7 +51,7 @@ pub fn AutoIndentingStream(comptime WriterType: type) type {
55 if (bytes.len == 0)51 if (bytes.len == 0)
56 return @as(usize, 0);52 return @as(usize, 0);
5753
58 try self.writer_pointer.writer().writeAll(bytes);54 try self.underlying_writer.writeAll(bytes);
59 if (bytes[bytes.len - 1] == '\n')55 if (bytes[bytes.len - 1] == '\n')
60 self.resetLine();56 self.resetLine();
61 return bytes.len;57 return bytes.len;
...@@ -115,7 +111,7 @@ pub fn AutoIndentingStream(comptime WriterType: type) type {...@@ -115,7 +111,7 @@ pub fn AutoIndentingStream(comptime WriterType: type) type {
115 fn applyIndent(self: *Self) Error!void {111 fn applyIndent(self: *Self) Error!void {
116 const current_indent = self.currentIndent();112 const current_indent = self.currentIndent();
117 if (self.current_line_empty and current_indent > 0) {113 if (self.current_line_empty and current_indent > 0) {
118 try self.writer_pointer.writer().writeByteNTimes(' ', current_indent);114 try self.underlying_writer.writeByteNTimes(' ', current_indent);
119 self.applied_indent = current_indent;115 self.applied_indent = current_indent;
120 }116 }
121117
...@@ -143,8 +139,10 @@ pub fn AutoIndentingStream(comptime WriterType: type) type {...@@ -143,8 +139,10 @@ pub fn AutoIndentingStream(comptime WriterType: type) type {
143139
144pub fn autoIndentingStream(140pub fn autoIndentingStream(
145 indent_delta: usize,141 indent_delta: usize,
146 underlying_stream: anytype,142 underlying_writer: anytype,
147) AutoIndentingStream(@TypeOf(underlying_stream).Child) {143) AutoIndentingStream(@TypeOf(underlying_writer)) {
148 comptime assert(@typeInfo(@TypeOf(underlying_stream)) == .Pointer);144 return AutoIndentingStream(@TypeOf(underlying_writer)){
149 return AutoIndentingStream(@TypeOf(underlying_stream).Child).init(indent_delta, underlying_stream);145 .underlying_writer = underlying_writer,
146 .indent_delta = indent_delta,
147 };
150}148}
lib/std/io/change_detection_stream.zig+11-15
...@@ -10,19 +10,11 @@ pub fn ChangeDetectionStream(comptime WriterType: type) type {...@@ -10,19 +10,11 @@ pub fn ChangeDetectionStream(comptime WriterType: type) type {
10 pub const Error = WriterType.Error;10 pub const Error = WriterType.Error;
11 pub const Writer = io.Writer(*Self, Error, write);11 pub const Writer = io.Writer(*Self, Error, write);
1212
13 anything_changed: bool = false,13 anything_changed: bool,
14 writer_pointer: *const WriterType,14 underlying_writer: WriterType,
15 source_index: usize,15 source_index: usize,
16 source: []const u8,16 source: []const u8,
1717
18 pub fn init(source: []const u8, writer_pointer: *const WriterType) Self {
19 return Self{
20 .writer_pointer = writer_pointer,
21 .source_index = 0,
22 .source = source,
23 };
24 }
25
26 pub fn writer(self: *Self) Writer {18 pub fn writer(self: *Self) Writer {
27 return .{ .context = self };19 return .{ .context = self };
28 }20 }
...@@ -41,7 +33,7 @@ pub fn ChangeDetectionStream(comptime WriterType: type) type {...@@ -41,7 +33,7 @@ pub fn ChangeDetectionStream(comptime WriterType: type) type {
41 }33 }
42 }34 }
4335
44 return self.writer_pointer.write(bytes);36 return self.underlying_writer.write(bytes);
45 }37 }
4638
47 pub fn changeDetected(self: *Self) bool {39 pub fn changeDetected(self: *Self) bool {
...@@ -52,8 +44,12 @@ pub fn ChangeDetectionStream(comptime WriterType: type) type {...@@ -52,8 +44,12 @@ pub fn ChangeDetectionStream(comptime WriterType: type) type {
5244
53pub fn changeDetectionStream(45pub fn changeDetectionStream(
54 source: []const u8,46 source: []const u8,
55 underlying_stream: anytype,47 underlying_writer: anytype,
56) ChangeDetectionStream(@TypeOf(underlying_stream).Child) {48) ChangeDetectionStream(@TypeOf(underlying_writer)) {
57 comptime assert(@typeInfo(@TypeOf(underlying_stream)) == .Pointer);49 return ChangeDetectionStream(@TypeOf(underlying_writer)){
58 return ChangeDetectionStream(@TypeOf(underlying_stream).Child).init(source, underlying_stream);50 .anything_changed = false,
51 .underlying_writer = underlying_writer,
52 .source_index = 0,
53 .source = source,
54 };
59}55}
lib/std/io/find_byte_out_stream.zig+11-15
...@@ -4,24 +4,16 @@ const assert = std.debug.assert;...@@ -4,24 +4,16 @@ const assert = std.debug.assert;
44
5/// An OutStream that returns whether the given character has been written to it.5/// An OutStream that returns whether the given character has been written to it.
6/// The contents are not written to anything.6/// The contents are not written to anything.
7pub fn FindByteOutStream(comptime WriterType: type) type {7pub fn FindByteOutStream(comptime UnderlyingWriter: 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 = UnderlyingWriter.Error;
11 pub const Writer = io.Writer(*Self, Error, write);11 pub const Writer = io.Writer(*Self, Error, write);
1212
13 writer_pointer: *const WriterType,13 underlying_writer: UnderlyingWriter,
14 byte_found: bool,14 byte_found: bool,
15 byte: u8,15 byte: u8,
1616
17 pub fn init(byte: u8, writer_pointer: *const WriterType) Self {
18 return Self{
19 .writer_pointer = writer_pointer,
20 .byte = byte,
21 .byte_found = false,
22 };
23 }
24
25 pub fn writer(self: *Self) Writer {17 pub fn writer(self: *Self) Writer {
26 return .{ .context = self };18 return .{ .context = self };
27 }19 }
...@@ -34,11 +26,15 @@ pub fn FindByteOutStream(comptime WriterType: type) type {...@@ -34,11 +26,15 @@ pub fn FindByteOutStream(comptime WriterType: type) type {
34 break :blk false;26 break :blk false;
35 };27 };
36 }28 }
37 return self.writer_pointer.writer().write(bytes);29 return self.underlying_writer.write(bytes);
38 }30 }
39 };31 };
40}32}
41pub fn findByteOutStream(byte: u8, underlying_stream: anytype) FindByteOutStream(@TypeOf(underlying_stream).Child) {33
42 comptime assert(@typeInfo(@TypeOf(underlying_stream)) == .Pointer);34pub fn findByteOutStream(byte: u8, underlying_writer: anytype) FindByteOutStream(@TypeOf(underlying_writer)) {
43 return FindByteOutStream(@TypeOf(underlying_stream).Child).init(byte, underlying_stream);35 return FindByteOutStream(@TypeOf(underlying_writer)){
36 .underlying_writer = underlying_writer,
37 .byte = byte,
38 .byte_found = false,
39 };
44}40}
lib/std/io/writer.zig-4
...@@ -18,10 +18,6 @@ pub fn Writer(...@@ -18,10 +18,6 @@ pub fn Writer(
18 const Self = @This();18 const Self = @This();
19 pub const Error = WriteError;19 pub const Error = WriteError;
2020
21 pub fn writer(self: *const Self) Self {
22 return self.*;
23 }
24
25 pub fn write(self: Self, bytes: []const u8) Error!usize {21 pub fn write(self: Self, bytes: []const u8) Error!usize {
26 return writeFn(self.context, bytes);22 return writeFn(self.context, bytes);
27 }23 }
lib/std/zig/parser_test.zig+1-1
...@@ -3364,7 +3364,7 @@ fn testParse(source: []const u8, allocator: *mem.Allocator, anything_changed: *b...@@ -3364,7 +3364,7 @@ fn testParse(source: []const u8, allocator: *mem.Allocator, anything_changed: *b
3364 errdefer buffer.deinit();3364 errdefer buffer.deinit();
33653365
3366 const outStream = buffer.outStream();3366 const outStream = buffer.outStream();
3367 anything_changed.* = try std.zig.render(allocator, &outStream, tree);3367 anything_changed.* = try std.zig.render(allocator, outStream, tree);
3368 return buffer.toOwnedSlice();3368 return buffer.toOwnedSlice();
3369}3369}
3370fn testTransform(source: []const u8, expected_source: []const u8) !void {3370fn testTransform(source: []const u8, expected_source: []const u8) !void {
lib/std/zig/render.zig+614-615
...@@ -19,13 +19,12 @@ pub const Error = error{...@@ -19,13 +19,12 @@ pub const Error = error{
19};19};
2020
21/// Returns whether anything changed21/// Returns whether anything changed
22pub fn render(allocator: *mem.Allocator, stream: anytype, tree: *ast.Tree) (meta.Child(@TypeOf(stream)).Error || Error)!bool {22pub fn render(allocator: *mem.Allocator, stream: anytype, tree: *ast.Tree) (@TypeOf(stream).Error || Error)!bool {
23 // cannot render an invalid tree23 // cannot render an invalid tree
24 std.debug.assert(tree.errors.len == 0);24 std.debug.assert(tree.errors.len == 0);
2525
26 var s = stream.*;26 var change_detection_stream = std.io.changeDetectionStream(tree.source, stream);
27 var change_detection_stream = std.io.changeDetectionStream(tree.source, &s);27 var auto_indenting_stream = std.io.autoIndentingStream(indent_delta, change_detection_stream.writer());
28 var auto_indenting_stream = std.io.autoIndentingStream(indent_delta, &change_detection_stream);
2928
30 try renderRoot(allocator, &auto_indenting_stream, tree);29 try renderRoot(allocator, &auto_indenting_stream, tree);
3130
...@@ -34,19 +33,19 @@ pub fn render(allocator: *mem.Allocator, stream: anytype, tree: *ast.Tree) (meta...@@ -34,19 +33,19 @@ pub fn render(allocator: *mem.Allocator, stream: anytype, tree: *ast.Tree) (meta
3433
35fn renderRoot(34fn renderRoot(
36 allocator: *mem.Allocator,35 allocator: *mem.Allocator,
37 stream: anytype,36 ais: anytype,
38 tree: *ast.Tree,37 tree: *ast.Tree,
39) (@TypeOf(stream.*).Error || Error)!void {38) (@TypeOf(ais.*).Error || Error)!void {
4039
41 // render all the line comments at the beginning of the file40 // render all the line comments at the beginning of the file
42 for (tree.token_ids) |token_id, i| {41 for (tree.token_ids) |token_id, i| {
43 if (token_id != .LineComment) break;42 if (token_id != .LineComment) break;
44 const token_loc = tree.token_locs[i];43 const token_loc = tree.token_locs[i];
45 try stream.writer().print("{}\n", .{mem.trimRight(u8, tree.tokenSliceLoc(token_loc), " ")});44 try ais.writer().print("{}\n", .{mem.trimRight(u8, tree.tokenSliceLoc(token_loc), " ")});
46 const next_token = tree.token_locs[i + 1];45 const next_token = tree.token_locs[i + 1];
47 const loc = tree.tokenLocationLoc(token_loc.end, next_token);46 const loc = tree.tokenLocationLoc(token_loc.end, next_token);
48 if (loc.line >= 2) {47 if (loc.line >= 2) {
49 try stream.insertNewline();48 try ais.insertNewline();
50 }49 }
51 }50 }
5251
...@@ -110,7 +109,7 @@ fn renderRoot(...@@ -110,7 +109,7 @@ fn renderRoot(
110 // If there's no next reformatted `decl`, just copy the109 // If there's no next reformatted `decl`, just copy the
111 // remaining input tokens and bail out.110 // remaining input tokens and bail out.
112 const start = tree.token_locs[copy_start_token_index].start;111 const start = tree.token_locs[copy_start_token_index].start;
113 try copyFixingWhitespace(stream, tree.source[start..]);112 try copyFixingWhitespace(ais, tree.source[start..]);
114 return;113 return;
115 }114 }
116 decl = root_decls[decl_i];115 decl = root_decls[decl_i];
...@@ -151,25 +150,25 @@ fn renderRoot(...@@ -151,25 +150,25 @@ fn renderRoot(
151150
152 const start = tree.token_locs[copy_start_token_index].start;151 const start = tree.token_locs[copy_start_token_index].start;
153 const end = tree.token_locs[copy_end_token_index].start;152 const end = tree.token_locs[copy_end_token_index].start;
154 try copyFixingWhitespace(stream, tree.source[start..end]);153 try copyFixingWhitespace(ais, tree.source[start..end]);
155 }154 }
156155
157 try renderTopLevelDecl(allocator, stream, tree, decl);156 try renderTopLevelDecl(allocator, ais, tree, decl);
158 decl_i += 1;157 decl_i += 1;
159 if (decl_i >= root_decls.len) return;158 if (decl_i >= root_decls.len) return;
160 try renderExtraNewline(tree, stream, root_decls[decl_i]);159 try renderExtraNewline(tree, ais, root_decls[decl_i]);
161 }160 }
162}161}
163162
164fn renderExtraNewline(tree: *ast.Tree, stream: anytype, node: *ast.Node) @TypeOf(stream.*).Error!void {163fn renderExtraNewline(tree: *ast.Tree, ais: anytype, node: *ast.Node) @TypeOf(ais.*).Error!void {
165 return renderExtraNewlineToken(tree, stream, node.firstToken());164 return renderExtraNewlineToken(tree, ais, node.firstToken());
166}165}
167166
168fn renderExtraNewlineToken(167fn renderExtraNewlineToken(
169 tree: *ast.Tree,168 tree: *ast.Tree,
170 stream: anytype,169 ais: anytype,
171 first_token: ast.TokenIndex,170 first_token: ast.TokenIndex,
172) @TypeOf(stream.*).Error!void {171) @TypeOf(ais.*).Error!void {
173 var prev_token = first_token;172 var prev_token = first_token;
174 if (prev_token == 0) return;173 if (prev_token == 0) return;
175 var newline_threshold: usize = 2;174 var newline_threshold: usize = 2;
...@@ -182,27 +181,27 @@ fn renderExtraNewlineToken(...@@ -182,27 +181,27 @@ fn renderExtraNewlineToken(
182 const prev_token_end = tree.token_locs[prev_token - 1].end;181 const prev_token_end = tree.token_locs[prev_token - 1].end;
183 const loc = tree.tokenLocation(prev_token_end, first_token);182 const loc = tree.tokenLocation(prev_token_end, first_token);
184 if (loc.line >= newline_threshold) {183 if (loc.line >= newline_threshold) {
185 try stream.insertNewline();184 try ais.insertNewline();
186 }185 }
187}186}
188187
189fn renderTopLevelDecl(allocator: *mem.Allocator, stream: anytype, tree: *ast.Tree, decl: *ast.Node) (@TypeOf(stream.*).Error || Error)!void {188fn renderTopLevelDecl(allocator: *mem.Allocator, ais: anytype, tree: *ast.Tree, decl: *ast.Node) (@TypeOf(ais.*).Error || Error)!void {
190 try renderContainerDecl(allocator, stream, tree, decl, .Newline);189 try renderContainerDecl(allocator, ais, tree, decl, .Newline);
191}190}
192191
193fn renderContainerDecl(allocator: *mem.Allocator, stream: anytype, tree: *ast.Tree, decl: *ast.Node, space: Space) (@TypeOf(stream.*).Error || Error)!void {192fn renderContainerDecl(allocator: *mem.Allocator, ais: anytype, tree: *ast.Tree, decl: *ast.Node, space: Space) (@TypeOf(ais.*).Error || Error)!void {
194 switch (decl.tag) {193 switch (decl.tag) {
195 .FnProto => {194 .FnProto => {
196 const fn_proto = @fieldParentPtr(ast.Node.FnProto, "base", decl);195 const fn_proto = @fieldParentPtr(ast.Node.FnProto, "base", decl);
197196
198 try renderDocComments(tree, stream, fn_proto, fn_proto.getDocComments());197 try renderDocComments(tree, ais, fn_proto, fn_proto.getDocComments());
199198
200 if (fn_proto.getBodyNode()) |body_node| {199 if (fn_proto.getBodyNode()) |body_node| {
201 try renderExpression(allocator, stream, tree, decl, .Space);200 try renderExpression(allocator, ais, tree, decl, .Space);
202 try renderExpression(allocator, stream, tree, body_node, space);201 try renderExpression(allocator, ais, tree, body_node, space);
203 } else {202 } else {
204 try renderExpression(allocator, stream, tree, decl, .None);203 try renderExpression(allocator, ais, tree, decl, .None);
205 try renderToken(tree, stream, tree.nextToken(decl.lastToken()), space);204 try renderToken(tree, ais, tree.nextToken(decl.lastToken()), space);
206 }205 }
207 },206 },
208207
...@@ -210,35 +209,35 @@ fn renderContainerDecl(allocator: *mem.Allocator, stream: anytype, tree: *ast.Tr...@@ -210,35 +209,35 @@ fn renderContainerDecl(allocator: *mem.Allocator, stream: anytype, tree: *ast.Tr
210 const use_decl = @fieldParentPtr(ast.Node.Use, "base", decl);209 const use_decl = @fieldParentPtr(ast.Node.Use, "base", decl);
211210
212 if (use_decl.visib_token) |visib_token| {211 if (use_decl.visib_token) |visib_token| {
213 try renderToken(tree, stream, visib_token, .Space); // pub212 try renderToken(tree, ais, visib_token, .Space); // pub
214 }213 }
215 try renderToken(tree, stream, use_decl.use_token, .Space); // usingnamespace214 try renderToken(tree, ais, use_decl.use_token, .Space); // usingnamespace
216 try renderExpression(allocator, stream, tree, use_decl.expr, .None);215 try renderExpression(allocator, ais, tree, use_decl.expr, .None);
217 try renderToken(tree, stream, use_decl.semicolon_token, space); // ;216 try renderToken(tree, ais, use_decl.semicolon_token, space); // ;
218 },217 },
219218
220 .VarDecl => {219 .VarDecl => {
221 const var_decl = @fieldParentPtr(ast.Node.VarDecl, "base", decl);220 const var_decl = @fieldParentPtr(ast.Node.VarDecl, "base", decl);
222221
223 try renderDocComments(tree, stream, var_decl, var_decl.getDocComments());222 try renderDocComments(tree, ais, var_decl, var_decl.getDocComments());
224 try renderVarDecl(allocator, stream, tree, var_decl);223 try renderVarDecl(allocator, ais, tree, var_decl);
225 },224 },
226225
227 .TestDecl => {226 .TestDecl => {
228 const test_decl = @fieldParentPtr(ast.Node.TestDecl, "base", decl);227 const test_decl = @fieldParentPtr(ast.Node.TestDecl, "base", decl);
229228
230 try renderDocComments(tree, stream, test_decl, test_decl.doc_comments);229 try renderDocComments(tree, ais, test_decl, test_decl.doc_comments);
231 try renderToken(tree, stream, test_decl.test_token, .Space);230 try renderToken(tree, ais, test_decl.test_token, .Space);
232 try renderExpression(allocator, stream, tree, test_decl.name, .Space);231 try renderExpression(allocator, ais, tree, test_decl.name, .Space);
233 try renderExpression(allocator, stream, tree, test_decl.body_node, space);232 try renderExpression(allocator, ais, tree, test_decl.body_node, space);
234 },233 },
235234
236 .ContainerField => {235 .ContainerField => {
237 const field = @fieldParentPtr(ast.Node.ContainerField, "base", decl);236 const field = @fieldParentPtr(ast.Node.ContainerField, "base", decl);
238237
239 try renderDocComments(tree, stream, field, field.doc_comments);238 try renderDocComments(tree, ais, field, field.doc_comments);
240 if (field.comptime_token) |t| {239 if (field.comptime_token) |t| {
241 try renderToken(tree, stream, t, .Space); // comptime240 try renderToken(tree, ais, t, .Space); // comptime
242 }241 }
243242
244 const src_has_trailing_comma = blk: {243 const src_has_trailing_comma = blk: {
...@@ -251,67 +250,67 @@ fn renderContainerDecl(allocator: *mem.Allocator, stream: anytype, tree: *ast.Tr...@@ -251,67 +250,67 @@ fn renderContainerDecl(allocator: *mem.Allocator, stream: anytype, tree: *ast.Tr
251 const last_token_space: Space = if (src_has_trailing_comma) .None else space;250 const last_token_space: Space = if (src_has_trailing_comma) .None else space;
252251
253 if (field.type_expr == null and field.value_expr == null) {252 if (field.type_expr == null and field.value_expr == null) {
254 try renderToken(tree, stream, field.name_token, last_token_space); // name253 try renderToken(tree, ais, field.name_token, last_token_space); // name
255 } else if (field.type_expr != null and field.value_expr == null) {254 } else if (field.type_expr != null and field.value_expr == null) {
256 try renderToken(tree, stream, field.name_token, .None); // name255 try renderToken(tree, ais, field.name_token, .None); // name
257 try renderToken(tree, stream, tree.nextToken(field.name_token), .Space); // :256 try renderToken(tree, ais, tree.nextToken(field.name_token), .Space); // :
258257
259 if (field.align_expr) |align_value_expr| {258 if (field.align_expr) |align_value_expr| {
260 try renderExpression(allocator, stream, tree, field.type_expr.?, .Space); // type259 try renderExpression(allocator, ais, tree, field.type_expr.?, .Space); // type
261 const lparen_token = tree.prevToken(align_value_expr.firstToken());260 const lparen_token = tree.prevToken(align_value_expr.firstToken());
262 const align_kw = tree.prevToken(lparen_token);261 const align_kw = tree.prevToken(lparen_token);
263 const rparen_token = tree.nextToken(align_value_expr.lastToken());262 const rparen_token = tree.nextToken(align_value_expr.lastToken());
264 try renderToken(tree, stream, align_kw, .None); // align263 try renderToken(tree, ais, align_kw, .None); // align
265 try renderToken(tree, stream, lparen_token, .None); // (264 try renderToken(tree, ais, lparen_token, .None); // (
266 try renderExpression(allocator, stream, tree, align_value_expr, .None); // alignment265 try renderExpression(allocator, ais, tree, align_value_expr, .None); // alignment
267 try renderToken(tree, stream, rparen_token, last_token_space); // )266 try renderToken(tree, ais, rparen_token, last_token_space); // )
268 } else {267 } else {
269 try renderExpression(allocator, stream, tree, field.type_expr.?, last_token_space); // type268 try renderExpression(allocator, ais, tree, field.type_expr.?, last_token_space); // type
270 }269 }
271 } else if (field.type_expr == null and field.value_expr != null) {270 } else if (field.type_expr == null and field.value_expr != null) {
272 try renderToken(tree, stream, field.name_token, .Space); // name271 try renderToken(tree, ais, field.name_token, .Space); // name
273 try renderToken(tree, stream, tree.nextToken(field.name_token), .Space); // =272 try renderToken(tree, ais, tree.nextToken(field.name_token), .Space); // =
274 try renderExpression(allocator, stream, tree, field.value_expr.?, last_token_space); // value273 try renderExpression(allocator, ais, tree, field.value_expr.?, last_token_space); // value
275 } else {274 } else {
276 try renderToken(tree, stream, field.name_token, .None); // name275 try renderToken(tree, ais, field.name_token, .None); // name
277 try renderToken(tree, stream, tree.nextToken(field.name_token), .Space); // :276 try renderToken(tree, ais, tree.nextToken(field.name_token), .Space); // :
278277
279 if (field.align_expr) |align_value_expr| {278 if (field.align_expr) |align_value_expr| {
280 try renderExpression(allocator, stream, tree, field.type_expr.?, .Space); // type279 try renderExpression(allocator, ais, tree, field.type_expr.?, .Space); // type
281 const lparen_token = tree.prevToken(align_value_expr.firstToken());280 const lparen_token = tree.prevToken(align_value_expr.firstToken());
282 const align_kw = tree.prevToken(lparen_token);281 const align_kw = tree.prevToken(lparen_token);
283 const rparen_token = tree.nextToken(align_value_expr.lastToken());282 const rparen_token = tree.nextToken(align_value_expr.lastToken());
284 try renderToken(tree, stream, align_kw, .None); // align283 try renderToken(tree, ais, align_kw, .None); // align
285 try renderToken(tree, stream, lparen_token, .None); // (284 try renderToken(tree, ais, lparen_token, .None); // (
286 try renderExpression(allocator, stream, tree, align_value_expr, .None); // alignment285 try renderExpression(allocator, ais, tree, align_value_expr, .None); // alignment
287 try renderToken(tree, stream, rparen_token, .Space); // )286 try renderToken(tree, ais, rparen_token, .Space); // )
288 } else {287 } else {
289 try renderExpression(allocator, stream, tree, field.type_expr.?, .Space); // type288 try renderExpression(allocator, ais, tree, field.type_expr.?, .Space); // type
290 }289 }
291 try renderToken(tree, stream, tree.prevToken(field.value_expr.?.firstToken()), .Space); // =290 try renderToken(tree, ais, tree.prevToken(field.value_expr.?.firstToken()), .Space); // =
292 try renderExpression(allocator, stream, tree, field.value_expr.?, last_token_space); // value291 try renderExpression(allocator, ais, tree, field.value_expr.?, last_token_space); // value
293 }292 }
294293
295 if (src_has_trailing_comma) {294 if (src_has_trailing_comma) {
296 const comma = tree.nextToken(field.lastToken());295 const comma = tree.nextToken(field.lastToken());
297 try renderToken(tree, stream, comma, space);296 try renderToken(tree, ais, comma, space);
298 }297 }
299 },298 },
300299
301 .Comptime => {300 .Comptime => {
302 assert(!decl.requireSemiColon());301 assert(!decl.requireSemiColon());
303 try renderExpression(allocator, stream, tree, decl, space);302 try renderExpression(allocator, ais, tree, decl, space);
304 },303 },
305304
306 .DocComment => {305 .DocComment => {
307 const comment = @fieldParentPtr(ast.Node.DocComment, "base", decl);306 const comment = @fieldParentPtr(ast.Node.DocComment, "base", decl);
308 const kind = tree.token_ids[comment.first_line];307 const kind = tree.token_ids[comment.first_line];
309 try renderToken(tree, stream, comment.first_line, .Newline);308 try renderToken(tree, ais, comment.first_line, .Newline);
310 var tok_i = comment.first_line + 1;309 var tok_i = comment.first_line + 1;
311 while (true) : (tok_i += 1) {310 while (true) : (tok_i += 1) {
312 const tok_id = tree.token_ids[tok_i];311 const tok_id = tree.token_ids[tok_i];
313 if (tok_id == kind) {312 if (tok_id == kind) {
314 try renderToken(tree, stream, tok_i, .Newline);313 try renderToken(tree, ais, tok_i, .Newline);
315 } else if (tok_id == .LineComment) {314 } else if (tok_id == .LineComment) {
316 continue;315 continue;
317 } else {316 } else {
...@@ -325,11 +324,11 @@ fn renderContainerDecl(allocator: *mem.Allocator, stream: anytype, tree: *ast.Tr...@@ -325,11 +324,11 @@ fn renderContainerDecl(allocator: *mem.Allocator, stream: anytype, tree: *ast.Tr
325324
326fn renderExpression(325fn renderExpression(
327 allocator: *mem.Allocator,326 allocator: *mem.Allocator,
328 stream: anytype,327 ais: anytype,
329 tree: *ast.Tree,328 tree: *ast.Tree,
330 base: *ast.Node,329 base: *ast.Node,
331 space: Space,330 space: Space,
332) (@TypeOf(stream.*).Error || Error)!void {331) (@TypeOf(ais.*).Error || Error)!void {
333 switch (base.tag) {332 switch (base.tag) {
334 .Identifier,333 .Identifier,
335 .IntegerLiteral,334 .IntegerLiteral,
...@@ -343,18 +342,18 @@ fn renderExpression(...@@ -343,18 +342,18 @@ fn renderExpression(
343 .UndefinedLiteral,342 .UndefinedLiteral,
344 => {343 => {
345 const casted_node = base.cast(ast.Node.OneToken).?;344 const casted_node = base.cast(ast.Node.OneToken).?;
346 return renderToken(tree, stream, casted_node.token, space);345 return renderToken(tree, ais, casted_node.token, space);
347 },346 },
348347
349 .AnyType => {348 .AnyType => {
350 const any_type = base.castTag(.AnyType).?;349 const any_type = base.castTag(.AnyType).?;
351 if (mem.eql(u8, tree.tokenSlice(any_type.token), "var")) {350 if (mem.eql(u8, tree.tokenSlice(any_type.token), "var")) {
352 // TODO remove in next release cycle351 // TODO remove in next release cycle
353 try stream.writer().writeAll("anytype");352 try ais.writer().writeAll("anytype");
354 if (space == .Comma) try stream.writer().writeAll(",\n");353 if (space == .Comma) try ais.writer().writeAll(",\n");
355 return;354 return;
356 }355 }
357 return renderToken(tree, stream, any_type.token, space);356 return renderToken(tree, ais, any_type.token, space);
358 },357 },
359358
360 .Block, .LabeledBlock => {359 .Block, .LabeledBlock => {
...@@ -384,65 +383,65 @@ fn renderExpression(...@@ -384,65 +383,65 @@ fn renderExpression(
384 };383 };
385384
386 if (block.label) |label| {385 if (block.label) |label| {
387 try renderToken(tree, stream, label, Space.None);386 try renderToken(tree, ais, label, Space.None);
388 try renderToken(tree, stream, tree.nextToken(label), Space.Space);387 try renderToken(tree, ais, tree.nextToken(label), Space.Space);
389 }388 }
390389
391 if (block.statements.len == 0) {390 if (block.statements.len == 0) {
392 stream.pushIndentNextLine();391 ais.pushIndentNextLine();
393 defer stream.popIndent();392 defer ais.popIndent();
394 try renderToken(tree, stream, block.lbrace, Space.None);393 try renderToken(tree, ais, block.lbrace, Space.None);
395 } else {394 } else {
396 stream.pushIndentNextLine();395 ais.pushIndentNextLine();
397 defer stream.popIndent();396 defer ais.popIndent();
398397
399 try renderToken(tree, stream, block.lbrace, Space.Newline);398 try renderToken(tree, ais, block.lbrace, Space.Newline);
400399
401 for (block.statements) |statement, i| {400 for (block.statements) |statement, i| {
402 try renderStatement(allocator, stream, tree, statement);401 try renderStatement(allocator, ais, tree, statement);
403402
404 if (i + 1 < block.statements.len) {403 if (i + 1 < block.statements.len) {
405 try renderExtraNewline(tree, stream, block.statements[i + 1]);404 try renderExtraNewline(tree, ais, block.statements[i + 1]);
406 }405 }
407 }406 }
408 }407 }
409 return renderToken(tree, stream, block.rbrace, space);408 return renderToken(tree, ais, block.rbrace, space);
410 },409 },
411410
412 .Defer => {411 .Defer => {
413 const defer_node = @fieldParentPtr(ast.Node.Defer, "base", base);412 const defer_node = @fieldParentPtr(ast.Node.Defer, "base", base);
414413
415 try renderToken(tree, stream, defer_node.defer_token, Space.Space);414 try renderToken(tree, ais, defer_node.defer_token, Space.Space);
416 if (defer_node.payload) |payload| {415 if (defer_node.payload) |payload| {
417 try renderExpression(allocator, stream, tree, payload, Space.Space);416 try renderExpression(allocator, ais, tree, payload, Space.Space);
418 }417 }
419 return renderExpression(allocator, stream, tree, defer_node.expr, space);418 return renderExpression(allocator, ais, tree, defer_node.expr, space);
420 },419 },
421 .Comptime => {420 .Comptime => {
422 const comptime_node = @fieldParentPtr(ast.Node.Comptime, "base", base);421 const comptime_node = @fieldParentPtr(ast.Node.Comptime, "base", base);
423422
424 try renderToken(tree, stream, comptime_node.comptime_token, Space.Space);423 try renderToken(tree, ais, comptime_node.comptime_token, Space.Space);
425 return renderExpression(allocator, stream, tree, comptime_node.expr, space);424 return renderExpression(allocator, ais, tree, comptime_node.expr, space);
426 },425 },
427 .Nosuspend => {426 .Nosuspend => {
428 const nosuspend_node = @fieldParentPtr(ast.Node.Nosuspend, "base", base);427 const nosuspend_node = @fieldParentPtr(ast.Node.Nosuspend, "base", base);
429 if (mem.eql(u8, tree.tokenSlice(nosuspend_node.nosuspend_token), "noasync")) {428 if (mem.eql(u8, tree.tokenSlice(nosuspend_node.nosuspend_token), "noasync")) {
430 // TODO: remove this429 // TODO: remove this
431 try stream.writer().writeAll("nosuspend ");430 try ais.writer().writeAll("nosuspend ");
432 } else {431 } else {
433 try renderToken(tree, stream, nosuspend_node.nosuspend_token, Space.Space);432 try renderToken(tree, ais, nosuspend_node.nosuspend_token, Space.Space);
434 }433 }
435 return renderExpression(allocator, stream, tree, nosuspend_node.expr, space);434 return renderExpression(allocator, ais, tree, nosuspend_node.expr, space);
436 },435 },
437436
438 .Suspend => {437 .Suspend => {
439 const suspend_node = @fieldParentPtr(ast.Node.Suspend, "base", base);438 const suspend_node = @fieldParentPtr(ast.Node.Suspend, "base", base);
440439
441 if (suspend_node.body) |body| {440 if (suspend_node.body) |body| {
442 try renderToken(tree, stream, suspend_node.suspend_token, Space.Space);441 try renderToken(tree, ais, suspend_node.suspend_token, Space.Space);
443 return renderExpression(allocator, stream, tree, body, space);442 return renderExpression(allocator, ais, tree, body, space);
444 } else {443 } else {
445 return renderToken(tree, stream, suspend_node.suspend_token, space);444 return renderToken(tree, ais, suspend_node.suspend_token, space);
446 }445 }
447 },446 },
448447
...@@ -450,21 +449,21 @@ fn renderExpression(...@@ -450,21 +449,21 @@ fn renderExpression(
450 const infix_op_node = @fieldParentPtr(ast.Node.Catch, "base", base);449 const infix_op_node = @fieldParentPtr(ast.Node.Catch, "base", base);
451450
452 const op_space = Space.Space;451 const op_space = Space.Space;
453 try renderExpression(allocator, stream, tree, infix_op_node.lhs, op_space);452 try renderExpression(allocator, ais, tree, infix_op_node.lhs, op_space);
454453
455 const after_op_space = blk: {454 const after_op_space = blk: {
456 const same_line = tree.tokensOnSameLine(infix_op_node.op_token, tree.nextToken(infix_op_node.op_token));455 const same_line = tree.tokensOnSameLine(infix_op_node.op_token, tree.nextToken(infix_op_node.op_token));
457 break :blk if (same_line) op_space else Space.Newline;456 break :blk if (same_line) op_space else Space.Newline;
458 };457 };
459458
460 try renderToken(tree, stream, infix_op_node.op_token, after_op_space);459 try renderToken(tree, ais, infix_op_node.op_token, after_op_space);
461460
462 if (infix_op_node.payload) |payload| {461 if (infix_op_node.payload) |payload| {
463 try renderExpression(allocator, stream, tree, payload, Space.Space);462 try renderExpression(allocator, ais, tree, payload, Space.Space);
464 }463 }
465464
466 stream.pushIndentOneShot();465 ais.pushIndentOneShot();
467 return renderExpression(allocator, stream, tree, infix_op_node.rhs, space);466 return renderExpression(allocator, ais, tree, infix_op_node.rhs, space);
468 },467 },
469468
470 .Add,469 .Add,
...@@ -516,16 +515,16 @@ fn renderExpression(...@@ -516,16 +515,16 @@ fn renderExpression(
516 .Period, .ErrorUnion, .Range => Space.None,515 .Period, .ErrorUnion, .Range => Space.None,
517 else => Space.Space,516 else => Space.Space,
518 };517 };
519 try renderExpression(allocator, stream, tree, infix_op_node.lhs, op_space);518 try renderExpression(allocator, ais, tree, infix_op_node.lhs, op_space);
520519
521 const after_op_space = blk: {520 const after_op_space = blk: {
522 const loc = tree.tokenLocation(tree.token_locs[infix_op_node.op_token].end, tree.nextToken(infix_op_node.op_token));521 const loc = tree.tokenLocation(tree.token_locs[infix_op_node.op_token].end, tree.nextToken(infix_op_node.op_token));
523 break :blk if (loc.line == 0) op_space else Space.Newline;522 break :blk if (loc.line == 0) op_space else Space.Newline;
524 };523 };
525524
526 try renderToken(tree, stream, infix_op_node.op_token, after_op_space);525 try renderToken(tree, ais, infix_op_node.op_token, after_op_space);
527 stream.pushIndentOneShot();526 ais.pushIndentOneShot();
528 return renderExpression(allocator, stream, tree, infix_op_node.rhs, space);527 return renderExpression(allocator, ais, tree, infix_op_node.rhs, space);
529 },528 },
530529
531 .BitNot,530 .BitNot,
...@@ -536,8 +535,8 @@ fn renderExpression(...@@ -536,8 +535,8 @@ fn renderExpression(
536 .AddressOf,535 .AddressOf,
537 => {536 => {
538 const casted_node = @fieldParentPtr(ast.Node.SimplePrefixOp, "base", base);537 const casted_node = @fieldParentPtr(ast.Node.SimplePrefixOp, "base", base);
539 try renderToken(tree, stream, casted_node.op_token, Space.None);538 try renderToken(tree, ais, casted_node.op_token, Space.None);
540 return renderExpression(allocator, stream, tree, casted_node.rhs, space);539 return renderExpression(allocator, ais, tree, casted_node.rhs, space);
541 },540 },
542541
543 .Try,542 .Try,
...@@ -545,15 +544,15 @@ fn renderExpression(...@@ -545,15 +544,15 @@ fn renderExpression(
545 .Await,544 .Await,
546 => {545 => {
547 const casted_node = @fieldParentPtr(ast.Node.SimplePrefixOp, "base", base);546 const casted_node = @fieldParentPtr(ast.Node.SimplePrefixOp, "base", base);
548 try renderToken(tree, stream, casted_node.op_token, Space.Space);547 try renderToken(tree, ais, casted_node.op_token, Space.Space);
549 return renderExpression(allocator, stream, tree, casted_node.rhs, space);548 return renderExpression(allocator, ais, tree, casted_node.rhs, space);
550 },549 },
551550
552 .ArrayType => {551 .ArrayType => {
553 const array_type = @fieldParentPtr(ast.Node.ArrayType, "base", base);552 const array_type = @fieldParentPtr(ast.Node.ArrayType, "base", base);
554 return renderArrayType(553 return renderArrayType(
555 allocator,554 allocator,
556 stream,555 ais,
557 tree,556 tree,
558 array_type.op_token,557 array_type.op_token,
559 array_type.rhs,558 array_type.rhs,
...@@ -566,7 +565,7 @@ fn renderExpression(...@@ -566,7 +565,7 @@ fn renderExpression(
566 const array_type = @fieldParentPtr(ast.Node.ArrayTypeSentinel, "base", base);565 const array_type = @fieldParentPtr(ast.Node.ArrayTypeSentinel, "base", base);
567 return renderArrayType(566 return renderArrayType(
568 allocator,567 allocator,
569 stream,568 ais,
570 tree,569 tree,
571 array_type.op_token,570 array_type.op_token,
572 array_type.rhs,571 array_type.rhs,
...@@ -580,111 +579,111 @@ fn renderExpression(...@@ -580,111 +579,111 @@ fn renderExpression(
580 const ptr_type = @fieldParentPtr(ast.Node.PtrType, "base", base);579 const ptr_type = @fieldParentPtr(ast.Node.PtrType, "base", base);
581 const op_tok_id = tree.token_ids[ptr_type.op_token];580 const op_tok_id = tree.token_ids[ptr_type.op_token];
582 switch (op_tok_id) {581 switch (op_tok_id) {
583 .Asterisk, .AsteriskAsterisk => try stream.writer().writeByte('*'),582 .Asterisk, .AsteriskAsterisk => try ais.writer().writeByte('*'),
584 .LBracket => if (tree.token_ids[ptr_type.op_token + 2] == .Identifier)583 .LBracket => if (tree.token_ids[ptr_type.op_token + 2] == .Identifier)
585 try stream.writer().writeAll("[*c")584 try ais.writer().writeAll("[*c")
586 else585 else
587 try stream.writer().writeAll("[*"),586 try ais.writer().writeAll("[*"),
588 else => unreachable,587 else => unreachable,
589 }588 }
590 if (ptr_type.ptr_info.sentinel) |sentinel| {589 if (ptr_type.ptr_info.sentinel) |sentinel| {
591 const colon_token = tree.prevToken(sentinel.firstToken());590 const colon_token = tree.prevToken(sentinel.firstToken());
592 try renderToken(tree, stream, colon_token, Space.None); // :591 try renderToken(tree, ais, colon_token, Space.None); // :
593 const sentinel_space = switch (op_tok_id) {592 const sentinel_space = switch (op_tok_id) {
594 .LBracket => Space.None,593 .LBracket => Space.None,
595 else => Space.Space,594 else => Space.Space,
596 };595 };
597 try renderExpression(allocator, stream, tree, sentinel, sentinel_space);596 try renderExpression(allocator, ais, tree, sentinel, sentinel_space);
598 }597 }
599 switch (op_tok_id) {598 switch (op_tok_id) {
600 .Asterisk, .AsteriskAsterisk => {},599 .Asterisk, .AsteriskAsterisk => {},
601 .LBracket => try stream.writer().writeByte(']'),600 .LBracket => try ais.writer().writeByte(']'),
602 else => unreachable,601 else => unreachable,
603 }602 }
604 if (ptr_type.ptr_info.allowzero_token) |allowzero_token| {603 if (ptr_type.ptr_info.allowzero_token) |allowzero_token| {
605 try renderToken(tree, stream, allowzero_token, Space.Space); // allowzero604 try renderToken(tree, ais, allowzero_token, Space.Space); // allowzero
606 }605 }
607 if (ptr_type.ptr_info.align_info) |align_info| {606 if (ptr_type.ptr_info.align_info) |align_info| {
608 const lparen_token = tree.prevToken(align_info.node.firstToken());607 const lparen_token = tree.prevToken(align_info.node.firstToken());
609 const align_token = tree.prevToken(lparen_token);608 const align_token = tree.prevToken(lparen_token);
610609
611 try renderToken(tree, stream, align_token, Space.None); // align610 try renderToken(tree, ais, align_token, Space.None); // align
612 try renderToken(tree, stream, lparen_token, Space.None); // (611 try renderToken(tree, ais, lparen_token, Space.None); // (
613612
614 try renderExpression(allocator, stream, tree, align_info.node, Space.None);613 try renderExpression(allocator, ais, tree, align_info.node, Space.None);
615614
616 if (align_info.bit_range) |bit_range| {615 if (align_info.bit_range) |bit_range| {
617 const colon1 = tree.prevToken(bit_range.start.firstToken());616 const colon1 = tree.prevToken(bit_range.start.firstToken());
618 const colon2 = tree.prevToken(bit_range.end.firstToken());617 const colon2 = tree.prevToken(bit_range.end.firstToken());
619618
620 try renderToken(tree, stream, colon1, Space.None); // :619 try renderToken(tree, ais, colon1, Space.None); // :
621 try renderExpression(allocator, stream, tree, bit_range.start, Space.None);620 try renderExpression(allocator, ais, tree, bit_range.start, Space.None);
622 try renderToken(tree, stream, colon2, Space.None); // :621 try renderToken(tree, ais, colon2, Space.None); // :
623 try renderExpression(allocator, stream, tree, bit_range.end, Space.None);622 try renderExpression(allocator, ais, tree, bit_range.end, Space.None);
624623
625 const rparen_token = tree.nextToken(bit_range.end.lastToken());624 const rparen_token = tree.nextToken(bit_range.end.lastToken());
626 try renderToken(tree, stream, rparen_token, Space.Space); // )625 try renderToken(tree, ais, rparen_token, Space.Space); // )
627 } else {626 } else {
628 const rparen_token = tree.nextToken(align_info.node.lastToken());627 const rparen_token = tree.nextToken(align_info.node.lastToken());
629 try renderToken(tree, stream, rparen_token, Space.Space); // )628 try renderToken(tree, ais, rparen_token, Space.Space); // )
630 }629 }
631 }630 }
632 if (ptr_type.ptr_info.const_token) |const_token| {631 if (ptr_type.ptr_info.const_token) |const_token| {
633 try renderToken(tree, stream, const_token, Space.Space); // const632 try renderToken(tree, ais, const_token, Space.Space); // const
634 }633 }
635 if (ptr_type.ptr_info.volatile_token) |volatile_token| {634 if (ptr_type.ptr_info.volatile_token) |volatile_token| {
636 try renderToken(tree, stream, volatile_token, Space.Space); // volatile635 try renderToken(tree, ais, volatile_token, Space.Space); // volatile
637 }636 }
638 return renderExpression(allocator, stream, tree, ptr_type.rhs, space);637 return renderExpression(allocator, ais, tree, ptr_type.rhs, space);
639 },638 },
640639
641 .SliceType => {640 .SliceType => {
642 const slice_type = @fieldParentPtr(ast.Node.SliceType, "base", base);641 const slice_type = @fieldParentPtr(ast.Node.SliceType, "base", base);
643 try renderToken(tree, stream, slice_type.op_token, Space.None); // [642 try renderToken(tree, ais, slice_type.op_token, Space.None); // [
644 if (slice_type.ptr_info.sentinel) |sentinel| {643 if (slice_type.ptr_info.sentinel) |sentinel| {
645 const colon_token = tree.prevToken(sentinel.firstToken());644 const colon_token = tree.prevToken(sentinel.firstToken());
646 try renderToken(tree, stream, colon_token, Space.None); // :645 try renderToken(tree, ais, colon_token, Space.None); // :
647 try renderExpression(allocator, stream, tree, sentinel, Space.None);646 try renderExpression(allocator, ais, tree, sentinel, Space.None);
648 try renderToken(tree, stream, tree.nextToken(sentinel.lastToken()), Space.None); // ]647 try renderToken(tree, ais, tree.nextToken(sentinel.lastToken()), Space.None); // ]
649 } else {648 } else {
650 try renderToken(tree, stream, tree.nextToken(slice_type.op_token), Space.None); // ]649 try renderToken(tree, ais, tree.nextToken(slice_type.op_token), Space.None); // ]
651 }650 }
652651
653 if (slice_type.ptr_info.allowzero_token) |allowzero_token| {652 if (slice_type.ptr_info.allowzero_token) |allowzero_token| {
654 try renderToken(tree, stream, allowzero_token, Space.Space); // allowzero653 try renderToken(tree, ais, allowzero_token, Space.Space); // allowzero
655 }654 }
656 if (slice_type.ptr_info.align_info) |align_info| {655 if (slice_type.ptr_info.align_info) |align_info| {
657 const lparen_token = tree.prevToken(align_info.node.firstToken());656 const lparen_token = tree.prevToken(align_info.node.firstToken());
658 const align_token = tree.prevToken(lparen_token);657 const align_token = tree.prevToken(lparen_token);
659658
660 try renderToken(tree, stream, align_token, Space.None); // align659 try renderToken(tree, ais, align_token, Space.None); // align
661 try renderToken(tree, stream, lparen_token, Space.None); // (660 try renderToken(tree, ais, lparen_token, Space.None); // (
662661
663 try renderExpression(allocator, stream, tree, align_info.node, Space.None);662 try renderExpression(allocator, ais, tree, align_info.node, Space.None);
664663
665 if (align_info.bit_range) |bit_range| {664 if (align_info.bit_range) |bit_range| {
666 const colon1 = tree.prevToken(bit_range.start.firstToken());665 const colon1 = tree.prevToken(bit_range.start.firstToken());
667 const colon2 = tree.prevToken(bit_range.end.firstToken());666 const colon2 = tree.prevToken(bit_range.end.firstToken());
668667
669 try renderToken(tree, stream, colon1, Space.None); // :668 try renderToken(tree, ais, colon1, Space.None); // :
670 try renderExpression(allocator, stream, tree, bit_range.start, Space.None);669 try renderExpression(allocator, ais, tree, bit_range.start, Space.None);
671 try renderToken(tree, stream, colon2, Space.None); // :670 try renderToken(tree, ais, colon2, Space.None); // :
672 try renderExpression(allocator, stream, tree, bit_range.end, Space.None);671 try renderExpression(allocator, ais, tree, bit_range.end, Space.None);
673672
674 const rparen_token = tree.nextToken(bit_range.end.lastToken());673 const rparen_token = tree.nextToken(bit_range.end.lastToken());
675 try renderToken(tree, stream, rparen_token, Space.Space); // )674 try renderToken(tree, ais, rparen_token, Space.Space); // )
676 } else {675 } else {
677 const rparen_token = tree.nextToken(align_info.node.lastToken());676 const rparen_token = tree.nextToken(align_info.node.lastToken());
678 try renderToken(tree, stream, rparen_token, Space.Space); // )677 try renderToken(tree, ais, rparen_token, Space.Space); // )
679 }678 }
680 }679 }
681 if (slice_type.ptr_info.const_token) |const_token| {680 if (slice_type.ptr_info.const_token) |const_token| {
682 try renderToken(tree, stream, const_token, Space.Space);681 try renderToken(tree, ais, const_token, Space.Space);
683 }682 }
684 if (slice_type.ptr_info.volatile_token) |volatile_token| {683 if (slice_type.ptr_info.volatile_token) |volatile_token| {
685 try renderToken(tree, stream, volatile_token, Space.Space);684 try renderToken(tree, ais, volatile_token, Space.Space);
686 }685 }
687 return renderExpression(allocator, stream, tree, slice_type.rhs, space);686 return renderExpression(allocator, ais, tree, slice_type.rhs, space);
688 },687 },
689688
690 .ArrayInitializer, .ArrayInitializerDot => {689 .ArrayInitializer, .ArrayInitializerDot => {
...@@ -713,33 +712,33 @@ fn renderExpression(...@@ -713,33 +712,33 @@ fn renderExpression(
713712
714 if (exprs.len == 0) {713 if (exprs.len == 0) {
715 switch (lhs) {714 switch (lhs) {
716 .dot => |dot| try renderToken(tree, stream, dot, Space.None),715 .dot => |dot| try renderToken(tree, ais, dot, Space.None),
717 .node => |node| try renderExpression(allocator, stream, tree, node, Space.None),716 .node => |node| try renderExpression(allocator, ais, tree, node, Space.None),
718 }717 }
719718
720 {719 {
721 stream.pushIndent();720 ais.pushIndent();
722 defer stream.popIndent();721 defer ais.popIndent();
723 try renderToken(tree, stream, lbrace, Space.None);722 try renderToken(tree, ais, lbrace, Space.None);
724 }723 }
725724
726 return renderToken(tree, stream, rtoken, space);725 return renderToken(tree, ais, rtoken, space);
727 }726 }
728 if (exprs.len == 1 and tree.token_ids[exprs[0].*.lastToken() + 1] == .RBrace) {727 if (exprs.len == 1 and tree.token_ids[exprs[0].*.lastToken() + 1] == .RBrace) {
729 const expr = exprs[0];728 const expr = exprs[0];
730729
731 switch (lhs) {730 switch (lhs) {
732 .dot => |dot| try renderToken(tree, stream, dot, Space.None),731 .dot => |dot| try renderToken(tree, ais, dot, Space.None),
733 .node => |node| try renderExpression(allocator, stream, tree, node, Space.None),732 .node => |node| try renderExpression(allocator, ais, tree, node, Space.None),
734 }733 }
735 try renderToken(tree, stream, lbrace, Space.None);734 try renderToken(tree, ais, lbrace, Space.None);
736 try renderExpression(allocator, stream, tree, expr, Space.None);735 try renderExpression(allocator, ais, tree, expr, Space.None);
737 return renderToken(tree, stream, rtoken, space);736 return renderToken(tree, ais, rtoken, space);
738 }737 }
739738
740 switch (lhs) {739 switch (lhs) {
741 .dot => |dot| try renderToken(tree, stream, dot, Space.None),740 .dot => |dot| try renderToken(tree, ais, dot, Space.None),
742 .node => |node| try renderExpression(allocator, stream, tree, node, Space.None),741 .node => |node| try renderExpression(allocator, ais, tree, node, Space.None),
743 }742 }
744743
745 // scan to find row size744 // scan to find row size
...@@ -781,9 +780,9 @@ fn renderExpression(...@@ -781,9 +780,9 @@ fn renderExpression(
781 var expr_widths = widths[0 .. widths.len - row_size];780 var expr_widths = widths[0 .. widths.len - row_size];
782 var column_widths = widths[widths.len - row_size ..];781 var column_widths = widths[widths.len - row_size ..];
783782
784 // Null stream for counting the printed length of each expression783 // Null ais for counting the printed length of each expression
785 var counting_stream = std.io.countingOutStream(std.io.null_out_stream);784 var counting_stream = std.io.countingOutStream(std.io.null_out_stream);
786 var auto_indenting_stream = std.io.autoIndentingStream(indent_delta, &counting_stream);785 var auto_indenting_stream = std.io.autoIndentingStream(indent_delta, counting_stream.writer());
787786
788 for (exprs) |expr, i| {787 for (exprs) |expr, i| {
789 counting_stream.bytes_written = 0;788 counting_stream.bytes_written = 0;
...@@ -795,23 +794,23 @@ fn renderExpression(...@@ -795,23 +794,23 @@ fn renderExpression(
795 }794 }
796795
797 {796 {
798 stream.pushIndentNextLine();797 ais.pushIndentNextLine();
799 defer stream.popIndent();798 defer ais.popIndent();
800 try renderToken(tree, stream, lbrace, Space.Newline);799 try renderToken(tree, ais, lbrace, Space.Newline);
801800
802 var col: usize = 1;801 var col: usize = 1;
803 for (exprs) |expr, i| {802 for (exprs) |expr, i| {
804 if (i + 1 < exprs.len) {803 if (i + 1 < exprs.len) {
805 const next_expr = exprs[i + 1];804 const next_expr = exprs[i + 1];
806 try renderExpression(allocator, stream, tree, expr, Space.None);805 try renderExpression(allocator, ais, tree, expr, Space.None);
807806
808 const comma = tree.nextToken(expr.*.lastToken());807 const comma = tree.nextToken(expr.*.lastToken());
809808
810 if (col != row_size) {809 if (col != row_size) {
811 try renderToken(tree, stream, comma, Space.Space); // ,810 try renderToken(tree, ais, comma, Space.Space); // ,
812811
813 const padding = column_widths[i % row_size] - expr_widths[i];812 const padding = column_widths[i % row_size] - expr_widths[i];
814 try stream.writer().writeByteNTimes(' ', padding);813 try ais.writer().writeByteNTimes(' ', padding);
815814
816 col += 1;815 col += 1;
817 continue;816 continue;
...@@ -819,32 +818,32 @@ fn renderExpression(...@@ -819,32 +818,32 @@ fn renderExpression(
819 col = 1;818 col = 1;
820819
821 if (tree.token_ids[tree.nextToken(comma)] != .MultilineStringLiteralLine) {820 if (tree.token_ids[tree.nextToken(comma)] != .MultilineStringLiteralLine) {
822 try renderToken(tree, stream, comma, Space.Newline); // ,821 try renderToken(tree, ais, comma, Space.Newline); // ,
823 } else {822 } else {
824 try renderToken(tree, stream, comma, Space.None); // ,823 try renderToken(tree, ais, comma, Space.None); // ,
825 }824 }
826825
827 try renderExtraNewline(tree, stream, next_expr);826 try renderExtraNewline(tree, ais, next_expr);
828 } else {827 } else {
829 try renderExpression(allocator, stream, tree, expr, Space.Comma); // ,828 try renderExpression(allocator, ais, tree, expr, Space.Comma); // ,
830 }829 }
831 }830 }
832 }831 }
833 return renderToken(tree, stream, rtoken, space);832 return renderToken(tree, ais, rtoken, space);
834 } else {833 } else {
835 try renderToken(tree, stream, lbrace, Space.Space);834 try renderToken(tree, ais, lbrace, Space.Space);
836 for (exprs) |expr, i| {835 for (exprs) |expr, i| {
837 if (i + 1 < exprs.len) {836 if (i + 1 < exprs.len) {
838 const next_expr = exprs[i + 1];837 const next_expr = exprs[i + 1];
839 try renderExpression(allocator, stream, tree, expr, Space.None);838 try renderExpression(allocator, ais, tree, expr, Space.None);
840 const comma = tree.nextToken(expr.*.lastToken());839 const comma = tree.nextToken(expr.*.lastToken());
841 try renderToken(tree, stream, comma, Space.Space); // ,840 try renderToken(tree, ais, comma, Space.Space); // ,
842 } else {841 } else {
843 try renderExpression(allocator, stream, tree, expr, Space.Space);842 try renderExpression(allocator, ais, tree, expr, Space.Space);
844 }843 }
845 }844 }
846845
847 return renderToken(tree, stream, rtoken, space);846 return renderToken(tree, ais, rtoken, space);
848 }847 }
849 },848 },
850849
...@@ -874,17 +873,17 @@ fn renderExpression(...@@ -874,17 +873,17 @@ fn renderExpression(
874873
875 if (field_inits.len == 0) {874 if (field_inits.len == 0) {
876 switch (lhs) {875 switch (lhs) {
877 .dot => |dot| try renderToken(tree, stream, dot, Space.None),876 .dot => |dot| try renderToken(tree, ais, dot, Space.None),
878 .node => |node| try renderExpression(allocator, stream, tree, node, Space.None),877 .node => |node| try renderExpression(allocator, ais, tree, node, Space.None),
879 }878 }
880879
881 {880 {
882 stream.pushIndentNextLine();881 ais.pushIndentNextLine();
883 defer stream.popIndent();882 defer ais.popIndent();
884 try renderToken(tree, stream, lbrace, Space.None);883 try renderToken(tree, ais, lbrace, Space.None);
885 }884 }
886885
887 return renderToken(tree, stream, rtoken, space);886 return renderToken(tree, ais, rtoken, space);
888 }887 }
889888
890 const src_has_trailing_comma = blk: {889 const src_has_trailing_comma = blk: {
...@@ -900,8 +899,8 @@ fn renderExpression(...@@ -900,8 +899,8 @@ fn renderExpression(
900 const expr_outputs_one_line = blk: {899 const expr_outputs_one_line = blk: {
901 // render field expressions until a LF is found900 // render field expressions until a LF is found
902 for (field_inits) |field_init| {901 for (field_inits) |field_init| {
903 var find_stream = std.io.findByteOutStream('\n', &std.io.null_out_stream);902 var find_stream = std.io.findByteOutStream('\n', std.io.null_out_stream);
904 var auto_indenting_stream = std.io.autoIndentingStream(indent_delta, &find_stream);903 var auto_indenting_stream = std.io.autoIndentingStream(indent_delta, find_stream.writer());
905904
906 try renderExpression(allocator, &auto_indenting_stream, tree, field_init, Space.None);905 try renderExpression(allocator, &auto_indenting_stream, tree, field_init, Space.None);
907 if (find_stream.byte_found) break :blk false;906 if (find_stream.byte_found) break :blk false;
...@@ -925,78 +924,78 @@ fn renderExpression(...@@ -925,78 +924,78 @@ fn renderExpression(
925 }924 }
926925
927 switch (lhs) {926 switch (lhs) {
928 .dot => |dot| try renderToken(tree, stream, dot, Space.None),927 .dot => |dot| try renderToken(tree, ais, dot, Space.None),
929 .node => |node| try renderExpression(allocator, stream, tree, node, Space.None),928 .node => |node| try renderExpression(allocator, ais, tree, node, Space.None),
930 }929 }
931 try renderToken(tree, stream, lbrace, Space.Space);930 try renderToken(tree, ais, lbrace, Space.Space);
932 try renderExpression(allocator, stream, tree, &field_init.base, Space.Space);931 try renderExpression(allocator, ais, tree, &field_init.base, Space.Space);
933 return renderToken(tree, stream, rtoken, space);932 return renderToken(tree, ais, rtoken, space);
934 }933 }
935934
936 if (!src_has_trailing_comma and src_same_line and expr_outputs_one_line) {935 if (!src_has_trailing_comma and src_same_line and expr_outputs_one_line) {
937 // render all on one line, no trailing comma936 // render all on one line, no trailing comma
938 switch (lhs) {937 switch (lhs) {
939 .dot => |dot| try renderToken(tree, stream, dot, Space.None),938 .dot => |dot| try renderToken(tree, ais, dot, Space.None),
940 .node => |node| try renderExpression(allocator, stream, tree, node, Space.None),939 .node => |node| try renderExpression(allocator, ais, tree, node, Space.None),
941 }940 }
942 try renderToken(tree, stream, lbrace, Space.Space);941 try renderToken(tree, ais, lbrace, Space.Space);
943942
944 for (field_inits) |field_init, i| {943 for (field_inits) |field_init, i| {
945 if (i + 1 < field_inits.len) {944 if (i + 1 < field_inits.len) {
946 try renderExpression(allocator, stream, tree, field_init, Space.None);945 try renderExpression(allocator, ais, tree, field_init, Space.None);
947946
948 const comma = tree.nextToken(field_init.lastToken());947 const comma = tree.nextToken(field_init.lastToken());
949 try renderToken(tree, stream, comma, Space.Space);948 try renderToken(tree, ais, comma, Space.Space);
950 } else {949 } else {
951 try renderExpression(allocator, stream, tree, field_init, Space.Space);950 try renderExpression(allocator, ais, tree, field_init, Space.Space);
952 }951 }
953 }952 }
954953
955 return renderToken(tree, stream, rtoken, space);954 return renderToken(tree, ais, rtoken, space);
956 }955 }
957956
958 {957 {
959 switch (lhs) {958 switch (lhs) {
960 .dot => |dot| try renderToken(tree, stream, dot, Space.None),959 .dot => |dot| try renderToken(tree, ais, dot, Space.None),
961 .node => |node| try renderExpression(allocator, stream, tree, node, Space.None),960 .node => |node| try renderExpression(allocator, ais, tree, node, Space.None),
962 }961 }
963962
964 stream.pushIndentNextLine();963 ais.pushIndentNextLine();
965 defer stream.popIndent();964 defer ais.popIndent();
966965
967 try renderToken(tree, stream, lbrace, Space.Newline);966 try renderToken(tree, ais, lbrace, Space.Newline);
968967
969 for (field_inits) |field_init, i| {968 for (field_inits) |field_init, i| {
970 if (i + 1 < field_inits.len) {969 if (i + 1 < field_inits.len) {
971 const next_field_init = field_inits[i + 1];970 const next_field_init = field_inits[i + 1];
972 try renderExpression(allocator, stream, tree, field_init, Space.None);971 try renderExpression(allocator, ais, tree, field_init, Space.None);
973972
974 const comma = tree.nextToken(field_init.lastToken());973 const comma = tree.nextToken(field_init.lastToken());
975 try renderToken(tree, stream, comma, Space.Newline);974 try renderToken(tree, ais, comma, Space.Newline);
976975
977 try renderExtraNewline(tree, stream, next_field_init);976 try renderExtraNewline(tree, ais, next_field_init);
978 } else {977 } else {
979 try renderExpression(allocator, stream, tree, field_init, Space.Comma);978 try renderExpression(allocator, ais, tree, field_init, Space.Comma);
980 }979 }
981 }980 }
982 }981 }
983982
984 return renderToken(tree, stream, rtoken, space);983 return renderToken(tree, ais, rtoken, space);
985 },984 },
986985
987 .Call => {986 .Call => {
988 const call = @fieldParentPtr(ast.Node.Call, "base", base);987 const call = @fieldParentPtr(ast.Node.Call, "base", base);
989 if (call.async_token) |async_token| {988 if (call.async_token) |async_token| {
990 try renderToken(tree, stream, async_token, Space.Space);989 try renderToken(tree, ais, async_token, Space.Space);
991 }990 }
992991
993 try renderExpression(allocator, stream, tree, call.lhs, Space.None);992 try renderExpression(allocator, ais, tree, call.lhs, Space.None);
994993
995 const lparen = tree.nextToken(call.lhs.lastToken());994 const lparen = tree.nextToken(call.lhs.lastToken());
996995
997 if (call.params_len == 0) {996 if (call.params_len == 0) {
998 try renderToken(tree, stream, lparen, Space.None);997 try renderToken(tree, ais, lparen, Space.None);
999 return renderToken(tree, stream, call.rtoken, space);998 return renderToken(tree, ais, call.rtoken, space);
1000 }999 }
10011000
1002 const src_has_trailing_comma = blk: {1001 const src_has_trailing_comma = blk: {
...@@ -1005,41 +1004,41 @@ fn renderExpression(...@@ -1005,41 +1004,41 @@ fn renderExpression(
1005 };1004 };
10061005
1007 if (src_has_trailing_comma) {1006 if (src_has_trailing_comma) {
1008 try renderToken(tree, stream, lparen, Space.Newline);1007 try renderToken(tree, ais, lparen, Space.Newline);
10091008
1010 const params = call.params();1009 const params = call.params();
1011 for (params) |param_node, i| {1010 for (params) |param_node, i| {
1012 stream.pushIndent();1011 ais.pushIndent();
1013 defer stream.popIndent();1012 defer ais.popIndent();
10141013
1015 if (i + 1 < params.len) {1014 if (i + 1 < params.len) {
1016 const next_node = params[i + 1];1015 const next_node = params[i + 1];
1017 try renderExpression(allocator, stream, tree, param_node, Space.None);1016 try renderExpression(allocator, ais, tree, param_node, Space.None);
1018 const comma = tree.nextToken(param_node.lastToken());1017 const comma = tree.nextToken(param_node.lastToken());
1019 try renderToken(tree, stream, comma, Space.Newline); // ,1018 try renderToken(tree, ais, comma, Space.Newline); // ,
1020 try renderExtraNewline(tree, stream, next_node);1019 try renderExtraNewline(tree, ais, next_node);
1021 } else {1020 } else {
1022 try renderExpression(allocator, stream, tree, param_node, Space.Comma);1021 try renderExpression(allocator, ais, tree, param_node, Space.Comma);
1023 }1022 }
1024 }1023 }
1025 return renderToken(tree, stream, call.rtoken, space);1024 return renderToken(tree, ais, call.rtoken, space);
1026 }1025 }
10271026
1028 try renderToken(tree, stream, lparen, Space.None); // (1027 try renderToken(tree, ais, lparen, Space.None); // (
10291028
1030 const params = call.params();1029 const params = call.params();
1031 for (params) |param_node, i| {1030 for (params) |param_node, i| {
1032 if (param_node.*.tag == .MultilineStringLiteral) stream.pushIndentOneShot();1031 if (param_node.*.tag == .MultilineStringLiteral) ais.pushIndentOneShot();
10331032
1034 try renderExpression(allocator, stream, tree, param_node, Space.None);1033 try renderExpression(allocator, ais, tree, param_node, Space.None);
10351034
1036 if (i + 1 < params.len) {1035 if (i + 1 < params.len) {
1037 const next_param = params[i + 1];1036 const next_param = params[i + 1];
1038 const comma = tree.nextToken(param_node.lastToken());1037 const comma = tree.nextToken(param_node.lastToken());
1039 try renderToken(tree, stream, comma, Space.Space);1038 try renderToken(tree, ais, comma, Space.Space);
1040 }1039 }
1041 }1040 }
1042 return renderToken(tree, stream, call.rtoken, space);1041 return renderToken(tree, ais, call.rtoken, space);
1043 },1042 },
10441043
1045 .ArrayAccess => {1044 .ArrayAccess => {
...@@ -1048,25 +1047,25 @@ fn renderExpression(...@@ -1048,25 +1047,25 @@ fn renderExpression(
1048 const lbracket = tree.nextToken(suffix_op.lhs.lastToken());1047 const lbracket = tree.nextToken(suffix_op.lhs.lastToken());
1049 const rbracket = tree.nextToken(suffix_op.index_expr.lastToken());1048 const rbracket = tree.nextToken(suffix_op.index_expr.lastToken());
10501049
1051 try renderExpression(allocator, stream, tree, suffix_op.lhs, Space.None);1050 try renderExpression(allocator, ais, tree, suffix_op.lhs, Space.None);
1052 try renderToken(tree, stream, lbracket, Space.None); // [1051 try renderToken(tree, ais, lbracket, Space.None); // [
10531052
1054 const starts_with_comment = tree.token_ids[lbracket + 1] == .LineComment;1053 const starts_with_comment = tree.token_ids[lbracket + 1] == .LineComment;
1055 const ends_with_comment = tree.token_ids[rbracket - 1] == .LineComment;1054 const ends_with_comment = tree.token_ids[rbracket - 1] == .LineComment;
1056 {1055 {
1057 const new_space = if (ends_with_comment) Space.Newline else Space.None;1056 const new_space = if (ends_with_comment) Space.Newline else Space.None;
10581057
1059 stream.pushIndent();1058 ais.pushIndent();
1060 defer stream.popIndent();1059 defer ais.popIndent();
1061 try renderExpression(allocator, stream, tree, suffix_op.index_expr, new_space);1060 try renderExpression(allocator, ais, tree, suffix_op.index_expr, new_space);
1062 }1061 }
1063 if (starts_with_comment) try stream.maybeInsertNewline();1062 if (starts_with_comment) try ais.maybeInsertNewline();
1064 return renderToken(tree, stream, rbracket, space); // ]1063 return renderToken(tree, ais, rbracket, space); // ]
1065 },1064 },
10661065
1067 .Slice => {1066 .Slice => {
1068 const suffix_op = base.castTag(.Slice).?;1067 const suffix_op = base.castTag(.Slice).?;
1069 try renderExpression(allocator, stream, tree, suffix_op.lhs, Space.None);1068 try renderExpression(allocator, ais, tree, suffix_op.lhs, Space.None);
10701069
1071 const lbracket = tree.prevToken(suffix_op.start.firstToken());1070 const lbracket = tree.prevToken(suffix_op.start.firstToken());
1072 const dotdot = tree.nextToken(suffix_op.start.lastToken());1071 const dotdot = tree.nextToken(suffix_op.start.lastToken());
...@@ -1076,33 +1075,33 @@ fn renderExpression(...@@ -1076,33 +1075,33 @@ fn renderExpression(
1076 const after_start_space = if (after_start_space_bool) Space.Space else Space.None;1075 const after_start_space = if (after_start_space_bool) Space.Space else Space.None;
1077 const after_op_space = if (suffix_op.end != null) after_start_space else Space.None;1076 const after_op_space = if (suffix_op.end != null) after_start_space else Space.None;
10781077
1079 try renderToken(tree, stream, lbracket, Space.None); // [1078 try renderToken(tree, ais, lbracket, Space.None); // [
1080 try renderExpression(allocator, stream, tree, suffix_op.start, after_start_space);1079 try renderExpression(allocator, ais, tree, suffix_op.start, after_start_space);
1081 try renderToken(tree, stream, dotdot, after_op_space); // ..1080 try renderToken(tree, ais, dotdot, after_op_space); // ..
1082 if (suffix_op.end) |end| {1081 if (suffix_op.end) |end| {
1083 const after_end_space = if (suffix_op.sentinel != null) Space.Space else Space.None;1082 const after_end_space = if (suffix_op.sentinel != null) Space.Space else Space.None;
1084 try renderExpression(allocator, stream, tree, end, after_end_space);1083 try renderExpression(allocator, ais, tree, end, after_end_space);
1085 }1084 }
1086 if (suffix_op.sentinel) |sentinel| {1085 if (suffix_op.sentinel) |sentinel| {
1087 const colon = tree.prevToken(sentinel.firstToken());1086 const colon = tree.prevToken(sentinel.firstToken());
1088 try renderToken(tree, stream, colon, Space.None); // :1087 try renderToken(tree, ais, colon, Space.None); // :
1089 try renderExpression(allocator, stream, tree, sentinel, Space.None);1088 try renderExpression(allocator, ais, tree, sentinel, Space.None);
1090 }1089 }
1091 return renderToken(tree, stream, suffix_op.rtoken, space); // ]1090 return renderToken(tree, ais, suffix_op.rtoken, space); // ]
1092 },1091 },
10931092
1094 .Deref => {1093 .Deref => {
1095 const suffix_op = base.castTag(.Deref).?;1094 const suffix_op = base.castTag(.Deref).?;
10961095
1097 try renderExpression(allocator, stream, tree, suffix_op.lhs, Space.None);1096 try renderExpression(allocator, ais, tree, suffix_op.lhs, Space.None);
1098 return renderToken(tree, stream, suffix_op.rtoken, space); // .*1097 return renderToken(tree, ais, suffix_op.rtoken, space); // .*
1099 },1098 },
1100 .UnwrapOptional => {1099 .UnwrapOptional => {
1101 const suffix_op = base.castTag(.UnwrapOptional).?;1100 const suffix_op = base.castTag(.UnwrapOptional).?;
11021101
1103 try renderExpression(allocator, stream, tree, suffix_op.lhs, Space.None);1102 try renderExpression(allocator, ais, tree, suffix_op.lhs, Space.None);
1104 try renderToken(tree, stream, tree.prevToken(suffix_op.rtoken), Space.None); // .1103 try renderToken(tree, ais, tree.prevToken(suffix_op.rtoken), Space.None); // .
1105 return renderToken(tree, stream, suffix_op.rtoken, space); // ?1104 return renderToken(tree, ais, suffix_op.rtoken, space); // ?
1106 },1105 },
11071106
1108 .Break => {1107 .Break => {
...@@ -1111,152 +1110,152 @@ fn renderExpression(...@@ -1111,152 +1110,152 @@ fn renderExpression(
1111 const maybe_label = flow_expr.getLabel();1110 const maybe_label = flow_expr.getLabel();
11121111
1113 if (maybe_label == null and maybe_rhs == null) {1112 if (maybe_label == null and maybe_rhs == null) {
1114 return renderToken(tree, stream, flow_expr.ltoken, space); // break1113 return renderToken(tree, ais, flow_expr.ltoken, space); // break
1115 }1114 }
11161115
1117 try renderToken(tree, stream, flow_expr.ltoken, Space.Space); // break1116 try renderToken(tree, ais, flow_expr.ltoken, Space.Space); // break
1118 if (maybe_label) |label| {1117 if (maybe_label) |label| {
1119 const colon = tree.nextToken(flow_expr.ltoken);1118 const colon = tree.nextToken(flow_expr.ltoken);
1120 try renderToken(tree, stream, colon, Space.None); // :1119 try renderToken(tree, ais, colon, Space.None); // :
11211120
1122 if (maybe_rhs == null) {1121 if (maybe_rhs == null) {
1123 return renderToken(tree, stream, label, space); // label1122 return renderToken(tree, ais, label, space); // label
1124 }1123 }
1125 try renderToken(tree, stream, label, Space.Space); // label1124 try renderToken(tree, ais, label, Space.Space); // label
1126 }1125 }
1127 return renderExpression(allocator, stream, tree, maybe_rhs.?, space);1126 return renderExpression(allocator, ais, tree, maybe_rhs.?, space);
1128 },1127 },
11291128
1130 .Continue => {1129 .Continue => {
1131 const flow_expr = base.castTag(.Continue).?;1130 const flow_expr = base.castTag(.Continue).?;
1132 if (flow_expr.getLabel()) |label| {1131 if (flow_expr.getLabel()) |label| {
1133 try renderToken(tree, stream, flow_expr.ltoken, Space.Space); // continue1132 try renderToken(tree, ais, flow_expr.ltoken, Space.Space); // continue
1134 const colon = tree.nextToken(flow_expr.ltoken);1133 const colon = tree.nextToken(flow_expr.ltoken);
1135 try renderToken(tree, stream, colon, Space.None); // :1134 try renderToken(tree, ais, colon, Space.None); // :
1136 return renderToken(tree, stream, label, space); // label1135 return renderToken(tree, ais, label, space); // label
1137 } else {1136 } else {
1138 return renderToken(tree, stream, flow_expr.ltoken, space); // continue1137 return renderToken(tree, ais, flow_expr.ltoken, space); // continue
1139 }1138 }
1140 },1139 },
11411140
1142 .Return => {1141 .Return => {
1143 const flow_expr = base.castTag(.Return).?;1142 const flow_expr = base.castTag(.Return).?;
1144 if (flow_expr.getRHS()) |rhs| {1143 if (flow_expr.getRHS()) |rhs| {
1145 try renderToken(tree, stream, flow_expr.ltoken, Space.Space);1144 try renderToken(tree, ais, flow_expr.ltoken, Space.Space);
1146 return renderExpression(allocator, stream, tree, rhs, space);1145 return renderExpression(allocator, ais, tree, rhs, space);
1147 } else {1146 } else {
1148 return renderToken(tree, stream, flow_expr.ltoken, space);1147 return renderToken(tree, ais, flow_expr.ltoken, space);
1149 }1148 }
1150 },1149 },
11511150
1152 .Payload => {1151 .Payload => {
1153 const payload = @fieldParentPtr(ast.Node.Payload, "base", base);1152 const payload = @fieldParentPtr(ast.Node.Payload, "base", base);
11541153
1155 try renderToken(tree, stream, payload.lpipe, Space.None);1154 try renderToken(tree, ais, payload.lpipe, Space.None);
1156 try renderExpression(allocator, stream, tree, payload.error_symbol, Space.None);1155 try renderExpression(allocator, ais, tree, payload.error_symbol, Space.None);
1157 return renderToken(tree, stream, payload.rpipe, space);1156 return renderToken(tree, ais, payload.rpipe, space);
1158 },1157 },
11591158
1160 .PointerPayload => {1159 .PointerPayload => {
1161 const payload = @fieldParentPtr(ast.Node.PointerPayload, "base", base);1160 const payload = @fieldParentPtr(ast.Node.PointerPayload, "base", base);
11621161
1163 try renderToken(tree, stream, payload.lpipe, Space.None);1162 try renderToken(tree, ais, payload.lpipe, Space.None);
1164 if (payload.ptr_token) |ptr_token| {1163 if (payload.ptr_token) |ptr_token| {
1165 try renderToken(tree, stream, ptr_token, Space.None);1164 try renderToken(tree, ais, ptr_token, Space.None);
1166 }1165 }
1167 try renderExpression(allocator, stream, tree, payload.value_symbol, Space.None);1166 try renderExpression(allocator, ais, tree, payload.value_symbol, Space.None);
1168 return renderToken(tree, stream, payload.rpipe, space);1167 return renderToken(tree, ais, payload.rpipe, space);
1169 },1168 },
11701169
1171 .PointerIndexPayload => {1170 .PointerIndexPayload => {
1172 const payload = @fieldParentPtr(ast.Node.PointerIndexPayload, "base", base);1171 const payload = @fieldParentPtr(ast.Node.PointerIndexPayload, "base", base);
11731172
1174 try renderToken(tree, stream, payload.lpipe, Space.None);1173 try renderToken(tree, ais, payload.lpipe, Space.None);
1175 if (payload.ptr_token) |ptr_token| {1174 if (payload.ptr_token) |ptr_token| {
1176 try renderToken(tree, stream, ptr_token, Space.None);1175 try renderToken(tree, ais, ptr_token, Space.None);
1177 }1176 }
1178 try renderExpression(allocator, stream, tree, payload.value_symbol, Space.None);1177 try renderExpression(allocator, ais, tree, payload.value_symbol, Space.None);
11791178
1180 if (payload.index_symbol) |index_symbol| {1179 if (payload.index_symbol) |index_symbol| {
1181 const comma = tree.nextToken(payload.value_symbol.lastToken());1180 const comma = tree.nextToken(payload.value_symbol.lastToken());
11821181
1183 try renderToken(tree, stream, comma, Space.Space);1182 try renderToken(tree, ais, comma, Space.Space);
1184 try renderExpression(allocator, stream, tree, index_symbol, Space.None);1183 try renderExpression(allocator, ais, tree, index_symbol, Space.None);
1185 }1184 }
11861185
1187 return renderToken(tree, stream, payload.rpipe, space);1186 return renderToken(tree, ais, payload.rpipe, space);
1188 },1187 },
11891188
1190 .GroupedExpression => {1189 .GroupedExpression => {
1191 const grouped_expr = @fieldParentPtr(ast.Node.GroupedExpression, "base", base);1190 const grouped_expr = @fieldParentPtr(ast.Node.GroupedExpression, "base", base);
11921191
1193 try renderToken(tree, stream, grouped_expr.lparen, Space.None);1192 try renderToken(tree, ais, grouped_expr.lparen, Space.None);
1194 {1193 {
1195 stream.pushIndentOneShot();1194 ais.pushIndentOneShot();
1196 try renderExpression(allocator, stream, tree, grouped_expr.expr, Space.None);1195 try renderExpression(allocator, ais, tree, grouped_expr.expr, Space.None);
1197 }1196 }
1198 return renderToken(tree, stream, grouped_expr.rparen, space);1197 return renderToken(tree, ais, grouped_expr.rparen, space);
1199 },1198 },
12001199
1201 .FieldInitializer => {1200 .FieldInitializer => {
1202 const field_init = @fieldParentPtr(ast.Node.FieldInitializer, "base", base);1201 const field_init = @fieldParentPtr(ast.Node.FieldInitializer, "base", base);
12031202
1204 try renderToken(tree, stream, field_init.period_token, Space.None); // .1203 try renderToken(tree, ais, field_init.period_token, Space.None); // .
1205 try renderToken(tree, stream, field_init.name_token, Space.Space); // name1204 try renderToken(tree, ais, field_init.name_token, Space.Space); // name
1206 try renderToken(tree, stream, tree.nextToken(field_init.name_token), Space.Space); // =1205 try renderToken(tree, ais, tree.nextToken(field_init.name_token), Space.Space); // =
1207 return renderExpression(allocator, stream, tree, field_init.expr, space);1206 return renderExpression(allocator, ais, tree, field_init.expr, space);
1208 },1207 },
12091208
1210 .ContainerDecl => {1209 .ContainerDecl => {
1211 const container_decl = @fieldParentPtr(ast.Node.ContainerDecl, "base", base);1210 const container_decl = @fieldParentPtr(ast.Node.ContainerDecl, "base", base);
12121211
1213 if (container_decl.layout_token) |layout_token| {1212 if (container_decl.layout_token) |layout_token| {
1214 try renderToken(tree, stream, layout_token, Space.Space);1213 try renderToken(tree, ais, layout_token, Space.Space);
1215 }1214 }
12161215
1217 switch (container_decl.init_arg_expr) {1216 switch (container_decl.init_arg_expr) {
1218 .None => {1217 .None => {
1219 try renderToken(tree, stream, container_decl.kind_token, Space.Space); // union1218 try renderToken(tree, ais, container_decl.kind_token, Space.Space); // union
1220 },1219 },
1221 .Enum => |enum_tag_type| {1220 .Enum => |enum_tag_type| {
1222 try renderToken(tree, stream, container_decl.kind_token, Space.None); // union1221 try renderToken(tree, ais, container_decl.kind_token, Space.None); // union
12231222
1224 const lparen = tree.nextToken(container_decl.kind_token);1223 const lparen = tree.nextToken(container_decl.kind_token);
1225 const enum_token = tree.nextToken(lparen);1224 const enum_token = tree.nextToken(lparen);
12261225
1227 try renderToken(tree, stream, lparen, Space.None); // (1226 try renderToken(tree, ais, lparen, Space.None); // (
1228 try renderToken(tree, stream, enum_token, Space.None); // enum1227 try renderToken(tree, ais, enum_token, Space.None); // enum
12291228
1230 if (enum_tag_type) |expr| {1229 if (enum_tag_type) |expr| {
1231 try renderToken(tree, stream, tree.nextToken(enum_token), Space.None); // (1230 try renderToken(tree, ais, tree.nextToken(enum_token), Space.None); // (
1232 try renderExpression(allocator, stream, tree, expr, Space.None);1231 try renderExpression(allocator, ais, tree, expr, Space.None);
12331232
1234 const rparen = tree.nextToken(expr.lastToken());1233 const rparen = tree.nextToken(expr.lastToken());
1235 try renderToken(tree, stream, rparen, Space.None); // )1234 try renderToken(tree, ais, rparen, Space.None); // )
1236 try renderToken(tree, stream, tree.nextToken(rparen), Space.Space); // )1235 try renderToken(tree, ais, tree.nextToken(rparen), Space.Space); // )
1237 } else {1236 } else {
1238 try renderToken(tree, stream, tree.nextToken(enum_token), Space.Space); // )1237 try renderToken(tree, ais, tree.nextToken(enum_token), Space.Space); // )
1239 }1238 }
1240 },1239 },
1241 .Type => |type_expr| {1240 .Type => |type_expr| {
1242 try renderToken(tree, stream, container_decl.kind_token, Space.None); // union1241 try renderToken(tree, ais, container_decl.kind_token, Space.None); // union
12431242
1244 const lparen = tree.nextToken(container_decl.kind_token);1243 const lparen = tree.nextToken(container_decl.kind_token);
1245 const rparen = tree.nextToken(type_expr.lastToken());1244 const rparen = tree.nextToken(type_expr.lastToken());
12461245
1247 try renderToken(tree, stream, lparen, Space.None); // (1246 try renderToken(tree, ais, lparen, Space.None); // (
1248 try renderExpression(allocator, stream, tree, type_expr, Space.None);1247 try renderExpression(allocator, ais, tree, type_expr, Space.None);
1249 try renderToken(tree, stream, rparen, Space.Space); // )1248 try renderToken(tree, ais, rparen, Space.Space); // )
1250 },1249 },
1251 }1250 }
12521251
1253 if (container_decl.fields_and_decls_len == 0) {1252 if (container_decl.fields_and_decls_len == 0) {
1254 {1253 {
1255 stream.pushIndentNextLine();1254 ais.pushIndentNextLine();
1256 defer stream.popIndent();1255 defer ais.popIndent();
1257 try renderToken(tree, stream, container_decl.lbrace_token, Space.None); // {1256 try renderToken(tree, ais, container_decl.lbrace_token, Space.None); // {
1258 }1257 }
1259 return renderToken(tree, stream, container_decl.rbrace_token, space); // }1258 return renderToken(tree, ais, container_decl.rbrace_token, space); // }
1260 }1259 }
12611260
1262 const src_has_trailing_comma = blk: {1261 const src_has_trailing_comma = blk: {
...@@ -1287,39 +1286,39 @@ fn renderExpression(...@@ -1287,39 +1286,39 @@ fn renderExpression(
12871286
1288 if (src_has_trailing_comma or !src_has_only_fields) {1287 if (src_has_trailing_comma or !src_has_only_fields) {
1289 // One declaration per line1288 // One declaration per line
1290 stream.pushIndentNextLine();1289 ais.pushIndentNextLine();
1291 defer stream.popIndent();1290 defer ais.popIndent();
1292 try renderToken(tree, stream, container_decl.lbrace_token, .Newline); // {1291 try renderToken(tree, ais, container_decl.lbrace_token, .Newline); // {
12931292
1294 for (fields_and_decls) |decl, i| {1293 for (fields_and_decls) |decl, i| {
1295 try renderContainerDecl(allocator, stream, tree, decl, .Newline);1294 try renderContainerDecl(allocator, ais, tree, decl, .Newline);
12961295
1297 if (i + 1 < fields_and_decls.len) {1296 if (i + 1 < fields_and_decls.len) {
1298 try renderExtraNewline(tree, stream, fields_and_decls[i + 1]);1297 try renderExtraNewline(tree, ais, fields_and_decls[i + 1]);
1299 }1298 }
1300 }1299 }
1301 } else if (src_has_newline) {1300 } else if (src_has_newline) {
1302 // All the declarations on the same line, but place the items on1301 // All the declarations on the same line, but place the items on
1303 // their own line1302 // their own line
1304 try renderToken(tree, stream, container_decl.lbrace_token, .Newline); // {1303 try renderToken(tree, ais, container_decl.lbrace_token, .Newline); // {
13051304
1306 stream.pushIndent();1305 ais.pushIndent();
1307 defer stream.popIndent();1306 defer ais.popIndent();
13081307
1309 for (fields_and_decls) |decl, i| {1308 for (fields_and_decls) |decl, i| {
1310 const space_after_decl: Space = if (i + 1 >= fields_and_decls.len) .Newline else .Space;1309 const space_after_decl: Space = if (i + 1 >= fields_and_decls.len) .Newline else .Space;
1311 try renderContainerDecl(allocator, stream, tree, decl, space_after_decl);1310 try renderContainerDecl(allocator, ais, tree, decl, space_after_decl);
1312 }1311 }
1313 } else {1312 } else {
1314 // All the declarations on the same line1313 // All the declarations on the same line
1315 try renderToken(tree, stream, container_decl.lbrace_token, .Space); // {1314 try renderToken(tree, ais, container_decl.lbrace_token, .Space); // {
13161315
1317 for (fields_and_decls) |decl| {1316 for (fields_and_decls) |decl| {
1318 try renderContainerDecl(allocator, stream, tree, decl, .Space);1317 try renderContainerDecl(allocator, ais, tree, decl, .Space);
1319 }1318 }
1320 }1319 }
13211320
1322 return renderToken(tree, stream, container_decl.rbrace_token, space); // }1321 return renderToken(tree, ais, container_decl.rbrace_token, space); // }
1323 },1322 },
13241323
1325 .ErrorSetDecl => {1324 .ErrorSetDecl => {
...@@ -1328,9 +1327,9 @@ fn renderExpression(...@@ -1328,9 +1327,9 @@ fn renderExpression(
1328 const lbrace = tree.nextToken(err_set_decl.error_token);1327 const lbrace = tree.nextToken(err_set_decl.error_token);
13291328
1330 if (err_set_decl.decls_len == 0) {1329 if (err_set_decl.decls_len == 0) {
1331 try renderToken(tree, stream, err_set_decl.error_token, Space.None);1330 try renderToken(tree, ais, err_set_decl.error_token, Space.None);
1332 try renderToken(tree, stream, lbrace, Space.None);1331 try renderToken(tree, ais, lbrace, Space.None);
1333 return renderToken(tree, stream, err_set_decl.rbrace_token, space);1332 return renderToken(tree, ais, err_set_decl.rbrace_token, space);
1334 }1333 }
13351334
1336 if (err_set_decl.decls_len == 1) blk: {1335 if (err_set_decl.decls_len == 1) blk: {
...@@ -1344,13 +1343,13 @@ fn renderExpression(...@@ -1344,13 +1343,13 @@ fn renderExpression(
1344 break :blk;1343 break :blk;
1345 }1344 }
13461345
1347 try renderToken(tree, stream, err_set_decl.error_token, Space.None); // error1346 try renderToken(tree, ais, err_set_decl.error_token, Space.None); // error
1348 try renderToken(tree, stream, lbrace, Space.None); // {1347 try renderToken(tree, ais, lbrace, Space.None); // {
1349 try renderExpression(allocator, stream, tree, node, Space.None);1348 try renderExpression(allocator, ais, tree, node, Space.None);
1350 return renderToken(tree, stream, err_set_decl.rbrace_token, space); // }1349 return renderToken(tree, ais, err_set_decl.rbrace_token, space); // }
1351 }1350 }
13521351
1353 try renderToken(tree, stream, err_set_decl.error_token, Space.None); // error1352 try renderToken(tree, ais, err_set_decl.error_token, Space.None); // error
13541353
1355 const src_has_trailing_comma = blk: {1354 const src_has_trailing_comma = blk: {
1356 const maybe_comma = tree.prevToken(err_set_decl.rbrace_token);1355 const maybe_comma = tree.prevToken(err_set_decl.rbrace_token);
...@@ -1359,64 +1358,64 @@ fn renderExpression(...@@ -1359,64 +1358,64 @@ fn renderExpression(
13591358
1360 if (src_has_trailing_comma) {1359 if (src_has_trailing_comma) {
1361 {1360 {
1362 stream.pushIndent();1361 ais.pushIndent();
1363 defer stream.popIndent();1362 defer ais.popIndent();
13641363
1365 try renderToken(tree, stream, lbrace, Space.Newline); // {1364 try renderToken(tree, ais, lbrace, Space.Newline); // {
1366 const decls = err_set_decl.decls();1365 const decls = err_set_decl.decls();
1367 for (decls) |node, i| {1366 for (decls) |node, i| {
1368 if (i + 1 < decls.len) {1367 if (i + 1 < decls.len) {
1369 try renderExpression(allocator, stream, tree, node, Space.None);1368 try renderExpression(allocator, ais, tree, node, Space.None);
1370 try renderToken(tree, stream, tree.nextToken(node.lastToken()), Space.Newline); // ,1369 try renderToken(tree, ais, tree.nextToken(node.lastToken()), Space.Newline); // ,
13711370
1372 try renderExtraNewline(tree, stream, decls[i + 1]);1371 try renderExtraNewline(tree, ais, decls[i + 1]);
1373 } else {1372 } else {
1374 try renderExpression(allocator, stream, tree, node, Space.Comma);1373 try renderExpression(allocator, ais, tree, node, Space.Comma);
1375 }1374 }
1376 }1375 }
1377 }1376 }
13781377
1379 return renderToken(tree, stream, err_set_decl.rbrace_token, space); // }1378 return renderToken(tree, ais, err_set_decl.rbrace_token, space); // }
1380 } else {1379 } else {
1381 try renderToken(tree, stream, lbrace, Space.Space); // {1380 try renderToken(tree, ais, lbrace, Space.Space); // {
13821381
1383 const decls = err_set_decl.decls();1382 const decls = err_set_decl.decls();
1384 for (decls) |node, i| {1383 for (decls) |node, i| {
1385 if (i + 1 < decls.len) {1384 if (i + 1 < decls.len) {
1386 try renderExpression(allocator, stream, tree, node, Space.None);1385 try renderExpression(allocator, ais, tree, node, Space.None);
13871386
1388 const comma_token = tree.nextToken(node.lastToken());1387 const comma_token = tree.nextToken(node.lastToken());
1389 assert(tree.token_ids[comma_token] == .Comma);1388 assert(tree.token_ids[comma_token] == .Comma);
1390 try renderToken(tree, stream, comma_token, Space.Space); // ,1389 try renderToken(tree, ais, comma_token, Space.Space); // ,
1391 try renderExtraNewline(tree, stream, decls[i + 1]);1390 try renderExtraNewline(tree, ais, decls[i + 1]);
1392 } else {1391 } else {
1393 try renderExpression(allocator, stream, tree, node, Space.Space);1392 try renderExpression(allocator, ais, tree, node, Space.Space);
1394 }1393 }
1395 }1394 }
13961395
1397 return renderToken(tree, stream, err_set_decl.rbrace_token, space); // }1396 return renderToken(tree, ais, err_set_decl.rbrace_token, space); // }
1398 }1397 }
1399 },1398 },
14001399
1401 .ErrorTag => {1400 .ErrorTag => {
1402 const tag = @fieldParentPtr(ast.Node.ErrorTag, "base", base);1401 const tag = @fieldParentPtr(ast.Node.ErrorTag, "base", base);
14031402
1404 try renderDocComments(tree, stream, tag, tag.doc_comments);1403 try renderDocComments(tree, ais, tag, tag.doc_comments);
1405 return renderToken(tree, stream, tag.name_token, space); // name1404 return renderToken(tree, ais, tag.name_token, space); // name
1406 },1405 },
14071406
1408 .MultilineStringLiteral => {1407 .MultilineStringLiteral => {
1409 const multiline_str_literal = @fieldParentPtr(ast.Node.MultilineStringLiteral, "base", base);1408 const multiline_str_literal = @fieldParentPtr(ast.Node.MultilineStringLiteral, "base", base);
14101409
1411 {1410 {
1412 const locked_indents = stream.lockOneShotIndent();1411 const locked_indents = ais.lockOneShotIndent();
1413 defer {1412 defer {
1414 var i: u8 = 0;1413 var i: u8 = 0;
1415 while (i < locked_indents) : (i += 1) stream.popIndent();1414 while (i < locked_indents) : (i += 1) ais.popIndent();
1416 }1415 }
1417 try stream.maybeInsertNewline();1416 try ais.maybeInsertNewline();
14181417
1419 for (multiline_str_literal.lines()) |t| try renderToken(tree, stream, t, Space.None);1418 for (multiline_str_literal.lines()) |t| try renderToken(tree, ais, t, Space.None);
1420 }1419 }
1421 },1420 },
14221421
...@@ -1425,9 +1424,9 @@ fn renderExpression(...@@ -1425,9 +1424,9 @@ fn renderExpression(
14251424
1426 // TODO remove after 0.7.0 release1425 // TODO remove after 0.7.0 release
1427 if (mem.eql(u8, tree.tokenSlice(builtin_call.builtin_token), "@OpaqueType"))1426 if (mem.eql(u8, tree.tokenSlice(builtin_call.builtin_token), "@OpaqueType"))
1428 return stream.writer().writeAll("@Type(.Opaque)");1427 return ais.writer().writeAll("@Type(.Opaque)");
14291428
1430 try renderToken(tree, stream, builtin_call.builtin_token, Space.None); // @name1429 try renderToken(tree, ais, builtin_call.builtin_token, Space.None); // @name
14311430
1432 const src_params_trailing_comma = blk: {1431 const src_params_trailing_comma = blk: {
1433 if (builtin_call.params_len < 2) break :blk false;1432 if (builtin_call.params_len < 2) break :blk false;
...@@ -1439,30 +1438,30 @@ fn renderExpression(...@@ -1439,30 +1438,30 @@ fn renderExpression(
1439 const lparen = tree.nextToken(builtin_call.builtin_token);1438 const lparen = tree.nextToken(builtin_call.builtin_token);
14401439
1441 if (!src_params_trailing_comma) {1440 if (!src_params_trailing_comma) {
1442 try renderToken(tree, stream, lparen, Space.None); // (1441 try renderToken(tree, ais, lparen, Space.None); // (
14431442
1444 // render all on one line, no trailing comma1443 // render all on one line, no trailing comma
1445 const params = builtin_call.params();1444 const params = builtin_call.params();
1446 for (params) |param_node, i| {1445 for (params) |param_node, i| {
1447 try renderExpression(allocator, stream, tree, param_node, Space.None);1446 try renderExpression(allocator, ais, tree, param_node, Space.None);
14481447
1449 if (i + 1 < params.len) {1448 if (i + 1 < params.len) {
1450 const comma_token = tree.nextToken(param_node.lastToken());1449 const comma_token = tree.nextToken(param_node.lastToken());
1451 try renderToken(tree, stream, comma_token, Space.Space); // ,1450 try renderToken(tree, ais, comma_token, Space.Space); // ,
1452 }1451 }
1453 }1452 }
1454 } else {1453 } else {
1455 // one param per line1454 // one param per line
1456 stream.pushIndent();1455 ais.pushIndent();
1457 defer stream.popIndent();1456 defer ais.popIndent();
1458 try renderToken(tree, stream, lparen, Space.Newline); // (1457 try renderToken(tree, ais, lparen, Space.Newline); // (
14591458
1460 for (builtin_call.params()) |param_node| {1459 for (builtin_call.params()) |param_node| {
1461 try renderExpression(allocator, stream, tree, param_node, Space.Comma);1460 try renderExpression(allocator, ais, tree, param_node, Space.Comma);
1462 }1461 }
1463 }1462 }
14641463
1465 return renderToken(tree, stream, builtin_call.rparen_token, space); // )1464 return renderToken(tree, ais, builtin_call.rparen_token, space); // )
1466 },1465 },
14671466
1468 .FnProto => {1467 .FnProto => {
...@@ -1472,24 +1471,24 @@ fn renderExpression(...@@ -1472,24 +1471,24 @@ fn renderExpression(
1472 const visib_token = tree.token_ids[visib_token_index];1471 const visib_token = tree.token_ids[visib_token_index];
1473 assert(visib_token == .Keyword_pub or visib_token == .Keyword_export);1472 assert(visib_token == .Keyword_pub or visib_token == .Keyword_export);
14741473
1475 try renderToken(tree, stream, visib_token_index, Space.Space); // pub1474 try renderToken(tree, ais, visib_token_index, Space.Space); // pub
1476 }1475 }
14771476
1478 if (fn_proto.getExternExportInlineToken()) |extern_export_inline_token| {1477 if (fn_proto.getExternExportInlineToken()) |extern_export_inline_token| {
1479 if (fn_proto.getIsExternPrototype() == null)1478 if (fn_proto.getIsExternPrototype() == null)
1480 try renderToken(tree, stream, extern_export_inline_token, Space.Space); // extern/export/inline1479 try renderToken(tree, ais, extern_export_inline_token, Space.Space); // extern/export/inline
1481 }1480 }
14821481
1483 if (fn_proto.getLibName()) |lib_name| {1482 if (fn_proto.getLibName()) |lib_name| {
1484 try renderExpression(allocator, stream, tree, lib_name, Space.Space);1483 try renderExpression(allocator, ais, tree, lib_name, Space.Space);
1485 }1484 }
14861485
1487 const lparen = if (fn_proto.getNameToken()) |name_token| blk: {1486 const lparen = if (fn_proto.getNameToken()) |name_token| blk: {
1488 try renderToken(tree, stream, fn_proto.fn_token, Space.Space); // fn1487 try renderToken(tree, ais, fn_proto.fn_token, Space.Space); // fn
1489 try renderToken(tree, stream, name_token, Space.None); // name1488 try renderToken(tree, ais, name_token, Space.None); // name
1490 break :blk tree.nextToken(name_token);1489 break :blk tree.nextToken(name_token);
1491 } else blk: {1490 } else blk: {
1492 try renderToken(tree, stream, fn_proto.fn_token, Space.Space); // fn1491 try renderToken(tree, ais, fn_proto.fn_token, Space.Space); // fn
1493 break :blk tree.nextToken(fn_proto.fn_token);1492 break :blk tree.nextToken(fn_proto.fn_token);
1494 };1493 };
1495 assert(tree.token_ids[lparen] == .LParen);1494 assert(tree.token_ids[lparen] == .LParen);
...@@ -1516,45 +1515,45 @@ fn renderExpression(...@@ -1516,45 +1515,45 @@ fn renderExpression(
1516 };1515 };
15171516
1518 if (!src_params_trailing_comma) {1517 if (!src_params_trailing_comma) {
1519 try renderToken(tree, stream, lparen, Space.None); // (1518 try renderToken(tree, ais, lparen, Space.None); // (
15201519
1521 // render all on one line, no trailing comma1520 // render all on one line, no trailing comma
1522 for (fn_proto.params()) |param_decl, i| {1521 for (fn_proto.params()) |param_decl, i| {
1523 try renderParamDecl(allocator, stream, tree, param_decl, Space.None);1522 try renderParamDecl(allocator, ais, tree, param_decl, Space.None);
15241523
1525 if (i + 1 < fn_proto.params_len or fn_proto.getVarArgsToken() != null) {1524 if (i + 1 < fn_proto.params_len or fn_proto.getVarArgsToken() != null) {
1526 const comma = tree.nextToken(param_decl.lastToken());1525 const comma = tree.nextToken(param_decl.lastToken());
1527 try renderToken(tree, stream, comma, Space.Space); // ,1526 try renderToken(tree, ais, comma, Space.Space); // ,
1528 }1527 }
1529 }1528 }
1530 if (fn_proto.getVarArgsToken()) |var_args_token| {1529 if (fn_proto.getVarArgsToken()) |var_args_token| {
1531 try renderToken(tree, stream, var_args_token, Space.None);1530 try renderToken(tree, ais, var_args_token, Space.None);
1532 }1531 }
1533 } else {1532 } else {
1534 // one param per line1533 // one param per line
1535 stream.pushIndent();1534 ais.pushIndent();
1536 defer stream.popIndent();1535 defer ais.popIndent();
1537 try renderToken(tree, stream, lparen, Space.Newline); // (1536 try renderToken(tree, ais, lparen, Space.Newline); // (
15381537
1539 for (fn_proto.params()) |param_decl| {1538 for (fn_proto.params()) |param_decl| {
1540 try renderParamDecl(allocator, stream, tree, param_decl, Space.Comma);1539 try renderParamDecl(allocator, ais, tree, param_decl, Space.Comma);
1541 }1540 }
1542 if (fn_proto.getVarArgsToken()) |var_args_token| {1541 if (fn_proto.getVarArgsToken()) |var_args_token| {
1543 try renderToken(tree, stream, var_args_token, Space.Comma);1542 try renderToken(tree, ais, var_args_token, Space.Comma);
1544 }1543 }
1545 }1544 }
15461545
1547 try renderToken(tree, stream, rparen, Space.Space); // )1546 try renderToken(tree, ais, rparen, Space.Space); // )
15481547
1549 if (fn_proto.getAlignExpr()) |align_expr| {1548 if (fn_proto.getAlignExpr()) |align_expr| {
1550 const align_rparen = tree.nextToken(align_expr.lastToken());1549 const align_rparen = tree.nextToken(align_expr.lastToken());
1551 const align_lparen = tree.prevToken(align_expr.firstToken());1550 const align_lparen = tree.prevToken(align_expr.firstToken());
1552 const align_kw = tree.prevToken(align_lparen);1551 const align_kw = tree.prevToken(align_lparen);
15531552
1554 try renderToken(tree, stream, align_kw, Space.None); // align1553 try renderToken(tree, ais, align_kw, Space.None); // align
1555 try renderToken(tree, stream, align_lparen, Space.None); // (1554 try renderToken(tree, ais, align_lparen, Space.None); // (
1556 try renderExpression(allocator, stream, tree, align_expr, Space.None);1555 try renderExpression(allocator, ais, tree, align_expr, Space.None);
1557 try renderToken(tree, stream, align_rparen, Space.Space); // )1556 try renderToken(tree, ais, align_rparen, Space.Space); // )
1558 }1557 }
15591558
1560 if (fn_proto.getSectionExpr()) |section_expr| {1559 if (fn_proto.getSectionExpr()) |section_expr| {
...@@ -1562,10 +1561,10 @@ fn renderExpression(...@@ -1562,10 +1561,10 @@ fn renderExpression(
1562 const section_lparen = tree.prevToken(section_expr.firstToken());1561 const section_lparen = tree.prevToken(section_expr.firstToken());
1563 const section_kw = tree.prevToken(section_lparen);1562 const section_kw = tree.prevToken(section_lparen);
15641563
1565 try renderToken(tree, stream, section_kw, Space.None); // section1564 try renderToken(tree, ais, section_kw, Space.None); // section
1566 try renderToken(tree, stream, section_lparen, Space.None); // (1565 try renderToken(tree, ais, section_lparen, Space.None); // (
1567 try renderExpression(allocator, stream, tree, section_expr, Space.None);1566 try renderExpression(allocator, ais, tree, section_expr, Space.None);
1568 try renderToken(tree, stream, section_rparen, Space.Space); // )1567 try renderToken(tree, ais, section_rparen, Space.Space); // )
1569 }1568 }
15701569
1571 if (fn_proto.getCallconvExpr()) |callconv_expr| {1570 if (fn_proto.getCallconvExpr()) |callconv_expr| {
...@@ -1573,23 +1572,23 @@ fn renderExpression(...@@ -1573,23 +1572,23 @@ fn renderExpression(
1573 const callconv_lparen = tree.prevToken(callconv_expr.firstToken());1572 const callconv_lparen = tree.prevToken(callconv_expr.firstToken());
1574 const callconv_kw = tree.prevToken(callconv_lparen);1573 const callconv_kw = tree.prevToken(callconv_lparen);
15751574
1576 try renderToken(tree, stream, callconv_kw, Space.None); // callconv1575 try renderToken(tree, ais, callconv_kw, Space.None); // callconv
1577 try renderToken(tree, stream, callconv_lparen, Space.None); // (1576 try renderToken(tree, ais, callconv_lparen, Space.None); // (
1578 try renderExpression(allocator, stream, tree, callconv_expr, Space.None);1577 try renderExpression(allocator, ais, tree, callconv_expr, Space.None);
1579 try renderToken(tree, stream, callconv_rparen, Space.Space); // )1578 try renderToken(tree, ais, callconv_rparen, Space.Space); // )
1580 } else if (fn_proto.getIsExternPrototype() != null) {1579 } else if (fn_proto.getIsExternPrototype() != null) {
1581 try stream.writer().writeAll("callconv(.C) ");1580 try ais.writer().writeAll("callconv(.C) ");
1582 } else if (fn_proto.getIsAsync() != null) {1581 } else if (fn_proto.getIsAsync() != null) {
1583 try stream.writer().writeAll("callconv(.Async) ");1582 try ais.writer().writeAll("callconv(.Async) ");
1584 }1583 }
15851584
1586 switch (fn_proto.return_type) {1585 switch (fn_proto.return_type) {
1587 .Explicit => |node| {1586 .Explicit => |node| {
1588 return renderExpression(allocator, stream, tree, node, space);1587 return renderExpression(allocator, ais, tree, node, space);
1589 },1588 },
1590 .InferErrorSet => |node| {1589 .InferErrorSet => |node| {
1591 try renderToken(tree, stream, tree.prevToken(node.firstToken()), Space.None); // !1590 try renderToken(tree, ais, tree.prevToken(node.firstToken()), Space.None); // !
1592 return renderExpression(allocator, stream, tree, node, space);1591 return renderExpression(allocator, ais, tree, node, space);
1593 },1592 },
1594 .Invalid => unreachable,1593 .Invalid => unreachable,
1595 }1594 }
...@@ -1599,11 +1598,11 @@ fn renderExpression(...@@ -1599,11 +1598,11 @@ fn renderExpression(
1599 const anyframe_type = @fieldParentPtr(ast.Node.AnyFrameType, "base", base);1598 const anyframe_type = @fieldParentPtr(ast.Node.AnyFrameType, "base", base);
16001599
1601 if (anyframe_type.result) |result| {1600 if (anyframe_type.result) |result| {
1602 try renderToken(tree, stream, anyframe_type.anyframe_token, Space.None); // anyframe1601 try renderToken(tree, ais, anyframe_type.anyframe_token, Space.None); // anyframe
1603 try renderToken(tree, stream, result.arrow_token, Space.None); // ->1602 try renderToken(tree, ais, result.arrow_token, Space.None); // ->
1604 return renderExpression(allocator, stream, tree, result.return_type, space);1603 return renderExpression(allocator, ais, tree, result.return_type, space);
1605 } else {1604 } else {
1606 return renderToken(tree, stream, anyframe_type.anyframe_token, space); // anyframe1605 return renderToken(tree, ais, anyframe_type.anyframe_token, space); // anyframe
1607 }1606 }
1608 },1607 },
16091608
...@@ -1612,38 +1611,38 @@ fn renderExpression(...@@ -1612,38 +1611,38 @@ fn renderExpression(
1612 .Switch => {1611 .Switch => {
1613 const switch_node = @fieldParentPtr(ast.Node.Switch, "base", base);1612 const switch_node = @fieldParentPtr(ast.Node.Switch, "base", base);
16141613
1615 try renderToken(tree, stream, switch_node.switch_token, Space.Space); // switch1614 try renderToken(tree, ais, switch_node.switch_token, Space.Space); // switch
1616 try renderToken(tree, stream, tree.nextToken(switch_node.switch_token), Space.None); // (1615 try renderToken(tree, ais, tree.nextToken(switch_node.switch_token), Space.None); // (
16171616
1618 const rparen = tree.nextToken(switch_node.expr.lastToken());1617 const rparen = tree.nextToken(switch_node.expr.lastToken());
1619 const lbrace = tree.nextToken(rparen);1618 const lbrace = tree.nextToken(rparen);
16201619
1621 if (switch_node.cases_len == 0) {1620 if (switch_node.cases_len == 0) {
1622 try renderExpression(allocator, stream, tree, switch_node.expr, Space.None);1621 try renderExpression(allocator, ais, tree, switch_node.expr, Space.None);
1623 try renderToken(tree, stream, rparen, Space.Space); // )1622 try renderToken(tree, ais, rparen, Space.Space); // )
1624 try renderToken(tree, stream, lbrace, Space.None); // {1623 try renderToken(tree, ais, lbrace, Space.None); // {
1625 return renderToken(tree, stream, switch_node.rbrace, space); // }1624 return renderToken(tree, ais, switch_node.rbrace, space); // }
1626 }1625 }
16271626
1628 try renderExpression(allocator, stream, tree, switch_node.expr, Space.None);1627 try renderExpression(allocator, ais, tree, switch_node.expr, Space.None);
1629 try renderToken(tree, stream, rparen, Space.Space); // )1628 try renderToken(tree, ais, rparen, Space.Space); // )
16301629
1631 {1630 {
1632 stream.pushIndentNextLine();1631 ais.pushIndentNextLine();
1633 defer stream.popIndent();1632 defer ais.popIndent();
1634 try renderToken(tree, stream, lbrace, Space.Newline); // {1633 try renderToken(tree, ais, lbrace, Space.Newline); // {
16351634
1636 const cases = switch_node.cases();1635 const cases = switch_node.cases();
1637 for (cases) |node, i| {1636 for (cases) |node, i| {
1638 try renderExpression(allocator, stream, tree, node, Space.Comma);1637 try renderExpression(allocator, ais, tree, node, Space.Comma);
16391638
1640 if (i + 1 < cases.len) {1639 if (i + 1 < cases.len) {
1641 try renderExtraNewline(tree, stream, cases[i + 1]);1640 try renderExtraNewline(tree, ais, cases[i + 1]);
1642 }1641 }
1643 }1642 }
1644 }1643 }
16451644
1646 return renderToken(tree, stream, switch_node.rbrace, space); // }1645 return renderToken(tree, ais, switch_node.rbrace, space); // }
1647 },1646 },
16481647
1649 .SwitchCase => {1648 .SwitchCase => {
...@@ -1660,41 +1659,41 @@ fn renderExpression(...@@ -1660,41 +1659,41 @@ fn renderExpression(
1660 const items = switch_case.items();1659 const items = switch_case.items();
1661 for (items) |node, i| {1660 for (items) |node, i| {
1662 if (i + 1 < items.len) {1661 if (i + 1 < items.len) {
1663 try renderExpression(allocator, stream, tree, node, Space.None);1662 try renderExpression(allocator, ais, tree, node, Space.None);
16641663
1665 const comma_token = tree.nextToken(node.lastToken());1664 const comma_token = tree.nextToken(node.lastToken());
1666 try renderToken(tree, stream, comma_token, Space.Space); // ,1665 try renderToken(tree, ais, comma_token, Space.Space); // ,
1667 try renderExtraNewline(tree, stream, items[i + 1]);1666 try renderExtraNewline(tree, ais, items[i + 1]);
1668 } else {1667 } else {
1669 try renderExpression(allocator, stream, tree, node, Space.Space);1668 try renderExpression(allocator, ais, tree, node, Space.Space);
1670 }1669 }
1671 }1670 }
1672 } else {1671 } else {
1673 const items = switch_case.items();1672 const items = switch_case.items();
1674 for (items) |node, i| {1673 for (items) |node, i| {
1675 if (i + 1 < items.len) {1674 if (i + 1 < items.len) {
1676 try renderExpression(allocator, stream, tree, node, Space.None);1675 try renderExpression(allocator, ais, tree, node, Space.None);
16771676
1678 const comma_token = tree.nextToken(node.lastToken());1677 const comma_token = tree.nextToken(node.lastToken());
1679 try renderToken(tree, stream, comma_token, Space.Newline); // ,1678 try renderToken(tree, ais, comma_token, Space.Newline); // ,
1680 try renderExtraNewline(tree, stream, items[i + 1]);1679 try renderExtraNewline(tree, ais, items[i + 1]);
1681 } else {1680 } else {
1682 try renderExpression(allocator, stream, tree, node, Space.Comma);1681 try renderExpression(allocator, ais, tree, node, Space.Comma);
1683 }1682 }
1684 }1683 }
1685 }1684 }
16861685
1687 try renderToken(tree, stream, switch_case.arrow_token, Space.Space); // =>1686 try renderToken(tree, ais, switch_case.arrow_token, Space.Space); // =>
16881687
1689 if (switch_case.payload) |payload| {1688 if (switch_case.payload) |payload| {
1690 try renderExpression(allocator, stream, tree, payload, Space.Space);1689 try renderExpression(allocator, ais, tree, payload, Space.Space);
1691 }1690 }
16921691
1693 return renderExpression(allocator, stream, tree, switch_case.expr, space);1692 return renderExpression(allocator, ais, tree, switch_case.expr, space);
1694 },1693 },
1695 .SwitchElse => {1694 .SwitchElse => {
1696 const switch_else = @fieldParentPtr(ast.Node.SwitchElse, "base", base);1695 const switch_else = @fieldParentPtr(ast.Node.SwitchElse, "base", base);
1697 return renderToken(tree, stream, switch_else.token, space);1696 return renderToken(tree, ais, switch_else.token, space);
1698 },1697 },
1699 .Else => {1698 .Else => {
1700 const else_node = @fieldParentPtr(ast.Node.Else, "base", base);1699 const else_node = @fieldParentPtr(ast.Node.Else, "base", base);
...@@ -1703,19 +1702,19 @@ fn renderExpression(...@@ -1703,19 +1702,19 @@ fn renderExpression(
1703 const same_line = body_is_block or tree.tokensOnSameLine(else_node.else_token, else_node.body.lastToken());1702 const same_line = body_is_block or tree.tokensOnSameLine(else_node.else_token, else_node.body.lastToken());
17041703
1705 const after_else_space = if (same_line or else_node.payload != null) Space.Space else Space.Newline;1704 const after_else_space = if (same_line or else_node.payload != null) Space.Space else Space.Newline;
1706 try renderToken(tree, stream, else_node.else_token, after_else_space);1705 try renderToken(tree, ais, else_node.else_token, after_else_space);
17071706
1708 if (else_node.payload) |payload| {1707 if (else_node.payload) |payload| {
1709 const payload_space = if (same_line) Space.Space else Space.Newline;1708 const payload_space = if (same_line) Space.Space else Space.Newline;
1710 try renderExpression(allocator, stream, tree, payload, payload_space);1709 try renderExpression(allocator, ais, tree, payload, payload_space);
1711 }1710 }
17121711
1713 if (same_line) {1712 if (same_line) {
1714 return renderExpression(allocator, stream, tree, else_node.body, space);1713 return renderExpression(allocator, ais, tree, else_node.body, space);
1715 } else {1714 } else {
1716 stream.pushIndent();1715 ais.pushIndent();
1717 defer stream.popIndent();1716 defer ais.popIndent();
1718 return renderExpression(allocator, stream, tree, else_node.body, space);1717 return renderExpression(allocator, ais, tree, else_node.body, space);
1719 }1718 }
1720 },1719 },
17211720
...@@ -1723,17 +1722,17 @@ fn renderExpression(...@@ -1723,17 +1722,17 @@ fn renderExpression(
1723 const while_node = @fieldParentPtr(ast.Node.While, "base", base);1722 const while_node = @fieldParentPtr(ast.Node.While, "base", base);
17241723
1725 if (while_node.label) |label| {1724 if (while_node.label) |label| {
1726 try renderToken(tree, stream, label, Space.None); // label1725 try renderToken(tree, ais, label, Space.None); // label
1727 try renderToken(tree, stream, tree.nextToken(label), Space.Space); // :1726 try renderToken(tree, ais, tree.nextToken(label), Space.Space); // :
1728 }1727 }
17291728
1730 if (while_node.inline_token) |inline_token| {1729 if (while_node.inline_token) |inline_token| {
1731 try renderToken(tree, stream, inline_token, Space.Space); // inline1730 try renderToken(tree, ais, inline_token, Space.Space); // inline
1732 }1731 }
17331732
1734 try renderToken(tree, stream, while_node.while_token, Space.Space); // while1733 try renderToken(tree, ais, while_node.while_token, Space.Space); // while
1735 try renderToken(tree, stream, tree.nextToken(while_node.while_token), Space.None); // (1734 try renderToken(tree, ais, tree.nextToken(while_node.while_token), Space.None); // (
1736 try renderExpression(allocator, stream, tree, while_node.condition, Space.None);1735 try renderExpression(allocator, ais, tree, while_node.condition, Space.None);
17371736
1738 const cond_rparen = tree.nextToken(while_node.condition.lastToken());1737 const cond_rparen = tree.nextToken(while_node.condition.lastToken());
17391738
...@@ -1755,12 +1754,12 @@ fn renderExpression(...@@ -1755,12 +1754,12 @@ fn renderExpression(
17551754
1756 {1755 {
1757 const rparen_space = if (while_node.payload != null or while_node.continue_expr != null) Space.Space else block_start_space;1756 const rparen_space = if (while_node.payload != null or while_node.continue_expr != null) Space.Space else block_start_space;
1758 try renderToken(tree, stream, cond_rparen, rparen_space); // )1757 try renderToken(tree, ais, cond_rparen, rparen_space); // )
1759 }1758 }
17601759
1761 if (while_node.payload) |payload| {1760 if (while_node.payload) |payload| {
1762 const payload_space = Space.Space; //if (while_node.continue_expr != null) Space.Space else block_start_space;1761 const payload_space = Space.Space; //if (while_node.continue_expr != null) Space.Space else block_start_space;
1763 try renderExpression(allocator, stream, tree, payload, payload_space);1762 try renderExpression(allocator, ais, tree, payload, payload_space);
1764 }1763 }
17651764
1766 if (while_node.continue_expr) |continue_expr| {1765 if (while_node.continue_expr) |continue_expr| {
...@@ -1768,22 +1767,22 @@ fn renderExpression(...@@ -1768,22 +1767,22 @@ fn renderExpression(
1768 const lparen = tree.prevToken(continue_expr.firstToken());1767 const lparen = tree.prevToken(continue_expr.firstToken());
1769 const colon = tree.prevToken(lparen);1768 const colon = tree.prevToken(lparen);
17701769
1771 try renderToken(tree, stream, colon, Space.Space); // :1770 try renderToken(tree, ais, colon, Space.Space); // :
1772 try renderToken(tree, stream, lparen, Space.None); // (1771 try renderToken(tree, ais, lparen, Space.None); // (
17731772
1774 try renderExpression(allocator, stream, tree, continue_expr, Space.None);1773 try renderExpression(allocator, ais, tree, continue_expr, Space.None);
17751774
1776 try renderToken(tree, stream, rparen, block_start_space); // )1775 try renderToken(tree, ais, rparen, block_start_space); // )
1777 }1776 }
17781777
1779 {1778 {
1780 if (!body_is_block) stream.pushIndent();1779 if (!body_is_block) ais.pushIndent();
1781 defer if (!body_is_block) stream.popIndent();1780 defer if (!body_is_block) ais.popIndent();
1782 try renderExpression(allocator, stream, tree, while_node.body, after_body_space);1781 try renderExpression(allocator, ais, tree, while_node.body, after_body_space);
1783 }1782 }
17841783
1785 if (while_node.@"else") |@"else"| {1784 if (while_node.@"else") |@"else"| {
1786 return renderExpression(allocator, stream, tree, &@"else".base, space);1785 return renderExpression(allocator, ais, tree, &@"else".base, space);
1787 }1786 }
1788 },1787 },
17891788
...@@ -1791,17 +1790,17 @@ fn renderExpression(...@@ -1791,17 +1790,17 @@ fn renderExpression(
1791 const for_node = @fieldParentPtr(ast.Node.For, "base", base);1790 const for_node = @fieldParentPtr(ast.Node.For, "base", base);
17921791
1793 if (for_node.label) |label| {1792 if (for_node.label) |label| {
1794 try renderToken(tree, stream, label, Space.None); // label1793 try renderToken(tree, ais, label, Space.None); // label
1795 try renderToken(tree, stream, tree.nextToken(label), Space.Space); // :1794 try renderToken(tree, ais, tree.nextToken(label), Space.Space); // :
1796 }1795 }
17971796
1798 if (for_node.inline_token) |inline_token| {1797 if (for_node.inline_token) |inline_token| {
1799 try renderToken(tree, stream, inline_token, Space.Space); // inline1798 try renderToken(tree, ais, inline_token, Space.Space); // inline
1800 }1799 }
18011800
1802 try renderToken(tree, stream, for_node.for_token, Space.Space); // for1801 try renderToken(tree, ais, for_node.for_token, Space.Space); // for
1803 try renderToken(tree, stream, tree.nextToken(for_node.for_token), Space.None); // (1802 try renderToken(tree, ais, tree.nextToken(for_node.for_token), Space.None); // (
1804 try renderExpression(allocator, stream, tree, for_node.array_expr, Space.None);1803 try renderExpression(allocator, ais, tree, for_node.array_expr, Space.None);
18051804
1806 const rparen = tree.nextToken(for_node.array_expr.lastToken());1805 const rparen = tree.nextToken(for_node.array_expr.lastToken());
18071806
...@@ -1809,10 +1808,10 @@ fn renderExpression(...@@ -1809,10 +1808,10 @@ fn renderExpression(
1809 const src_one_line_to_body = !body_is_block and tree.tokensOnSameLine(rparen, for_node.body.firstToken());1808 const src_one_line_to_body = !body_is_block and tree.tokensOnSameLine(rparen, for_node.body.firstToken());
1810 const body_on_same_line = body_is_block or src_one_line_to_body;1809 const body_on_same_line = body_is_block or src_one_line_to_body;
18111810
1812 try renderToken(tree, stream, rparen, Space.Space); // )1811 try renderToken(tree, ais, rparen, Space.Space); // )
18131812
1814 const space_after_payload = if (body_on_same_line) Space.Space else Space.Newline;1813 const space_after_payload = if (body_on_same_line) Space.Space else Space.Newline;
1815 try renderExpression(allocator, stream, tree, for_node.payload, space_after_payload); // |x|1814 try renderExpression(allocator, ais, tree, for_node.payload, space_after_payload); // |x|
18161815
1817 const space_after_body = blk: {1816 const space_after_body = blk: {
1818 if (for_node.@"else") |@"else"| {1817 if (for_node.@"else") |@"else"| {
...@@ -1828,13 +1827,13 @@ fn renderExpression(...@@ -1828,13 +1827,13 @@ fn renderExpression(
1828 };1827 };
18291828
1830 {1829 {
1831 if (!body_on_same_line) stream.pushIndent();1830 if (!body_on_same_line) ais.pushIndent();
1832 defer if (!body_on_same_line) stream.popIndent();1831 defer if (!body_on_same_line) ais.popIndent();
1833 try renderExpression(allocator, stream, tree, for_node.body, space_after_body); // { body }1832 try renderExpression(allocator, ais, tree, for_node.body, space_after_body); // { body }
1834 }1833 }
18351834
1836 if (for_node.@"else") |@"else"| {1835 if (for_node.@"else") |@"else"| {
1837 return renderExpression(allocator, stream, tree, &@"else".base, space); // else1836 return renderExpression(allocator, ais, tree, &@"else".base, space); // else
1838 }1837 }
1839 },1838 },
18401839
...@@ -1844,29 +1843,29 @@ fn renderExpression(...@@ -1844,29 +1843,29 @@ fn renderExpression(
1844 const lparen = tree.nextToken(if_node.if_token);1843 const lparen = tree.nextToken(if_node.if_token);
1845 const rparen = tree.nextToken(if_node.condition.lastToken());1844 const rparen = tree.nextToken(if_node.condition.lastToken());
18461845
1847 try renderToken(tree, stream, if_node.if_token, Space.Space); // if1846 try renderToken(tree, ais, if_node.if_token, Space.Space); // if
1848 try renderToken(tree, stream, lparen, Space.None); // (1847 try renderToken(tree, ais, lparen, Space.None); // (
18491848
1850 try renderExpression(allocator, stream, tree, if_node.condition, Space.None); // condition1849 try renderExpression(allocator, ais, tree, if_node.condition, Space.None); // condition
18511850
1852 const body_is_if_block = if_node.body.tag == .If;1851 const body_is_if_block = if_node.body.tag == .If;
1853 const body_is_block = nodeIsBlock(if_node.body);1852 const body_is_block = nodeIsBlock(if_node.body);
18541853
1855 if (body_is_if_block) {1854 if (body_is_if_block) {
1856 try renderExtraNewline(tree, stream, if_node.body);1855 try renderExtraNewline(tree, ais, if_node.body);
1857 } else if (body_is_block) {1856 } else if (body_is_block) {
1858 const after_rparen_space = if (if_node.payload == null) Space.BlockStart else Space.Space;1857 const after_rparen_space = if (if_node.payload == null) Space.BlockStart else Space.Space;
1859 try renderToken(tree, stream, rparen, after_rparen_space); // )1858 try renderToken(tree, ais, rparen, after_rparen_space); // )
18601859
1861 if (if_node.payload) |payload| {1860 if (if_node.payload) |payload| {
1862 try renderExpression(allocator, stream, tree, payload, Space.BlockStart); // |x|1861 try renderExpression(allocator, ais, tree, payload, Space.BlockStart); // |x|
1863 }1862 }
18641863
1865 if (if_node.@"else") |@"else"| {1864 if (if_node.@"else") |@"else"| {
1866 try renderExpression(allocator, stream, tree, if_node.body, Space.SpaceOrOutdent);1865 try renderExpression(allocator, ais, tree, if_node.body, Space.SpaceOrOutdent);
1867 return renderExpression(allocator, stream, tree, &@"else".base, space);1866 return renderExpression(allocator, ais, tree, &@"else".base, space);
1868 } else {1867 } else {
1869 return renderExpression(allocator, stream, tree, if_node.body, space);1868 return renderExpression(allocator, ais, tree, if_node.body, space);
1870 }1869 }
1871 }1870 }
18721871
...@@ -1874,121 +1873,121 @@ fn renderExpression(...@@ -1874,121 +1873,121 @@ fn renderExpression(
18741873
1875 if (src_has_newline) {1874 if (src_has_newline) {
1876 const after_rparen_space = if (if_node.payload == null) Space.Newline else Space.Space;1875 const after_rparen_space = if (if_node.payload == null) Space.Newline else Space.Space;
1877 try renderToken(tree, stream, rparen, after_rparen_space); // )1876 try renderToken(tree, ais, rparen, after_rparen_space); // )
18781877
1879 if (if_node.payload) |payload| {1878 if (if_node.payload) |payload| {
1880 try renderExpression(allocator, stream, tree, payload, Space.Newline);1879 try renderExpression(allocator, ais, tree, payload, Space.Newline);
1881 }1880 }
18821881
1883 if (if_node.@"else") |@"else"| {1882 if (if_node.@"else") |@"else"| {
1884 const else_is_block = nodeIsBlock(@"else".body);1883 const else_is_block = nodeIsBlock(@"else".body);
18851884
1886 {1885 {
1887 stream.pushIndent();1886 ais.pushIndent();
1888 defer stream.popIndent();1887 defer ais.popIndent();
1889 try renderExpression(allocator, stream, tree, if_node.body, Space.Newline);1888 try renderExpression(allocator, ais, tree, if_node.body, Space.Newline);
1890 }1889 }
18911890
1892 if (else_is_block) {1891 if (else_is_block) {
1893 try renderToken(tree, stream, @"else".else_token, Space.Space); // else1892 try renderToken(tree, ais, @"else".else_token, Space.Space); // else
18941893
1895 if (@"else".payload) |payload| {1894 if (@"else".payload) |payload| {
1896 try renderExpression(allocator, stream, tree, payload, Space.Space);1895 try renderExpression(allocator, ais, tree, payload, Space.Space);
1897 }1896 }
18981897
1899 return renderExpression(allocator, stream, tree, @"else".body, space);1898 return renderExpression(allocator, ais, tree, @"else".body, space);
1900 } else {1899 } else {
1901 const after_else_space = if (@"else".payload == null) Space.Newline else Space.Space;1900 const after_else_space = if (@"else".payload == null) Space.Newline else Space.Space;
1902 try renderToken(tree, stream, @"else".else_token, after_else_space); // else1901 try renderToken(tree, ais, @"else".else_token, after_else_space); // else
19031902
1904 if (@"else".payload) |payload| {1903 if (@"else".payload) |payload| {
1905 try renderExpression(allocator, stream, tree, payload, Space.Newline);1904 try renderExpression(allocator, ais, tree, payload, Space.Newline);
1906 }1905 }
19071906
1908 stream.pushIndent();1907 ais.pushIndent();
1909 defer stream.popIndent();1908 defer ais.popIndent();
1910 return renderExpression(allocator, stream, tree, @"else".body, space);1909 return renderExpression(allocator, ais, tree, @"else".body, space);
1911 }1910 }
1912 } else {1911 } else {
1913 stream.pushIndent();1912 ais.pushIndent();
1914 defer stream.popIndent();1913 defer ais.popIndent();
1915 return renderExpression(allocator, stream, tree, if_node.body, space);1914 return renderExpression(allocator, ais, tree, if_node.body, space);
1916 }1915 }
1917 }1916 }
19181917
1919 // Single line if statement1918 // Single line if statement
19201919
1921 try renderToken(tree, stream, rparen, Space.Space); // )1920 try renderToken(tree, ais, rparen, Space.Space); // )
19221921
1923 if (if_node.payload) |payload| {1922 if (if_node.payload) |payload| {
1924 try renderExpression(allocator, stream, tree, payload, Space.Space);1923 try renderExpression(allocator, ais, tree, payload, Space.Space);
1925 }1924 }
19261925
1927 if (if_node.@"else") |@"else"| {1926 if (if_node.@"else") |@"else"| {
1928 try renderExpression(allocator, stream, tree, if_node.body, Space.Space);1927 try renderExpression(allocator, ais, tree, if_node.body, Space.Space);
1929 try renderToken(tree, stream, @"else".else_token, Space.Space);1928 try renderToken(tree, ais, @"else".else_token, Space.Space);
19301929
1931 if (@"else".payload) |payload| {1930 if (@"else".payload) |payload| {
1932 try renderExpression(allocator, stream, tree, payload, Space.Space);1931 try renderExpression(allocator, ais, tree, payload, Space.Space);
1933 }1932 }
19341933
1935 return renderExpression(allocator, stream, tree, @"else".body, space);1934 return renderExpression(allocator, ais, tree, @"else".body, space);
1936 } else {1935 } else {
1937 return renderExpression(allocator, stream, tree, if_node.body, space);1936 return renderExpression(allocator, ais, tree, if_node.body, space);
1938 }1937 }
1939 },1938 },
19401939
1941 .Asm => {1940 .Asm => {
1942 const asm_node = @fieldParentPtr(ast.Node.Asm, "base", base);1941 const asm_node = @fieldParentPtr(ast.Node.Asm, "base", base);
19431942
1944 try renderToken(tree, stream, asm_node.asm_token, Space.Space); // asm1943 try renderToken(tree, ais, asm_node.asm_token, Space.Space); // asm
19451944
1946 if (asm_node.volatile_token) |volatile_token| {1945 if (asm_node.volatile_token) |volatile_token| {
1947 try renderToken(tree, stream, volatile_token, Space.Space); // volatile1946 try renderToken(tree, ais, volatile_token, Space.Space); // volatile
1948 try renderToken(tree, stream, tree.nextToken(volatile_token), Space.None); // (1947 try renderToken(tree, ais, tree.nextToken(volatile_token), Space.None); // (
1949 } else {1948 } else {
1950 try renderToken(tree, stream, tree.nextToken(asm_node.asm_token), Space.None); // (1949 try renderToken(tree, ais, tree.nextToken(asm_node.asm_token), Space.None); // (
1951 }1950 }
19521951
1953 asmblk: {1952 asmblk: {
1954 stream.pushIndent();1953 ais.pushIndent();
1955 defer stream.popIndent();1954 defer ais.popIndent();
19561955
1957 if (asm_node.outputs.len == 0 and asm_node.inputs.len == 0 and asm_node.clobbers.len == 0) {1956 if (asm_node.outputs.len == 0 and asm_node.inputs.len == 0 and asm_node.clobbers.len == 0) {
1958 try renderExpression(allocator, stream, tree, asm_node.template, Space.None);1957 try renderExpression(allocator, ais, tree, asm_node.template, Space.None);
1959 break :asmblk;1958 break :asmblk;
1960 }1959 }
19611960
1962 try renderExpression(allocator, stream, tree, asm_node.template, Space.Newline);1961 try renderExpression(allocator, ais, tree, asm_node.template, Space.Newline);
19631962
1964 stream.setIndentDelta(asm_indent_delta);1963 ais.setIndentDelta(asm_indent_delta);
1965 defer stream.setIndentDelta(indent_delta);1964 defer ais.setIndentDelta(indent_delta);
19661965
1967 const colon1 = tree.nextToken(asm_node.template.lastToken());1966 const colon1 = tree.nextToken(asm_node.template.lastToken());
19681967
1969 const colon2 = if (asm_node.outputs.len == 0) blk: {1968 const colon2 = if (asm_node.outputs.len == 0) blk: {
1970 try renderToken(tree, stream, colon1, Space.Newline); // :1969 try renderToken(tree, ais, colon1, Space.Newline); // :
19711970
1972 break :blk tree.nextToken(colon1);1971 break :blk tree.nextToken(colon1);
1973 } else blk: {1972 } else blk: {
1974 try renderToken(tree, stream, colon1, Space.Space); // :1973 try renderToken(tree, ais, colon1, Space.Space); // :
19751974
1976 stream.pushIndent();1975 ais.pushIndent();
1977 defer stream.popIndent();1976 defer ais.popIndent();
19781977
1979 for (asm_node.outputs) |*asm_output, i| {1978 for (asm_node.outputs) |*asm_output, i| {
1980 if (i + 1 < asm_node.outputs.len) {1979 if (i + 1 < asm_node.outputs.len) {
1981 const next_asm_output = asm_node.outputs[i + 1];1980 const next_asm_output = asm_node.outputs[i + 1];
1982 try renderAsmOutput(allocator, stream, tree, asm_output, Space.None);1981 try renderAsmOutput(allocator, ais, tree, asm_output, Space.None);
19831982
1984 const comma = tree.prevToken(next_asm_output.firstToken());1983 const comma = tree.prevToken(next_asm_output.firstToken());
1985 try renderToken(tree, stream, comma, Space.Newline); // ,1984 try renderToken(tree, ais, comma, Space.Newline); // ,
1986 try renderExtraNewlineToken(tree, stream, next_asm_output.firstToken());1985 try renderExtraNewlineToken(tree, ais, next_asm_output.firstToken());
1987 } else if (asm_node.inputs.len == 0 and asm_node.clobbers.len == 0) {1986 } else if (asm_node.inputs.len == 0 and asm_node.clobbers.len == 0) {
1988 try renderAsmOutput(allocator, stream, tree, asm_output, Space.Newline);1987 try renderAsmOutput(allocator, ais, tree, asm_output, Space.Newline);
1989 break :asmblk;1988 break :asmblk;
1990 } else {1989 } else {
1991 try renderAsmOutput(allocator, stream, tree, asm_output, Space.Newline);1990 try renderAsmOutput(allocator, ais, tree, asm_output, Space.Newline);
1992 const comma_or_colon = tree.nextToken(asm_output.lastToken());1991 const comma_or_colon = tree.nextToken(asm_output.lastToken());
1993 break :blk switch (tree.token_ids[comma_or_colon]) {1992 break :blk switch (tree.token_ids[comma_or_colon]) {
1994 .Comma => tree.nextToken(comma_or_colon),1993 .Comma => tree.nextToken(comma_or_colon),
...@@ -2000,25 +1999,25 @@ fn renderExpression(...@@ -2000,25 +1999,25 @@ fn renderExpression(
2000 };1999 };
20012000
2002 const colon3 = if (asm_node.inputs.len == 0) blk: {2001 const colon3 = if (asm_node.inputs.len == 0) blk: {
2003 try renderToken(tree, stream, colon2, Space.Newline); // :2002 try renderToken(tree, ais, colon2, Space.Newline); // :
2004 break :blk tree.nextToken(colon2);2003 break :blk tree.nextToken(colon2);
2005 } else blk: {2004 } else blk: {
2006 try renderToken(tree, stream, colon2, Space.Space); // :2005 try renderToken(tree, ais, colon2, Space.Space); // :
2007 stream.pushIndent();2006 ais.pushIndent();
2008 defer stream.popIndent();2007 defer ais.popIndent();
2009 for (asm_node.inputs) |*asm_input, i| {2008 for (asm_node.inputs) |*asm_input, i| {
2010 if (i + 1 < asm_node.inputs.len) {2009 if (i + 1 < asm_node.inputs.len) {
2011 const next_asm_input = &asm_node.inputs[i + 1];2010 const next_asm_input = &asm_node.inputs[i + 1];
2012 try renderAsmInput(allocator, stream, tree, asm_input, Space.None);2011 try renderAsmInput(allocator, ais, tree, asm_input, Space.None);
20132012
2014 const comma = tree.prevToken(next_asm_input.firstToken());2013 const comma = tree.prevToken(next_asm_input.firstToken());
2015 try renderToken(tree, stream, comma, Space.Newline); // ,2014 try renderToken(tree, ais, comma, Space.Newline); // ,
2016 try renderExtraNewlineToken(tree, stream, next_asm_input.firstToken());2015 try renderExtraNewlineToken(tree, ais, next_asm_input.firstToken());
2017 } else if (asm_node.clobbers.len == 0) {2016 } else if (asm_node.clobbers.len == 0) {
2018 try renderAsmInput(allocator, stream, tree, asm_input, Space.Newline);2017 try renderAsmInput(allocator, ais, tree, asm_input, Space.Newline);
2019 break :asmblk;2018 break :asmblk;
2020 } else {2019 } else {
2021 try renderAsmInput(allocator, stream, tree, asm_input, Space.Newline);2020 try renderAsmInput(allocator, ais, tree, asm_input, Space.Newline);
2022 const comma_or_colon = tree.nextToken(asm_input.lastToken());2021 const comma_or_colon = tree.nextToken(asm_input.lastToken());
2023 break :blk switch (tree.token_ids[comma_or_colon]) {2022 break :blk switch (tree.token_ids[comma_or_colon]) {
2024 .Comma => tree.nextToken(comma_or_colon),2023 .Comma => tree.nextToken(comma_or_colon),
...@@ -2029,29 +2028,29 @@ fn renderExpression(...@@ -2029,29 +2028,29 @@ fn renderExpression(
2029 unreachable;2028 unreachable;
2030 };2029 };
20312030
2032 try renderToken(tree, stream, colon3, Space.Space); // :2031 try renderToken(tree, ais, colon3, Space.Space); // :
2033 stream.pushIndent();2032 ais.pushIndent();
2034 defer stream.popIndent();2033 defer ais.popIndent();
2035 for (asm_node.clobbers) |clobber_node, i| {2034 for (asm_node.clobbers) |clobber_node, i| {
2036 if (i + 1 >= asm_node.clobbers.len) {2035 if (i + 1 >= asm_node.clobbers.len) {
2037 try renderExpression(allocator, stream, tree, clobber_node, Space.Newline);2036 try renderExpression(allocator, ais, tree, clobber_node, Space.Newline);
2038 break :asmblk;2037 break :asmblk;
2039 } else {2038 } else {
2040 try renderExpression(allocator, stream, tree, clobber_node, Space.None);2039 try renderExpression(allocator, ais, tree, clobber_node, Space.None);
2041 const comma = tree.nextToken(clobber_node.lastToken());2040 const comma = tree.nextToken(clobber_node.lastToken());
2042 try renderToken(tree, stream, comma, Space.Space); // ,2041 try renderToken(tree, ais, comma, Space.Space); // ,
2043 }2042 }
2044 }2043 }
2045 }2044 }
20462045
2047 return renderToken(tree, stream, asm_node.rparen, space);2046 return renderToken(tree, ais, asm_node.rparen, space);
2048 },2047 },
20492048
2050 .EnumLiteral => {2049 .EnumLiteral => {
2051 const enum_literal = @fieldParentPtr(ast.Node.EnumLiteral, "base", base);2050 const enum_literal = @fieldParentPtr(ast.Node.EnumLiteral, "base", base);
20522051
2053 try renderToken(tree, stream, enum_literal.dot, Space.None); // .2052 try renderToken(tree, ais, enum_literal.dot, Space.None); // .
2054 return renderToken(tree, stream, enum_literal.name, space); // name2053 return renderToken(tree, ais, enum_literal.name, space); // name
2055 },2054 },
20562055
2057 .ContainerField,2056 .ContainerField,
...@@ -2065,14 +2064,14 @@ fn renderExpression(...@@ -2065,14 +2064,14 @@ fn renderExpression(
20652064
2066fn renderArrayType(2065fn renderArrayType(
2067 allocator: *mem.Allocator,2066 allocator: *mem.Allocator,
2068 stream: anytype,2067 ais: anytype,
2069 tree: *ast.Tree,2068 tree: *ast.Tree,
2070 lbracket: ast.TokenIndex,2069 lbracket: ast.TokenIndex,
2071 rhs: *ast.Node,2070 rhs: *ast.Node,
2072 len_expr: *ast.Node,2071 len_expr: *ast.Node,
2073 opt_sentinel: ?*ast.Node,2072 opt_sentinel: ?*ast.Node,
2074 space: Space,2073 space: Space,
2075) (@TypeOf(stream.*).Error || Error)!void {2074) (@TypeOf(ais.*).Error || Error)!void {
2076 const rbracket = tree.nextToken(if (opt_sentinel) |sentinel|2075 const rbracket = tree.nextToken(if (opt_sentinel) |sentinel|
2077 sentinel.lastToken()2076 sentinel.lastToken()
2078 else2077 else
...@@ -2083,97 +2082,97 @@ fn renderArrayType(...@@ -2083,97 +2082,97 @@ fn renderArrayType(
2083 const new_space = if (ends_with_comment) Space.Newline else Space.None;2082 const new_space = if (ends_with_comment) Space.Newline else Space.None;
2084 {2083 {
2085 const do_indent = (starts_with_comment or ends_with_comment);2084 const do_indent = (starts_with_comment or ends_with_comment);
2086 if (do_indent) stream.pushIndent();2085 if (do_indent) ais.pushIndent();
2087 defer if (do_indent) stream.popIndent();2086 defer if (do_indent) ais.popIndent();
20882087
2089 try renderToken(tree, stream, lbracket, Space.None); // [2088 try renderToken(tree, ais, lbracket, Space.None); // [
2090 try renderExpression(allocator, stream, tree, len_expr, new_space);2089 try renderExpression(allocator, ais, tree, len_expr, new_space);
20912090
2092 if (starts_with_comment) {2091 if (starts_with_comment) {
2093 try stream.maybeInsertNewline();2092 try ais.maybeInsertNewline();
2094 }2093 }
2095 if (opt_sentinel) |sentinel| {2094 if (opt_sentinel) |sentinel| {
2096 const colon_token = tree.prevToken(sentinel.firstToken());2095 const colon_token = tree.prevToken(sentinel.firstToken());
2097 try renderToken(tree, stream, colon_token, Space.None); // :2096 try renderToken(tree, ais, colon_token, Space.None); // :
2098 try renderExpression(allocator, stream, tree, sentinel, Space.None);2097 try renderExpression(allocator, ais, tree, sentinel, Space.None);
2099 }2098 }
2100 if (starts_with_comment) {2099 if (starts_with_comment) {
2101 try stream.maybeInsertNewline();2100 try ais.maybeInsertNewline();
2102 }2101 }
2103 }2102 }
2104 try renderToken(tree, stream, rbracket, Space.None); // ]2103 try renderToken(tree, ais, rbracket, Space.None); // ]
21052104
2106 return renderExpression(allocator, stream, tree, rhs, space);2105 return renderExpression(allocator, ais, tree, rhs, space);
2107}2106}
21082107
2109fn renderAsmOutput(2108fn renderAsmOutput(
2110 allocator: *mem.Allocator,2109 allocator: *mem.Allocator,
2111 stream: anytype,2110 ais: anytype,
2112 tree: *ast.Tree,2111 tree: *ast.Tree,
2113 asm_output: *const ast.Node.Asm.Output,2112 asm_output: *const ast.Node.Asm.Output,
2114 space: Space,2113 space: Space,
2115) (@TypeOf(stream.*).Error || Error)!void {2114) (@TypeOf(ais.*).Error || Error)!void {
2116 try stream.writer().writeAll("[");2115 try ais.writer().writeAll("[");
2117 try renderExpression(allocator, stream, tree, asm_output.symbolic_name, Space.None);2116 try renderExpression(allocator, ais, tree, asm_output.symbolic_name, Space.None);
2118 try stream.writer().writeAll("] ");2117 try ais.writer().writeAll("] ");
2119 try renderExpression(allocator, stream, tree, asm_output.constraint, Space.None);2118 try renderExpression(allocator, ais, tree, asm_output.constraint, Space.None);
2120 try stream.writer().writeAll(" (");2119 try ais.writer().writeAll(" (");
21212120
2122 switch (asm_output.kind) {2121 switch (asm_output.kind) {
2123 ast.Node.Asm.Output.Kind.Variable => |variable_name| {2122 ast.Node.Asm.Output.Kind.Variable => |variable_name| {
2124 try renderExpression(allocator, stream, tree, &variable_name.base, Space.None);2123 try renderExpression(allocator, ais, tree, &variable_name.base, Space.None);
2125 },2124 },
2126 ast.Node.Asm.Output.Kind.Return => |return_type| {2125 ast.Node.Asm.Output.Kind.Return => |return_type| {
2127 try stream.writer().writeAll("-> ");2126 try ais.writer().writeAll("-> ");
2128 try renderExpression(allocator, stream, tree, return_type, Space.None);2127 try renderExpression(allocator, ais, tree, return_type, Space.None);
2129 },2128 },
2130 }2129 }
21312130
2132 return renderToken(tree, stream, asm_output.lastToken(), space); // )2131 return renderToken(tree, ais, asm_output.lastToken(), space); // )
2133}2132}
21342133
2135fn renderAsmInput(2134fn renderAsmInput(
2136 allocator: *mem.Allocator,2135 allocator: *mem.Allocator,
2137 stream: anytype,2136 ais: anytype,
2138 tree: *ast.Tree,2137 tree: *ast.Tree,
2139 asm_input: *const ast.Node.Asm.Input,2138 asm_input: *const ast.Node.Asm.Input,
2140 space: Space,2139 space: Space,
2141) (@TypeOf(stream.*).Error || Error)!void {2140) (@TypeOf(ais.*).Error || Error)!void {
2142 try stream.writer().writeAll("[");2141 try ais.writer().writeAll("[");
2143 try renderExpression(allocator, stream, tree, asm_input.symbolic_name, Space.None);2142 try renderExpression(allocator, ais, tree, asm_input.symbolic_name, Space.None);
2144 try stream.writer().writeAll("] ");2143 try ais.writer().writeAll("] ");
2145 try renderExpression(allocator, stream, tree, asm_input.constraint, Space.None);2144 try renderExpression(allocator, ais, tree, asm_input.constraint, Space.None);
2146 try stream.writer().writeAll(" (");2145 try ais.writer().writeAll(" (");
2147 try renderExpression(allocator, stream, tree, asm_input.expr, Space.None);2146 try renderExpression(allocator, ais, tree, asm_input.expr, Space.None);
2148 return renderToken(tree, stream, asm_input.lastToken(), space); // )2147 return renderToken(tree, ais, asm_input.lastToken(), space); // )
2149}2148}
21502149
2151fn renderVarDecl(2150fn renderVarDecl(
2152 allocator: *mem.Allocator,2151 allocator: *mem.Allocator,
2153 stream: anytype,2152 ais: anytype,
2154 tree: *ast.Tree,2153 tree: *ast.Tree,
2155 var_decl: *ast.Node.VarDecl,2154 var_decl: *ast.Node.VarDecl,
2156) (@TypeOf(stream.*).Error || Error)!void {2155) (@TypeOf(ais.*).Error || Error)!void {
2157 if (var_decl.getVisibToken()) |visib_token| {2156 if (var_decl.getVisibToken()) |visib_token| {
2158 try renderToken(tree, stream, visib_token, Space.Space); // pub2157 try renderToken(tree, ais, visib_token, Space.Space); // pub
2159 }2158 }
21602159
2161 if (var_decl.getExternExportToken()) |extern_export_token| {2160 if (var_decl.getExternExportToken()) |extern_export_token| {
2162 try renderToken(tree, stream, extern_export_token, Space.Space); // extern2161 try renderToken(tree, ais, extern_export_token, Space.Space); // extern
21632162
2164 if (var_decl.getLibName()) |lib_name| {2163 if (var_decl.getLibName()) |lib_name| {
2165 try renderExpression(allocator, stream, tree, lib_name, Space.Space); // "lib"2164 try renderExpression(allocator, ais, tree, lib_name, Space.Space); // "lib"
2166 }2165 }
2167 }2166 }
21682167
2169 if (var_decl.getComptimeToken()) |comptime_token| {2168 if (var_decl.getComptimeToken()) |comptime_token| {
2170 try renderToken(tree, stream, comptime_token, Space.Space); // comptime2169 try renderToken(tree, ais, comptime_token, Space.Space); // comptime
2171 }2170 }
21722171
2173 if (var_decl.getThreadLocalToken()) |thread_local_token| {2172 if (var_decl.getThreadLocalToken()) |thread_local_token| {
2174 try renderToken(tree, stream, thread_local_token, Space.Space); // threadlocal2173 try renderToken(tree, ais, thread_local_token, Space.Space); // threadlocal
2175 }2174 }
2176 try renderToken(tree, stream, var_decl.mut_token, Space.Space); // var2175 try renderToken(tree, ais, var_decl.mut_token, Space.Space); // var
21772176
2178 const name_space = if (var_decl.getTypeNode() == null and2177 const name_space = if (var_decl.getTypeNode() == null and
2179 (var_decl.getAlignNode() != null or2178 (var_decl.getAlignNode() != null or
...@@ -2182,92 +2181,92 @@ fn renderVarDecl(...@@ -2182,92 +2181,92 @@ fn renderVarDecl(
2182 Space.Space2181 Space.Space
2183 else2182 else
2184 Space.None;2183 Space.None;
2185 try renderToken(tree, stream, var_decl.name_token, name_space);2184 try renderToken(tree, ais, var_decl.name_token, name_space);
21862185
2187 if (var_decl.getTypeNode()) |type_node| {2186 if (var_decl.getTypeNode()) |type_node| {
2188 try renderToken(tree, stream, tree.nextToken(var_decl.name_token), Space.Space);2187 try renderToken(tree, ais, tree.nextToken(var_decl.name_token), Space.Space);
2189 const s = if (var_decl.getAlignNode() != null or2188 const s = if (var_decl.getAlignNode() != null or
2190 var_decl.getSectionNode() != null or2189 var_decl.getSectionNode() != null or
2191 var_decl.getInitNode() != null) Space.Space else Space.None;2190 var_decl.getInitNode() != null) Space.Space else Space.None;
2192 try renderExpression(allocator, stream, tree, type_node, s);2191 try renderExpression(allocator, ais, tree, type_node, s);
2193 }2192 }
21942193
2195 if (var_decl.getAlignNode()) |align_node| {2194 if (var_decl.getAlignNode()) |align_node| {
2196 const lparen = tree.prevToken(align_node.firstToken());2195 const lparen = tree.prevToken(align_node.firstToken());
2197 const align_kw = tree.prevToken(lparen);2196 const align_kw = tree.prevToken(lparen);
2198 const rparen = tree.nextToken(align_node.lastToken());2197 const rparen = tree.nextToken(align_node.lastToken());
2199 try renderToken(tree, stream, align_kw, Space.None); // align2198 try renderToken(tree, ais, align_kw, Space.None); // align
2200 try renderToken(tree, stream, lparen, Space.None); // (2199 try renderToken(tree, ais, lparen, Space.None); // (
2201 try renderExpression(allocator, stream, tree, align_node, Space.None);2200 try renderExpression(allocator, ais, tree, align_node, Space.None);
2202 const s = if (var_decl.getSectionNode() != null or var_decl.getInitNode() != null) Space.Space else Space.None;2201 const s = if (var_decl.getSectionNode() != null or var_decl.getInitNode() != null) Space.Space else Space.None;
2203 try renderToken(tree, stream, rparen, s); // )2202 try renderToken(tree, ais, rparen, s); // )
2204 }2203 }
22052204
2206 if (var_decl.getSectionNode()) |section_node| {2205 if (var_decl.getSectionNode()) |section_node| {
2207 const lparen = tree.prevToken(section_node.firstToken());2206 const lparen = tree.prevToken(section_node.firstToken());
2208 const section_kw = tree.prevToken(lparen);2207 const section_kw = tree.prevToken(lparen);
2209 const rparen = tree.nextToken(section_node.lastToken());2208 const rparen = tree.nextToken(section_node.lastToken());
2210 try renderToken(tree, stream, section_kw, Space.None); // linksection2209 try renderToken(tree, ais, section_kw, Space.None); // linksection
2211 try renderToken(tree, stream, lparen, Space.None); // (2210 try renderToken(tree, ais, lparen, Space.None); // (
2212 try renderExpression(allocator, stream, tree, section_node, Space.None);2211 try renderExpression(allocator, ais, tree, section_node, Space.None);
2213 const s = if (var_decl.getInitNode() != null) Space.Space else Space.None;2212 const s = if (var_decl.getInitNode() != null) Space.Space else Space.None;
2214 try renderToken(tree, stream, rparen, s); // )2213 try renderToken(tree, ais, rparen, s); // )
2215 }2214 }
22162215
2217 if (var_decl.getInitNode()) |init_node| {2216 if (var_decl.getInitNode()) |init_node| {
2218 const s = if (init_node.tag == .MultilineStringLiteral) Space.None else Space.Space;2217 const s = if (init_node.tag == .MultilineStringLiteral) Space.None else Space.Space;
2219 try renderToken(tree, stream, var_decl.getEqToken().?, s); // =2218 try renderToken(tree, ais, var_decl.getEqToken().?, s); // =
2220 stream.pushIndentOneShot();2219 ais.pushIndentOneShot();
2221 try renderExpression(allocator, stream, tree, init_node, Space.None);2220 try renderExpression(allocator, ais, tree, init_node, Space.None);
2222 }2221 }
22232222
2224 try renderToken(tree, stream, var_decl.semicolon_token, Space.Newline);2223 try renderToken(tree, ais, var_decl.semicolon_token, Space.Newline);
2225}2224}
22262225
2227fn renderParamDecl(2226fn renderParamDecl(
2228 allocator: *mem.Allocator,2227 allocator: *mem.Allocator,
2229 stream: anytype,2228 ais: anytype,
2230 tree: *ast.Tree,2229 tree: *ast.Tree,
2231 param_decl: ast.Node.FnProto.ParamDecl,2230 param_decl: ast.Node.FnProto.ParamDecl,
2232 space: Space,2231 space: Space,
2233) (@TypeOf(stream.*).Error || Error)!void {2232) (@TypeOf(ais.*).Error || Error)!void {
2234 try renderDocComments(tree, stream, param_decl, param_decl.doc_comments);2233 try renderDocComments(tree, ais, param_decl, param_decl.doc_comments);
22352234
2236 if (param_decl.comptime_token) |comptime_token| {2235 if (param_decl.comptime_token) |comptime_token| {
2237 try renderToken(tree, stream, comptime_token, Space.Space);2236 try renderToken(tree, ais, comptime_token, Space.Space);
2238 }2237 }
2239 if (param_decl.noalias_token) |noalias_token| {2238 if (param_decl.noalias_token) |noalias_token| {
2240 try renderToken(tree, stream, noalias_token, Space.Space);2239 try renderToken(tree, ais, noalias_token, Space.Space);
2241 }2240 }
2242 if (param_decl.name_token) |name_token| {2241 if (param_decl.name_token) |name_token| {
2243 try renderToken(tree, stream, name_token, Space.None);2242 try renderToken(tree, ais, name_token, Space.None);
2244 try renderToken(tree, stream, tree.nextToken(name_token), Space.Space); // :2243 try renderToken(tree, ais, tree.nextToken(name_token), Space.Space); // :
2245 }2244 }
2246 switch (param_decl.param_type) {2245 switch (param_decl.param_type) {
2247 .any_type, .type_expr => |node| try renderExpression(allocator, stream, tree, node, space),2246 .any_type, .type_expr => |node| try renderExpression(allocator, ais, tree, node, space),
2248 }2247 }
2249}2248}
22502249
2251fn renderStatement(2250fn renderStatement(
2252 allocator: *mem.Allocator,2251 allocator: *mem.Allocator,
2253 stream: anytype,2252 ais: anytype,
2254 tree: *ast.Tree,2253 tree: *ast.Tree,
2255 base: *ast.Node,2254 base: *ast.Node,
2256) (@TypeOf(stream.*).Error || Error)!void {2255) (@TypeOf(ais.*).Error || Error)!void {
2257 switch (base.tag) {2256 switch (base.tag) {
2258 .VarDecl => {2257 .VarDecl => {
2259 const var_decl = @fieldParentPtr(ast.Node.VarDecl, "base", base);2258 const var_decl = @fieldParentPtr(ast.Node.VarDecl, "base", base);
2260 try renderVarDecl(allocator, stream, tree, var_decl);2259 try renderVarDecl(allocator, ais, tree, var_decl);
2261 },2260 },
2262 else => {2261 else => {
2263 if (base.requireSemiColon()) {2262 if (base.requireSemiColon()) {
2264 try renderExpression(allocator, stream, tree, base, Space.None);2263 try renderExpression(allocator, ais, tree, base, Space.None);
22652264
2266 const semicolon_index = tree.nextToken(base.lastToken());2265 const semicolon_index = tree.nextToken(base.lastToken());
2267 assert(tree.token_ids[semicolon_index] == .Semicolon);2266 assert(tree.token_ids[semicolon_index] == .Semicolon);
2268 try renderToken(tree, stream, semicolon_index, Space.Newline);2267 try renderToken(tree, ais, semicolon_index, Space.Newline);
2269 } else {2268 } else {
2270 try renderExpression(allocator, stream, tree, base, Space.Newline);2269 try renderExpression(allocator, ais, tree, base, Space.Newline);
2271 }2270 }
2272 },2271 },
2273 }2272 }
...@@ -2286,19 +2285,19 @@ const Space = enum {...@@ -2286,19 +2285,19 @@ const Space = enum {
22862285
2287fn renderTokenOffset(2286fn renderTokenOffset(
2288 tree: *ast.Tree,2287 tree: *ast.Tree,
2289 stream: anytype,2288 ais: anytype,
2290 token_index: ast.TokenIndex,2289 token_index: ast.TokenIndex,
2291 space: Space,2290 space: Space,
2292 token_skip_bytes: usize,2291 token_skip_bytes: usize,
2293) (@TypeOf(stream.*).Error || Error)!void {2292) (@TypeOf(ais.*).Error || Error)!void {
2294 if (space == Space.BlockStart) {2293 if (space == Space.BlockStart) {
2295 // If placing the lbrace on the current line would cause an uggly gap then put the lbrace on the next line2294 // If placing the lbrace on the current line would cause an uggly gap then put the lbrace on the next line
2296 const new_space = if (stream.isLineOverIndented()) Space.Newline else Space.Space;2295 const new_space = if (ais.isLineOverIndented()) Space.Newline else Space.Space;
2297 return renderToken(tree, stream, token_index, new_space);2296 return renderToken(tree, ais, token_index, new_space);
2298 }2297 }
22992298
2300 var token_loc = tree.token_locs[token_index];2299 var token_loc = tree.token_locs[token_index];
2301 try stream.writer().writeAll(mem.trimRight(u8, tree.tokenSliceLoc(token_loc)[token_skip_bytes..], " "));2300 try ais.writer().writeAll(mem.trimRight(u8, tree.tokenSliceLoc(token_loc)[token_skip_bytes..], " "));
23022301
2303 if (space == Space.NoComment)2302 if (space == Space.NoComment)
2304 return;2303 return;
...@@ -2307,20 +2306,20 @@ fn renderTokenOffset(...@@ -2307,20 +2306,20 @@ fn renderTokenOffset(
2307 var next_token_loc = tree.token_locs[token_index + 1];2306 var next_token_loc = tree.token_locs[token_index + 1];
23082307
2309 if (space == Space.Comma) switch (next_token_id) {2308 if (space == Space.Comma) switch (next_token_id) {
2310 .Comma => return renderToken(tree, stream, token_index + 1, Space.Newline),2309 .Comma => return renderToken(tree, ais, token_index + 1, Space.Newline),
2311 .LineComment => {2310 .LineComment => {
2312 try stream.writer().writeAll(", ");2311 try ais.writer().writeAll(", ");
2313 return renderToken(tree, stream, token_index + 1, Space.Newline);2312 return renderToken(tree, ais, token_index + 1, Space.Newline);
2314 },2313 },
2315 else => {2314 else => {
2316 if (token_index + 2 < tree.token_ids.len and2315 if (token_index + 2 < tree.token_ids.len and
2317 tree.token_ids[token_index + 2] == .MultilineStringLiteralLine)2316 tree.token_ids[token_index + 2] == .MultilineStringLiteralLine)
2318 {2317 {
2319 try stream.writer().writeAll(",");2318 try ais.writer().writeAll(",");
2320 return;2319 return;
2321 } else {2320 } else {
2322 try stream.writer().writeAll(",");2321 try ais.writer().writeAll(",");
2323 try stream.insertNewline();2322 try ais.insertNewline();
2324 return;2323 return;
2325 }2324 }
2326 },2325 },
...@@ -2344,14 +2343,14 @@ fn renderTokenOffset(...@@ -2344,14 +2343,14 @@ fn renderTokenOffset(
2344 if (next_token_id == .MultilineStringLiteralLine) {2343 if (next_token_id == .MultilineStringLiteralLine) {
2345 return;2344 return;
2346 } else {2345 } else {
2347 try stream.insertNewline();2346 try ais.insertNewline();
2348 return;2347 return;
2349 }2348 }
2350 },2349 },
2351 Space.Space, Space.SpaceOrOutdent => {2350 Space.Space, Space.SpaceOrOutdent => {
2352 if (next_token_id == .MultilineStringLiteralLine)2351 if (next_token_id == .MultilineStringLiteralLine)
2353 return;2352 return;
2354 try stream.writer().writeByte(' ');2353 try ais.writer().writeByte(' ');
2355 return;2354 return;
2356 },2355 },
2357 Space.NoComment, Space.Comma, Space.BlockStart => unreachable,2356 Space.NoComment, Space.Comma, Space.BlockStart => unreachable,
...@@ -2368,7 +2367,7 @@ fn renderTokenOffset(...@@ -2368,7 +2367,7 @@ fn renderTokenOffset(
2368 next_token_id = tree.token_ids[token_index + offset];2367 next_token_id = tree.token_ids[token_index + offset];
2369 next_token_loc = tree.token_locs[token_index + offset];2368 next_token_loc = tree.token_locs[token_index + offset];
2370 if (next_token_id != .LineComment) {2369 if (next_token_id != .LineComment) {
2371 try stream.insertNewline();2370 try ais.insertNewline();
2372 return;2371 return;
2373 }2372 }
2374 },2373 },
...@@ -2381,7 +2380,7 @@ fn renderTokenOffset(...@@ -2381,7 +2380,7 @@ fn renderTokenOffset(
23812380
2382 var loc = tree.tokenLocationLoc(token_loc.end, next_token_loc);2381 var loc = tree.tokenLocationLoc(token_loc.end, next_token_loc);
2383 if (loc.line == 0) {2382 if (loc.line == 0) {
2384 try stream.writer().print(" {}", .{mem.trimRight(u8, tree.tokenSliceLoc(next_token_loc), " ")});2383 try ais.writer().print(" {}", .{mem.trimRight(u8, tree.tokenSliceLoc(next_token_loc), " ")});
2385 offset = 2;2384 offset = 2;
2386 token_loc = next_token_loc;2385 token_loc = next_token_loc;
2387 next_token_loc = tree.token_locs[token_index + offset];2386 next_token_loc = tree.token_locs[token_index + offset];
...@@ -2389,16 +2388,16 @@ fn renderTokenOffset(...@@ -2389,16 +2388,16 @@ fn renderTokenOffset(
2389 if (next_token_id != .LineComment) {2388 if (next_token_id != .LineComment) {
2390 switch (space) {2389 switch (space) {
2391 Space.None, Space.Space => {2390 Space.None, Space.Space => {
2392 try stream.insertNewline();2391 try ais.insertNewline();
2393 },2392 },
2394 Space.SpaceOrOutdent => {2393 Space.SpaceOrOutdent => {
2395 try stream.insertNewline();2394 try ais.insertNewline();
2396 },2395 },
2397 Space.Newline => {2396 Space.Newline => {
2398 if (next_token_id == .MultilineStringLiteralLine) {2397 if (next_token_id == .MultilineStringLiteralLine) {
2399 return;2398 return;
2400 } else {2399 } else {
2401 try stream.insertNewline();2400 try ais.insertNewline();
2402 return;2401 return;
2403 }2402 }
2404 },2403 },
...@@ -2415,8 +2414,8 @@ fn renderTokenOffset(...@@ -2415,8 +2414,8 @@ fn renderTokenOffset(
2415 // in generated code (loc.line == 0) so treat that case2414 // in generated code (loc.line == 0) so treat that case
2416 // as though there was meant to be a newline between the tokens2415 // as though there was meant to be a newline between the tokens
2417 var newline_count = if (loc.line <= 1) @as(u8, 1) else @as(u8, 2);2416 var newline_count = if (loc.line <= 1) @as(u8, 1) else @as(u8, 2);
2418 while (newline_count > 0) : (newline_count -= 1) try stream.insertNewline();2417 while (newline_count > 0) : (newline_count -= 1) try ais.insertNewline();
2419 try stream.writer().writeAll(mem.trimRight(u8, tree.tokenSliceLoc(next_token_loc), " "));2418 try ais.writer().writeAll(mem.trimRight(u8, tree.tokenSliceLoc(next_token_loc), " "));
24202419
2421 offset += 1;2420 offset += 1;
2422 token_loc = next_token_loc;2421 token_loc = next_token_loc;
...@@ -2428,15 +2427,15 @@ fn renderTokenOffset(...@@ -2428,15 +2427,15 @@ fn renderTokenOffset(
2428 if (next_token_id == .MultilineStringLiteralLine) {2427 if (next_token_id == .MultilineStringLiteralLine) {
2429 return;2428 return;
2430 } else {2429 } else {
2431 try stream.insertNewline();2430 try ais.insertNewline();
2432 return;2431 return;
2433 }2432 }
2434 },2433 },
2435 Space.None, Space.Space => {2434 Space.None, Space.Space => {
2436 try stream.insertNewline();2435 try ais.insertNewline();
2437 },2436 },
2438 Space.SpaceOrOutdent => {2437 Space.SpaceOrOutdent => {
2439 try stream.insertNewline();2438 try ais.insertNewline();
2440 },2439 },
2441 Space.NoNewline => {},2440 Space.NoNewline => {},
2442 Space.NoComment, Space.Comma, Space.BlockStart => unreachable,2441 Space.NoComment, Space.Comma, Space.BlockStart => unreachable,
...@@ -2449,38 +2448,38 @@ fn renderTokenOffset(...@@ -2449,38 +2448,38 @@ fn renderTokenOffset(
24492448
2450fn renderToken(2449fn renderToken(
2451 tree: *ast.Tree,2450 tree: *ast.Tree,
2452 stream: anytype,2451 ais: anytype,
2453 token_index: ast.TokenIndex,2452 token_index: ast.TokenIndex,
2454 space: Space,2453 space: Space,
2455) (@TypeOf(stream.*).Error || Error)!void {2454) (@TypeOf(ais.*).Error || Error)!void {
2456 return renderTokenOffset(tree, stream, token_index, space, 0);2455 return renderTokenOffset(tree, ais, token_index, space, 0);
2457}2456}
24582457
2459fn renderDocComments(2458fn renderDocComments(
2460 tree: *ast.Tree,2459 tree: *ast.Tree,
2461 stream: anytype,2460 ais: anytype,
2462 node: anytype,2461 node: anytype,
2463 doc_comments: ?*ast.Node.DocComment,2462 doc_comments: ?*ast.Node.DocComment,
2464) (@TypeOf(stream.*).Error || Error)!void {2463) (@TypeOf(ais.*).Error || Error)!void {
2465 const comment = doc_comments orelse return;2464 const comment = doc_comments orelse return;
2466 return renderDocCommentsToken(tree, stream, comment, node.firstToken());2465 return renderDocCommentsToken(tree, ais, comment, node.firstToken());
2467}2466}
24682467
2469fn renderDocCommentsToken(2468fn renderDocCommentsToken(
2470 tree: *ast.Tree,2469 tree: *ast.Tree,
2471 stream: anytype,2470 ais: anytype,
2472 comment: *ast.Node.DocComment,2471 comment: *ast.Node.DocComment,
2473 first_token: ast.TokenIndex,2472 first_token: ast.TokenIndex,
2474) (@TypeOf(stream.*).Error || Error)!void {2473) (@TypeOf(ais.*).Error || Error)!void {
2475 var tok_i = comment.first_line;2474 var tok_i = comment.first_line;
2476 while (true) : (tok_i += 1) {2475 while (true) : (tok_i += 1) {
2477 switch (tree.token_ids[tok_i]) {2476 switch (tree.token_ids[tok_i]) {
2478 .DocComment, .ContainerDocComment => {2477 .DocComment, .ContainerDocComment => {
2479 if (comment.first_line < first_token) {2478 if (comment.first_line < first_token) {
2480 try renderToken(tree, stream, tok_i, Space.Newline);2479 try renderToken(tree, ais, tok_i, Space.Newline);
2481 } else {2480 } else {
2482 try renderToken(tree, stream, tok_i, Space.NoComment);2481 try renderToken(tree, ais, tok_i, Space.NoComment);
2483 try stream.insertNewline();2482 try ais.insertNewline();
2484 }2483 }
2485 },2484 },
2486 .LineComment => continue,2485 .LineComment => continue,
...@@ -2552,10 +2551,10 @@ fn nodeCausesSliceOpSpace(base: *ast.Node) bool {...@@ -2552,10 +2551,10 @@ fn nodeCausesSliceOpSpace(base: *ast.Node) bool {
2552 };2551 };
2553}2552}
25542553
2555fn copyFixingWhitespace(stream: anytype, slice: []const u8) @TypeOf(stream.*).Error!void {2554fn copyFixingWhitespace(ais: anytype, slice: []const u8) @TypeOf(ais.*).Error!void {
2556 for (slice) |byte| switch (byte) {2555 for (slice) |byte| switch (byte) {
2557 '\t' => try stream.writer().writeAll(" "),2556 '\t' => try ais.writer().writeAll(" "),
2558 '\r' => {},2557 '\r' => {},
2559 else => try stream.writer().writeByte(byte),2558 else => try ais.writer().writeByte(byte),
2560 };2559 };
2561}2560}
src-self-hosted/main.zig+4-4
...@@ -682,13 +682,13 @@ pub fn cmdFmt(gpa: *Allocator, args: []const []const u8) !void {...@@ -682,13 +682,13 @@ pub fn cmdFmt(gpa: *Allocator, args: []const []const u8) !void {
682 process.exit(1);682 process.exit(1);
683 }683 }
684 if (check_flag) {684 if (check_flag) {
685 const anything_changed = try std.zig.render(gpa, &io.null_out_stream, tree);685 const anything_changed = try std.zig.render(gpa, io.null_out_stream, tree);
686 const code = if (anything_changed) @as(u8, 1) else @as(u8, 0);686 const code = if (anything_changed) @as(u8, 1) else @as(u8, 0);
687 process.exit(code);687 process.exit(code);
688 }688 }
689689
690 const stdout = io.getStdOut().outStream();690 const stdout = io.getStdOut().outStream();
691 _ = try std.zig.render(gpa, &stdout, tree);691 _ = try std.zig.render(gpa, stdout, tree);
692 return;692 return;
693 }693 }
694694
...@@ -830,7 +830,7 @@ fn fmtPathFile(...@@ -830,7 +830,7 @@ fn fmtPathFile(
830 }830 }
831831
832 if (check_mode) {832 if (check_mode) {
833 const anything_changed = try std.zig.render(fmt.gpa, &io.null_out_stream, tree);833 const anything_changed = try std.zig.render(fmt.gpa, io.null_out_stream, tree);
834 if (anything_changed) {834 if (anything_changed) {
835 std.debug.print("{}\n", .{file_path});835 std.debug.print("{}\n", .{file_path});
836 fmt.any_error = true;836 fmt.any_error = true;
...@@ -840,7 +840,7 @@ fn fmtPathFile(...@@ -840,7 +840,7 @@ fn fmtPathFile(
840 try fmt.out_buffer.ensureCapacity(source_code.len);840 try fmt.out_buffer.ensureCapacity(source_code.len);
841 fmt.out_buffer.items.len = 0;841 fmt.out_buffer.items.len = 0;
842 const writer = fmt.out_buffer.writer();842 const writer = fmt.out_buffer.writer();
843 const anything_changed = try std.zig.render(fmt.gpa, &writer, tree);843 const anything_changed = try std.zig.render(fmt.gpa, writer, tree);
844 if (!anything_changed)844 if (!anything_changed)
845 return; // Good thing we didn't waste any file system access on this.845 return; // Good thing we didn't waste any file system access on this.
846846
src-self-hosted/stage2.zig+1-1
...@@ -151,7 +151,7 @@ export fn stage2_free_clang_errors(errors_ptr: [*]translate_c.ClangErrMsg, error...@@ -151,7 +151,7 @@ export fn stage2_free_clang_errors(errors_ptr: [*]translate_c.ClangErrMsg, error
151151
152export fn stage2_render_ast(tree: *ast.Tree, output_file: *FILE) Error {152export fn stage2_render_ast(tree: *ast.Tree, output_file: *FILE) Error {
153 const c_out_stream = std.io.cOutStream(output_file);153 const c_out_stream = std.io.cOutStream(output_file);
154 _ = std.zig.render(std.heap.c_allocator, &c_out_stream, tree) catch |e| switch (e) {154 _ = std.zig.render(std.heap.c_allocator, c_out_stream, tree) catch |e| switch (e) {
155 error.WouldBlock => unreachable, // stage1 opens stuff in exclusively blocking mode155 error.WouldBlock => unreachable, // stage1 opens stuff in exclusively blocking mode
156 error.NotOpenForWriting => unreachable,156 error.NotOpenForWriting => unreachable,
157 error.SystemResources => return .SystemResources,157 error.SystemResources => return .SystemResources,