authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2019-12-05 10:14:31-05:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2019-12-05 10:14:31-05:00
log8829b5316b1ff1dab9d3d985191e40f481d05441
treedfbeccebe456bcd5e9c2bed8fc054848dbc6e231
parentbef3769bb7a8d5e83ffc8359461232c9b21f6431
parentd40ad92668ad19bebdcf9d4ac1cc30576f5358df
signaturebadge-question-mark Signed by PGP key 4AEE18F83AFDEB23

Merge pull request #3849 from Vexu/fix-fmt

Fix zig fmt c pointer return type

3 files changed, 140 insertions(+), 130 deletions(-)

lib/std/zig/parse.zig+1-1
...@@ -2558,7 +2558,7 @@ fn parsePtrTypeStart(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node...@@ -2558,7 +2558,7 @@ fn parsePtrTypeStart(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node
2558 _ = try expectToken(it, tree, .RBracket);2558 _ = try expectToken(it, tree, .RBracket);
2559 const node = try arena.create(Node.PrefixOp);2559 const node = try arena.create(Node.PrefixOp);
2560 node.* = .{2560 node.* = .{
2561 .op_token = ident,2561 .op_token = lbracket,
2562 .op = .{ .PtrType = .{} },2562 .op = .{ .PtrType = .{} },
2563 .rhs = undefined, // set by caller2563 .rhs = undefined, // set by caller
2564 };2564 };
lib/std/zig/parser_test.zig+8
...@@ -1,3 +1,10 @@...@@ -1,3 +1,10 @@
1test "zig fmt: c pointer type" {
2 try testCanonical(
3 \\pub extern fn repro() [*c]const u8;
4 \\
5 );
6}
7
1test "zig fmt: asm expression with comptime content" {8test "zig fmt: asm expression with comptime content" {
2 try testCanonical(9 try testCanonical(
3 \\comptime {10 \\comptime {
...@@ -21,6 +28,7 @@ test "zig fmt: asm expression with comptime content" {...@@ -21,6 +28,7 @@ test "zig fmt: asm expression with comptime content" {
21 \\28 \\
22 );29 );
23}30}
31
24test "zig fmt: var struct field" {32test "zig fmt: var struct field" {
25 try testCanonical(33 try testCanonical(
26 \\pub const Pointer = struct {34 \\pub const Pointer = struct {
lib/std/zig/render.zig+131-129
...@@ -75,7 +75,7 @@ fn renderRoot(...@@ -75,7 +75,7 @@ fn renderRoot(
7575
76 // render all the line comments at the beginning of the file76 // render all the line comments at the beginning of the file
77 while (tok_it.next()) |token| {77 while (tok_it.next()) |token| {
78 if (token.id != Token.Id.LineComment) break;78 if (token.id != .LineComment) break;
79 try stream.print("{}\n", mem.trimRight(u8, tree.tokenSlicePtr(token), " "));79 try stream.print("{}\n", mem.trimRight(u8, tree.tokenSlicePtr(token), " "));
80 if (tok_it.peek()) |next_token| {80 if (tok_it.peek()) |next_token| {
81 const loc = tree.tokenLocationPtr(token.end, next_token);81 const loc = tree.tokenLocationPtr(token.end, next_token);
...@@ -109,8 +109,8 @@ fn renderRoot(...@@ -109,8 +109,8 @@ fn renderRoot(
109 token_index -= 1;109 token_index -= 1;
110 const token = tree.tokens.at(token_index);110 const token = tree.tokens.at(token_index);
111 switch (token.id) {111 switch (token.id) {
112 Token.Id.LineComment => {},112 .LineComment => {},
113 Token.Id.DocComment => {113 .DocComment => {
114 copy_start_token_index = token_index;114 copy_start_token_index = token_index;
115 continue;115 continue;
116 },116 },
...@@ -149,8 +149,8 @@ fn renderRoot(...@@ -149,8 +149,8 @@ fn renderRoot(
149 while (token_index < decl_first_token_index) : (token_index += 1) {149 while (token_index < decl_first_token_index) : (token_index += 1) {
150 const token = tree.tokens.at(token_index);150 const token = tree.tokens.at(token_index);
151 switch (token.id) {151 switch (token.id) {
152 Token.Id.LineComment => {},152 .LineComment => {},
153 Token.Id.Eof => unreachable,153 .Eof => unreachable,
154 else => continue,154 else => continue,
155 }155 }
156 if (mem.eql(u8, mem.trim(u8, tree.tokenSlicePtr(token)[2..], " "), "zig fmt: on")) {156 if (mem.eql(u8, mem.trim(u8, tree.tokenSlicePtr(token)[2..], " "), "zig fmt: on")) {
...@@ -169,8 +169,8 @@ fn renderRoot(...@@ -169,8 +169,8 @@ fn renderRoot(
169 token_index -= 1;169 token_index -= 1;
170 const token = tree.tokens.at(token_index);170 const token = tree.tokens.at(token_index);
171 switch (token.id) {171 switch (token.id) {
172 Token.Id.LineComment => {},172 .LineComment => {},
173 Token.Id.DocComment => {173 .DocComment => {
174 copy_end_token_index = token_index;174 copy_end_token_index = token_index;
175 continue;175 continue;
176 },176 },
...@@ -193,7 +193,7 @@ fn renderRoot(...@@ -193,7 +193,7 @@ fn renderRoot(
193fn renderExtraNewline(tree: *ast.Tree, stream: var, start_col: *usize, node: *ast.Node) @typeOf(stream).Child.Error!void {193fn renderExtraNewline(tree: *ast.Tree, stream: var, start_col: *usize, node: *ast.Node) @typeOf(stream).Child.Error!void {
194 const first_token = node.firstToken();194 const first_token = node.firstToken();
195 var prev_token = first_token;195 var prev_token = first_token;
196 while (tree.tokens.at(prev_token - 1).id == Token.Id.DocComment) {196 while (tree.tokens.at(prev_token - 1).id == .DocComment) {
197 prev_token -= 1;197 prev_token -= 1;
198 }198 }
199 const prev_token_end = tree.tokens.at(prev_token - 1).end;199 const prev_token_end = tree.tokens.at(prev_token - 1).end;
...@@ -206,7 +206,7 @@ fn renderExtraNewline(tree: *ast.Tree, stream: var, start_col: *usize, node: *as...@@ -206,7 +206,7 @@ fn renderExtraNewline(tree: *ast.Tree, stream: var, start_col: *usize, node: *as
206206
207fn renderTopLevelDecl(allocator: *mem.Allocator, stream: var, tree: *ast.Tree, indent: usize, start_col: *usize, decl: *ast.Node) (@typeOf(stream).Child.Error || Error)!void {207fn renderTopLevelDecl(allocator: *mem.Allocator, stream: var, tree: *ast.Tree, indent: usize, start_col: *usize, decl: *ast.Node) (@typeOf(stream).Child.Error || Error)!void {
208 switch (decl.id) {208 switch (decl.id) {
209 ast.Node.Id.FnProto => {209 .FnProto => {
210 const fn_proto = @fieldParentPtr(ast.Node.FnProto, "base", decl);210 const fn_proto = @fieldParentPtr(ast.Node.FnProto, "base", decl);
211211
212 try renderDocComments(tree, stream, fn_proto, indent, start_col);212 try renderDocComments(tree, stream, fn_proto, indent, start_col);
...@@ -220,7 +220,7 @@ fn renderTopLevelDecl(allocator: *mem.Allocator, stream: var, tree: *ast.Tree, i...@@ -220,7 +220,7 @@ fn renderTopLevelDecl(allocator: *mem.Allocator, stream: var, tree: *ast.Tree, i
220 }220 }
221 },221 },
222222
223 ast.Node.Id.Use => {223 .Use => {
224 const use_decl = @fieldParentPtr(ast.Node.Use, "base", decl);224 const use_decl = @fieldParentPtr(ast.Node.Use, "base", decl);
225225
226 if (use_decl.visib_token) |visib_token| {226 if (use_decl.visib_token) |visib_token| {
...@@ -231,14 +231,14 @@ fn renderTopLevelDecl(allocator: *mem.Allocator, stream: var, tree: *ast.Tree, i...@@ -231,14 +231,14 @@ fn renderTopLevelDecl(allocator: *mem.Allocator, stream: var, tree: *ast.Tree, i
231 try renderToken(tree, stream, use_decl.semicolon_token, indent, start_col, Space.Newline); // ;231 try renderToken(tree, stream, use_decl.semicolon_token, indent, start_col, Space.Newline); // ;
232 },232 },
233233
234 ast.Node.Id.VarDecl => {234 .VarDecl => {
235 const var_decl = @fieldParentPtr(ast.Node.VarDecl, "base", decl);235 const var_decl = @fieldParentPtr(ast.Node.VarDecl, "base", decl);
236236
237 try renderDocComments(tree, stream, var_decl, indent, start_col);237 try renderDocComments(tree, stream, var_decl, indent, start_col);
238 try renderVarDecl(allocator, stream, tree, indent, start_col, var_decl);238 try renderVarDecl(allocator, stream, tree, indent, start_col, var_decl);
239 },239 },
240240
241 ast.Node.Id.TestDecl => {241 .TestDecl => {
242 const test_decl = @fieldParentPtr(ast.Node.TestDecl, "base", decl);242 const test_decl = @fieldParentPtr(ast.Node.TestDecl, "base", decl);
243243
244 try renderDocComments(tree, stream, test_decl, indent, start_col);244 try renderDocComments(tree, stream, test_decl, indent, start_col);
...@@ -247,7 +247,7 @@ fn renderTopLevelDecl(allocator: *mem.Allocator, stream: var, tree: *ast.Tree, i...@@ -247,7 +247,7 @@ fn renderTopLevelDecl(allocator: *mem.Allocator, stream: var, tree: *ast.Tree, i
247 try renderExpression(allocator, stream, tree, indent, start_col, test_decl.body_node, Space.Newline);247 try renderExpression(allocator, stream, tree, indent, start_col, test_decl.body_node, Space.Newline);
248 },248 },
249249
250 ast.Node.Id.ContainerField => {250 .ContainerField => {
251 const field = @fieldParentPtr(ast.Node.ContainerField, "base", decl);251 const field = @fieldParentPtr(ast.Node.ContainerField, "base", decl);
252252
253 try renderDocComments(tree, stream, field, indent, start_col);253 try renderDocComments(tree, stream, field, indent, start_col);
...@@ -295,12 +295,12 @@ fn renderTopLevelDecl(allocator: *mem.Allocator, stream: var, tree: *ast.Tree, i...@@ -295,12 +295,12 @@ fn renderTopLevelDecl(allocator: *mem.Allocator, stream: var, tree: *ast.Tree, i
295 }295 }
296 },296 },
297297
298 ast.Node.Id.Comptime => {298 .Comptime => {
299 assert(!decl.requireSemiColon());299 assert(!decl.requireSemiColon());
300 try renderExpression(allocator, stream, tree, indent, start_col, decl, Space.Newline);300 try renderExpression(allocator, stream, tree, indent, start_col, decl, Space.Newline);
301 },301 },
302302
303 ast.Node.Id.DocComment => {303 .DocComment => {
304 const comment = @fieldParentPtr(ast.Node.DocComment, "base", decl);304 const comment = @fieldParentPtr(ast.Node.DocComment, "base", decl);
305 var it = comment.lines.iterator(0);305 var it = comment.lines.iterator(0);
306 while (it.next()) |line_token_index| {306 while (it.next()) |line_token_index| {
...@@ -324,11 +324,11 @@ fn renderExpression(...@@ -324,11 +324,11 @@ fn renderExpression(
324 space: Space,324 space: Space,
325) (@typeOf(stream).Child.Error || Error)!void {325) (@typeOf(stream).Child.Error || Error)!void {
326 switch (base.id) {326 switch (base.id) {
327 ast.Node.Id.Identifier => {327 .Identifier => {
328 const identifier = @fieldParentPtr(ast.Node.Identifier, "base", base);328 const identifier = @fieldParentPtr(ast.Node.Identifier, "base", base);
329 return renderToken(tree, stream, identifier.token, indent, start_col, space);329 return renderToken(tree, stream, identifier.token, indent, start_col, space);
330 },330 },
331 ast.Node.Id.Block => {331 .Block => {
332 const block = @fieldParentPtr(ast.Node.Block, "base", base);332 const block = @fieldParentPtr(ast.Node.Block, "base", base);
333333
334 if (block.label) |label| {334 if (block.label) |label| {
...@@ -357,20 +357,20 @@ fn renderExpression(...@@ -357,20 +357,20 @@ fn renderExpression(
357 return renderToken(tree, stream, block.rbrace, indent, start_col, space);357 return renderToken(tree, stream, block.rbrace, indent, start_col, space);
358 }358 }
359 },359 },
360 ast.Node.Id.Defer => {360 .Defer => {
361 const defer_node = @fieldParentPtr(ast.Node.Defer, "base", base);361 const defer_node = @fieldParentPtr(ast.Node.Defer, "base", base);
362362
363 try renderToken(tree, stream, defer_node.defer_token, indent, start_col, Space.Space);363 try renderToken(tree, stream, defer_node.defer_token, indent, start_col, Space.Space);
364 return renderExpression(allocator, stream, tree, indent, start_col, defer_node.expr, space);364 return renderExpression(allocator, stream, tree, indent, start_col, defer_node.expr, space);
365 },365 },
366 ast.Node.Id.Comptime => {366 .Comptime => {
367 const comptime_node = @fieldParentPtr(ast.Node.Comptime, "base", base);367 const comptime_node = @fieldParentPtr(ast.Node.Comptime, "base", base);
368368
369 try renderToken(tree, stream, comptime_node.comptime_token, indent, start_col, Space.Space);369 try renderToken(tree, stream, comptime_node.comptime_token, indent, start_col, Space.Space);
370 return renderExpression(allocator, stream, tree, indent, start_col, comptime_node.expr, space);370 return renderExpression(allocator, stream, tree, indent, start_col, comptime_node.expr, space);
371 },371 },
372372
373 ast.Node.Id.Suspend => {373 .Suspend => {
374 const suspend_node = @fieldParentPtr(ast.Node.Suspend, "base", base);374 const suspend_node = @fieldParentPtr(ast.Node.Suspend, "base", base);
375375
376 if (suspend_node.body) |body| {376 if (suspend_node.body) |body| {
...@@ -381,7 +381,7 @@ fn renderExpression(...@@ -381,7 +381,7 @@ fn renderExpression(
381 }381 }
382 },382 },
383383
384 ast.Node.Id.InfixOp => {384 .InfixOp => {
385 const infix_op_node = @fieldParentPtr(ast.Node.InfixOp, "base", base);385 const infix_op_node = @fieldParentPtr(ast.Node.InfixOp, "base", base);
386386
387 const op_space = switch (infix_op_node.op) {387 const op_space = switch (infix_op_node.op) {
...@@ -397,7 +397,7 @@ fn renderExpression(...@@ -397,7 +397,7 @@ fn renderExpression(
397397
398 try renderToken(tree, stream, infix_op_node.op_token, indent, start_col, after_op_space);398 try renderToken(tree, stream, infix_op_node.op_token, indent, start_col, after_op_space);
399 if (after_op_space == Space.Newline and399 if (after_op_space == Space.Newline and
400 tree.tokens.at(tree.nextToken(infix_op_node.op_token)).id != Token.Id.MultilineStringLiteralLine)400 tree.tokens.at(tree.nextToken(infix_op_node.op_token)).id != .MultilineStringLiteralLine)
401 {401 {
402 try stream.writeByteNTimes(' ', indent + indent_delta);402 try stream.writeByteNTimes(' ', indent + indent_delta);
403 start_col.* = indent + indent_delta;403 start_col.* = indent + indent_delta;
...@@ -413,16 +413,18 @@ fn renderExpression(...@@ -413,16 +413,18 @@ fn renderExpression(
413 return renderExpression(allocator, stream, tree, indent, start_col, infix_op_node.rhs, space);413 return renderExpression(allocator, stream, tree, indent, start_col, infix_op_node.rhs, space);
414 },414 },
415415
416 ast.Node.Id.PrefixOp => {416 .PrefixOp => {
417 const prefix_op_node = @fieldParentPtr(ast.Node.PrefixOp, "base", base);417 const prefix_op_node = @fieldParentPtr(ast.Node.PrefixOp, "base", base);
418418
419 switch (prefix_op_node.op) {419 switch (prefix_op_node.op) {
420 ast.Node.PrefixOp.Op.PtrType => |ptr_info| {420 .PtrType => |ptr_info| {
421 const op_tok_id = tree.tokens.at(prefix_op_node.op_token).id;421 const op_tok_id = tree.tokens.at(prefix_op_node.op_token).id;
422 switch (op_tok_id) {422 switch (op_tok_id) {
423 .Asterisk, .AsteriskAsterisk => try stream.writeByte('*'),423 .Asterisk, .AsteriskAsterisk => try stream.writeByte('*'),
424 .Identifier => try stream.write("[*c]"),424 .LBracket => if (tree.tokens.at(prefix_op_node.op_token + 2).id == .Identifier)
425 .LBracket => try stream.write("[*"),425 try stream.write("[*c")
426 else
427 try stream.write("[*"),
426 else => unreachable,428 else => unreachable,
427 }429 }
428 if (ptr_info.sentinel) |sentinel| {430 if (ptr_info.sentinel) |sentinel| {
...@@ -435,7 +437,7 @@ fn renderExpression(...@@ -435,7 +437,7 @@ fn renderExpression(
435 try renderExpression(allocator, stream, tree, indent, start_col, sentinel, sentinel_space);437 try renderExpression(allocator, stream, tree, indent, start_col, sentinel, sentinel_space);
436 }438 }
437 switch (op_tok_id) {439 switch (op_tok_id) {
438 .Asterisk, .AsteriskAsterisk, .Identifier => {},440 .Asterisk, .AsteriskAsterisk => {},
439 .LBracket => try stream.writeByte(']'),441 .LBracket => try stream.writeByte(']'),
440 else => unreachable,442 else => unreachable,
441 }443 }
...@@ -475,7 +477,7 @@ fn renderExpression(...@@ -475,7 +477,7 @@ fn renderExpression(
475 }477 }
476 },478 },
477479
478 ast.Node.PrefixOp.Op.SliceType => |ptr_info| {480 .SliceType => |ptr_info| {
479 try renderToken(tree, stream, prefix_op_node.op_token, indent, start_col, Space.None); // [481 try renderToken(tree, stream, prefix_op_node.op_token, indent, start_col, Space.None); // [
480 if (ptr_info.sentinel) |sentinel| {482 if (ptr_info.sentinel) |sentinel| {
481 const colon_token = tree.prevToken(sentinel.firstToken());483 const colon_token = tree.prevToken(sentinel.firstToken());
...@@ -522,7 +524,7 @@ fn renderExpression(...@@ -522,7 +524,7 @@ fn renderExpression(
522 }524 }
523 },525 },
524526
525 ast.Node.PrefixOp.Op.ArrayType => |array_info| {527 .ArrayType => |array_info| {
526 const lbracket = prefix_op_node.op_token;528 const lbracket = prefix_op_node.op_token;
527 const rbracket = tree.nextToken(if (array_info.sentinel) |sentinel|529 const rbracket = tree.nextToken(if (array_info.sentinel) |sentinel|
528 sentinel.lastToken()530 sentinel.lastToken()
...@@ -549,20 +551,20 @@ fn renderExpression(...@@ -549,20 +551,20 @@ fn renderExpression(
549 }551 }
550 try renderToken(tree, stream, rbracket, indent, start_col, Space.None); // ]552 try renderToken(tree, stream, rbracket, indent, start_col, Space.None); // ]
551 },553 },
552 ast.Node.PrefixOp.Op.BitNot,554 .BitNot,
553 ast.Node.PrefixOp.Op.BoolNot,555 .BoolNot,
554 ast.Node.PrefixOp.Op.Negation,556 .Negation,
555 ast.Node.PrefixOp.Op.NegationWrap,557 .NegationWrap,
556 ast.Node.PrefixOp.Op.OptionalType,558 .OptionalType,
557 ast.Node.PrefixOp.Op.AddressOf,559 .AddressOf,
558 => {560 => {
559 try renderToken(tree, stream, prefix_op_node.op_token, indent, start_col, Space.None);561 try renderToken(tree, stream, prefix_op_node.op_token, indent, start_col, Space.None);
560 },562 },
561563
562 ast.Node.PrefixOp.Op.Try,564 .Try,
563 ast.Node.PrefixOp.Op.Await,565 .Await,
564 ast.Node.PrefixOp.Op.Cancel,566 .Cancel,
565 ast.Node.PrefixOp.Op.Resume,567 .Resume,
566 => {568 => {
567 try renderToken(tree, stream, prefix_op_node.op_token, indent, start_col, Space.Space);569 try renderToken(tree, stream, prefix_op_node.op_token, indent, start_col, Space.Space);
568 },570 },
...@@ -571,11 +573,11 @@ fn renderExpression(...@@ -571,11 +573,11 @@ fn renderExpression(
571 return renderExpression(allocator, stream, tree, indent, start_col, prefix_op_node.rhs, space);573 return renderExpression(allocator, stream, tree, indent, start_col, prefix_op_node.rhs, space);
572 },574 },
573575
574 ast.Node.Id.SuffixOp => {576 .SuffixOp => {
575 const suffix_op = @fieldParentPtr(ast.Node.SuffixOp, "base", base);577 const suffix_op = @fieldParentPtr(ast.Node.SuffixOp, "base", base);
576578
577 switch (suffix_op.op) {579 switch (suffix_op.op) {
578 @TagType(ast.Node.SuffixOp.Op).Call => |*call_info| {580 .Call => |*call_info| {
579 if (call_info.async_token) |async_token| {581 if (call_info.async_token) |async_token| {
580 try renderToken(tree, stream, async_token, indent, start_col, Space.Space);582 try renderToken(tree, stream, async_token, indent, start_col, Space.Space);
581 }583 }
...@@ -591,7 +593,7 @@ fn renderExpression(...@@ -591,7 +593,7 @@ fn renderExpression(
591593
592 const src_has_trailing_comma = blk: {594 const src_has_trailing_comma = blk: {
593 const maybe_comma = tree.prevToken(suffix_op.rtoken);595 const maybe_comma = tree.prevToken(suffix_op.rtoken);
594 break :blk tree.tokens.at(maybe_comma).id == Token.Id.Comma;596 break :blk tree.tokens.at(maybe_comma).id == .Comma;
595 };597 };
596598
597 if (src_has_trailing_comma) {599 if (src_has_trailing_comma) {
...@@ -602,7 +604,7 @@ fn renderExpression(...@@ -602,7 +604,7 @@ fn renderExpression(
602 while (true) {604 while (true) {
603 const param_node = it.next().?;605 const param_node = it.next().?;
604606
605 const param_node_new_indent = if (param_node.*.id == ast.Node.Id.MultilineStringLiteral) blk: {607 const param_node_new_indent = if (param_node.*.id == .MultilineStringLiteral) blk: {
606 break :blk indent;608 break :blk indent;
607 } else blk: {609 } else blk: {
608 try stream.writeByteNTimes(' ', new_indent);610 try stream.writeByteNTimes(' ', new_indent);
...@@ -636,7 +638,7 @@ fn renderExpression(...@@ -636,7 +638,7 @@ fn renderExpression(
636 return renderToken(tree, stream, suffix_op.rtoken, indent, start_col, space);638 return renderToken(tree, stream, suffix_op.rtoken, indent, start_col, space);
637 },639 },
638640
639 ast.Node.SuffixOp.Op.ArrayAccess => |index_expr| {641 .ArrayAccess => |index_expr| {
640 const lbracket = tree.prevToken(index_expr.firstToken());642 const lbracket = tree.prevToken(index_expr.firstToken());
641 const rbracket = tree.nextToken(index_expr.lastToken());643 const rbracket = tree.nextToken(index_expr.lastToken());
642644
...@@ -657,18 +659,18 @@ fn renderExpression(...@@ -657,18 +659,18 @@ fn renderExpression(
657 return renderToken(tree, stream, rbracket, indent, start_col, space); // ]659 return renderToken(tree, stream, rbracket, indent, start_col, space); // ]
658 },660 },
659661
660 ast.Node.SuffixOp.Op.Deref => {662 .Deref => {
661 try renderExpression(allocator, stream, tree, indent, start_col, suffix_op.lhs.node, Space.None);663 try renderExpression(allocator, stream, tree, indent, start_col, suffix_op.lhs.node, Space.None);
662 return renderToken(tree, stream, suffix_op.rtoken, indent, start_col, space); // .*664 return renderToken(tree, stream, suffix_op.rtoken, indent, start_col, space); // .*
663 },665 },
664666
665 ast.Node.SuffixOp.Op.UnwrapOptional => {667 .UnwrapOptional => {
666 try renderExpression(allocator, stream, tree, indent, start_col, suffix_op.lhs.node, Space.None);668 try renderExpression(allocator, stream, tree, indent, start_col, suffix_op.lhs.node, Space.None);
667 try renderToken(tree, stream, tree.prevToken(suffix_op.rtoken), indent, start_col, Space.None); // .669 try renderToken(tree, stream, tree.prevToken(suffix_op.rtoken), indent, start_col, Space.None); // .
668 return renderToken(tree, stream, suffix_op.rtoken, indent, start_col, space); // ?670 return renderToken(tree, stream, suffix_op.rtoken, indent, start_col, space); // ?
669 },671 },
670672
671 @TagType(ast.Node.SuffixOp.Op).Slice => |range| {673 .Slice => |range| {
672 try renderExpression(allocator, stream, tree, indent, start_col, suffix_op.lhs.node, Space.None);674 try renderExpression(allocator, stream, tree, indent, start_col, suffix_op.lhs.node, Space.None);
673675
674 const lbracket = tree.prevToken(range.start.firstToken());676 const lbracket = tree.prevToken(range.start.firstToken());
...@@ -688,7 +690,7 @@ fn renderExpression(...@@ -688,7 +690,7 @@ fn renderExpression(
688 return renderToken(tree, stream, suffix_op.rtoken, indent, start_col, space); // ]690 return renderToken(tree, stream, suffix_op.rtoken, indent, start_col, space); // ]
689 },691 },
690692
691 ast.Node.SuffixOp.Op.StructInitializer => |*field_inits| {693 .StructInitializer => |*field_inits| {
692 const lbrace = switch (suffix_op.lhs) {694 const lbrace = switch (suffix_op.lhs) {
693 .dot => |dot| tree.nextToken(dot),695 .dot => |dot| tree.nextToken(dot),
694 .node => |node| tree.nextToken(node.lastToken()),696 .node => |node| tree.nextToken(node.lastToken()),
...@@ -705,7 +707,7 @@ fn renderExpression(...@@ -705,7 +707,7 @@ fn renderExpression(
705707
706 const src_has_trailing_comma = blk: {708 const src_has_trailing_comma = blk: {
707 const maybe_comma = tree.prevToken(suffix_op.rtoken);709 const maybe_comma = tree.prevToken(suffix_op.rtoken);
708 break :blk tree.tokens.at(maybe_comma).id == Token.Id.Comma;710 break :blk tree.tokens.at(maybe_comma).id == .Comma;
709 };711 };
710712
711 const src_same_line = blk: {713 const src_same_line = blk: {
...@@ -729,7 +731,7 @@ fn renderExpression(...@@ -729,7 +731,7 @@ fn renderExpression(
729 const field_init = field_inits.at(0).*.cast(ast.Node.FieldInitializer).?;731 const field_init = field_inits.at(0).*.cast(ast.Node.FieldInitializer).?;
730732
731 if (field_init.expr.cast(ast.Node.SuffixOp)) |nested_suffix_op| {733 if (field_init.expr.cast(ast.Node.SuffixOp)) |nested_suffix_op| {
732 if (nested_suffix_op.op == ast.Node.SuffixOp.Op.StructInitializer) {734 if (nested_suffix_op.op == .StructInitializer) {
733 break :blk;735 break :blk;
734 }736 }
735 }737 }
...@@ -799,7 +801,7 @@ fn renderExpression(...@@ -799,7 +801,7 @@ fn renderExpression(
799 return renderToken(tree, stream, suffix_op.rtoken, indent, start_col, space);801 return renderToken(tree, stream, suffix_op.rtoken, indent, start_col, space);
800 },802 },
801803
802 ast.Node.SuffixOp.Op.ArrayInitializer => |*exprs| {804 .ArrayInitializer => |*exprs| {
803 const lbrace = switch (suffix_op.lhs) {805 const lbrace = switch (suffix_op.lhs) {
804 .dot => |dot| tree.nextToken(dot),806 .dot => |dot| tree.nextToken(dot),
805 .node => |node| tree.nextToken(node.lastToken()),807 .node => |node| tree.nextToken(node.lastToken()),
...@@ -848,7 +850,7 @@ fn renderExpression(...@@ -848,7 +850,7 @@ fn renderExpression(
848 // all on one line850 // all on one line
849 const src_has_trailing_comma = trailblk: {851 const src_has_trailing_comma = trailblk: {
850 const maybe_comma = tree.prevToken(suffix_op.rtoken);852 const maybe_comma = tree.prevToken(suffix_op.rtoken);
851 break :trailblk tree.tokens.at(maybe_comma).id == Token.Id.Comma;853 break :trailblk tree.tokens.at(maybe_comma).id == .Comma;
852 };854 };
853 if (src_has_trailing_comma) {855 if (src_has_trailing_comma) {
854 break :blk 1; // force row size 1856 break :blk 1; // force row size 1
...@@ -889,7 +891,7 @@ fn renderExpression(...@@ -889,7 +891,7 @@ fn renderExpression(
889891
890 var new_indent = indent + indent_delta;892 var new_indent = indent + indent_delta;
891893
892 if (tree.tokens.at(tree.nextToken(lbrace)).id != Token.Id.MultilineStringLiteralLine) {894 if (tree.tokens.at(tree.nextToken(lbrace)).id != .MultilineStringLiteralLine) {
893 try renderToken(tree, stream, lbrace, new_indent, start_col, Space.Newline);895 try renderToken(tree, stream, lbrace, new_indent, start_col, Space.Newline);
894 try stream.writeByteNTimes(' ', new_indent);896 try stream.writeByteNTimes(' ', new_indent);
895 } else {897 } else {
...@@ -917,14 +919,14 @@ fn renderExpression(...@@ -917,14 +919,14 @@ fn renderExpression(
917 }919 }
918 col = 1;920 col = 1;
919921
920 if (tree.tokens.at(tree.nextToken(comma)).id != Token.Id.MultilineStringLiteralLine) {922 if (tree.tokens.at(tree.nextToken(comma)).id != .MultilineStringLiteralLine) {
921 try renderToken(tree, stream, comma, new_indent, start_col, Space.Newline); // ,923 try renderToken(tree, stream, comma, new_indent, start_col, Space.Newline); // ,
922 } else {924 } else {
923 try renderToken(tree, stream, comma, new_indent, start_col, Space.None); // ,925 try renderToken(tree, stream, comma, new_indent, start_col, Space.None); // ,
924 }926 }
925927
926 try renderExtraNewline(tree, stream, start_col, next_expr.*);928 try renderExtraNewline(tree, stream, start_col, next_expr.*);
927 if (next_expr.*.id != ast.Node.Id.MultilineStringLiteral) {929 if (next_expr.*.id != .MultilineStringLiteral) {
928 try stream.writeByteNTimes(' ', new_indent);930 try stream.writeByteNTimes(' ', new_indent);
929 }931 }
930 } else {932 } else {
...@@ -932,7 +934,7 @@ fn renderExpression(...@@ -932,7 +934,7 @@ fn renderExpression(
932 }934 }
933 }935 }
934 const last_node = it.prev().?;936 const last_node = it.prev().?;
935 if (last_node.*.id != ast.Node.Id.MultilineStringLiteral) {937 if (last_node.*.id != .MultilineStringLiteral) {
936 try stream.writeByteNTimes(' ', indent);938 try stream.writeByteNTimes(' ', indent);
937 }939 }
938 return renderToken(tree, stream, suffix_op.rtoken, indent, start_col, space);940 return renderToken(tree, stream, suffix_op.rtoken, indent, start_col, space);
...@@ -955,11 +957,11 @@ fn renderExpression(...@@ -955,11 +957,11 @@ fn renderExpression(
955 }957 }
956 },958 },
957959
958 ast.Node.Id.ControlFlowExpression => {960 .ControlFlowExpression => {
959 const flow_expr = @fieldParentPtr(ast.Node.ControlFlowExpression, "base", base);961 const flow_expr = @fieldParentPtr(ast.Node.ControlFlowExpression, "base", base);
960962
961 switch (flow_expr.kind) {963 switch (flow_expr.kind) {
962 ast.Node.ControlFlowExpression.Kind.Break => |maybe_label| {964 .Break => |maybe_label| {
963 if (maybe_label == null and flow_expr.rhs == null) {965 if (maybe_label == null and flow_expr.rhs == null) {
964 return renderToken(tree, stream, flow_expr.ltoken, indent, start_col, space); // break966 return renderToken(tree, stream, flow_expr.ltoken, indent, start_col, space); // break
965 }967 }
...@@ -975,7 +977,7 @@ fn renderExpression(...@@ -975,7 +977,7 @@ fn renderExpression(
975 try renderExpression(allocator, stream, tree, indent, start_col, label, Space.Space); // label977 try renderExpression(allocator, stream, tree, indent, start_col, label, Space.Space); // label
976 }978 }
977 },979 },
978 ast.Node.ControlFlowExpression.Kind.Continue => |maybe_label| {980 .Continue => |maybe_label| {
979 assert(flow_expr.rhs == null);981 assert(flow_expr.rhs == null);
980982
981 if (maybe_label == null and flow_expr.rhs == null) {983 if (maybe_label == null and flow_expr.rhs == null) {
...@@ -990,7 +992,7 @@ fn renderExpression(...@@ -990,7 +992,7 @@ fn renderExpression(
990 return renderExpression(allocator, stream, tree, indent, start_col, label, space);992 return renderExpression(allocator, stream, tree, indent, start_col, label, space);
991 }993 }
992 },994 },
993 ast.Node.ControlFlowExpression.Kind.Return => {995 .Return => {
994 if (flow_expr.rhs == null) {996 if (flow_expr.rhs == null) {
995 return renderToken(tree, stream, flow_expr.ltoken, indent, start_col, space);997 return renderToken(tree, stream, flow_expr.ltoken, indent, start_col, space);
996 }998 }
...@@ -1001,7 +1003,7 @@ fn renderExpression(...@@ -1001,7 +1003,7 @@ fn renderExpression(
1001 return renderExpression(allocator, stream, tree, indent, start_col, flow_expr.rhs.?, space);1003 return renderExpression(allocator, stream, tree, indent, start_col, flow_expr.rhs.?, space);
1002 },1004 },
10031005
1004 ast.Node.Id.Payload => {1006 .Payload => {
1005 const payload = @fieldParentPtr(ast.Node.Payload, "base", base);1007 const payload = @fieldParentPtr(ast.Node.Payload, "base", base);
10061008
1007 try renderToken(tree, stream, payload.lpipe, indent, start_col, Space.None);1009 try renderToken(tree, stream, payload.lpipe, indent, start_col, Space.None);
...@@ -1009,7 +1011,7 @@ fn renderExpression(...@@ -1009,7 +1011,7 @@ fn renderExpression(
1009 return renderToken(tree, stream, payload.rpipe, indent, start_col, space);1011 return renderToken(tree, stream, payload.rpipe, indent, start_col, space);
1010 },1012 },
10111013
1012 ast.Node.Id.PointerPayload => {1014 .PointerPayload => {
1013 const payload = @fieldParentPtr(ast.Node.PointerPayload, "base", base);1015 const payload = @fieldParentPtr(ast.Node.PointerPayload, "base", base);
10141016
1015 try renderToken(tree, stream, payload.lpipe, indent, start_col, Space.None);1017 try renderToken(tree, stream, payload.lpipe, indent, start_col, Space.None);
...@@ -1020,7 +1022,7 @@ fn renderExpression(...@@ -1020,7 +1022,7 @@ fn renderExpression(
1020 return renderToken(tree, stream, payload.rpipe, indent, start_col, space);1022 return renderToken(tree, stream, payload.rpipe, indent, start_col, space);
1021 },1023 },
10221024
1023 ast.Node.Id.PointerIndexPayload => {1025 .PointerIndexPayload => {
1024 const payload = @fieldParentPtr(ast.Node.PointerIndexPayload, "base", base);1026 const payload = @fieldParentPtr(ast.Node.PointerIndexPayload, "base", base);
10251027
1026 try renderToken(tree, stream, payload.lpipe, indent, start_col, Space.None);1028 try renderToken(tree, stream, payload.lpipe, indent, start_col, Space.None);
...@@ -1039,7 +1041,7 @@ fn renderExpression(...@@ -1039,7 +1041,7 @@ fn renderExpression(
1039 return renderToken(tree, stream, payload.rpipe, indent, start_col, space);1041 return renderToken(tree, stream, payload.rpipe, indent, start_col, space);
1040 },1042 },
10411043
1042 ast.Node.Id.GroupedExpression => {1044 .GroupedExpression => {
1043 const grouped_expr = @fieldParentPtr(ast.Node.GroupedExpression, "base", base);1045 const grouped_expr = @fieldParentPtr(ast.Node.GroupedExpression, "base", base);
10441046
1045 try renderToken(tree, stream, grouped_expr.lparen, indent, start_col, Space.None);1047 try renderToken(tree, stream, grouped_expr.lparen, indent, start_col, Space.None);
...@@ -1047,7 +1049,7 @@ fn renderExpression(...@@ -1047,7 +1049,7 @@ fn renderExpression(
1047 return renderToken(tree, stream, grouped_expr.rparen, indent, start_col, space);1049 return renderToken(tree, stream, grouped_expr.rparen, indent, start_col, space);
1048 },1050 },
10491051
1050 ast.Node.Id.FieldInitializer => {1052 .FieldInitializer => {
1051 const field_init = @fieldParentPtr(ast.Node.FieldInitializer, "base", base);1053 const field_init = @fieldParentPtr(ast.Node.FieldInitializer, "base", base);
10521054
1053 try renderToken(tree, stream, field_init.period_token, indent, start_col, Space.None); // .1055 try renderToken(tree, stream, field_init.period_token, indent, start_col, Space.None); // .
...@@ -1056,43 +1058,43 @@ fn renderExpression(...@@ -1056,43 +1058,43 @@ fn renderExpression(
1056 return renderExpression(allocator, stream, tree, indent, start_col, field_init.expr, space);1058 return renderExpression(allocator, stream, tree, indent, start_col, field_init.expr, space);
1057 },1059 },
10581060
1059 ast.Node.Id.IntegerLiteral => {1061 .IntegerLiteral => {
1060 const integer_literal = @fieldParentPtr(ast.Node.IntegerLiteral, "base", base);1062 const integer_literal = @fieldParentPtr(ast.Node.IntegerLiteral, "base", base);
1061 return renderToken(tree, stream, integer_literal.token, indent, start_col, space);1063 return renderToken(tree, stream, integer_literal.token, indent, start_col, space);
1062 },1064 },
1063 ast.Node.Id.FloatLiteral => {1065 .FloatLiteral => {
1064 const float_literal = @fieldParentPtr(ast.Node.FloatLiteral, "base", base);1066 const float_literal = @fieldParentPtr(ast.Node.FloatLiteral, "base", base);
1065 return renderToken(tree, stream, float_literal.token, indent, start_col, space);1067 return renderToken(tree, stream, float_literal.token, indent, start_col, space);
1066 },1068 },
1067 ast.Node.Id.StringLiteral => {1069 .StringLiteral => {
1068 const string_literal = @fieldParentPtr(ast.Node.StringLiteral, "base", base);1070 const string_literal = @fieldParentPtr(ast.Node.StringLiteral, "base", base);
1069 return renderToken(tree, stream, string_literal.token, indent, start_col, space);1071 return renderToken(tree, stream, string_literal.token, indent, start_col, space);
1070 },1072 },
1071 ast.Node.Id.CharLiteral => {1073 .CharLiteral => {
1072 const char_literal = @fieldParentPtr(ast.Node.CharLiteral, "base", base);1074 const char_literal = @fieldParentPtr(ast.Node.CharLiteral, "base", base);
1073 return renderToken(tree, stream, char_literal.token, indent, start_col, space);1075 return renderToken(tree, stream, char_literal.token, indent, start_col, space);
1074 },1076 },
1075 ast.Node.Id.BoolLiteral => {1077 .BoolLiteral => {
1076 const bool_literal = @fieldParentPtr(ast.Node.CharLiteral, "base", base);1078 const bool_literal = @fieldParentPtr(ast.Node.CharLiteral, "base", base);
1077 return renderToken(tree, stream, bool_literal.token, indent, start_col, space);1079 return renderToken(tree, stream, bool_literal.token, indent, start_col, space);
1078 },1080 },
1079 ast.Node.Id.NullLiteral => {1081 .NullLiteral => {
1080 const null_literal = @fieldParentPtr(ast.Node.NullLiteral, "base", base);1082 const null_literal = @fieldParentPtr(ast.Node.NullLiteral, "base", base);
1081 return renderToken(tree, stream, null_literal.token, indent, start_col, space);1083 return renderToken(tree, stream, null_literal.token, indent, start_col, space);
1082 },1084 },
1083 ast.Node.Id.Unreachable => {1085 .Unreachable => {
1084 const unreachable_node = @fieldParentPtr(ast.Node.Unreachable, "base", base);1086 const unreachable_node = @fieldParentPtr(ast.Node.Unreachable, "base", base);
1085 return renderToken(tree, stream, unreachable_node.token, indent, start_col, space);1087 return renderToken(tree, stream, unreachable_node.token, indent, start_col, space);
1086 },1088 },
1087 ast.Node.Id.ErrorType => {1089 .ErrorType => {
1088 const error_type = @fieldParentPtr(ast.Node.ErrorType, "base", base);1090 const error_type = @fieldParentPtr(ast.Node.ErrorType, "base", base);
1089 return renderToken(tree, stream, error_type.token, indent, start_col, space);1091 return renderToken(tree, stream, error_type.token, indent, start_col, space);
1090 },1092 },
1091 ast.Node.Id.VarType => {1093 .VarType => {
1092 const var_type = @fieldParentPtr(ast.Node.VarType, "base", base);1094 const var_type = @fieldParentPtr(ast.Node.VarType, "base", base);
1093 return renderToken(tree, stream, var_type.token, indent, start_col, space);1095 return renderToken(tree, stream, var_type.token, indent, start_col, space);
1094 },1096 },
1095 ast.Node.Id.ContainerDecl => {1097 .ContainerDecl => {
1096 const container_decl = @fieldParentPtr(ast.Node.ContainerDecl, "base", base);1098 const container_decl = @fieldParentPtr(ast.Node.ContainerDecl, "base", base);
10971099
1098 if (container_decl.layout_token) |layout_token| {1100 if (container_decl.layout_token) |layout_token| {
...@@ -1157,7 +1159,7 @@ fn renderExpression(...@@ -1157,7 +1159,7 @@ fn renderExpression(
1157 }1159 }
1158 },1160 },
11591161
1160 ast.Node.Id.ErrorSetDecl => {1162 .ErrorSetDecl => {
1161 const err_set_decl = @fieldParentPtr(ast.Node.ErrorSetDecl, "base", base);1163 const err_set_decl = @fieldParentPtr(ast.Node.ErrorSetDecl, "base", base);
11621164
1163 const lbrace = tree.nextToken(err_set_decl.error_token);1165 const lbrace = tree.nextToken(err_set_decl.error_token);
...@@ -1207,20 +1209,20 @@ fn renderExpression(...@@ -1207,20 +1209,20 @@ fn renderExpression(
1207 return renderToken(tree, stream, err_set_decl.rbrace_token, indent, start_col, space); // }1209 return renderToken(tree, stream, err_set_decl.rbrace_token, indent, start_col, space); // }
1208 },1210 },
12091211
1210 ast.Node.Id.ErrorTag => {1212 .ErrorTag => {
1211 const tag = @fieldParentPtr(ast.Node.ErrorTag, "base", base);1213 const tag = @fieldParentPtr(ast.Node.ErrorTag, "base", base);
12121214
1213 try renderDocComments(tree, stream, tag, indent, start_col);1215 try renderDocComments(tree, stream, tag, indent, start_col);
1214 return renderToken(tree, stream, tag.name_token, indent, start_col, space); // name1216 return renderToken(tree, stream, tag.name_token, indent, start_col, space); // name
1215 },1217 },
12161218
1217 ast.Node.Id.MultilineStringLiteral => {1219 .MultilineStringLiteral => {
1218 // TODO: Don't indent in this function, but let the caller indent.1220 // TODO: Don't indent in this function, but let the caller indent.
1219 // If this has been implemented, a lot of hacky solutions in i.e. ArrayInit and FunctionCall can be removed1221 // If this has been implemented, a lot of hacky solutions in i.e. ArrayInit and FunctionCall can be removed
1220 const multiline_str_literal = @fieldParentPtr(ast.Node.MultilineStringLiteral, "base", base);1222 const multiline_str_literal = @fieldParentPtr(ast.Node.MultilineStringLiteral, "base", base);
12211223
1222 var skip_first_indent = true;1224 var skip_first_indent = true;
1223 if (tree.tokens.at(multiline_str_literal.firstToken() - 1).id != Token.Id.LineComment) {1225 if (tree.tokens.at(multiline_str_literal.firstToken() - 1).id != .LineComment) {
1224 try stream.print("\n");1226 try stream.print("\n");
1225 skip_first_indent = false;1227 skip_first_indent = false;
1226 }1228 }
...@@ -1236,12 +1238,12 @@ fn renderExpression(...@@ -1236,12 +1238,12 @@ fn renderExpression(
1236 }1238 }
1237 try stream.writeByteNTimes(' ', indent);1239 try stream.writeByteNTimes(' ', indent);
1238 },1240 },
1239 ast.Node.Id.UndefinedLiteral => {1241 .UndefinedLiteral => {
1240 const undefined_literal = @fieldParentPtr(ast.Node.UndefinedLiteral, "base", base);1242 const undefined_literal = @fieldParentPtr(ast.Node.UndefinedLiteral, "base", base);
1241 return renderToken(tree, stream, undefined_literal.token, indent, start_col, space);1243 return renderToken(tree, stream, undefined_literal.token, indent, start_col, space);
1242 },1244 },
12431245
1244 ast.Node.Id.BuiltinCall => {1246 .BuiltinCall => {
1245 const builtin_call = @fieldParentPtr(ast.Node.BuiltinCall, "base", base);1247 const builtin_call = @fieldParentPtr(ast.Node.BuiltinCall, "base", base);
12461248
1247 try renderToken(tree, stream, builtin_call.builtin_token, indent, start_col, Space.None); // @name1249 try renderToken(tree, stream, builtin_call.builtin_token, indent, start_col, Space.None); // @name
...@@ -1259,12 +1261,12 @@ fn renderExpression(...@@ -1259,12 +1261,12 @@ fn renderExpression(
1259 return renderToken(tree, stream, builtin_call.rparen_token, indent, start_col, space); // )1261 return renderToken(tree, stream, builtin_call.rparen_token, indent, start_col, space); // )
1260 },1262 },
12611263
1262 ast.Node.Id.FnProto => {1264 .FnProto => {
1263 const fn_proto = @fieldParentPtr(ast.Node.FnProto, "base", base);1265 const fn_proto = @fieldParentPtr(ast.Node.FnProto, "base", base);
12641266
1265 if (fn_proto.visib_token) |visib_token_index| {1267 if (fn_proto.visib_token) |visib_token_index| {
1266 const visib_token = tree.tokens.at(visib_token_index);1268 const visib_token = tree.tokens.at(visib_token_index);
1267 assert(visib_token.id == Token.Id.Keyword_pub or visib_token.id == Token.Id.Keyword_export);1269 assert(visib_token.id == .Keyword_pub or visib_token.id == .Keyword_export);
12681270
1269 try renderToken(tree, stream, visib_token_index, indent, start_col, Space.Space); // pub1271 try renderToken(tree, stream, visib_token_index, indent, start_col, Space.Space); // pub
1270 }1272 }
...@@ -1361,7 +1363,7 @@ fn renderExpression(...@@ -1361,7 +1363,7 @@ fn renderExpression(
1361 }1363 }
1362 },1364 },
13631365
1364 ast.Node.Id.AnyFrameType => {1366 .AnyFrameType => {
1365 const anyframe_type = @fieldParentPtr(ast.Node.AnyFrameType, "base", base);1367 const anyframe_type = @fieldParentPtr(ast.Node.AnyFrameType, "base", base);
13661368
1367 if (anyframe_type.result) |result| {1369 if (anyframe_type.result) |result| {
...@@ -1373,9 +1375,9 @@ fn renderExpression(...@@ -1373,9 +1375,9 @@ fn renderExpression(
1373 }1375 }
1374 },1376 },
13751377
1376 ast.Node.Id.DocComment => unreachable, // doc comments are attached to nodes1378 .DocComment => unreachable, // doc comments are attached to nodes
13771379
1378 ast.Node.Id.Switch => {1380 .Switch => {
1379 const switch_node = @fieldParentPtr(ast.Node.Switch, "base", base);1381 const switch_node = @fieldParentPtr(ast.Node.Switch, "base", base);
13801382
1381 try renderToken(tree, stream, switch_node.switch_token, indent, start_col, Space.Space); // switch1383 try renderToken(tree, stream, switch_node.switch_token, indent, start_col, Space.Space); // switch
...@@ -1412,14 +1414,14 @@ fn renderExpression(...@@ -1412,14 +1414,14 @@ fn renderExpression(
1412 return renderToken(tree, stream, switch_node.rbrace, indent, start_col, space); // }1414 return renderToken(tree, stream, switch_node.rbrace, indent, start_col, space); // }
1413 },1415 },
14141416
1415 ast.Node.Id.SwitchCase => {1417 .SwitchCase => {
1416 const switch_case = @fieldParentPtr(ast.Node.SwitchCase, "base", base);1418 const switch_case = @fieldParentPtr(ast.Node.SwitchCase, "base", base);
14171419
1418 assert(switch_case.items.len != 0);1420 assert(switch_case.items.len != 0);
1419 const src_has_trailing_comma = blk: {1421 const src_has_trailing_comma = blk: {
1420 const last_node = switch_case.items.at(switch_case.items.len - 1).*;1422 const last_node = switch_case.items.at(switch_case.items.len - 1).*;
1421 const maybe_comma = tree.nextToken(last_node.lastToken());1423 const maybe_comma = tree.nextToken(last_node.lastToken());
1422 break :blk tree.tokens.at(maybe_comma).id == Token.Id.Comma;1424 break :blk tree.tokens.at(maybe_comma).id == .Comma;
1423 };1425 };
14241426
1425 if (switch_case.items.len == 1 or !src_has_trailing_comma) {1427 if (switch_case.items.len == 1 or !src_has_trailing_comma) {
...@@ -1462,11 +1464,11 @@ fn renderExpression(...@@ -1462,11 +1464,11 @@ fn renderExpression(
14621464
1463 return renderExpression(allocator, stream, tree, indent, start_col, switch_case.expr, space);1465 return renderExpression(allocator, stream, tree, indent, start_col, switch_case.expr, space);
1464 },1466 },
1465 ast.Node.Id.SwitchElse => {1467 .SwitchElse => {
1466 const switch_else = @fieldParentPtr(ast.Node.SwitchElse, "base", base);1468 const switch_else = @fieldParentPtr(ast.Node.SwitchElse, "base", base);
1467 return renderToken(tree, stream, switch_else.token, indent, start_col, space);1469 return renderToken(tree, stream, switch_else.token, indent, start_col, space);
1468 },1470 },
1469 ast.Node.Id.Else => {1471 .Else => {
1470 const else_node = @fieldParentPtr(ast.Node.Else, "base", base);1472 const else_node = @fieldParentPtr(ast.Node.Else, "base", base);
14711473
1472 const body_is_block = nodeIsBlock(else_node.body);1474 const body_is_block = nodeIsBlock(else_node.body);
...@@ -1489,7 +1491,7 @@ fn renderExpression(...@@ -1489,7 +1491,7 @@ fn renderExpression(
1489 return renderExpression(allocator, stream, tree, indent, start_col, else_node.body, space);1491 return renderExpression(allocator, stream, tree, indent, start_col, else_node.body, space);
1490 },1492 },
14911493
1492 ast.Node.Id.While => {1494 .While => {
1493 const while_node = @fieldParentPtr(ast.Node.While, "base", base);1495 const while_node = @fieldParentPtr(ast.Node.While, "base", base);
14941496
1495 if (while_node.label) |label| {1497 if (while_node.label) |label| {
...@@ -1564,7 +1566,7 @@ fn renderExpression(...@@ -1564,7 +1566,7 @@ fn renderExpression(
1564 }1566 }
1565 },1567 },
15661568
1567 ast.Node.Id.For => {1569 .For => {
1568 const for_node = @fieldParentPtr(ast.Node.For, "base", base);1570 const for_node = @fieldParentPtr(ast.Node.For, "base", base);
15691571
1570 if (for_node.label) |label| {1572 if (for_node.label) |label| {
...@@ -1582,7 +1584,7 @@ fn renderExpression(...@@ -1582,7 +1584,7 @@ fn renderExpression(
15821584
1583 const rparen = tree.nextToken(for_node.array_expr.lastToken());1585 const rparen = tree.nextToken(for_node.array_expr.lastToken());
15841586
1585 const body_is_block = for_node.body.id == ast.Node.Id.Block;1587 const body_is_block = for_node.body.id == .Block;
1586 const src_one_line_to_body = !body_is_block and tree.tokensOnSameLine(rparen, for_node.body.firstToken());1588 const src_one_line_to_body = !body_is_block and tree.tokensOnSameLine(rparen, for_node.body.firstToken());
1587 const body_on_same_line = body_is_block or src_one_line_to_body;1589 const body_on_same_line = body_is_block or src_one_line_to_body;
15881590
...@@ -1614,7 +1616,7 @@ fn renderExpression(...@@ -1614,7 +1616,7 @@ fn renderExpression(
1614 }1616 }
1615 },1617 },
16161618
1617 ast.Node.Id.If => {1619 .If => {
1618 const if_node = @fieldParentPtr(ast.Node.If, "base", base);1620 const if_node = @fieldParentPtr(ast.Node.If, "base", base);
16191621
1620 const lparen = tree.prevToken(if_node.condition.firstToken());1622 const lparen = tree.prevToken(if_node.condition.firstToken());
...@@ -1625,7 +1627,7 @@ fn renderExpression(...@@ -1625,7 +1627,7 @@ fn renderExpression(
16251627
1626 try renderExpression(allocator, stream, tree, indent, start_col, if_node.condition, Space.None); // condition1628 try renderExpression(allocator, stream, tree, indent, start_col, if_node.condition, Space.None); // condition
16271629
1628 const body_is_if_block = if_node.body.id == ast.Node.Id.If;1630 const body_is_if_block = if_node.body.id == .If;
1629 const body_is_block = nodeIsBlock(if_node.body);1631 const body_is_block = nodeIsBlock(if_node.body);
16301632
1631 if (body_is_if_block) {1633 if (body_is_if_block) {
...@@ -1708,7 +1710,7 @@ fn renderExpression(...@@ -1708,7 +1710,7 @@ fn renderExpression(
1708 }1710 }
1709 },1711 },
17101712
1711 ast.Node.Id.Asm => {1713 .Asm => {
1712 const asm_node = @fieldParentPtr(ast.Node.Asm, "base", base);1714 const asm_node = @fieldParentPtr(ast.Node.Asm, "base", base);
17131715
1714 try renderToken(tree, stream, asm_node.asm_token, indent, start_col, Space.Space); // asm1716 try renderToken(tree, stream, asm_node.asm_token, indent, start_col, Space.Space); // asm
...@@ -1729,7 +1731,7 @@ fn renderExpression(...@@ -1729,7 +1731,7 @@ fn renderExpression(
17291731
1730 const indent_once = indent + indent_delta;1732 const indent_once = indent + indent_delta;
17311733
1732 if (asm_node.template.id == ast.Node.Id.MultilineStringLiteral) {1734 if (asm_node.template.id == .MultilineStringLiteral) {
1733 // After rendering a multiline string literal the cursor is1735 // After rendering a multiline string literal the cursor is
1734 // already offset by indent1736 // already offset by indent
1735 try stream.writeByteNTimes(' ', indent_delta);1737 try stream.writeByteNTimes(' ', indent_delta);
...@@ -1771,7 +1773,7 @@ fn renderExpression(...@@ -1771,7 +1773,7 @@ fn renderExpression(
1771 try stream.writeByteNTimes(' ', indent_once);1773 try stream.writeByteNTimes(' ', indent_once);
1772 const comma_or_colon = tree.nextToken(node.lastToken());1774 const comma_or_colon = tree.nextToken(node.lastToken());
1773 break :blk switch (tree.tokens.at(comma_or_colon).id) {1775 break :blk switch (tree.tokens.at(comma_or_colon).id) {
1774 Token.Id.Comma => tree.nextToken(comma_or_colon),1776 .Comma => tree.nextToken(comma_or_colon),
1775 else => comma_or_colon,1777 else => comma_or_colon,
1776 };1778 };
1777 }1779 }
...@@ -1809,7 +1811,7 @@ fn renderExpression(...@@ -1809,7 +1811,7 @@ fn renderExpression(
1809 try stream.writeByteNTimes(' ', indent_once);1811 try stream.writeByteNTimes(' ', indent_once);
1810 const comma_or_colon = tree.nextToken(node.lastToken());1812 const comma_or_colon = tree.nextToken(node.lastToken());
1811 break :blk switch (tree.tokens.at(comma_or_colon).id) {1813 break :blk switch (tree.tokens.at(comma_or_colon).id) {
1812 Token.Id.Comma => tree.nextToken(comma_or_colon),1814 .Comma => tree.nextToken(comma_or_colon),
1813 else => comma_or_colon,1815 else => comma_or_colon,
1814 };1816 };
1815 }1817 }
...@@ -1834,7 +1836,7 @@ fn renderExpression(...@@ -1834,7 +1836,7 @@ fn renderExpression(
1834 }1836 }
1835 },1837 },
18361838
1837 ast.Node.Id.AsmInput => {1839 .AsmInput => {
1838 const asm_input = @fieldParentPtr(ast.Node.AsmInput, "base", base);1840 const asm_input = @fieldParentPtr(ast.Node.AsmInput, "base", base);
18391841
1840 try stream.write("[");1842 try stream.write("[");
...@@ -1846,7 +1848,7 @@ fn renderExpression(...@@ -1846,7 +1848,7 @@ fn renderExpression(
1846 return renderToken(tree, stream, asm_input.lastToken(), indent, start_col, space); // )1848 return renderToken(tree, stream, asm_input.lastToken(), indent, start_col, space); // )
1847 },1849 },
18481850
1849 ast.Node.Id.AsmOutput => {1851 .AsmOutput => {
1850 const asm_output = @fieldParentPtr(ast.Node.AsmOutput, "base", base);1852 const asm_output = @fieldParentPtr(ast.Node.AsmOutput, "base", base);
18511853
1852 try stream.write("[");1854 try stream.write("[");
...@@ -1868,19 +1870,19 @@ fn renderExpression(...@@ -1868,19 +1870,19 @@ fn renderExpression(
1868 return renderToken(tree, stream, asm_output.lastToken(), indent, start_col, space); // )1870 return renderToken(tree, stream, asm_output.lastToken(), indent, start_col, space); // )
1869 },1871 },
18701872
1871 ast.Node.Id.EnumLiteral => {1873 .EnumLiteral => {
1872 const enum_literal = @fieldParentPtr(ast.Node.EnumLiteral, "base", base);1874 const enum_literal = @fieldParentPtr(ast.Node.EnumLiteral, "base", base);
18731875
1874 try renderToken(tree, stream, enum_literal.dot, indent, start_col, Space.None); // .1876 try renderToken(tree, stream, enum_literal.dot, indent, start_col, Space.None); // .
1875 return renderToken(tree, stream, enum_literal.name, indent, start_col, space); // name1877 return renderToken(tree, stream, enum_literal.name, indent, start_col, space); // name
1876 },1878 },
18771879
1878 ast.Node.Id.ContainerField,1880 .ContainerField,
1879 ast.Node.Id.Root,1881 .Root,
1880 ast.Node.Id.VarDecl,1882 .VarDecl,
1881 ast.Node.Id.Use,1883 .Use,
1882 ast.Node.Id.TestDecl,1884 .TestDecl,
1883 ast.Node.Id.ParamDecl,1885 .ParamDecl,
1884 => unreachable,1886 => unreachable,
1885 }1887 }
1886}1888}
...@@ -1949,7 +1951,7 @@ fn renderVarDecl(...@@ -1949,7 +1951,7 @@ fn renderVarDecl(
1949 }1951 }
19501952
1951 if (var_decl.init_node) |init_node| {1953 if (var_decl.init_node) |init_node| {
1952 const s = if (init_node.id == ast.Node.Id.MultilineStringLiteral) Space.None else Space.Space;1954 const s = if (init_node.id == .MultilineStringLiteral) Space.None else Space.Space;
1953 try renderToken(tree, stream, var_decl.eq_token, indent, start_col, s); // =1955 try renderToken(tree, stream, var_decl.eq_token, indent, start_col, s); // =
1954 try renderExpression(allocator, stream, tree, indent, start_col, init_node, Space.None);1956 try renderExpression(allocator, stream, tree, indent, start_col, init_node, Space.None);
1955 }1957 }
...@@ -1996,7 +1998,7 @@ fn renderStatement(...@@ -1996,7 +1998,7 @@ fn renderStatement(
1996 base: *ast.Node,1998 base: *ast.Node,
1997) (@typeOf(stream).Child.Error || Error)!void {1999) (@typeOf(stream).Child.Error || Error)!void {
1998 switch (base.id) {2000 switch (base.id) {
1999 ast.Node.Id.VarDecl => {2001 .VarDecl => {
2000 const var_decl = @fieldParentPtr(ast.Node.VarDecl, "base", base);2002 const var_decl = @fieldParentPtr(ast.Node.VarDecl, "base", base);
2001 try renderVarDecl(allocator, stream, tree, indent, start_col, var_decl);2003 try renderVarDecl(allocator, stream, tree, indent, start_col, var_decl);
2002 },2004 },
...@@ -2005,7 +2007,7 @@ fn renderStatement(...@@ -2005,7 +2007,7 @@ fn renderStatement(
2005 try renderExpression(allocator, stream, tree, indent, start_col, base, Space.None);2007 try renderExpression(allocator, stream, tree, indent, start_col, base, Space.None);
20062008
2007 const semicolon_index = tree.nextToken(base.lastToken());2009 const semicolon_index = tree.nextToken(base.lastToken());
2008 assert(tree.tokens.at(semicolon_index).id == Token.Id.Semicolon);2010 assert(tree.tokens.at(semicolon_index).id == .Semicolon);
2009 try renderToken(tree, stream, semicolon_index, indent, start_col, Space.Newline);2011 try renderToken(tree, stream, semicolon_index, indent, start_col, Space.Newline);
2010 } else {2012 } else {
2011 try renderExpression(allocator, stream, tree, indent, start_col, base, Space.Newline);2013 try renderExpression(allocator, stream, tree, indent, start_col, base, Space.Newline);
...@@ -2052,13 +2054,13 @@ fn renderTokenOffset(...@@ -2052,13 +2054,13 @@ fn renderTokenOffset(
2052 var next_token = tree.tokens.at(token_index + 1);2054 var next_token = tree.tokens.at(token_index + 1);
20532055
2054 if (space == Space.Comma) switch (next_token.id) {2056 if (space == Space.Comma) switch (next_token.id) {
2055 Token.Id.Comma => return renderToken(tree, stream, token_index + 1, indent, start_col, Space.Newline),2057 .Comma => return renderToken(tree, stream, token_index + 1, indent, start_col, Space.Newline),
2056 Token.Id.LineComment => {2058 .LineComment => {
2057 try stream.write(", ");2059 try stream.write(", ");
2058 return renderToken(tree, stream, token_index + 1, indent, start_col, Space.Newline);2060 return renderToken(tree, stream, token_index + 1, indent, start_col, Space.Newline);
2059 },2061 },
2060 else => {2062 else => {
2061 if (token_index + 2 < tree.tokens.len and tree.tokens.at(token_index + 2).id == Token.Id.MultilineStringLiteralLine) {2063 if (token_index + 2 < tree.tokens.len and tree.tokens.at(token_index + 2).id == .MultilineStringLiteralLine) {
2062 try stream.write(",");2064 try stream.write(",");
2063 return;2065 return;
2064 } else {2066 } else {
...@@ -2071,7 +2073,7 @@ fn renderTokenOffset(...@@ -2071,7 +2073,7 @@ fn renderTokenOffset(
20712073
2072 // Skip over same line doc comments2074 // Skip over same line doc comments
2073 var offset: usize = 1;2075 var offset: usize = 1;
2074 if (next_token.id == Token.Id.DocComment) {2076 if (next_token.id == .DocComment) {
2075 const loc = tree.tokenLocationPtr(token.end, next_token);2077 const loc = tree.tokenLocationPtr(token.end, next_token);
2076 if (loc.line == 0) {2078 if (loc.line == 0) {
2077 offset += 1;2079 offset += 1;
...@@ -2079,11 +2081,11 @@ fn renderTokenOffset(...@@ -2079,11 +2081,11 @@ fn renderTokenOffset(
2079 }2081 }
2080 }2082 }
20812083
2082 if (next_token.id != Token.Id.LineComment) blk: {2084 if (next_token.id != .LineComment) blk: {
2083 switch (space) {2085 switch (space) {
2084 Space.None, Space.NoNewline => return,2086 Space.None, Space.NoNewline => return,
2085 Space.Newline => {2087 Space.Newline => {
2086 if (next_token.id == Token.Id.MultilineStringLiteralLine) {2088 if (next_token.id == .MultilineStringLiteralLine) {
2087 return;2089 return;
2088 } else {2090 } else {
2089 try stream.write("\n");2091 try stream.write("\n");
...@@ -2092,7 +2094,7 @@ fn renderTokenOffset(...@@ -2092,7 +2094,7 @@ fn renderTokenOffset(
2092 }2094 }
2093 },2095 },
2094 Space.Space, Space.SpaceOrOutdent => {2096 Space.Space, Space.SpaceOrOutdent => {
2095 if (next_token.id == Token.Id.MultilineStringLiteralLine)2097 if (next_token.id == .MultilineStringLiteralLine)
2096 return;2098 return;
2097 try stream.writeByte(' ');2099 try stream.writeByte(' ');
2098 return;2100 return;
...@@ -2128,13 +2130,13 @@ fn renderTokenOffset(...@@ -2128,13 +2130,13 @@ fn renderTokenOffset(
2128 offset = 2;2130 offset = 2;
2129 token = next_token;2131 token = next_token;
2130 next_token = tree.tokens.at(token_index + offset);2132 next_token = tree.tokens.at(token_index + offset);
2131 if (next_token.id != Token.Id.LineComment) {2133 if (next_token.id != .LineComment) {
2132 switch (space) {2134 switch (space) {
2133 Space.None, Space.Space => {2135 Space.None, Space.Space => {
2134 try stream.writeByte('\n');2136 try stream.writeByte('\n');
2135 const after_comment_token = tree.tokens.at(token_index + offset);2137 const after_comment_token = tree.tokens.at(token_index + offset);
2136 const next_line_indent = switch (after_comment_token.id) {2138 const next_line_indent = switch (after_comment_token.id) {
2137 Token.Id.RParen, Token.Id.RBrace, Token.Id.RBracket => indent,2139 .RParen, .RBrace, .RBracket => indent,
2138 else => indent + indent_delta,2140 else => indent + indent_delta,
2139 };2141 };
2140 try stream.writeByteNTimes(' ', next_line_indent);2142 try stream.writeByteNTimes(' ', next_line_indent);
...@@ -2146,7 +2148,7 @@ fn renderTokenOffset(...@@ -2146,7 +2148,7 @@ fn renderTokenOffset(
2146 start_col.* = indent;2148 start_col.* = indent;
2147 },2149 },
2148 Space.Newline => {2150 Space.Newline => {
2149 if (next_token.id == Token.Id.MultilineStringLiteralLine) {2151 if (next_token.id == .MultilineStringLiteralLine) {
2150 return;2152 return;
2151 } else {2153 } else {
2152 try stream.write("\n");2154 try stream.write("\n");
...@@ -2172,10 +2174,10 @@ fn renderTokenOffset(...@@ -2172,10 +2174,10 @@ fn renderTokenOffset(
2172 offset += 1;2174 offset += 1;
2173 token = next_token;2175 token = next_token;
2174 next_token = tree.tokens.at(token_index + offset);2176 next_token = tree.tokens.at(token_index + offset);
2175 if (next_token.id != Token.Id.LineComment) {2177 if (next_token.id != .LineComment) {
2176 switch (space) {2178 switch (space) {
2177 Space.Newline => {2179 Space.Newline => {
2178 if (next_token.id == Token.Id.MultilineStringLiteralLine) {2180 if (next_token.id == .MultilineStringLiteralLine) {
2179 return;2181 return;
2180 } else {2182 } else {
2181 try stream.write("\n");2183 try stream.write("\n");
...@@ -2188,7 +2190,7 @@ fn renderTokenOffset(...@@ -2188,7 +2190,7 @@ fn renderTokenOffset(
21882190
2189 const after_comment_token = tree.tokens.at(token_index + offset);2191 const after_comment_token = tree.tokens.at(token_index + offset);
2190 const next_line_indent = switch (after_comment_token.id) {2192 const next_line_indent = switch (after_comment_token.id) {
2191 Token.Id.RParen, Token.Id.RBrace, Token.Id.RBracket => blk: {2193 .RParen, .RBrace, .RBracket => blk: {
2192 if (indent > indent_delta) {2194 if (indent > indent_delta) {
2193 break :blk indent - indent_delta;2195 break :blk indent - indent_delta;
2194 } else {2196 } else {
...@@ -2249,11 +2251,11 @@ fn renderDocComments(...@@ -2249,11 +2251,11 @@ fn renderDocComments(
22492251
2250fn nodeIsBlock(base: *const ast.Node) bool {2252fn nodeIsBlock(base: *const ast.Node) bool {
2251 return switch (base.id) {2253 return switch (base.id) {
2252 ast.Node.Id.Block,2254 .Block,
2253 ast.Node.Id.If,2255 .If,
2254 ast.Node.Id.For,2256 .For,
2255 ast.Node.Id.While,2257 .While,
2256 ast.Node.Id.Switch,2258 .Switch,
2257 => true,2259 => true,
2258 else => false,2260 else => false,
2259 };2261 };