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
signature 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
25582558 _ = try expectToken(it, tree, .RBracket);
25592559 const node = try arena.create(Node.PrefixOp);
25602560 node.* = .{
2561 .op_token = ident,
2561 .op_token = lbracket,
25622562 .op = .{ .PtrType = .{} },
25632563 .rhs = undefined, // set by caller
25642564 };
lib/std/zig/parser_test.zig+8
......@@ -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
18test "zig fmt: asm expression with comptime content" {
29 try testCanonical(
310 \\comptime {
......@@ -21,6 +28,7 @@ test "zig fmt: asm expression with comptime content" {
2128 \\
2229 );
2330}
31
2432test "zig fmt: var struct field" {
2533 try testCanonical(
2634 \\pub const Pointer = struct {
lib/std/zig/render.zig+131-129
......@@ -75,7 +75,7 @@ fn renderRoot(
7575
7676 // render all the line comments at the beginning of the file
7777 while (tok_it.next()) |token| {
78 if (token.id != Token.Id.LineComment) break;
78 if (token.id != .LineComment) break;
7979 try stream.print("{}\n", mem.trimRight(u8, tree.tokenSlicePtr(token), " "));
8080 if (tok_it.peek()) |next_token| {
8181 const loc = tree.tokenLocationPtr(token.end, next_token);
......@@ -109,8 +109,8 @@ fn renderRoot(
109109 token_index -= 1;
110110 const token = tree.tokens.at(token_index);
111111 switch (token.id) {
112 Token.Id.LineComment => {},
113 Token.Id.DocComment => {
112 .LineComment => {},
113 .DocComment => {
114114 copy_start_token_index = token_index;
115115 continue;
116116 },
......@@ -149,8 +149,8 @@ fn renderRoot(
149149 while (token_index < decl_first_token_index) : (token_index += 1) {
150150 const token = tree.tokens.at(token_index);
151151 switch (token.id) {
152 Token.Id.LineComment => {},
153 Token.Id.Eof => unreachable,
152 .LineComment => {},
153 .Eof => unreachable,
154154 else => continue,
155155 }
156156 if (mem.eql(u8, mem.trim(u8, tree.tokenSlicePtr(token)[2..], " "), "zig fmt: on")) {
......@@ -169,8 +169,8 @@ fn renderRoot(
169169 token_index -= 1;
170170 const token = tree.tokens.at(token_index);
171171 switch (token.id) {
172 Token.Id.LineComment => {},
173 Token.Id.DocComment => {
172 .LineComment => {},
173 .DocComment => {
174174 copy_end_token_index = token_index;
175175 continue;
176176 },
......@@ -193,7 +193,7 @@ fn renderRoot(
193193fn renderExtraNewline(tree: *ast.Tree, stream: var, start_col: *usize, node: *ast.Node) @typeOf(stream).Child.Error!void {
194194 const first_token = node.firstToken();
195195 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) {
197197 prev_token -= 1;
198198 }
199199 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
206206
207207fn renderTopLevelDecl(allocator: *mem.Allocator, stream: var, tree: *ast.Tree, indent: usize, start_col: *usize, decl: *ast.Node) (@typeOf(stream).Child.Error || Error)!void {
208208 switch (decl.id) {
209 ast.Node.Id.FnProto => {
209 .FnProto => {
210210 const fn_proto = @fieldParentPtr(ast.Node.FnProto, "base", decl);
211211
212212 try renderDocComments(tree, stream, fn_proto, indent, start_col);
......@@ -220,7 +220,7 @@ fn renderTopLevelDecl(allocator: *mem.Allocator, stream: var, tree: *ast.Tree, i
220220 }
221221 },
222222
223 ast.Node.Id.Use => {
223 .Use => {
224224 const use_decl = @fieldParentPtr(ast.Node.Use, "base", decl);
225225
226226 if (use_decl.visib_token) |visib_token| {
......@@ -231,14 +231,14 @@ fn renderTopLevelDecl(allocator: *mem.Allocator, stream: var, tree: *ast.Tree, i
231231 try renderToken(tree, stream, use_decl.semicolon_token, indent, start_col, Space.Newline); // ;
232232 },
233233
234 ast.Node.Id.VarDecl => {
234 .VarDecl => {
235235 const var_decl = @fieldParentPtr(ast.Node.VarDecl, "base", decl);
236236
237237 try renderDocComments(tree, stream, var_decl, indent, start_col);
238238 try renderVarDecl(allocator, stream, tree, indent, start_col, var_decl);
239239 },
240240
241 ast.Node.Id.TestDecl => {
241 .TestDecl => {
242242 const test_decl = @fieldParentPtr(ast.Node.TestDecl, "base", decl);
243243
244244 try renderDocComments(tree, stream, test_decl, indent, start_col);
......@@ -247,7 +247,7 @@ fn renderTopLevelDecl(allocator: *mem.Allocator, stream: var, tree: *ast.Tree, i
247247 try renderExpression(allocator, stream, tree, indent, start_col, test_decl.body_node, Space.Newline);
248248 },
249249
250 ast.Node.Id.ContainerField => {
250 .ContainerField => {
251251 const field = @fieldParentPtr(ast.Node.ContainerField, "base", decl);
252252
253253 try renderDocComments(tree, stream, field, indent, start_col);
......@@ -295,12 +295,12 @@ fn renderTopLevelDecl(allocator: *mem.Allocator, stream: var, tree: *ast.Tree, i
295295 }
296296 },
297297
298 ast.Node.Id.Comptime => {
298 .Comptime => {
299299 assert(!decl.requireSemiColon());
300300 try renderExpression(allocator, stream, tree, indent, start_col, decl, Space.Newline);
301301 },
302302
303 ast.Node.Id.DocComment => {
303 .DocComment => {
304304 const comment = @fieldParentPtr(ast.Node.DocComment, "base", decl);
305305 var it = comment.lines.iterator(0);
306306 while (it.next()) |line_token_index| {
......@@ -324,11 +324,11 @@ fn renderExpression(
324324 space: Space,
325325) (@typeOf(stream).Child.Error || Error)!void {
326326 switch (base.id) {
327 ast.Node.Id.Identifier => {
327 .Identifier => {
328328 const identifier = @fieldParentPtr(ast.Node.Identifier, "base", base);
329329 return renderToken(tree, stream, identifier.token, indent, start_col, space);
330330 },
331 ast.Node.Id.Block => {
331 .Block => {
332332 const block = @fieldParentPtr(ast.Node.Block, "base", base);
333333
334334 if (block.label) |label| {
......@@ -357,20 +357,20 @@ fn renderExpression(
357357 return renderToken(tree, stream, block.rbrace, indent, start_col, space);
358358 }
359359 },
360 ast.Node.Id.Defer => {
360 .Defer => {
361361 const defer_node = @fieldParentPtr(ast.Node.Defer, "base", base);
362362
363363 try renderToken(tree, stream, defer_node.defer_token, indent, start_col, Space.Space);
364364 return renderExpression(allocator, stream, tree, indent, start_col, defer_node.expr, space);
365365 },
366 ast.Node.Id.Comptime => {
366 .Comptime => {
367367 const comptime_node = @fieldParentPtr(ast.Node.Comptime, "base", base);
368368
369369 try renderToken(tree, stream, comptime_node.comptime_token, indent, start_col, Space.Space);
370370 return renderExpression(allocator, stream, tree, indent, start_col, comptime_node.expr, space);
371371 },
372372
373 ast.Node.Id.Suspend => {
373 .Suspend => {
374374 const suspend_node = @fieldParentPtr(ast.Node.Suspend, "base", base);
375375
376376 if (suspend_node.body) |body| {
......@@ -381,7 +381,7 @@ fn renderExpression(
381381 }
382382 },
383383
384 ast.Node.Id.InfixOp => {
384 .InfixOp => {
385385 const infix_op_node = @fieldParentPtr(ast.Node.InfixOp, "base", base);
386386
387387 const op_space = switch (infix_op_node.op) {
......@@ -397,7 +397,7 @@ fn renderExpression(
397397
398398 try renderToken(tree, stream, infix_op_node.op_token, indent, start_col, after_op_space);
399399 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)
401401 {
402402 try stream.writeByteNTimes(' ', indent + indent_delta);
403403 start_col.* = indent + indent_delta;
......@@ -413,16 +413,18 @@ fn renderExpression(
413413 return renderExpression(allocator, stream, tree, indent, start_col, infix_op_node.rhs, space);
414414 },
415415
416 ast.Node.Id.PrefixOp => {
416 .PrefixOp => {
417417 const prefix_op_node = @fieldParentPtr(ast.Node.PrefixOp, "base", base);
418418
419419 switch (prefix_op_node.op) {
420 ast.Node.PrefixOp.Op.PtrType => |ptr_info| {
420 .PtrType => |ptr_info| {
421421 const op_tok_id = tree.tokens.at(prefix_op_node.op_token).id;
422422 switch (op_tok_id) {
423423 .Asterisk, .AsteriskAsterisk => try stream.writeByte('*'),
424 .Identifier => try stream.write("[*c]"),
425 .LBracket => try stream.write("[*"),
424 .LBracket => if (tree.tokens.at(prefix_op_node.op_token + 2).id == .Identifier)
425 try stream.write("[*c")
426 else
427 try stream.write("[*"),
426428 else => unreachable,
427429 }
428430 if (ptr_info.sentinel) |sentinel| {
......@@ -435,7 +437,7 @@ fn renderExpression(
435437 try renderExpression(allocator, stream, tree, indent, start_col, sentinel, sentinel_space);
436438 }
437439 switch (op_tok_id) {
438 .Asterisk, .AsteriskAsterisk, .Identifier => {},
440 .Asterisk, .AsteriskAsterisk => {},
439441 .LBracket => try stream.writeByte(']'),
440442 else => unreachable,
441443 }
......@@ -475,7 +477,7 @@ fn renderExpression(
475477 }
476478 },
477479
478 ast.Node.PrefixOp.Op.SliceType => |ptr_info| {
480 .SliceType => |ptr_info| {
479481 try renderToken(tree, stream, prefix_op_node.op_token, indent, start_col, Space.None); // [
480482 if (ptr_info.sentinel) |sentinel| {
481483 const colon_token = tree.prevToken(sentinel.firstToken());
......@@ -522,7 +524,7 @@ fn renderExpression(
522524 }
523525 },
524526
525 ast.Node.PrefixOp.Op.ArrayType => |array_info| {
527 .ArrayType => |array_info| {
526528 const lbracket = prefix_op_node.op_token;
527529 const rbracket = tree.nextToken(if (array_info.sentinel) |sentinel|
528530 sentinel.lastToken()
......@@ -549,20 +551,20 @@ fn renderExpression(
549551 }
550552 try renderToken(tree, stream, rbracket, indent, start_col, Space.None); // ]
551553 },
552 ast.Node.PrefixOp.Op.BitNot,
553 ast.Node.PrefixOp.Op.BoolNot,
554 ast.Node.PrefixOp.Op.Negation,
555 ast.Node.PrefixOp.Op.NegationWrap,
556 ast.Node.PrefixOp.Op.OptionalType,
557 ast.Node.PrefixOp.Op.AddressOf,
554 .BitNot,
555 .BoolNot,
556 .Negation,
557 .NegationWrap,
558 .OptionalType,
559 .AddressOf,
558560 => {
559561 try renderToken(tree, stream, prefix_op_node.op_token, indent, start_col, Space.None);
560562 },
561563
562 ast.Node.PrefixOp.Op.Try,
563 ast.Node.PrefixOp.Op.Await,
564 ast.Node.PrefixOp.Op.Cancel,
565 ast.Node.PrefixOp.Op.Resume,
564 .Try,
565 .Await,
566 .Cancel,
567 .Resume,
566568 => {
567569 try renderToken(tree, stream, prefix_op_node.op_token, indent, start_col, Space.Space);
568570 },
......@@ -571,11 +573,11 @@ fn renderExpression(
571573 return renderExpression(allocator, stream, tree, indent, start_col, prefix_op_node.rhs, space);
572574 },
573575
574 ast.Node.Id.SuffixOp => {
576 .SuffixOp => {
575577 const suffix_op = @fieldParentPtr(ast.Node.SuffixOp, "base", base);
576578
577579 switch (suffix_op.op) {
578 @TagType(ast.Node.SuffixOp.Op).Call => |*call_info| {
580 .Call => |*call_info| {
579581 if (call_info.async_token) |async_token| {
580582 try renderToken(tree, stream, async_token, indent, start_col, Space.Space);
581583 }
......@@ -591,7 +593,7 @@ fn renderExpression(
591593
592594 const src_has_trailing_comma = blk: {
593595 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;
595597 };
596598
597599 if (src_has_trailing_comma) {
......@@ -602,7 +604,7 @@ fn renderExpression(
602604 while (true) {
603605 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: {
606608 break :blk indent;
607609 } else blk: {
608610 try stream.writeByteNTimes(' ', new_indent);
......@@ -636,7 +638,7 @@ fn renderExpression(
636638 return renderToken(tree, stream, suffix_op.rtoken, indent, start_col, space);
637639 },
638640
639 ast.Node.SuffixOp.Op.ArrayAccess => |index_expr| {
641 .ArrayAccess => |index_expr| {
640642 const lbracket = tree.prevToken(index_expr.firstToken());
641643 const rbracket = tree.nextToken(index_expr.lastToken());
642644
......@@ -657,18 +659,18 @@ fn renderExpression(
657659 return renderToken(tree, stream, rbracket, indent, start_col, space); // ]
658660 },
659661
660 ast.Node.SuffixOp.Op.Deref => {
662 .Deref => {
661663 try renderExpression(allocator, stream, tree, indent, start_col, suffix_op.lhs.node, Space.None);
662664 return renderToken(tree, stream, suffix_op.rtoken, indent, start_col, space); // .*
663665 },
664666
665 ast.Node.SuffixOp.Op.UnwrapOptional => {
667 .UnwrapOptional => {
666668 try renderExpression(allocator, stream, tree, indent, start_col, suffix_op.lhs.node, Space.None);
667669 try renderToken(tree, stream, tree.prevToken(suffix_op.rtoken), indent, start_col, Space.None); // .
668670 return renderToken(tree, stream, suffix_op.rtoken, indent, start_col, space); // ?
669671 },
670672
671 @TagType(ast.Node.SuffixOp.Op).Slice => |range| {
673 .Slice => |range| {
672674 try renderExpression(allocator, stream, tree, indent, start_col, suffix_op.lhs.node, Space.None);
673675
674676 const lbracket = tree.prevToken(range.start.firstToken());
......@@ -688,7 +690,7 @@ fn renderExpression(
688690 return renderToken(tree, stream, suffix_op.rtoken, indent, start_col, space); // ]
689691 },
690692
691 ast.Node.SuffixOp.Op.StructInitializer => |*field_inits| {
693 .StructInitializer => |*field_inits| {
692694 const lbrace = switch (suffix_op.lhs) {
693695 .dot => |dot| tree.nextToken(dot),
694696 .node => |node| tree.nextToken(node.lastToken()),
......@@ -705,7 +707,7 @@ fn renderExpression(
705707
706708 const src_has_trailing_comma = blk: {
707709 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;
709711 };
710712
711713 const src_same_line = blk: {
......@@ -729,7 +731,7 @@ fn renderExpression(
729731 const field_init = field_inits.at(0).*.cast(ast.Node.FieldInitializer).?;
730732
731733 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) {
733735 break :blk;
734736 }
735737 }
......@@ -799,7 +801,7 @@ fn renderExpression(
799801 return renderToken(tree, stream, suffix_op.rtoken, indent, start_col, space);
800802 },
801803
802 ast.Node.SuffixOp.Op.ArrayInitializer => |*exprs| {
804 .ArrayInitializer => |*exprs| {
803805 const lbrace = switch (suffix_op.lhs) {
804806 .dot => |dot| tree.nextToken(dot),
805807 .node => |node| tree.nextToken(node.lastToken()),
......@@ -848,7 +850,7 @@ fn renderExpression(
848850 // all on one line
849851 const src_has_trailing_comma = trailblk: {
850852 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;
852854 };
853855 if (src_has_trailing_comma) {
854856 break :blk 1; // force row size 1
......@@ -889,7 +891,7 @@ fn renderExpression(
889891
890892 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) {
893895 try renderToken(tree, stream, lbrace, new_indent, start_col, Space.Newline);
894896 try stream.writeByteNTimes(' ', new_indent);
895897 } else {
......@@ -917,14 +919,14 @@ fn renderExpression(
917919 }
918920 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) {
921923 try renderToken(tree, stream, comma, new_indent, start_col, Space.Newline); // ,
922924 } else {
923925 try renderToken(tree, stream, comma, new_indent, start_col, Space.None); // ,
924926 }
925927
926928 try renderExtraNewline(tree, stream, start_col, next_expr.*);
927 if (next_expr.*.id != ast.Node.Id.MultilineStringLiteral) {
929 if (next_expr.*.id != .MultilineStringLiteral) {
928930 try stream.writeByteNTimes(' ', new_indent);
929931 }
930932 } else {
......@@ -932,7 +934,7 @@ fn renderExpression(
932934 }
933935 }
934936 const last_node = it.prev().?;
935 if (last_node.*.id != ast.Node.Id.MultilineStringLiteral) {
937 if (last_node.*.id != .MultilineStringLiteral) {
936938 try stream.writeByteNTimes(' ', indent);
937939 }
938940 return renderToken(tree, stream, suffix_op.rtoken, indent, start_col, space);
......@@ -955,11 +957,11 @@ fn renderExpression(
955957 }
956958 },
957959
958 ast.Node.Id.ControlFlowExpression => {
960 .ControlFlowExpression => {
959961 const flow_expr = @fieldParentPtr(ast.Node.ControlFlowExpression, "base", base);
960962
961963 switch (flow_expr.kind) {
962 ast.Node.ControlFlowExpression.Kind.Break => |maybe_label| {
964 .Break => |maybe_label| {
963965 if (maybe_label == null and flow_expr.rhs == null) {
964966 return renderToken(tree, stream, flow_expr.ltoken, indent, start_col, space); // break
965967 }
......@@ -975,7 +977,7 @@ fn renderExpression(
975977 try renderExpression(allocator, stream, tree, indent, start_col, label, Space.Space); // label
976978 }
977979 },
978 ast.Node.ControlFlowExpression.Kind.Continue => |maybe_label| {
980 .Continue => |maybe_label| {
979981 assert(flow_expr.rhs == null);
980982
981983 if (maybe_label == null and flow_expr.rhs == null) {
......@@ -990,7 +992,7 @@ fn renderExpression(
990992 return renderExpression(allocator, stream, tree, indent, start_col, label, space);
991993 }
992994 },
993 ast.Node.ControlFlowExpression.Kind.Return => {
995 .Return => {
994996 if (flow_expr.rhs == null) {
995997 return renderToken(tree, stream, flow_expr.ltoken, indent, start_col, space);
996998 }
......@@ -1001,7 +1003,7 @@ fn renderExpression(
10011003 return renderExpression(allocator, stream, tree, indent, start_col, flow_expr.rhs.?, space);
10021004 },
10031005
1004 ast.Node.Id.Payload => {
1006 .Payload => {
10051007 const payload = @fieldParentPtr(ast.Node.Payload, "base", base);
10061008
10071009 try renderToken(tree, stream, payload.lpipe, indent, start_col, Space.None);
......@@ -1009,7 +1011,7 @@ fn renderExpression(
10091011 return renderToken(tree, stream, payload.rpipe, indent, start_col, space);
10101012 },
10111013
1012 ast.Node.Id.PointerPayload => {
1014 .PointerPayload => {
10131015 const payload = @fieldParentPtr(ast.Node.PointerPayload, "base", base);
10141016
10151017 try renderToken(tree, stream, payload.lpipe, indent, start_col, Space.None);
......@@ -1020,7 +1022,7 @@ fn renderExpression(
10201022 return renderToken(tree, stream, payload.rpipe, indent, start_col, space);
10211023 },
10221024
1023 ast.Node.Id.PointerIndexPayload => {
1025 .PointerIndexPayload => {
10241026 const payload = @fieldParentPtr(ast.Node.PointerIndexPayload, "base", base);
10251027
10261028 try renderToken(tree, stream, payload.lpipe, indent, start_col, Space.None);
......@@ -1039,7 +1041,7 @@ fn renderExpression(
10391041 return renderToken(tree, stream, payload.rpipe, indent, start_col, space);
10401042 },
10411043
1042 ast.Node.Id.GroupedExpression => {
1044 .GroupedExpression => {
10431045 const grouped_expr = @fieldParentPtr(ast.Node.GroupedExpression, "base", base);
10441046
10451047 try renderToken(tree, stream, grouped_expr.lparen, indent, start_col, Space.None);
......@@ -1047,7 +1049,7 @@ fn renderExpression(
10471049 return renderToken(tree, stream, grouped_expr.rparen, indent, start_col, space);
10481050 },
10491051
1050 ast.Node.Id.FieldInitializer => {
1052 .FieldInitializer => {
10511053 const field_init = @fieldParentPtr(ast.Node.FieldInitializer, "base", base);
10521054
10531055 try renderToken(tree, stream, field_init.period_token, indent, start_col, Space.None); // .
......@@ -1056,43 +1058,43 @@ fn renderExpression(
10561058 return renderExpression(allocator, stream, tree, indent, start_col, field_init.expr, space);
10571059 },
10581060
1059 ast.Node.Id.IntegerLiteral => {
1061 .IntegerLiteral => {
10601062 const integer_literal = @fieldParentPtr(ast.Node.IntegerLiteral, "base", base);
10611063 return renderToken(tree, stream, integer_literal.token, indent, start_col, space);
10621064 },
1063 ast.Node.Id.FloatLiteral => {
1065 .FloatLiteral => {
10641066 const float_literal = @fieldParentPtr(ast.Node.FloatLiteral, "base", base);
10651067 return renderToken(tree, stream, float_literal.token, indent, start_col, space);
10661068 },
1067 ast.Node.Id.StringLiteral => {
1069 .StringLiteral => {
10681070 const string_literal = @fieldParentPtr(ast.Node.StringLiteral, "base", base);
10691071 return renderToken(tree, stream, string_literal.token, indent, start_col, space);
10701072 },
1071 ast.Node.Id.CharLiteral => {
1073 .CharLiteral => {
10721074 const char_literal = @fieldParentPtr(ast.Node.CharLiteral, "base", base);
10731075 return renderToken(tree, stream, char_literal.token, indent, start_col, space);
10741076 },
1075 ast.Node.Id.BoolLiteral => {
1077 .BoolLiteral => {
10761078 const bool_literal = @fieldParentPtr(ast.Node.CharLiteral, "base", base);
10771079 return renderToken(tree, stream, bool_literal.token, indent, start_col, space);
10781080 },
1079 ast.Node.Id.NullLiteral => {
1081 .NullLiteral => {
10801082 const null_literal = @fieldParentPtr(ast.Node.NullLiteral, "base", base);
10811083 return renderToken(tree, stream, null_literal.token, indent, start_col, space);
10821084 },
1083 ast.Node.Id.Unreachable => {
1085 .Unreachable => {
10841086 const unreachable_node = @fieldParentPtr(ast.Node.Unreachable, "base", base);
10851087 return renderToken(tree, stream, unreachable_node.token, indent, start_col, space);
10861088 },
1087 ast.Node.Id.ErrorType => {
1089 .ErrorType => {
10881090 const error_type = @fieldParentPtr(ast.Node.ErrorType, "base", base);
10891091 return renderToken(tree, stream, error_type.token, indent, start_col, space);
10901092 },
1091 ast.Node.Id.VarType => {
1093 .VarType => {
10921094 const var_type = @fieldParentPtr(ast.Node.VarType, "base", base);
10931095 return renderToken(tree, stream, var_type.token, indent, start_col, space);
10941096 },
1095 ast.Node.Id.ContainerDecl => {
1097 .ContainerDecl => {
10961098 const container_decl = @fieldParentPtr(ast.Node.ContainerDecl, "base", base);
10971099
10981100 if (container_decl.layout_token) |layout_token| {
......@@ -1157,7 +1159,7 @@ fn renderExpression(
11571159 }
11581160 },
11591161
1160 ast.Node.Id.ErrorSetDecl => {
1162 .ErrorSetDecl => {
11611163 const err_set_decl = @fieldParentPtr(ast.Node.ErrorSetDecl, "base", base);
11621164
11631165 const lbrace = tree.nextToken(err_set_decl.error_token);
......@@ -1207,20 +1209,20 @@ fn renderExpression(
12071209 return renderToken(tree, stream, err_set_decl.rbrace_token, indent, start_col, space); // }
12081210 },
12091211
1210 ast.Node.Id.ErrorTag => {
1212 .ErrorTag => {
12111213 const tag = @fieldParentPtr(ast.Node.ErrorTag, "base", base);
12121214
12131215 try renderDocComments(tree, stream, tag, indent, start_col);
12141216 return renderToken(tree, stream, tag.name_token, indent, start_col, space); // name
12151217 },
12161218
1217 ast.Node.Id.MultilineStringLiteral => {
1219 .MultilineStringLiteral => {
12181220 // TODO: Don't indent in this function, but let the caller indent.
12191221 // If this has been implemented, a lot of hacky solutions in i.e. ArrayInit and FunctionCall can be removed
12201222 const multiline_str_literal = @fieldParentPtr(ast.Node.MultilineStringLiteral, "base", base);
12211223
12221224 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) {
12241226 try stream.print("\n");
12251227 skip_first_indent = false;
12261228 }
......@@ -1236,12 +1238,12 @@ fn renderExpression(
12361238 }
12371239 try stream.writeByteNTimes(' ', indent);
12381240 },
1239 ast.Node.Id.UndefinedLiteral => {
1241 .UndefinedLiteral => {
12401242 const undefined_literal = @fieldParentPtr(ast.Node.UndefinedLiteral, "base", base);
12411243 return renderToken(tree, stream, undefined_literal.token, indent, start_col, space);
12421244 },
12431245
1244 ast.Node.Id.BuiltinCall => {
1246 .BuiltinCall => {
12451247 const builtin_call = @fieldParentPtr(ast.Node.BuiltinCall, "base", base);
12461248
12471249 try renderToken(tree, stream, builtin_call.builtin_token, indent, start_col, Space.None); // @name
......@@ -1259,12 +1261,12 @@ fn renderExpression(
12591261 return renderToken(tree, stream, builtin_call.rparen_token, indent, start_col, space); // )
12601262 },
12611263
1262 ast.Node.Id.FnProto => {
1264 .FnProto => {
12631265 const fn_proto = @fieldParentPtr(ast.Node.FnProto, "base", base);
12641266
12651267 if (fn_proto.visib_token) |visib_token_index| {
12661268 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
12691271 try renderToken(tree, stream, visib_token_index, indent, start_col, Space.Space); // pub
12701272 }
......@@ -1361,7 +1363,7 @@ fn renderExpression(
13611363 }
13621364 },
13631365
1364 ast.Node.Id.AnyFrameType => {
1366 .AnyFrameType => {
13651367 const anyframe_type = @fieldParentPtr(ast.Node.AnyFrameType, "base", base);
13661368
13671369 if (anyframe_type.result) |result| {
......@@ -1373,9 +1375,9 @@ fn renderExpression(
13731375 }
13741376 },
13751377
1376 ast.Node.Id.DocComment => unreachable, // doc comments are attached to nodes
1378 .DocComment => unreachable, // doc comments are attached to nodes
13771379
1378 ast.Node.Id.Switch => {
1380 .Switch => {
13791381 const switch_node = @fieldParentPtr(ast.Node.Switch, "base", base);
13801382
13811383 try renderToken(tree, stream, switch_node.switch_token, indent, start_col, Space.Space); // switch
......@@ -1412,14 +1414,14 @@ fn renderExpression(
14121414 return renderToken(tree, stream, switch_node.rbrace, indent, start_col, space); // }
14131415 },
14141416
1415 ast.Node.Id.SwitchCase => {
1417 .SwitchCase => {
14161418 const switch_case = @fieldParentPtr(ast.Node.SwitchCase, "base", base);
14171419
14181420 assert(switch_case.items.len != 0);
14191421 const src_has_trailing_comma = blk: {
14201422 const last_node = switch_case.items.at(switch_case.items.len - 1).*;
14211423 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;
14231425 };
14241426
14251427 if (switch_case.items.len == 1 or !src_has_trailing_comma) {
......@@ -1462,11 +1464,11 @@ fn renderExpression(
14621464
14631465 return renderExpression(allocator, stream, tree, indent, start_col, switch_case.expr, space);
14641466 },
1465 ast.Node.Id.SwitchElse => {
1467 .SwitchElse => {
14661468 const switch_else = @fieldParentPtr(ast.Node.SwitchElse, "base", base);
14671469 return renderToken(tree, stream, switch_else.token, indent, start_col, space);
14681470 },
1469 ast.Node.Id.Else => {
1471 .Else => {
14701472 const else_node = @fieldParentPtr(ast.Node.Else, "base", base);
14711473
14721474 const body_is_block = nodeIsBlock(else_node.body);
......@@ -1489,7 +1491,7 @@ fn renderExpression(
14891491 return renderExpression(allocator, stream, tree, indent, start_col, else_node.body, space);
14901492 },
14911493
1492 ast.Node.Id.While => {
1494 .While => {
14931495 const while_node = @fieldParentPtr(ast.Node.While, "base", base);
14941496
14951497 if (while_node.label) |label| {
......@@ -1564,7 +1566,7 @@ fn renderExpression(
15641566 }
15651567 },
15661568
1567 ast.Node.Id.For => {
1569 .For => {
15681570 const for_node = @fieldParentPtr(ast.Node.For, "base", base);
15691571
15701572 if (for_node.label) |label| {
......@@ -1582,7 +1584,7 @@ fn renderExpression(
15821584
15831585 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;
15861588 const src_one_line_to_body = !body_is_block and tree.tokensOnSameLine(rparen, for_node.body.firstToken());
15871589 const body_on_same_line = body_is_block or src_one_line_to_body;
15881590
......@@ -1614,7 +1616,7 @@ fn renderExpression(
16141616 }
16151617 },
16161618
1617 ast.Node.Id.If => {
1619 .If => {
16181620 const if_node = @fieldParentPtr(ast.Node.If, "base", base);
16191621
16201622 const lparen = tree.prevToken(if_node.condition.firstToken());
......@@ -1625,7 +1627,7 @@ fn renderExpression(
16251627
16261628 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;
16291631 const body_is_block = nodeIsBlock(if_node.body);
16301632
16311633 if (body_is_if_block) {
......@@ -1708,7 +1710,7 @@ fn renderExpression(
17081710 }
17091711 },
17101712
1711 ast.Node.Id.Asm => {
1713 .Asm => {
17121714 const asm_node = @fieldParentPtr(ast.Node.Asm, "base", base);
17131715
17141716 try renderToken(tree, stream, asm_node.asm_token, indent, start_col, Space.Space); // asm
......@@ -1729,7 +1731,7 @@ fn renderExpression(
17291731
17301732 const indent_once = indent + indent_delta;
17311733
1732 if (asm_node.template.id == ast.Node.Id.MultilineStringLiteral) {
1734 if (asm_node.template.id == .MultilineStringLiteral) {
17331735 // After rendering a multiline string literal the cursor is
17341736 // already offset by indent
17351737 try stream.writeByteNTimes(' ', indent_delta);
......@@ -1771,7 +1773,7 @@ fn renderExpression(
17711773 try stream.writeByteNTimes(' ', indent_once);
17721774 const comma_or_colon = tree.nextToken(node.lastToken());
17731775 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),
17751777 else => comma_or_colon,
17761778 };
17771779 }
......@@ -1809,7 +1811,7 @@ fn renderExpression(
18091811 try stream.writeByteNTimes(' ', indent_once);
18101812 const comma_or_colon = tree.nextToken(node.lastToken());
18111813 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),
18131815 else => comma_or_colon,
18141816 };
18151817 }
......@@ -1834,7 +1836,7 @@ fn renderExpression(
18341836 }
18351837 },
18361838
1837 ast.Node.Id.AsmInput => {
1839 .AsmInput => {
18381840 const asm_input = @fieldParentPtr(ast.Node.AsmInput, "base", base);
18391841
18401842 try stream.write("[");
......@@ -1846,7 +1848,7 @@ fn renderExpression(
18461848 return renderToken(tree, stream, asm_input.lastToken(), indent, start_col, space); // )
18471849 },
18481850
1849 ast.Node.Id.AsmOutput => {
1851 .AsmOutput => {
18501852 const asm_output = @fieldParentPtr(ast.Node.AsmOutput, "base", base);
18511853
18521854 try stream.write("[");
......@@ -1868,19 +1870,19 @@ fn renderExpression(
18681870 return renderToken(tree, stream, asm_output.lastToken(), indent, start_col, space); // )
18691871 },
18701872
1871 ast.Node.Id.EnumLiteral => {
1873 .EnumLiteral => {
18721874 const enum_literal = @fieldParentPtr(ast.Node.EnumLiteral, "base", base);
18731875
18741876 try renderToken(tree, stream, enum_literal.dot, indent, start_col, Space.None); // .
18751877 return renderToken(tree, stream, enum_literal.name, indent, start_col, space); // name
18761878 },
18771879
1878 ast.Node.Id.ContainerField,
1879 ast.Node.Id.Root,
1880 ast.Node.Id.VarDecl,
1881 ast.Node.Id.Use,
1882 ast.Node.Id.TestDecl,
1883 ast.Node.Id.ParamDecl,
1880 .ContainerField,
1881 .Root,
1882 .VarDecl,
1883 .Use,
1884 .TestDecl,
1885 .ParamDecl,
18841886 => unreachable,
18851887 }
18861888}
......@@ -1949,7 +1951,7 @@ fn renderVarDecl(
19491951 }
19501952
19511953 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;
19531955 try renderToken(tree, stream, var_decl.eq_token, indent, start_col, s); // =
19541956 try renderExpression(allocator, stream, tree, indent, start_col, init_node, Space.None);
19551957 }
......@@ -1996,7 +1998,7 @@ fn renderStatement(
19961998 base: *ast.Node,
19971999) (@typeOf(stream).Child.Error || Error)!void {
19982000 switch (base.id) {
1999 ast.Node.Id.VarDecl => {
2001 .VarDecl => {
20002002 const var_decl = @fieldParentPtr(ast.Node.VarDecl, "base", base);
20012003 try renderVarDecl(allocator, stream, tree, indent, start_col, var_decl);
20022004 },
......@@ -2005,7 +2007,7 @@ fn renderStatement(
20052007 try renderExpression(allocator, stream, tree, indent, start_col, base, Space.None);
20062008
20072009 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);
20092011 try renderToken(tree, stream, semicolon_index, indent, start_col, Space.Newline);
20102012 } else {
20112013 try renderExpression(allocator, stream, tree, indent, start_col, base, Space.Newline);
......@@ -2052,13 +2054,13 @@ fn renderTokenOffset(
20522054 var next_token = tree.tokens.at(token_index + 1);
20532055
20542056 if (space == Space.Comma) switch (next_token.id) {
2055 Token.Id.Comma => return renderToken(tree, stream, token_index + 1, indent, start_col, Space.Newline),
2056 Token.Id.LineComment => {
2057 .Comma => return renderToken(tree, stream, token_index + 1, indent, start_col, Space.Newline),
2058 .LineComment => {
20572059 try stream.write(", ");
20582060 return renderToken(tree, stream, token_index + 1, indent, start_col, Space.Newline);
20592061 },
20602062 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) {
20622064 try stream.write(",");
20632065 return;
20642066 } else {
......@@ -2071,7 +2073,7 @@ fn renderTokenOffset(
20712073
20722074 // Skip over same line doc comments
20732075 var offset: usize = 1;
2074 if (next_token.id == Token.Id.DocComment) {
2076 if (next_token.id == .DocComment) {
20752077 const loc = tree.tokenLocationPtr(token.end, next_token);
20762078 if (loc.line == 0) {
20772079 offset += 1;
......@@ -2079,11 +2081,11 @@ fn renderTokenOffset(
20792081 }
20802082 }
20812083
2082 if (next_token.id != Token.Id.LineComment) blk: {
2084 if (next_token.id != .LineComment) blk: {
20832085 switch (space) {
20842086 Space.None, Space.NoNewline => return,
20852087 Space.Newline => {
2086 if (next_token.id == Token.Id.MultilineStringLiteralLine) {
2088 if (next_token.id == .MultilineStringLiteralLine) {
20872089 return;
20882090 } else {
20892091 try stream.write("\n");
......@@ -2092,7 +2094,7 @@ fn renderTokenOffset(
20922094 }
20932095 },
20942096 Space.Space, Space.SpaceOrOutdent => {
2095 if (next_token.id == Token.Id.MultilineStringLiteralLine)
2097 if (next_token.id == .MultilineStringLiteralLine)
20962098 return;
20972099 try stream.writeByte(' ');
20982100 return;
......@@ -2128,13 +2130,13 @@ fn renderTokenOffset(
21282130 offset = 2;
21292131 token = next_token;
21302132 next_token = tree.tokens.at(token_index + offset);
2131 if (next_token.id != Token.Id.LineComment) {
2133 if (next_token.id != .LineComment) {
21322134 switch (space) {
21332135 Space.None, Space.Space => {
21342136 try stream.writeByte('\n');
21352137 const after_comment_token = tree.tokens.at(token_index + offset);
21362138 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,
21382140 else => indent + indent_delta,
21392141 };
21402142 try stream.writeByteNTimes(' ', next_line_indent);
......@@ -2146,7 +2148,7 @@ fn renderTokenOffset(
21462148 start_col.* = indent;
21472149 },
21482150 Space.Newline => {
2149 if (next_token.id == Token.Id.MultilineStringLiteralLine) {
2151 if (next_token.id == .MultilineStringLiteralLine) {
21502152 return;
21512153 } else {
21522154 try stream.write("\n");
......@@ -2172,10 +2174,10 @@ fn renderTokenOffset(
21722174 offset += 1;
21732175 token = next_token;
21742176 next_token = tree.tokens.at(token_index + offset);
2175 if (next_token.id != Token.Id.LineComment) {
2177 if (next_token.id != .LineComment) {
21762178 switch (space) {
21772179 Space.Newline => {
2178 if (next_token.id == Token.Id.MultilineStringLiteralLine) {
2180 if (next_token.id == .MultilineStringLiteralLine) {
21792181 return;
21802182 } else {
21812183 try stream.write("\n");
......@@ -2188,7 +2190,7 @@ fn renderTokenOffset(
21882190
21892191 const after_comment_token = tree.tokens.at(token_index + offset);
21902192 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: {
21922194 if (indent > indent_delta) {
21932195 break :blk indent - indent_delta;
21942196 } else {
......@@ -2249,11 +2251,11 @@ fn renderDocComments(
22492251
22502252fn nodeIsBlock(base: *const ast.Node) bool {
22512253 return switch (base.id) {
2252 ast.Node.Id.Block,
2253 ast.Node.Id.If,
2254 ast.Node.Id.For,
2255 ast.Node.Id.While,
2256 ast.Node.Id.Switch,
2254 .Block,
2255 .If,
2256 .For,
2257 .While,
2258 .Switch,
22572259 => true,
22582260 else => false,
22592261 };