| ... | @@ -567,13 +567,13 @@ fn renderExpression(ais: *Ais, tree: ast.Tree, node: ast.Node.Index, space: Spac | ... | @@ -567,13 +567,13 @@ fn renderExpression(ais: *Ais, tree: ast.Tree, node: ast.Node.Index, space: Spac |
| 567 | if (lbrace + 1 == rbrace) { | 567 | if (lbrace + 1 == rbrace) { |
| 568 | // There is nothing between the braces so render condensed: `error{}` | 568 | // There is nothing between the braces so render condensed: `error{}` |
| 569 | try renderToken(ais, tree, lbrace, .None); | 569 | try renderToken(ais, tree, lbrace, .None); |
| 570 | try renderToken(ais, tree, rbrace, space); | 570 | return renderToken(ais, tree, rbrace, space); |
| 571 | } else if (lbrace + 2 == rbrace and token_tags[lbrace + 1] == .Identifier) { | 571 | } else if (lbrace + 2 == rbrace and token_tags[lbrace + 1] == .Identifier) { |
| 572 | // There is exactly one member and no trailing comma or | 572 | // There is exactly one member and no trailing comma or |
| 573 | // comments, so render without surrounding spaces: `error{Foo}` | 573 | // comments, so render without surrounding spaces: `error{Foo}` |
| 574 | try renderToken(ais, tree, lbrace, .None); | 574 | try renderToken(ais, tree, lbrace, .None); |
| 575 | try renderToken(ais, tree, lbrace + 1, .None); // identifier | 575 | try renderToken(ais, tree, lbrace + 1, .None); // identifier |
| 576 | try renderToken(ais, tree, rbrace, space); | 576 | return renderToken(ais, tree, rbrace, space); |
| 577 | } else if (token_tags[rbrace - 1] == .Comma) { | 577 | } else if (token_tags[rbrace - 1] == .Comma) { |
| 578 | // There is a trailing comma so render each member on a new line. | 578 | // There is a trailing comma so render each member on a new line. |
| 579 | try renderToken(ais, tree, lbrace, .Newline); | 579 | try renderToken(ais, tree, lbrace, .Newline); |
| ... | @@ -589,7 +589,7 @@ fn renderExpression(ais: *Ais, tree: ast.Tree, node: ast.Node.Index, space: Spac | ... | @@ -589,7 +589,7 @@ fn renderExpression(ais: *Ais, tree: ast.Tree, node: ast.Node.Index, space: Spac |
| 589 | } | 589 | } |
| 590 | } | 590 | } |
| 591 | ais.popIndent(); | 591 | ais.popIndent(); |
| 592 | try renderToken(ais, tree, rbrace, space); | 592 | return renderToken(ais, tree, rbrace, space); |
| 593 | } else { | 593 | } else { |
| 594 | // There is no trailing comma so render everything on one line. | 594 | // There is no trailing comma so render everything on one line. |
| 595 | try renderToken(ais, tree, lbrace, .Space); | 595 | try renderToken(ais, tree, lbrace, .Space); |
| ... | @@ -602,7 +602,7 @@ fn renderExpression(ais: *Ais, tree: ast.Tree, node: ast.Node.Index, space: Spac | ... | @@ -602,7 +602,7 @@ fn renderExpression(ais: *Ais, tree: ast.Tree, node: ast.Node.Index, space: Spac |
| 602 | else => unreachable, | 602 | else => unreachable, |
| 603 | } | 603 | } |
| 604 | } | 604 | } |
| 605 | try renderToken(ais, tree, rbrace, space); | 605 | return renderToken(ais, tree, rbrace, space); |
| 606 | } | 606 | } |
| 607 | }, | 607 | }, |
| 608 | | 608 | |
| ... | @@ -663,7 +663,7 @@ fn renderExpression(ais: *Ais, tree: ast.Tree, node: ast.Node.Index, space: Spac | ... | @@ -663,7 +663,7 @@ fn renderExpression(ais: *Ais, tree: ast.Tree, node: ast.Node.Index, space: Spac |
| 663 | | 663 | |
| 664 | if (cases.len == 0) { | 664 | if (cases.len == 0) { |
| 665 | try renderToken(ais, tree, rparen + 1, .None); // lbrace | 665 | try renderToken(ais, tree, rparen + 1, .None); // lbrace |
| 666 | try renderToken(ais, tree, rparen + 2, space); // rbrace | 666 | return renderToken(ais, tree, rparen + 2, space); // rbrace |
| 667 | } else { | 667 | } else { |
| 668 | try renderToken(ais, tree, rparen + 1, .Newline); // lbrace | 668 | try renderToken(ais, tree, rparen + 1, .Newline); // lbrace |
| 669 | ais.pushIndent(); | 669 | ais.pushIndent(); |
| ... | @@ -673,83 +673,16 @@ fn renderExpression(ais: *Ais, tree: ast.Tree, node: ast.Node.Index, space: Spac | ... | @@ -673,83 +673,16 @@ fn renderExpression(ais: *Ais, tree: ast.Tree, node: ast.Node.Index, space: Spac |
| 673 | try renderExpression(ais, tree, case, .Comma); | 673 | try renderExpression(ais, tree, case, .Comma); |
| 674 | } | 674 | } |
| 675 | ais.popIndent(); | 675 | ais.popIndent(); |
| 676 | try renderToken(ais, tree, tree.lastToken(node), space); // rbrace | 676 | return renderToken(ais, tree, tree.lastToken(node), space); // rbrace |
| 677 | } | 677 | } |
| 678 | }, | 678 | }, |
| 679 | | 679 | |
| 680 | .SwitchCaseOne => try renderSwitchCase(ais, tree, tree.switchCaseOne(node), space), | 680 | .SwitchCaseOne => return renderSwitchCase(ais, tree, tree.switchCaseOne(node), space), |
| 681 | .SwitchCase => try renderSwitchCase(ais, tree, tree.switchCase(node), space), | 681 | .SwitchCase => return renderSwitchCase(ais, tree, tree.switchCase(node), space), |
| 682 | | 682 | |
| 683 | .WhileSimple => unreachable, // TODO | 683 | .WhileSimple => return renderWhile(ais, tree, tree.whileSimple(node), space), |
| 684 | .WhileCont => unreachable, // TODO | 684 | .WhileCont => return renderWhile(ais, tree, tree.whileCont(node), space), |
| 685 | .While => unreachable, // TODO | 685 | .While => return renderWhile(ais, tree, tree.whileFull(node), space), |
| 686 | //.While => { | | |
| 687 | // const while_node = @fieldParentPtr(ast.Node.While, "base", base); | | |
| 688 | | | |
| 689 | // if (while_node.label) |label| { | | |
| 690 | // try renderToken(ais, tree, label, Space.None); // label | | |
| 691 | // try renderToken(ais, tree, tree.nextToken(label), Space.Space); // : | | |
| 692 | // } | | |
| 693 | | | |
| 694 | // if (while_node.inline_token) |inline_token| { | | |
| 695 | // try renderToken(ais, tree, inline_token, Space.Space); // inline | | |
| 696 | // } | | |
| 697 | | | |
| 698 | // try renderToken(ais, tree, while_node.while_token, Space.Space); // while | | |
| 699 | // try renderToken(ais, tree, tree.nextToken(while_node.while_token), Space.None); // ( | | |
| 700 | // try renderExpression(ais, tree, while_node.condition, Space.None); | | |
| 701 | | | |
| 702 | // const cond_rparen = tree.nextToken(while_node.condition.lastToken()); | | |
| 703 | | | |
| 704 | // const body_is_block = nodeIsBlock(while_node.body); | | |
| 705 | | | |
| 706 | // var block_start_space: Space = undefined; | | |
| 707 | // var after_body_space: Space = undefined; | | |
| 708 | | | |
| 709 | // if (body_is_block) { | | |
| 710 | // block_start_space = Space.BlockStart; | | |
| 711 | // after_body_space = if (while_node.@"else" == null) space else Space.Space; | | |
| 712 | // } else if (tree.tokensOnSameLine(cond_rparen, while_node.body.lastToken())) { | | |
| 713 | // block_start_space = Space.Space; | | |
| 714 | // after_body_space = if (while_node.@"else" == null) space else Space.Space; | | |
| 715 | // } else { | | |
| 716 | // block_start_space = Space.Newline; | | |
| 717 | // after_body_space = if (while_node.@"else" == null) space else Space.Newline; | | |
| 718 | // } | | |
| 719 | | | |
| 720 | // { | | |
| 721 | // const rparen_space = if (while_node.payload != null or while_node.continue_expr != null) Space.Space else block_start_space; | | |
| 722 | // try renderToken(ais, tree, cond_rparen, rparen_space); // ) | | |
| 723 | // } | | |
| 724 | | | |
| 725 | // if (while_node.payload) |payload| { | | |
| 726 | // const payload_space = if (while_node.continue_expr != null) Space.Space else block_start_space; | | |
| 727 | // try renderExpression(ais, tree, payload, payload_space); | | |
| 728 | // } | | |
| 729 | | | |
| 730 | // if (while_node.continue_expr) |continue_expr| { | | |
| 731 | // const rparen = tree.nextToken(continue_expr.lastToken()); | | |
| 732 | // const lparen = tree.prevToken(continue_expr.firstToken()); | | |
| 733 | // const colon = tree.prevToken(lparen); | | |
| 734 | | | |
| 735 | // try renderToken(ais, tree, colon, Space.Space); // : | | |
| 736 | // try renderToken(ais, tree, lparen, Space.None); // ( | | |
| 737 | | | |
| 738 | // try renderExpression(ais, tree, continue_expr, Space.None); | | |
| 739 | | | |
| 740 | // try renderToken(ais, tree, rparen, block_start_space); // ) | | |
| 741 | // } | | |
| 742 | | | |
| 743 | // { | | |
| 744 | // if (!body_is_block) ais.pushIndent(); | | |
| 745 | // defer if (!body_is_block) ais.popIndent(); | | |
| 746 | // try renderExpression(ais, tree, while_node.body, after_body_space); | | |
| 747 | // } | | |
| 748 | | | |
| 749 | // if (while_node.@"else") |@"else"| { | | |
| 750 | // return renderExpression(ais, tree, &@"else".base, space); | | |
| 751 | // } | | |
| 752 | //}, | | |
| 753 | | 686 | |
| 754 | .ForSimple => unreachable, // TODO | 687 | .ForSimple => unreachable, // TODO |
| 755 | .For => unreachable, // TODO | 688 | .For => unreachable, // TODO |
| ... | @@ -1092,105 +1025,142 @@ fn renderVarDecl(ais: *Ais, tree: ast.Tree, var_decl: ast.full.VarDecl) Error!vo | ... | @@ -1092,105 +1025,142 @@ fn renderVarDecl(ais: *Ais, tree: ast.Tree, var_decl: ast.full.VarDecl) Error!vo |
| 1092 | } | 1025 | } |
| 1093 | | 1026 | |
| 1094 | fn renderIf(ais: *Ais, tree: ast.Tree, if_node: ast.full.If, space: Space) Error!void { | 1027 | fn renderIf(ais: *Ais, tree: ast.Tree, if_node: ast.full.If, space: Space) Error!void { |
| | 1028 | return renderWhile(ais, tree, .{ |
| | 1029 | .ast = .{ |
| | 1030 | .while_token = if_node.ast.if_token, |
| | 1031 | .cond_expr = if_node.ast.cond_expr, |
| | 1032 | .cont_expr = 0, |
| | 1033 | .then_expr = if_node.ast.then_expr, |
| | 1034 | .else_expr = if_node.ast.else_expr, |
| | 1035 | }, |
| | 1036 | .inline_token = null, |
| | 1037 | .label_token = null, |
| | 1038 | .payload_token = if_node.payload_token, |
| | 1039 | .else_token = if_node.else_token, |
| | 1040 | .error_token = if_node.error_token, |
| | 1041 | }, space); |
| | 1042 | } |
| | 1043 | |
| | 1044 | /// Note that this function is additionally used to render if expressions, with |
| | 1045 | /// respective values set to null. |
| | 1046 | fn renderWhile(ais: *Ais, tree: ast.Tree, while_node: ast.full.While, space: Space) Error!void { |
| 1095 | const node_tags = tree.nodes.items(.tag); | 1047 | const node_tags = tree.nodes.items(.tag); |
| 1096 | const token_tags = tree.tokens.items(.tag); | 1048 | const token_tags = tree.tokens.items(.tag); |
| 1097 | | 1049 | |
| 1098 | try renderToken(ais, tree, if_node.ast.if_token, .Space); // if | 1050 | if (while_node.label_token) |label| { |
| | 1051 | try renderToken(ais, tree, label, .None); // label |
| | 1052 | try renderToken(ais, tree, label + 1, .Space); // : |
| | 1053 | } |
| 1099 | | 1054 | |
| 1100 | const lparen = if_node.ast.if_token + 1; | 1055 | if (while_node.inline_token) |inline_token| { |
| | 1056 | try renderToken(ais, tree, inline_token, .Space); // inline |
| | 1057 | } |
| 1101 | | 1058 | |
| 1102 | try renderToken(ais, tree, lparen, .None); // ( | 1059 | try renderToken(ais, tree, while_node.ast.while_token, .Space); // if |
| 1103 | try renderExpression(ais, tree, if_node.ast.cond_expr, .None); // condition | 1060 | try renderToken(ais, tree, while_node.ast.while_token + 1, .None); // ( |
| | 1061 | try renderExpression(ais, tree, while_node.ast.cond_expr, .None); // condition |
| 1104 | | 1062 | |
| 1105 | switch (node_tags[if_node.ast.then_expr]) { | 1063 | if (nodeIsBlock(node_tags[while_node.ast.then_expr])) { |
| 1106 | .If, .IfSimple => { | 1064 | const payload_space: Space = if (while_node.ast.cont_expr != 0) .Space else .BlockStart; |
| 1107 | try renderExtraNewline(ais, tree, if_node.ast.then_expr); | 1065 | if (while_node.payload_token) |payload_token| { |
| 1108 | }, | 1066 | try renderToken(ais, tree, payload_token - 2, .Space); // ) |
| 1109 | .Block, .For, .ForSimple, .While, .WhileSimple, .Switch => { | 1067 | try renderToken(ais, tree, payload_token - 1, .None); // | |
| 1110 | if (if_node.payload_token) |payload_token| { | 1068 | if (token_tags[payload_token] == .Asterisk) { |
| 1111 | try renderToken(ais, tree, payload_token - 2, .Space); // ) | 1069 | try renderToken(ais, tree, payload_token, .None); // * |
| 1112 | try renderToken(ais, tree, payload_token - 1, .None); // | | 1070 | try renderToken(ais, tree, payload_token + 1, .None); // identifier |
| 1113 | if (token_tags[payload_token] == .Asterisk) { | 1071 | try renderToken(ais, tree, payload_token + 2, payload_space); // | |
| 1114 | try renderToken(ais, tree, payload_token, .None); // * | | |
| 1115 | try renderToken(ais, tree, payload_token + 1, .None); // identifier | | |
| 1116 | try renderToken(ais, tree, payload_token + 2, .BlockStart); // | | | |
| 1117 | } else { | | |
| 1118 | try renderToken(ais, tree, payload_token, .None); // identifier | | |
| 1119 | try renderToken(ais, tree, payload_token + 1, .BlockStart); // | | | |
| 1120 | } | | |
| 1121 | } else { | 1072 | } else { |
| 1122 | const rparen = tree.lastToken(if_node.ast.cond_expr) + 1; | 1073 | try renderToken(ais, tree, payload_token, .None); // identifier |
| 1123 | try renderToken(ais, tree, rparen, .BlockStart); // ) | 1074 | try renderToken(ais, tree, payload_token + 1, payload_space); // | |
| 1124 | } | 1075 | } |
| 1125 | if (if_node.ast.else_expr != 0) { | 1076 | } else { |
| 1126 | try renderExpression(ais, tree, if_node.ast.then_expr, Space.Space); | 1077 | const rparen = tree.lastToken(while_node.ast.cond_expr) + 1; |
| 1127 | try renderToken(ais, tree, if_node.else_token, .Space); // else | 1078 | try renderToken(ais, tree, rparen, payload_space); // ) |
| 1128 | if (if_node.error_token) |error_token| { | 1079 | } |
| 1129 | try renderToken(ais, tree, error_token - 1, .None); // | | 1080 | if (while_node.ast.cont_expr != 0) { |
| 1130 | try renderToken(ais, tree, error_token, .None); // identifier | 1081 | const rparen = tree.lastToken(while_node.ast.cont_expr) + 1; |
| 1131 | try renderToken(ais, tree, error_token + 1, .Space); // | | 1082 | const lparen = tree.firstToken(while_node.ast.cont_expr) - 1; |
| 1132 | } | 1083 | try renderToken(ais, tree, lparen - 1, .Space); // : |
| 1133 | return renderExpression(ais, tree, if_node.ast.else_expr, space); | 1084 | try renderToken(ais, tree, lparen, .None); // lparen |
| 1134 | } else { | 1085 | try renderExpression(ais, tree, while_node.ast.cont_expr, .None); |
| 1135 | return renderExpression(ais, tree, if_node.ast.then_expr, space); | 1086 | try renderToken(ais, tree, rparen, .BlockStart); // rparen |
| | 1087 | } |
| | 1088 | if (while_node.ast.else_expr != 0) { |
| | 1089 | try renderExpression(ais, tree, while_node.ast.then_expr, Space.Space); |
| | 1090 | try renderToken(ais, tree, while_node.else_token, .Space); // else |
| | 1091 | if (while_node.error_token) |error_token| { |
| | 1092 | try renderToken(ais, tree, error_token - 1, .None); // | |
| | 1093 | try renderToken(ais, tree, error_token, .None); // identifier |
| | 1094 | try renderToken(ais, tree, error_token + 1, .Space); // | |
| 1136 | } | 1095 | } |
| 1137 | }, | 1096 | return renderExpression(ais, tree, while_node.ast.else_expr, space); |
| 1138 | else => {}, | 1097 | } else { |
| | 1098 | return renderExpression(ais, tree, while_node.ast.then_expr, space); |
| | 1099 | } |
| 1139 | } | 1100 | } |
| 1140 | | 1101 | |
| 1141 | const rparen = tree.lastToken(if_node.ast.cond_expr) + 1; | 1102 | const rparen = tree.lastToken(while_node.ast.cond_expr) + 1; |
| 1142 | const last_then_token = tree.lastToken(if_node.ast.then_expr); | 1103 | const last_then_token = tree.lastToken(while_node.ast.then_expr); |
| 1143 | const src_has_newline = !tree.tokensOnSameLine(rparen, last_then_token); | 1104 | const src_has_newline = !tree.tokensOnSameLine(rparen, last_then_token); |
| 1144 | | 1105 | |
| 1145 | if (src_has_newline) { | 1106 | if (src_has_newline) { |
| 1146 | if (if_node.payload_token) |payload_token| { | 1107 | const payload_space: Space = if (while_node.ast.cont_expr != 0) .Space else .Newline; |
| | 1108 | if (while_node.payload_token) |payload_token| { |
| 1147 | try renderToken(ais, tree, payload_token - 2, .Space); // ) | 1109 | try renderToken(ais, tree, payload_token - 2, .Space); // ) |
| 1148 | try renderToken(ais, tree, payload_token - 1, .None); // | | 1110 | try renderToken(ais, tree, payload_token - 1, .None); // | |
| 1149 | try renderToken(ais, tree, payload_token, .None); // identifier | 1111 | try renderToken(ais, tree, payload_token, .None); // identifier |
| 1150 | try renderToken(ais, tree, payload_token + 1, .Newline); // | | 1112 | try renderToken(ais, tree, payload_token + 1, payload_space); // | |
| 1151 | } else { | 1113 | } else { |
| 1152 | ais.pushIndent(); | 1114 | ais.pushIndent(); |
| 1153 | try renderToken(ais, tree, rparen, .Newline); // ) | 1115 | try renderToken(ais, tree, rparen, payload_space); // ) |
| 1154 | ais.popIndent(); | 1116 | ais.popIndent(); |
| 1155 | } | 1117 | } |
| 1156 | if (if_node.ast.else_expr != 0) { | 1118 | if (while_node.ast.cont_expr != 0) { |
| | 1119 | const cont_rparen = tree.lastToken(while_node.ast.cont_expr) + 1; |
| | 1120 | const cont_lparen = tree.firstToken(while_node.ast.cont_expr) - 1; |
| | 1121 | try renderToken(ais, tree, cont_lparen - 1, .Space); // : |
| | 1122 | try renderToken(ais, tree, cont_lparen, .None); // lparen |
| | 1123 | try renderExpression(ais, tree, while_node.ast.cont_expr, .None); |
| | 1124 | try renderToken(ais, tree, cont_rparen, .Newline); // rparen |
| | 1125 | } |
| | 1126 | if (while_node.ast.else_expr != 0) { |
| 1157 | ais.pushIndent(); | 1127 | ais.pushIndent(); |
| 1158 | try renderExpression(ais, tree, if_node.ast.then_expr, Space.Newline); | 1128 | try renderExpression(ais, tree, while_node.ast.then_expr, Space.Newline); |
| 1159 | ais.popIndent(); | 1129 | ais.popIndent(); |
| 1160 | const else_is_block = nodeIsBlock(node_tags[if_node.ast.else_expr]); | 1130 | const else_is_block = nodeIsBlock(node_tags[while_node.ast.else_expr]); |
| 1161 | if (else_is_block) { | 1131 | if (else_is_block) { |
| 1162 | try renderToken(ais, tree, if_node.else_token, .Space); // else | 1132 | try renderToken(ais, tree, while_node.else_token, .Space); // else |
| 1163 | if (if_node.error_token) |error_token| { | 1133 | if (while_node.error_token) |error_token| { |
| 1164 | try renderToken(ais, tree, error_token - 1, .None); // | | 1134 | try renderToken(ais, tree, error_token - 1, .None); // | |
| 1165 | try renderToken(ais, tree, error_token, .None); // identifier | 1135 | try renderToken(ais, tree, error_token, .None); // identifier |
| 1166 | try renderToken(ais, tree, error_token + 1, .Space); // | | 1136 | try renderToken(ais, tree, error_token + 1, .Space); // | |
| 1167 | } | 1137 | } |
| 1168 | return renderExpression(ais, tree, if_node.ast.else_expr, space); | 1138 | return renderExpression(ais, tree, while_node.ast.else_expr, space); |
| 1169 | } else { | 1139 | } else { |
| 1170 | if (if_node.error_token) |error_token| { | 1140 | if (while_node.error_token) |error_token| { |
| 1171 | try renderToken(ais, tree, if_node.else_token, .Space); // else | 1141 | try renderToken(ais, tree, while_node.else_token, .Space); // else |
| 1172 | try renderToken(ais, tree, error_token - 1, .None); // | | 1142 | try renderToken(ais, tree, error_token - 1, .None); // | |
| 1173 | try renderToken(ais, tree, error_token, .None); // identifier | 1143 | try renderToken(ais, tree, error_token, .None); // identifier |
| 1174 | try renderToken(ais, tree, error_token + 1, .Space); // | | 1144 | try renderToken(ais, tree, error_token + 1, .Space); // | |
| 1175 | } else { | 1145 | } else { |
| 1176 | try renderToken(ais, tree, if_node.else_token, .Newline); // else | 1146 | try renderToken(ais, tree, while_node.else_token, .Newline); // else |
| 1177 | } | 1147 | } |
| 1178 | ais.pushIndent(); | 1148 | ais.pushIndent(); |
| 1179 | try renderExpression(ais, tree, if_node.ast.else_expr, space); | 1149 | try renderExpression(ais, tree, while_node.ast.else_expr, space); |
| 1180 | ais.popIndent(); | 1150 | ais.popIndent(); |
| 1181 | return; | 1151 | return; |
| 1182 | } | 1152 | } |
| 1183 | } else { | 1153 | } else { |
| 1184 | ais.pushIndent(); | 1154 | ais.pushIndent(); |
| 1185 | try renderExpression(ais, tree, if_node.ast.then_expr, space); | 1155 | try renderExpression(ais, tree, while_node.ast.then_expr, space); |
| 1186 | ais.popIndent(); | 1156 | ais.popIndent(); |
| 1187 | return; | 1157 | return; |
| 1188 | } | 1158 | } |
| 1189 | } | 1159 | } |
| 1190 | | 1160 | |
| 1191 | // Single line if statement. | 1161 | // Render everything on a single line. |
| 1192 | | 1162 | |
| 1193 | if (if_node.payload_token) |payload_token| { | 1163 | if (while_node.payload_token) |payload_token| { |
| 1194 | assert(payload_token - 2 == rparen); | 1164 | assert(payload_token - 2 == rparen); |
| 1195 | try renderToken(ais, tree, payload_token - 2, .Space); // ) | 1165 | try renderToken(ais, tree, payload_token - 2, .Space); // ) |
| 1196 | try renderToken(ais, tree, payload_token - 1, .None); // | | 1166 | try renderToken(ais, tree, payload_token - 1, .None); // | |
| ... | @@ -1206,19 +1176,28 @@ fn renderIf(ais: *Ais, tree: ast.Tree, if_node: ast.full.If, space: Space) Error | ... | @@ -1206,19 +1176,28 @@ fn renderIf(ais: *Ais, tree: ast.Tree, if_node: ast.full.If, space: Space) Error |
| 1206 | try renderToken(ais, tree, rparen, .Space); // ) | 1176 | try renderToken(ais, tree, rparen, .Space); // ) |
| 1207 | } | 1177 | } |
| 1208 | | 1178 | |
| 1209 | if (if_node.ast.else_expr != 0) { | 1179 | if (while_node.ast.cont_expr != 0) { |
| 1210 | try renderExpression(ais, tree, if_node.ast.then_expr, .Space); | 1180 | const cont_rparen = tree.lastToken(while_node.ast.cont_expr) + 1; |
| 1211 | try renderToken(ais, tree, if_node.else_token, .Space); // else | 1181 | const cont_lparen = tree.firstToken(while_node.ast.cont_expr) - 1; |
| | 1182 | try renderToken(ais, tree, cont_lparen - 1, .Space); // : |
| | 1183 | try renderToken(ais, tree, cont_lparen, .None); // lparen |
| | 1184 | try renderExpression(ais, tree, while_node.ast.cont_expr, .None); |
| | 1185 | try renderToken(ais, tree, cont_rparen, .Space); // rparen |
| | 1186 | } |
| | 1187 | |
| | 1188 | if (while_node.ast.else_expr != 0) { |
| | 1189 | try renderExpression(ais, tree, while_node.ast.then_expr, .Space); |
| | 1190 | try renderToken(ais, tree, while_node.else_token, .Space); // else |
| 1212 | | 1191 | |
| 1213 | if (if_node.error_token) |error_token| { | 1192 | if (while_node.error_token) |error_token| { |
| 1214 | try renderToken(ais, tree, error_token - 1, .None); // | | 1193 | try renderToken(ais, tree, error_token - 1, .None); // | |
| 1215 | try renderToken(ais, tree, error_token, .None); // identifier | 1194 | try renderToken(ais, tree, error_token, .None); // identifier |
| 1216 | try renderToken(ais, tree, error_token + 1, .Space); // | | 1195 | try renderToken(ais, tree, error_token + 1, .Space); // | |
| 1217 | } | 1196 | } |
| 1218 | | 1197 | |
| 1219 | return renderExpression(ais, tree, if_node.ast.else_expr, space); | 1198 | return renderExpression(ais, tree, while_node.ast.else_expr, space); |
| 1220 | } else { | 1199 | } else { |
| 1221 | return renderExpression(ais, tree, if_node.ast.then_expr, space); | 1200 | return renderExpression(ais, tree, while_node.ast.then_expr, space); |
| 1222 | } | 1201 | } |
| 1223 | } | 1202 | } |
| 1224 | | 1203 | |
| ... | @@ -2079,12 +2058,16 @@ fn renderDocComments(ais: *Ais, tree: ast.Tree, end_token: ast.TokenIndex) Error | ... | @@ -2079,12 +2058,16 @@ fn renderDocComments(ais: *Ais, tree: ast.Tree, end_token: ast.TokenIndex) Error |
| 2079 | fn nodeIsBlock(tag: ast.Node.Tag) bool { | 2058 | fn nodeIsBlock(tag: ast.Node.Tag) bool { |
| 2080 | return switch (tag) { | 2059 | return switch (tag) { |
| 2081 | .Block, | 2060 | .Block, |
| | 2061 | .BlockSemicolon, |
| | 2062 | .BlockTwo, |
| | 2063 | .BlockTwoSemicolon, |
| 2082 | .If, | 2064 | .If, |
| 2083 | .IfSimple, | 2065 | .IfSimple, |
| 2084 | .For, | 2066 | .For, |
| 2085 | .ForSimple, | 2067 | .ForSimple, |
| 2086 | .While, | 2068 | .While, |
| 2087 | .WhileSimple, | 2069 | .WhileSimple, |
| | 2070 | .WhileCont, |
| 2088 | .Switch, | 2071 | .Switch, |
| 2089 | => true, | 2072 | => true, |
| 2090 | else => false, | 2073 | else => false, |