| ... | @@ -800,7 +800,6 @@ pub fn lastToken(tree: Ast, node: Node.Index) TokenIndex { | ... | @@ -800,7 +800,6 @@ pub fn lastToken(tree: Ast, node: Node.Index) TokenIndex { |
| 800 | const tags = tree.nodes.items(.tag); | 800 | const tags = tree.nodes.items(.tag); |
| 801 | const datas = tree.nodes.items(.data); | 801 | const datas = tree.nodes.items(.data); |
| 802 | const main_tokens = tree.nodes.items(.main_token); | 802 | const main_tokens = tree.nodes.items(.main_token); |
| 803 | const token_starts = tree.tokens.items(.start); | | |
| 804 | const token_tags = tree.tokens.items(.tag); | 803 | const token_tags = tree.tokens.items(.tag); |
| 805 | var n = node; | 804 | var n = node; |
| 806 | var end_offset: TokenIndex = 0; | 805 | var end_offset: TokenIndex = 0; |
| ... | @@ -816,6 +815,7 @@ pub fn lastToken(tree: Ast, node: Node.Index) TokenIndex { | ... | @@ -816,6 +815,7 @@ pub fn lastToken(tree: Ast, node: Node.Index) TokenIndex { |
| 816 | .@"try", | 815 | .@"try", |
| 817 | .@"await", | 816 | .@"await", |
| 818 | .optional_type, | 817 | .optional_type, |
| | 818 | .@"suspend", |
| 819 | .@"resume", | 819 | .@"resume", |
| 820 | .@"nosuspend", | 820 | .@"nosuspend", |
| 821 | .@"comptime", | 821 | .@"comptime", |
| ... | @@ -880,6 +880,9 @@ pub fn lastToken(tree: Ast, node: Node.Index) TokenIndex { | ... | @@ -880,6 +880,9 @@ pub fn lastToken(tree: Ast, node: Node.Index) TokenIndex { |
| 880 | .for_simple, | 880 | .for_simple, |
| 881 | .fn_proto_simple, | 881 | .fn_proto_simple, |
| 882 | .fn_proto_multi, | 882 | .fn_proto_multi, |
| | 883 | .fn_proto_one, |
| | 884 | .fn_proto, |
| | 885 | .fn_decl, |
| 883 | .ptr_type_aligned, | 886 | .ptr_type_aligned, |
| 884 | .ptr_type_sentinel, | 887 | .ptr_type_sentinel, |
| 885 | .ptr_type, | 888 | .ptr_type, |
| ... | @@ -928,9 +931,7 @@ pub fn lastToken(tree: Ast, node: Node.Index) TokenIndex { | ... | @@ -928,9 +931,7 @@ pub fn lastToken(tree: Ast, node: Node.Index) TokenIndex { |
| 928 | .call, .async_call => { | 931 | .call, .async_call => { |
| 929 | end_offset += 1; // for the rparen | 932 | end_offset += 1; // for the rparen |
| 930 | const params = tree.extraData(datas[n].rhs, Node.SubRange); | 933 | const params = tree.extraData(datas[n].rhs, Node.SubRange); |
| 931 | if (params.end - params.start == 0) { | 934 | assert(params.end - params.start > 0); |
| 932 | return main_tokens[n] + end_offset; | | |
| 933 | } | | |
| 934 | n = tree.extra_data[params.end - 1]; // last parameter | 935 | n = tree.extra_data[params.end - 1]; // last parameter |
| 935 | }, | 936 | }, |
| 936 | .tagged_union_enum_tag => { | 937 | .tagged_union_enum_tag => { |
| ... | @@ -1122,48 +1123,28 @@ pub fn lastToken(tree: Ast, node: Node.Index) TokenIndex { | ... | @@ -1122,48 +1123,28 @@ pub fn lastToken(tree: Ast, node: Node.Index) TokenIndex { |
| 1122 | n = datas[n].rhs; | 1123 | n = datas[n].rhs; |
| 1123 | } else { | 1124 | } else { |
| 1124 | const extra = tree.extraData(datas[n].lhs, Node.LocalVarDecl); | 1125 | const extra = tree.extraData(datas[n].lhs, Node.LocalVarDecl); |
| 1125 | if (extra.align_node != 0) { | 1126 | assert(extra.align_node != 0); |
| 1126 | end_offset += 1; // for the rparen | 1127 | end_offset += 1; // for the rparen |
| 1127 | n = extra.align_node; | 1128 | n = extra.align_node; |
| 1128 | } else if (extra.type_node != 0) { | | |
| 1129 | n = extra.type_node; | | |
| 1130 | } else { | | |
| 1131 | end_offset += 1; // from mut token to name | | |
| 1132 | return main_tokens[n] + end_offset; | | |
| 1133 | } | | |
| 1134 | } | 1129 | } |
| 1135 | }, | 1130 | }, |
| 1136 | .container_field_init => { | 1131 | .container_field_init => { |
| 1137 | if (datas[n].rhs != 0) { | 1132 | if (datas[n].rhs != 0) { |
| 1138 | n = datas[n].rhs; | 1133 | n = datas[n].rhs; |
| 1139 | } else if (datas[n].lhs != 0) { | | |
| 1140 | n = datas[n].lhs; | | |
| 1141 | } else { | 1134 | } else { |
| 1142 | return main_tokens[n] + end_offset; | 1135 | assert(datas[n].lhs != 0); |
| | 1136 | n = datas[n].lhs; |
| 1143 | } | 1137 | } |
| 1144 | }, | 1138 | }, |
| 1145 | .container_field_align => { | 1139 | .container_field_align => { |
| 1146 | if (datas[n].rhs != 0) { | 1140 | assert(datas[n].rhs != 0); |
| 1147 | end_offset += 1; // for the rparen | 1141 | end_offset += 1; // for the rparen |
| 1148 | n = datas[n].rhs; | 1142 | n = datas[n].rhs; |
| 1149 | } else if (datas[n].lhs != 0) { | | |
| 1150 | n = datas[n].lhs; | | |
| 1151 | } else { | | |
| 1152 | return main_tokens[n] + end_offset; | | |
| 1153 | } | | |
| 1154 | }, | 1143 | }, |
| 1155 | .container_field => { | 1144 | .container_field => { |
| 1156 | const extra = tree.extraData(datas[n].rhs, Node.ContainerField); | 1145 | const extra = tree.extraData(datas[n].rhs, Node.ContainerField); |
| 1157 | if (extra.value_expr != 0) { | 1146 | assert(extra.value_expr != 0); |
| 1158 | n = extra.value_expr; | 1147 | n = extra.value_expr; |
| 1159 | } else if (extra.align_expr != 0) { | | |
| 1160 | end_offset += 1; // for the rparen | | |
| 1161 | n = extra.align_expr; | | |
| 1162 | } else if (datas[n].lhs != 0) { | | |
| 1163 | n = datas[n].lhs; | | |
| 1164 | } else { | | |
| 1165 | return main_tokens[n] + end_offset; | | |
| 1166 | } | | |
| 1167 | }, | 1148 | }, |
| 1168 | | 1149 | |
| 1169 | .array_init_one, | 1150 | .array_init_one, |
| ... | @@ -1208,97 +1189,6 @@ pub fn lastToken(tree: Ast, node: Node.Index) TokenIndex { | ... | @@ -1208,97 +1189,6 @@ pub fn lastToken(tree: Ast, node: Node.Index) TokenIndex { |
| 1208 | return main_tokens[n] + end_offset; | 1189 | return main_tokens[n] + end_offset; |
| 1209 | } | 1190 | } |
| 1210 | }, | 1191 | }, |
| 1211 | .fn_decl => { | | |
| 1212 | if (datas[n].rhs != 0) { | | |
| 1213 | n = datas[n].rhs; | | |
| 1214 | } else { | | |
| 1215 | n = datas[n].lhs; | | |
| 1216 | } | | |
| 1217 | }, | | |
| 1218 | .fn_proto_one => { | | |
| 1219 | const extra = tree.extraData(datas[n].lhs, Node.FnProtoOne); | | |
| 1220 | // addrspace, linksection, callconv, align can appear in any order, so we | | |
| 1221 | // find the last one here. | | |
| 1222 | var max_node: Node.Index = datas[n].rhs; | | |
| 1223 | var max_start = token_starts[main_tokens[max_node]]; | | |
| 1224 | var max_offset: TokenIndex = 0; | | |
| 1225 | if (extra.align_expr != 0) { | | |
| 1226 | const start = token_starts[main_tokens[extra.align_expr]]; | | |
| 1227 | if (start > max_start) { | | |
| 1228 | max_node = extra.align_expr; | | |
| 1229 | max_start = start; | | |
| 1230 | max_offset = 1; // for the rparen | | |
| 1231 | } | | |
| 1232 | } | | |
| 1233 | if (extra.addrspace_expr != 0) { | | |
| 1234 | const start = token_starts[main_tokens[extra.addrspace_expr]]; | | |
| 1235 | if (start > max_start) { | | |
| 1236 | max_node = extra.addrspace_expr; | | |
| 1237 | max_start = start; | | |
| 1238 | max_offset = 1; // for the rparen | | |
| 1239 | } | | |
| 1240 | } | | |
| 1241 | if (extra.section_expr != 0) { | | |
| 1242 | const start = token_starts[main_tokens[extra.section_expr]]; | | |
| 1243 | if (start > max_start) { | | |
| 1244 | max_node = extra.section_expr; | | |
| 1245 | max_start = start; | | |
| 1246 | max_offset = 1; // for the rparen | | |
| 1247 | } | | |
| 1248 | } | | |
| 1249 | if (extra.callconv_expr != 0) { | | |
| 1250 | const start = token_starts[main_tokens[extra.callconv_expr]]; | | |
| 1251 | if (start > max_start) { | | |
| 1252 | max_node = extra.callconv_expr; | | |
| 1253 | max_start = start; | | |
| 1254 | max_offset = 1; // for the rparen | | |
| 1255 | } | | |
| 1256 | } | | |
| 1257 | n = max_node; | | |
| 1258 | end_offset += max_offset; | | |
| 1259 | }, | | |
| 1260 | .fn_proto => { | | |
| 1261 | const extra = tree.extraData(datas[n].lhs, Node.FnProto); | | |
| 1262 | // addrspace, linksection, callconv, align can appear in any order, so we | | |
| 1263 | // find the last one here. | | |
| 1264 | var max_node: Node.Index = datas[n].rhs; | | |
| 1265 | var max_start = token_starts[main_tokens[max_node]]; | | |
| 1266 | var max_offset: TokenIndex = 0; | | |
| 1267 | if (extra.align_expr != 0) { | | |
| 1268 | const start = token_starts[main_tokens[extra.align_expr]]; | | |
| 1269 | if (start > max_start) { | | |
| 1270 | max_node = extra.align_expr; | | |
| 1271 | max_start = start; | | |
| 1272 | max_offset = 1; // for the rparen | | |
| 1273 | } | | |
| 1274 | } | | |
| 1275 | if (extra.addrspace_expr != 0) { | | |
| 1276 | const start = token_starts[main_tokens[extra.addrspace_expr]]; | | |
| 1277 | if (start > max_start) { | | |
| 1278 | max_node = extra.addrspace_expr; | | |
| 1279 | max_start = start; | | |
| 1280 | max_offset = 1; // for the rparen | | |
| 1281 | } | | |
| 1282 | } | | |
| 1283 | if (extra.section_expr != 0) { | | |
| 1284 | const start = token_starts[main_tokens[extra.section_expr]]; | | |
| 1285 | if (start > max_start) { | | |
| 1286 | max_node = extra.section_expr; | | |
| 1287 | max_start = start; | | |
| 1288 | max_offset = 1; // for the rparen | | |
| 1289 | } | | |
| 1290 | } | | |
| 1291 | if (extra.callconv_expr != 0) { | | |
| 1292 | const start = token_starts[main_tokens[extra.callconv_expr]]; | | |
| 1293 | if (start > max_start) { | | |
| 1294 | max_node = extra.callconv_expr; | | |
| 1295 | max_start = start; | | |
| 1296 | max_offset = 1; // for the rparen | | |
| 1297 | } | | |
| 1298 | } | | |
| 1299 | n = max_node; | | |
| 1300 | end_offset += max_offset; | | |
| 1301 | }, | | |
| 1302 | .while_cont => { | 1192 | .while_cont => { |
| 1303 | const extra = tree.extraData(datas[n].rhs, Node.WhileCont); | 1193 | const extra = tree.extraData(datas[n].rhs, Node.WhileCont); |
| 1304 | assert(extra.then_expr != 0); | 1194 | assert(extra.then_expr != 0); |
| ... | @@ -1318,13 +1208,6 @@ pub fn lastToken(tree: Ast, node: Node.Index) TokenIndex { | ... | @@ -1318,13 +1208,6 @@ pub fn lastToken(tree: Ast, node: Node.Index) TokenIndex { |
| 1318 | const extra = @as(Node.For, @bitCast(datas[n].rhs)); | 1208 | const extra = @as(Node.For, @bitCast(datas[n].rhs)); |
| 1319 | n = tree.extra_data[datas[n].lhs + extra.inputs + @intFromBool(extra.has_else)]; | 1209 | n = tree.extra_data[datas[n].lhs + extra.inputs + @intFromBool(extra.has_else)]; |
| 1320 | }, | 1210 | }, |
| 1321 | .@"suspend" => { | | |
| 1322 | if (datas[n].lhs != 0) { | | |
| 1323 | n = datas[n].lhs; | | |
| 1324 | } else { | | |
| 1325 | return main_tokens[n] + end_offset; | | |
| 1326 | } | | |
| 1327 | }, | | |
| 1328 | .array_type_sentinel => { | 1211 | .array_type_sentinel => { |
| 1329 | const extra = tree.extraData(datas[n].rhs, Node.ArrayTypeSentinel); | 1212 | const extra = tree.extraData(datas[n].rhs, Node.ArrayTypeSentinel); |
| 1330 | n = extra.elem_type; | 1213 | n = extra.elem_type; |