| ... | ... | @@ -800,7 +800,6 @@ pub fn lastToken(tree: Ast, node: Node.Index) TokenIndex { |
| 800 | 800 | const tags = tree.nodes.items(.tag); |
| 801 | 801 | const datas = tree.nodes.items(.data); |
| 802 | 802 | const main_tokens = tree.nodes.items(.main_token); |
| 803 | | const token_starts = tree.tokens.items(.start); |
| 804 | 803 | const token_tags = tree.tokens.items(.tag); |
| 805 | 804 | var n = node; |
| 806 | 805 | var end_offset: TokenIndex = 0; |
| ... | ... | @@ -816,6 +815,7 @@ pub fn lastToken(tree: Ast, node: Node.Index) TokenIndex { |
| 816 | 815 | .@"try", |
| 817 | 816 | .@"await", |
| 818 | 817 | .optional_type, |
| 818 | .@"suspend", |
| 819 | 819 | .@"resume", |
| 820 | 820 | .@"nosuspend", |
| 821 | 821 | .@"comptime", |
| ... | ... | @@ -880,6 +880,9 @@ pub fn lastToken(tree: Ast, node: Node.Index) TokenIndex { |
| 880 | 880 | .for_simple, |
| 881 | 881 | .fn_proto_simple, |
| 882 | 882 | .fn_proto_multi, |
| 883 | .fn_proto_one, |
| 884 | .fn_proto, |
| 885 | .fn_decl, |
| 883 | 886 | .ptr_type_aligned, |
| 884 | 887 | .ptr_type_sentinel, |
| 885 | 888 | .ptr_type, |
| ... | ... | @@ -928,9 +931,7 @@ pub fn lastToken(tree: Ast, node: Node.Index) TokenIndex { |
| 928 | 931 | .call, .async_call => { |
| 929 | 932 | end_offset += 1; // for the rparen |
| 930 | 933 | const params = tree.extraData(datas[n].rhs, Node.SubRange); |
| 931 | | if (params.end - params.start == 0) { |
| 932 | | return main_tokens[n] + end_offset; |
| 933 | | } |
| 934 | assert(params.end - params.start > 0); |
| 934 | 935 | n = tree.extra_data[params.end - 1]; // last parameter |
| 935 | 936 | }, |
| 936 | 937 | .tagged_union_enum_tag => { |
| ... | ... | @@ -1122,48 +1123,28 @@ pub fn lastToken(tree: Ast, node: Node.Index) TokenIndex { |
| 1122 | 1123 | n = datas[n].rhs; |
| 1123 | 1124 | } else { |
| 1124 | 1125 | const extra = tree.extraData(datas[n].lhs, Node.LocalVarDecl); |
| 1125 | | if (extra.align_node != 0) { |
| 1126 | | end_offset += 1; // for the rparen |
| 1127 | | 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 | | } |
| 1126 | assert(extra.align_node != 0); |
| 1127 | end_offset += 1; // for the rparen |
| 1128 | n = extra.align_node; |
| 1134 | 1129 | } |
| 1135 | 1130 | }, |
| 1136 | 1131 | .container_field_init => { |
| 1137 | 1132 | if (datas[n].rhs != 0) { |
| 1138 | 1133 | n = datas[n].rhs; |
| 1139 | | } else if (datas[n].lhs != 0) { |
| 1140 | | n = datas[n].lhs; |
| 1141 | 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 | 1139 | .container_field_align => { |
| 1146 | | if (datas[n].rhs != 0) { |
| 1147 | | end_offset += 1; // for the rparen |
| 1148 | | 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 | | } |
| 1140 | assert(datas[n].rhs != 0); |
| 1141 | end_offset += 1; // for the rparen |
| 1142 | n = datas[n].rhs; |
| 1154 | 1143 | }, |
| 1155 | 1144 | .container_field => { |
| 1156 | 1145 | const extra = tree.extraData(datas[n].rhs, Node.ContainerField); |
| 1157 | | if (extra.value_expr != 0) { |
| 1158 | | 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 | | } |
| 1146 | assert(extra.value_expr != 0); |
| 1147 | n = extra.value_expr; |
| 1167 | 1148 | }, |
| 1168 | 1149 | |
| 1169 | 1150 | .array_init_one, |
| ... | ... | @@ -1208,97 +1189,6 @@ pub fn lastToken(tree: Ast, node: Node.Index) TokenIndex { |
| 1208 | 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 | 1192 | .while_cont => { |
| 1303 | 1193 | const extra = tree.extraData(datas[n].rhs, Node.WhileCont); |
| 1304 | 1194 | assert(extra.then_expr != 0); |
| ... | ... | @@ -1318,13 +1208,6 @@ pub fn lastToken(tree: Ast, node: Node.Index) TokenIndex { |
| 1318 | 1208 | const extra = @as(Node.For, @bitCast(datas[n].rhs)); |
| 1319 | 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 | 1211 | .array_type_sentinel => { |
| 1329 | 1212 | const extra = tree.extraData(datas[n].rhs, Node.ArrayTypeSentinel); |
| 1330 | 1213 | n = extra.elem_type; |