authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2021-02-09 20:08:40-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2021-02-09 20:08:40-07:00
log39acc4c02004f4e106b7c280f3f6bb070df88178
tree40aa89c158e10f85c15cbd42b3f8b468cc76b485
parent1c79eea125c7e21b00a7abeffdc3b64548c54257

zig fmt: for loops


4 files changed, 200 insertions(+), 212 deletions(-)

lib/std/zig/ast.zig+27-4
......@@ -512,6 +512,7 @@ pub const Tree = struct {
512512 .ErrorUnion,
513513 .IfSimple,
514514 .WhileSimple,
515 .ForSimple,
515516 .FnDecl,
516517 .PtrTypeAligned,
517518 .PtrTypeSentinel,
......@@ -531,6 +532,7 @@ pub const Tree = struct {
531532 .AsmInput,
532533 .FnProtoSimple,
533534 .FnProtoMulti,
535 .ErrorValue,
534536 => return datas[n].rhs + end_offset,
535537
536538 .AnyType,
......@@ -854,7 +856,7 @@ pub const Tree = struct {
854856 assert(extra.else_expr != 0);
855857 n = extra.else_expr;
856858 },
857 .If => {
859 .If, .For => {
858860 const extra = tree.extraData(datas[n].rhs, Node.If);
859861 assert(extra.else_expr != 0);
860862 n = extra.else_expr;
......@@ -876,9 +878,6 @@ pub const Tree = struct {
876878 .SwitchRange => unreachable, // TODO
877879 .ArrayType => unreachable, // TODO
878880 .ArrayTypeSentinel => unreachable, // TODO
879 .ForSimple => unreachable, // TODO
880 .For => unreachable, // TODO
881 .ErrorValue => unreachable, // TODO
882881 };
883882 }
884883
......@@ -1457,6 +1456,29 @@ pub const Tree = struct {
14571456 });
14581457 }
14591458
1459 pub fn forSimple(tree: Tree, node: Node.Index) full.While {
1460 const data = tree.nodes.items(.data)[node];
1461 return tree.fullWhile(.{
1462 .while_token = tree.nodes.items(.main_token)[node],
1463 .cond_expr = data.lhs,
1464 .cont_expr = 0,
1465 .then_expr = data.rhs,
1466 .else_expr = 0,
1467 });
1468 }
1469
1470 pub fn forFull(tree: Tree, node: Node.Index) full.While {
1471 const data = tree.nodes.items(.data)[node];
1472 const extra = tree.extraData(data.rhs, Node.If);
1473 return tree.fullWhile(.{
1474 .while_token = tree.nodes.items(.main_token)[node],
1475 .cond_expr = data.lhs,
1476 .cont_expr = 0,
1477 .then_expr = extra.then_expr,
1478 .else_expr = extra.else_expr,
1479 });
1480 }
1481
14601482 fn fullVarDecl(tree: Tree, info: full.VarDecl.Ast) full.VarDecl {
14611483 const token_tags = tree.tokens.items(.tag);
14621484 var result: full.VarDecl = .{
......@@ -2356,6 +2378,7 @@ pub const Node = struct {
23562378 /// main_token is the `=>`
23572379 SwitchCaseOne,
23582380 /// `a, b, c => rhs`. `SubRange[lhs]`.
2381 /// main_token is the `=>`
23592382 SwitchCase,
23602383 /// `lhs...rhs`.
23612384 SwitchRange,
lib/std/zig/parse.zig+14-19
......@@ -835,12 +835,11 @@ const Parser = struct {
835835 });
836836 }
837837
838 const token = p.nextToken();
839 switch (p.token_tags[token]) {
838 switch (p.token_tags[p.tok_i]) {
840839 .Keyword_nosuspend => {
841840 return p.addNode(.{
842841 .tag = .Nosuspend,
843 .main_token = token,
842 .main_token = p.nextToken(),
844843 .data = .{
845844 .lhs = try p.expectBlockExprStatement(),
846845 .rhs = undefined,
......@@ -848,6 +847,7 @@ const Parser = struct {
848847 });
849848 },
850849 .Keyword_suspend => {
850 const token = p.nextToken();
851851 const block_expr: Node.Index = if (p.eatToken(.Semicolon) != null)
852852 0
853853 else
......@@ -863,7 +863,7 @@ const Parser = struct {
863863 },
864864 .Keyword_defer => return p.addNode(.{
865865 .tag = .Defer,
866 .main_token = token,
866 .main_token = p.nextToken(),
867867 .data = .{
868868 .lhs = undefined,
869869 .rhs = try p.expectBlockExprStatement(),
......@@ -871,24 +871,20 @@ const Parser = struct {
871871 }),
872872 .Keyword_errdefer => return p.addNode(.{
873873 .tag = .ErrDefer,
874 .main_token = token,
874 .main_token = p.nextToken(),
875875 .data = .{
876876 .lhs = try p.parsePayload(),
877877 .rhs = try p.expectBlockExprStatement(),
878878 },
879879 }),
880 else => p.tok_i -= 1,
880 .Keyword_switch => return p.expectSwitchExpr(),
881 .Keyword_if => return p.expectIfStatement(),
882 else => {},
881883 }
882884
883 const if_statement = try p.parseIfStatement();
884 if (if_statement != 0) return if_statement;
885
886885 const labeled_statement = try p.parseLabeledStatement();
887886 if (labeled_statement != 0) return labeled_statement;
888887
889 const switch_expr = try p.parseSwitchExpr();
890 if (switch_expr != 0) return switch_expr;
891
892888 const assign_expr = try p.parseAssignExpr();
893889 if (assign_expr != 0) {
894890 _ = try p.expectTokenRecoverable(.Semicolon);
......@@ -925,8 +921,8 @@ const Parser = struct {
925921 /// IfStatement
926922 /// <- IfPrefix BlockExpr ( KEYWORD_else Payload? Statement )?
927923 /// / IfPrefix AssignExpr ( SEMICOLON / KEYWORD_else Payload? Statement )
928 fn parseIfStatement(p: *Parser) !Node.Index {
929 const if_token = p.eatToken(.Keyword_if) orelse return null_node;
924 fn expectIfStatement(p: *Parser) !Node.Index {
925 const if_token = p.assertToken(.Keyword_if);
930926 _ = try p.expectToken(.LParen);
931927 const condition = try p.expectExpr();
932928 _ = try p.expectToken(.RParen);
......@@ -2441,7 +2437,7 @@ const Parser = struct {
24412437 .Builtin => return p.parseBuiltinCall(),
24422438 .Keyword_fn => return p.parseFnProto(),
24432439 .Keyword_if => return p.parseIf(parseTypeExpr),
2444 .Keyword_switch => return p.parseSwitchExpr(),
2440 .Keyword_switch => return p.expectSwitchExpr(),
24452441
24462442 .Keyword_extern,
24472443 .Keyword_packed,
......@@ -2880,8 +2876,8 @@ const Parser = struct {
28802876 }
28812877
28822878 /// SwitchExpr <- KEYWORD_switch LPAREN Expr RPAREN LBRACE SwitchProngList RBRACE
2883 fn parseSwitchExpr(p: *Parser) !Node.Index {
2884 const switch_token = p.eatToken(.Keyword_switch) orelse return null_node;
2879 fn expectSwitchExpr(p: *Parser) !Node.Index {
2880 const switch_token = p.assertToken(.Keyword_switch);
28852881 _ = try p.expectToken(.LParen);
28862882 const expr_node = try p.expectExpr();
28872883 _ = try p.expectToken(.RParen);
......@@ -3191,8 +3187,7 @@ const Parser = struct {
31913187 const first_item = try p.parseSwitchItem();
31923188 if (first_item == 0) return null_node;
31933189
3194 if (p.token_tags[p.tok_i] == .RBrace) {
3195 const arrow_token = try p.expectToken(.EqualAngleBracketRight);
3190 if (p.eatToken(.EqualAngleBracketRight)) |arrow_token| {
31963191 _ = try p.parsePtrPayload();
31973192 return p.addNode(.{
31983193 .tag = .SwitchCaseOne,
lib/std/zig/parser_test.zig+75-80
......@@ -2830,86 +2830,81 @@ test "zig fmt: switch" {
28302830// \\
28312831// );
28322832//}
2833//
2834//test "zig fmt: for" {
2835// try testCanonical(
2836// \\test "for" {
2837// \\ for (a) |v| {
2838// \\ continue;
2839// \\ }
2840// \\
2841// \\ for (a) |v| continue;
2842// \\
2843// \\ for (a) |v| continue else return;
2844// \\
2845// \\ for (a) |v| {
2846// \\ continue;
2847// \\ } else return;
2848// \\
2849// \\ for (a) |v| continue else {
2850// \\ return;
2851// \\ }
2852// \\
2853// \\ for (a) |v|
2854// \\ continue
2855// \\ else
2856// \\ return;
2857// \\
2858// \\ for (a) |v|
2859// \\ continue;
2860// \\
2861// \\ for (a) |*v|
2862// \\ continue;
2863// \\
2864// \\ for (a) |v, i| {
2865// \\ continue;
2866// \\ }
2867// \\
2868// \\ for (a) |v, i|
2869// \\ continue;
2870// \\
2871// \\ for (a) |b| switch (b) {
2872// \\ c => {},
2873// \\ d => {},
2874// \\ };
2875// \\
2876// \\ for (a) |b|
2877// \\ switch (b) {
2878// \\ c => {},
2879// \\ d => {},
2880// \\ };
2881// \\
2882// \\ const res = for (a) |v, i| {
2883// \\ break v;
2884// \\ } else {
2885// \\ unreachable;
2886// \\ };
2887// \\
2888// \\ var num: usize = 0;
2889// \\ inline for (a) |v, i| {
2890// \\ num += v;
2891// \\ num += i;
2892// \\ }
2893// \\}
2894// \\
2895// );
2896//
2897// try testTransform(
2898// \\test "fix for" {
2899// \\ for (a) |x|
2900// \\ f(x) else continue;
2901// \\}
2902// \\
2903// ,
2904// \\test "fix for" {
2905// \\ for (a) |x|
2906// \\ f(x)
2907// \\ else continue;
2908// \\}
2909// \\
2910// );
2911//}
2912//
2833
2834test "zig fmt: for" {
2835 try testCanonical(
2836 \\test "for" {
2837 \\ for (a) |v| {
2838 \\ continue;
2839 \\ }
2840 \\
2841 \\ for (a) |v| continue;
2842 \\
2843 \\ for (a) |v| continue else return;
2844 \\
2845 \\ for (a) |v| {
2846 \\ continue;
2847 \\ } else return;
2848 \\
2849 \\ for (a) |v| continue else {
2850 \\ return;
2851 \\ }
2852 \\
2853 \\ for (a) |v|
2854 \\ continue
2855 \\ else
2856 \\ return;
2857 \\
2858 \\ for (a) |v|
2859 \\ continue;
2860 \\
2861 \\ for (a) |*v|
2862 \\ continue;
2863 \\
2864 \\ for (a) |v, i| {
2865 \\ continue;
2866 \\ }
2867 \\
2868 \\ for (a) |v, i|
2869 \\ continue;
2870 \\
2871 \\ for (a) |b| switch (b) {
2872 \\ c => {},
2873 \\ d => {},
2874 \\ };
2875 \\
2876 \\ const res = for (a) |v, i| {
2877 \\ break v;
2878 \\ } else {
2879 \\ unreachable;
2880 \\ };
2881 \\
2882 \\ var num: usize = 0;
2883 \\ inline for (a) |v, i| {
2884 \\ num += v;
2885 \\ num += i;
2886 \\ }
2887 \\}
2888 \\
2889 );
2890
2891 try testTransform(
2892 \\test "fix for" {
2893 \\ for (a) |x|
2894 \\ f(x) else continue;
2895 \\}
2896 \\
2897 ,
2898 \\test "fix for" {
2899 \\ for (a) |x|
2900 \\ f(x)
2901 \\ else
2902 \\ continue;
2903 \\}
2904 \\
2905 );
2906}
2907
29132908//test "zig fmt: if" {
29142909// try testCanonical(
29152910// \\test "if" {
lib/std/zig/render.zig+84-109
......@@ -498,18 +498,17 @@ fn renderExpression(ais: *Ais, tree: ast.Tree, node: ast.Node.Index, space: Spac
498498 }
499499 },
500500
501 .Continue => unreachable, // TODO
502 //.Continue => {
503 // const flow_expr = base.castTag(.Continue).?;
504 // if (flow_expr.getLabel()) |label| {
505 // try renderToken(ais, tree, flow_expr.ltoken, Space.Space); // continue
506 // const colon = tree.nextToken(flow_expr.ltoken);
507 // try renderToken(ais, tree, colon, Space.None); // :
508 // return renderToken(ais, tree, label, space); // label
509 // } else {
510 // return renderToken(ais, tree, flow_expr.ltoken, space); // continue
511 // }
512 //},
501 .Continue => {
502 const main_token = main_tokens[node];
503 const label = datas[node].lhs;
504 if (label != 0) {
505 try renderToken(ais, tree, main_token, .Space); // continue
506 try renderToken(ais, tree, label - 1, .None); // :
507 return renderToken(ais, tree, label, space); // label
508 } else {
509 return renderToken(ais, tree, main_token, space); // continue
510 }
511 },
513512
514513 .Return => {
515514 if (datas[node].lhs != 0) {
......@@ -664,17 +663,16 @@ fn renderExpression(ais: *Ais, tree: ast.Tree, node: ast.Node.Index, space: Spac
664663 if (cases.len == 0) {
665664 try renderToken(ais, tree, rparen + 1, .None); // lbrace
666665 return renderToken(ais, tree, rparen + 2, space); // rbrace
667 } else {
668 try renderToken(ais, tree, rparen + 1, .Newline); // lbrace
669 ais.pushIndent();
670 try renderExpression(ais, tree, cases[0], .Comma);
671 for (cases[1..]) |case| {
672 try renderExtraNewline(ais, tree, case);
673 try renderExpression(ais, tree, case, .Comma);
674 }
675 ais.popIndent();
676 return renderToken(ais, tree, tree.lastToken(node), space); // rbrace
677666 }
667 try renderToken(ais, tree, rparen + 1, .Newline); // lbrace
668 ais.pushIndent();
669 try renderExpression(ais, tree, cases[0], .Comma);
670 for (cases[1..]) |case| {
671 try renderExtraNewline(ais, tree, case);
672 try renderExpression(ais, tree, case, .Comma);
673 }
674 ais.popIndent();
675 return renderToken(ais, tree, tree.lastToken(node), space); // rbrace
678676 },
679677
680678 .SwitchCaseOne => return renderSwitchCase(ais, tree, tree.switchCaseOne(node), space),
......@@ -683,59 +681,8 @@ fn renderExpression(ais: *Ais, tree: ast.Tree, node: ast.Node.Index, space: Spac
683681 .WhileSimple => return renderWhile(ais, tree, tree.whileSimple(node), space),
684682 .WhileCont => return renderWhile(ais, tree, tree.whileCont(node), space),
685683 .While => return renderWhile(ais, tree, tree.whileFull(node), space),
686
687 .ForSimple => unreachable, // TODO
688 .For => unreachable, // TODO
689 //.For => {
690 // const for_node = @fieldParentPtr(ast.Node.For, "base", base);
691
692 // if (for_node.label) |label| {
693 // try renderToken(ais, tree, label, Space.None); // label
694 // try renderToken(ais, tree, tree.nextToken(label), Space.Space); // :
695 // }
696
697 // if (for_node.inline_token) |inline_token| {
698 // try renderToken(ais, tree, inline_token, Space.Space); // inline
699 // }
700
701 // try renderToken(ais, tree, for_node.for_token, Space.Space); // for
702 // try renderToken(ais, tree, tree.nextToken(for_node.for_token), Space.None); // (
703 // try renderExpression(ais, tree, for_node.array_expr, Space.None);
704
705 // const rparen = tree.nextToken(for_node.array_expr.lastToken());
706
707 // const body_is_block = for_node.body.tag.isBlock();
708 // const src_one_line_to_body = !body_is_block and tree.tokensOnSameLine(rparen, for_node.body.firstToken());
709 // const body_on_same_line = body_is_block or src_one_line_to_body;
710
711 // try renderToken(ais, tree, rparen, Space.Space); // )
712
713 // const space_after_payload = if (body_on_same_line) Space.Space else Space.Newline;
714 // try renderExpression(ais, tree, for_node.payload, space_after_payload); // |x|
715
716 // const space_after_body = blk: {
717 // if (for_node.@"else") |@"else"| {
718 // const src_one_line_to_else = tree.tokensOnSameLine(rparen, @"else".firstToken());
719 // if (body_is_block or src_one_line_to_else) {
720 // break :blk Space.Space;
721 // } else {
722 // break :blk Space.Newline;
723 // }
724 // } else {
725 // break :blk space;
726 // }
727 // };
728
729 // {
730 // if (!body_on_same_line) ais.pushIndent();
731 // defer if (!body_on_same_line) ais.popIndent();
732 // try renderExpression(ais, tree, for_node.body, space_after_body); // { body }
733 // }
734
735 // if (for_node.@"else") |@"else"| {
736 // return renderExpression(ais, tree, &@"else".base, space); // else
737 // }
738 //},
684 .ForSimple => return renderWhile(ais, tree, tree.forSimple(node), space),
685 .For => return renderWhile(ais, tree, tree.forFull(node), space),
739686
740687 .IfSimple => return renderIf(ais, tree, tree.ifSimple(node), space),
741688 .If => return renderIf(ais, tree, tree.ifFull(node), space),
......@@ -1041,7 +988,7 @@ fn renderIf(ais: *Ais, tree: ast.Tree, if_node: ast.full.If, space: Space) Error
1041988 }, space);
1042989}
1043990
1044/// Note that this function is additionally used to render if expressions, with
991/// Note that this function is additionally used to render if and for expressions, with
1045992/// respective values set to null.
1046993fn renderWhile(ais: *Ais, tree: ast.Tree, while_node: ast.full.While, space: Space) Error!void {
1047994 const node_tags = tree.nodes.items(.tag);
......@@ -1061,21 +1008,31 @@ fn renderWhile(ais: *Ais, tree: ast.Tree, while_node: ast.full.While, space: Spa
10611008 try renderExpression(ais, tree, while_node.ast.cond_expr, .None); // condition
10621009
10631010 if (nodeIsBlock(node_tags[while_node.ast.then_expr])) {
1064 const payload_space: Space = if (while_node.ast.cont_expr != 0) .Space else .BlockStart;
10651011 if (while_node.payload_token) |payload_token| {
10661012 try renderToken(ais, tree, payload_token - 2, .Space); // )
10671013 try renderToken(ais, tree, payload_token - 1, .None); // |
1068 if (token_tags[payload_token] == .Asterisk) {
1069 try renderToken(ais, tree, payload_token, .None); // *
1070 try renderToken(ais, tree, payload_token + 1, .None); // identifier
1071 try renderToken(ais, tree, payload_token + 2, payload_space); // |
1072 } else {
1073 try renderToken(ais, tree, payload_token, .None); // identifier
1074 try renderToken(ais, tree, payload_token + 1, payload_space); // |
1075 }
1014 const ident = blk: {
1015 if (token_tags[payload_token] == .Asterisk) {
1016 try renderToken(ais, tree, payload_token, .None); // *
1017 break :blk payload_token + 1;
1018 } else {
1019 break :blk payload_token;
1020 }
1021 };
1022 try renderToken(ais, tree, ident, .None); // identifier
1023 const pipe = blk: {
1024 if (token_tags[ident + 1] == .Comma) {
1025 try renderToken(ais, tree, ident + 1, .Space); // ,
1026 try renderToken(ais, tree, ident + 2, .None); // index
1027 break :blk payload_token + 3;
1028 } else {
1029 break :blk ident + 1;
1030 }
1031 };
1032 try renderToken(ais, tree, pipe, .Space); // |
10761033 } else {
10771034 const rparen = tree.lastToken(while_node.ast.cond_expr) + 1;
1078 try renderToken(ais, tree, rparen, payload_space); // )
1035 try renderToken(ais, tree, rparen, .Space); // )
10791036 }
10801037 if (while_node.ast.cont_expr != 0) {
10811038 const rparen = tree.lastToken(while_node.ast.cont_expr) + 1;
......@@ -1083,7 +1040,7 @@ fn renderWhile(ais: *Ais, tree: ast.Tree, while_node: ast.full.While, space: Spa
10831040 try renderToken(ais, tree, lparen - 1, .Space); // :
10841041 try renderToken(ais, tree, lparen, .None); // lparen
10851042 try renderExpression(ais, tree, while_node.ast.cont_expr, .None);
1086 try renderToken(ais, tree, rparen, .BlockStart); // rparen
1043 try renderToken(ais, tree, rparen, .Space); // rparen
10871044 }
10881045 if (while_node.ast.else_expr != 0) {
10891046 try renderExpression(ais, tree, while_node.ast.then_expr, Space.Space);
......@@ -1104,15 +1061,31 @@ fn renderWhile(ais: *Ais, tree: ast.Tree, while_node: ast.full.While, space: Spa
11041061 const src_has_newline = !tree.tokensOnSameLine(rparen, last_then_token);
11051062
11061063 if (src_has_newline) {
1107 const payload_space: Space = if (while_node.ast.cont_expr != 0) .Space else .Newline;
11081064 if (while_node.payload_token) |payload_token| {
11091065 try renderToken(ais, tree, payload_token - 2, .Space); // )
11101066 try renderToken(ais, tree, payload_token - 1, .None); // |
1111 try renderToken(ais, tree, payload_token, .None); // identifier
1112 try renderToken(ais, tree, payload_token + 1, payload_space); // |
1067 const ident = blk: {
1068 if (token_tags[payload_token] == .Asterisk) {
1069 try renderToken(ais, tree, payload_token, .None); // *
1070 break :blk payload_token + 1;
1071 } else {
1072 break :blk payload_token;
1073 }
1074 };
1075 try renderToken(ais, tree, ident, .None); // identifier
1076 const pipe = blk: {
1077 if (token_tags[ident + 1] == .Comma) {
1078 try renderToken(ais, tree, ident + 1, .Space); // ,
1079 try renderToken(ais, tree, ident + 2, .None); // index
1080 break :blk payload_token + 3;
1081 } else {
1082 break :blk ident + 1;
1083 }
1084 };
1085 try renderToken(ais, tree, pipe, .Newline); // |
11131086 } else {
11141087 ais.pushIndent();
1115 try renderToken(ais, tree, rparen, payload_space); // )
1088 try renderToken(ais, tree, rparen, .Newline); // )
11161089 ais.popIndent();
11171090 }
11181091 if (while_node.ast.cont_expr != 0) {
......@@ -1164,14 +1137,25 @@ fn renderWhile(ais: *Ais, tree: ast.Tree, while_node: ast.full.While, space: Spa
11641137 assert(payload_token - 2 == rparen);
11651138 try renderToken(ais, tree, payload_token - 2, .Space); // )
11661139 try renderToken(ais, tree, payload_token - 1, .None); // |
1167 if (token_tags[payload_token] == .Asterisk) {
1168 try renderToken(ais, tree, payload_token, .None); // *
1169 try renderToken(ais, tree, payload_token + 1, .None); // identifier
1170 try renderToken(ais, tree, payload_token + 2, .Space); // |
1171 } else {
1172 try renderToken(ais, tree, payload_token, .None); // identifier
1173 try renderToken(ais, tree, payload_token + 1, .Space); // |
1174 }
1140 const ident = blk: {
1141 if (token_tags[payload_token] == .Asterisk) {
1142 try renderToken(ais, tree, payload_token, .None); // *
1143 break :blk payload_token + 1;
1144 } else {
1145 break :blk payload_token;
1146 }
1147 };
1148 try renderToken(ais, tree, ident, .None); // identifier
1149 const pipe = blk: {
1150 if (token_tags[ident + 1] == .Comma) {
1151 try renderToken(ais, tree, ident + 1, .Space); // ,
1152 try renderToken(ais, tree, ident + 2, .None); // index
1153 break :blk payload_token + 3;
1154 } else {
1155 break :blk ident + 1;
1156 }
1157 };
1158 try renderToken(ais, tree, pipe, .Space); // |
11751159 } else {
11761160 try renderToken(ais, tree, rparen, .Space); // )
11771161 }
......@@ -1952,18 +1936,9 @@ const Space = enum {
19521936 Semicolon,
19531937 /// Skips writing the possible line comment after the token.
19541938 NoComment,
1955 /// Intended when rendering lbrace tokens. Depending on whether the line is
1956 /// "over indented", will output a newline or a single space afterwards.
1957 /// See `std.io.AutoIndentingStream` for the definition of "over indented".
1958 BlockStart,
19591939};
19601940
19611941fn renderToken(ais: *Ais, tree: ast.Tree, token_index: ast.TokenIndex, space: Space) Error!void {
1962 if (space == Space.BlockStart) {
1963 const new_space: Space = if (ais.isLineOverIndented()) .Newline else .Space;
1964 return renderToken(ais, tree, token_index, new_space);
1965 }
1966
19671942 const token_tags = tree.tokens.items(.tag);
19681943 const token_starts = tree.tokens.items(.start);
19691944
......@@ -2020,7 +1995,6 @@ fn renderToken(ais: *Ais, tree: ast.Tree, token_index: ast.TokenIndex, space: Sp
20201995 try ais.insertNewline();
20211996 }
20221997 },
2023 .BlockStart => unreachable,
20241998 }
20251999}
20262000
......@@ -2069,6 +2043,7 @@ fn nodeIsBlock(tag: ast.Node.Tag) bool {
20692043 .WhileSimple,
20702044 .WhileCont,
20712045 .Switch,
2046 .SwitchComma,
20722047 => true,
20732048 else => false,
20742049 };