| ... | ... | @@ -567,13 +567,13 @@ fn renderExpression(ais: *Ais, tree: ast.Tree, node: ast.Node.Index, space: Spac |
| 567 | 567 | if (lbrace + 1 == rbrace) { |
| 568 | 568 | // There is nothing between the braces so render condensed: `error{}` |
| 569 | 569 | try renderToken(ais, tree, lbrace, .None); |
| 570 | | try renderToken(ais, tree, rbrace, space); |
| 570 | return renderToken(ais, tree, rbrace, space); |
| 571 | 571 | } else if (lbrace + 2 == rbrace and token_tags[lbrace + 1] == .Identifier) { |
| 572 | 572 | // There is exactly one member and no trailing comma or |
| 573 | 573 | // comments, so render without surrounding spaces: `error{Foo}` |
| 574 | 574 | try renderToken(ais, tree, lbrace, .None); |
| 575 | 575 | try renderToken(ais, tree, lbrace + 1, .None); // identifier |
| 576 | | try renderToken(ais, tree, rbrace, space); |
| 576 | return renderToken(ais, tree, rbrace, space); |
| 577 | 577 | } else if (token_tags[rbrace - 1] == .Comma) { |
| 578 | 578 | // There is a trailing comma so render each member on a new line. |
| 579 | 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 | 589 | } |
| 590 | 590 | } |
| 591 | 591 | ais.popIndent(); |
| 592 | | try renderToken(ais, tree, rbrace, space); |
| 592 | return renderToken(ais, tree, rbrace, space); |
| 593 | 593 | } else { |
| 594 | 594 | // There is no trailing comma so render everything on one line. |
| 595 | 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 | 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 | 663 | |
| 664 | 664 | if (cases.len == 0) { |
| 665 | 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 | 667 | } else { |
| 668 | 668 | try renderToken(ais, tree, rparen + 1, .Newline); // lbrace |
| 669 | 669 | ais.pushIndent(); |
| ... | ... | @@ -673,83 +673,16 @@ fn renderExpression(ais: *Ais, tree: ast.Tree, node: ast.Node.Index, space: Spac |
| 673 | 673 | try renderExpression(ais, tree, case, .Comma); |
| 674 | 674 | } |
| 675 | 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), |
| 681 | | .SwitchCase => try renderSwitchCase(ais, tree, tree.switchCase(node), space), |
| 680 | .SwitchCaseOne => return renderSwitchCase(ais, tree, tree.switchCaseOne(node), space), |
| 681 | .SwitchCase => return renderSwitchCase(ais, tree, tree.switchCase(node), space), |
| 682 | 682 | |
| 683 | | .WhileSimple => unreachable, // TODO |
| 684 | | .WhileCont => unreachable, // TODO |
| 685 | | .While => unreachable, // TODO |
| 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 | | //}, |
| 683 | .WhileSimple => return renderWhile(ais, tree, tree.whileSimple(node), space), |
| 684 | .WhileCont => return renderWhile(ais, tree, tree.whileCont(node), space), |
| 685 | .While => return renderWhile(ais, tree, tree.whileFull(node), space), |
| 753 | 686 | |
| 754 | 687 | .ForSimple => unreachable, // TODO |
| 755 | 688 | .For => unreachable, // TODO |
| ... | ... | @@ -1092,105 +1025,142 @@ fn renderVarDecl(ais: *Ais, tree: ast.Tree, var_decl: ast.full.VarDecl) Error!vo |
| 1092 | 1025 | } |
| 1093 | 1026 | |
| 1094 | 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 | 1047 | const node_tags = tree.nodes.items(.tag); |
| 1096 | 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); // ( |
| 1103 | | try renderExpression(ais, tree, if_node.ast.cond_expr, .None); // condition |
| 1059 | try renderToken(ais, tree, while_node.ast.while_token, .Space); // if |
| 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]) { |
| 1106 | | .If, .IfSimple => { |
| 1107 | | try renderExtraNewline(ais, tree, if_node.ast.then_expr); |
| 1108 | | }, |
| 1109 | | .Block, .For, .ForSimple, .While, .WhileSimple, .Switch => { |
| 1110 | | if (if_node.payload_token) |payload_token| { |
| 1111 | | try renderToken(ais, tree, payload_token - 2, .Space); // ) |
| 1112 | | try renderToken(ais, tree, payload_token - 1, .None); // | |
| 1113 | | if (token_tags[payload_token] == .Asterisk) { |
| 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 | | } |
| 1063 | if (nodeIsBlock(node_tags[while_node.ast.then_expr])) { |
| 1064 | const payload_space: Space = if (while_node.ast.cont_expr != 0) .Space else .BlockStart; |
| 1065 | if (while_node.payload_token) |payload_token| { |
| 1066 | try renderToken(ais, tree, payload_token - 2, .Space); // ) |
| 1067 | 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); // | |
| 1121 | 1072 | } else { |
| 1122 | | const rparen = tree.lastToken(if_node.ast.cond_expr) + 1; |
| 1123 | | try renderToken(ais, tree, rparen, .BlockStart); // ) |
| 1073 | try renderToken(ais, tree, payload_token, .None); // identifier |
| 1074 | try renderToken(ais, tree, payload_token + 1, payload_space); // | |
| 1124 | 1075 | } |
| 1125 | | if (if_node.ast.else_expr != 0) { |
| 1126 | | try renderExpression(ais, tree, if_node.ast.then_expr, Space.Space); |
| 1127 | | try renderToken(ais, tree, if_node.else_token, .Space); // else |
| 1128 | | if (if_node.error_token) |error_token| { |
| 1129 | | try renderToken(ais, tree, error_token - 1, .None); // | |
| 1130 | | try renderToken(ais, tree, error_token, .None); // identifier |
| 1131 | | try renderToken(ais, tree, error_token + 1, .Space); // | |
| 1132 | | } |
| 1133 | | return renderExpression(ais, tree, if_node.ast.else_expr, space); |
| 1134 | | } else { |
| 1135 | | return renderExpression(ais, tree, if_node.ast.then_expr, space); |
| 1076 | } else { |
| 1077 | const rparen = tree.lastToken(while_node.ast.cond_expr) + 1; |
| 1078 | try renderToken(ais, tree, rparen, payload_space); // ) |
| 1079 | } |
| 1080 | if (while_node.ast.cont_expr != 0) { |
| 1081 | const rparen = tree.lastToken(while_node.ast.cont_expr) + 1; |
| 1082 | const lparen = tree.firstToken(while_node.ast.cont_expr) - 1; |
| 1083 | try renderToken(ais, tree, lparen - 1, .Space); // : |
| 1084 | try renderToken(ais, tree, lparen, .None); // lparen |
| 1085 | try renderExpression(ais, tree, while_node.ast.cont_expr, .None); |
| 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 | | }, |
| 1138 | | else => {}, |
| 1096 | return renderExpression(ais, tree, while_node.ast.else_expr, space); |
| 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; |
| 1142 | | const last_then_token = tree.lastToken(if_node.ast.then_expr); |
| 1102 | const rparen = tree.lastToken(while_node.ast.cond_expr) + 1; |
| 1103 | const last_then_token = tree.lastToken(while_node.ast.then_expr); |
| 1143 | 1104 | const src_has_newline = !tree.tokensOnSameLine(rparen, last_then_token); |
| 1144 | 1105 | |
| 1145 | 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 | 1109 | try renderToken(ais, tree, payload_token - 2, .Space); // ) |
| 1148 | 1110 | try renderToken(ais, tree, payload_token - 1, .None); // | |
| 1149 | 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 | 1113 | } else { |
| 1152 | 1114 | ais.pushIndent(); |
| 1153 | | try renderToken(ais, tree, rparen, .Newline); // ) |
| 1115 | try renderToken(ais, tree, rparen, payload_space); // ) |
| 1154 | 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 | 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 | 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 | 1131 | if (else_is_block) { |
| 1162 | | try renderToken(ais, tree, if_node.else_token, .Space); // else |
| 1163 | | if (if_node.error_token) |error_token| { |
| 1132 | try renderToken(ais, tree, while_node.else_token, .Space); // else |
| 1133 | if (while_node.error_token) |error_token| { |
| 1164 | 1134 | try renderToken(ais, tree, error_token - 1, .None); // | |
| 1165 | 1135 | try renderToken(ais, tree, error_token, .None); // identifier |
| 1166 | 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 | 1139 | } else { |
| 1170 | | if (if_node.error_token) |error_token| { |
| 1171 | | try renderToken(ais, tree, if_node.else_token, .Space); // else |
| 1140 | if (while_node.error_token) |error_token| { |
| 1141 | try renderToken(ais, tree, while_node.else_token, .Space); // else |
| 1172 | 1142 | try renderToken(ais, tree, error_token - 1, .None); // | |
| 1173 | 1143 | try renderToken(ais, tree, error_token, .None); // identifier |
| 1174 | 1144 | try renderToken(ais, tree, error_token + 1, .Space); // | |
| 1175 | 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 | 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 | 1150 | ais.popIndent(); |
| 1181 | 1151 | return; |
| 1182 | 1152 | } |
| 1183 | 1153 | } else { |
| 1184 | 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 | 1156 | ais.popIndent(); |
| 1187 | 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 | 1164 | assert(payload_token - 2 == rparen); |
| 1195 | 1165 | try renderToken(ais, tree, payload_token - 2, .Space); // ) |
| 1196 | 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 | 1176 | try renderToken(ais, tree, rparen, .Space); // ) |
| 1207 | 1177 | } |
| 1208 | 1178 | |
| 1209 | | if (if_node.ast.else_expr != 0) { |
| 1210 | | try renderExpression(ais, tree, if_node.ast.then_expr, .Space); |
| 1211 | | try renderToken(ais, tree, if_node.else_token, .Space); // else |
| 1179 | if (while_node.ast.cont_expr != 0) { |
| 1180 | const cont_rparen = tree.lastToken(while_node.ast.cont_expr) + 1; |
| 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 | 1193 | try renderToken(ais, tree, error_token - 1, .None); // | |
| 1215 | 1194 | try renderToken(ais, tree, error_token, .None); // identifier |
| 1216 | 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 | 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 | 2058 | fn nodeIsBlock(tag: ast.Node.Tag) bool { |
| 2080 | 2059 | return switch (tag) { |
| 2081 | 2060 | .Block, |
| 2061 | .BlockSemicolon, |
| 2062 | .BlockTwo, |
| 2063 | .BlockTwoSemicolon, |
| 2082 | 2064 | .If, |
| 2083 | 2065 | .IfSimple, |
| 2084 | 2066 | .For, |
| 2085 | 2067 | .ForSimple, |
| 2086 | 2068 | .While, |
| 2087 | 2069 | .WhileSimple, |
| 2070 | .WhileCont, |
| 2088 | 2071 | .Switch, |
| 2089 | 2072 | => true, |
| 2090 | 2073 | else => false, |