| ... | @@ -668,6 +668,8 @@ const DocData = struct { | ... | @@ -668,6 +668,8 @@ const DocData = struct { |
| 668 | compileError: []const u8, | 668 | compileError: []const u8, |
| 669 | errorSets: usize, | 669 | errorSets: usize, |
| 670 | string: []const u8, // direct value | 670 | string: []const u8, // direct value |
| | 671 | sliceIndex: usize, |
| | 672 | slice: Slice, |
| 671 | builtin: Builtin, | 673 | builtin: Builtin, |
| 672 | builtinIndex: usize, | 674 | builtinIndex: usize, |
| 673 | builtinBin: BuiltinBin, | 675 | builtinBin: BuiltinBin, |
| ... | @@ -709,6 +711,12 @@ const DocData = struct { | ... | @@ -709,6 +711,12 @@ const DocData = struct { |
| 709 | name: []const u8 = "", // fn name | 711 | name: []const u8 = "", // fn name |
| 710 | param: usize, // index in `exprs` | 712 | param: usize, // index in `exprs` |
| 711 | }; | 713 | }; |
| | 714 | const Slice = struct { |
| | 715 | lhs: usize, // index in `exprs` |
| | 716 | start: usize, |
| | 717 | end: ?usize = null, |
| | 718 | sentinel: ?usize = null, // index in `exprs` |
| | 719 | }; |
| 712 | const As = struct { | 720 | const As = struct { |
| 713 | typeRefArg: ?usize, // index in `exprs` | 721 | typeRefArg: ?usize, // index in `exprs` |
| 714 | exprArg: usize, // index in `exprs` | 722 | exprArg: usize, // index in `exprs` |
| ... | @@ -833,6 +841,16 @@ const DocData = struct { | ... | @@ -833,6 +841,16 @@ const DocData = struct { |
| 833 | options, | 841 | options, |
| 834 | w, | 842 | w, |
| 835 | ), | 843 | ), |
| | 844 | .slice => |v| try std.json.stringify( |
| | 845 | struct { slice: Slice }{ .slice = v }, |
| | 846 | options, |
| | 847 | w, |
| | 848 | ), |
| | 849 | .sliceIndex => |v| try std.json.stringify( |
| | 850 | struct { sliceIndex: usize }{ .sliceIndex = v }, |
| | 851 | options, |
| | 852 | w, |
| | 853 | ), |
| 836 | .typeOf_peer => |v| try std.json.stringify( | 854 | .typeOf_peer => |v| try std.json.stringify( |
| 837 | struct { typeOf_peer: []usize }{ .typeOf_peer = v }, | 855 | struct { typeOf_peer: []usize }{ .typeOf_peer = v }, |
| 838 | options, | 856 | options, |
| ... | @@ -1106,6 +1124,123 @@ fn walkInstruction( | ... | @@ -1106,6 +1124,123 @@ fn walkInstruction( |
| 1106 | // .expr = .{ .binOpIndex = binop_index }, | 1124 | // .expr = .{ .binOpIndex = binop_index }, |
| 1107 | // }; | 1125 | // }; |
| 1108 | // }, | 1126 | // }, |
| | 1127 | .slice_start => { |
| | 1128 | const pl_node = data[inst_index].pl_node; |
| | 1129 | const extra = file.zir.extraData(Zir.Inst.SliceStart, pl_node.payload_index); |
| | 1130 | |
| | 1131 | const slice_index = self.exprs.items.len; |
| | 1132 | try self.exprs.append(self.arena, .{ .slice = .{ .lhs = 0, .start = 0 } }); |
| | 1133 | |
| | 1134 | var lhs: DocData.WalkResult = try self.walkRef( |
| | 1135 | file, |
| | 1136 | parent_scope, |
| | 1137 | extra.data.lhs, |
| | 1138 | false, |
| | 1139 | ); |
| | 1140 | var start: DocData.WalkResult = try self.walkRef( |
| | 1141 | file, |
| | 1142 | parent_scope, |
| | 1143 | extra.data.start, |
| | 1144 | false, |
| | 1145 | ); |
| | 1146 | |
| | 1147 | const lhs_index = self.exprs.items.len; |
| | 1148 | try self.exprs.append(self.arena, lhs.expr); |
| | 1149 | const start_index = self.exprs.items.len; |
| | 1150 | try self.exprs.append(self.arena, start.expr); |
| | 1151 | self.exprs.items[slice_index] = .{ .slice = .{ .lhs = lhs_index, .start = start_index } }; |
| | 1152 | |
| | 1153 | return DocData.WalkResult{ |
| | 1154 | .typeRef = .{ .type = @enumToInt(Ref.type_type) }, |
| | 1155 | .expr = .{ .sliceIndex = slice_index }, |
| | 1156 | }; |
| | 1157 | }, |
| | 1158 | .slice_end => { |
| | 1159 | const pl_node = data[inst_index].pl_node; |
| | 1160 | const extra = file.zir.extraData(Zir.Inst.SliceEnd, pl_node.payload_index); |
| | 1161 | |
| | 1162 | const slice_index = self.exprs.items.len; |
| | 1163 | try self.exprs.append(self.arena, .{ .slice = .{ .lhs = 0, .start = 0 } }); |
| | 1164 | |
| | 1165 | var lhs: DocData.WalkResult = try self.walkRef( |
| | 1166 | file, |
| | 1167 | parent_scope, |
| | 1168 | extra.data.lhs, |
| | 1169 | false, |
| | 1170 | ); |
| | 1171 | var start: DocData.WalkResult = try self.walkRef( |
| | 1172 | file, |
| | 1173 | parent_scope, |
| | 1174 | extra.data.start, |
| | 1175 | false, |
| | 1176 | ); |
| | 1177 | var end: DocData.WalkResult = try self.walkRef( |
| | 1178 | file, |
| | 1179 | parent_scope, |
| | 1180 | extra.data.end, |
| | 1181 | false, |
| | 1182 | ); |
| | 1183 | |
| | 1184 | const lhs_index = self.exprs.items.len; |
| | 1185 | try self.exprs.append(self.arena, lhs.expr); |
| | 1186 | const start_index = self.exprs.items.len; |
| | 1187 | try self.exprs.append(self.arena, start.expr); |
| | 1188 | const end_index = self.exprs.items.len; |
| | 1189 | try self.exprs.append(self.arena, end.expr); |
| | 1190 | self.exprs.items[slice_index] = .{ .slice = .{ .lhs = lhs_index, .start = start_index, .end = end_index } }; |
| | 1191 | |
| | 1192 | return DocData.WalkResult{ |
| | 1193 | .typeRef = .{ .type = @enumToInt(Ref.type_type) }, |
| | 1194 | .expr = .{ .sliceIndex = slice_index }, |
| | 1195 | }; |
| | 1196 | }, |
| | 1197 | .slice_sentinel => { |
| | 1198 | const pl_node = data[inst_index].pl_node; |
| | 1199 | const extra = file.zir.extraData(Zir.Inst.SliceSentinel, pl_node.payload_index); |
| | 1200 | |
| | 1201 | const slice_index = self.exprs.items.len; |
| | 1202 | try self.exprs.append(self.arena, .{ .slice = .{ .lhs = 0, .start = 0 } }); |
| | 1203 | |
| | 1204 | var lhs: DocData.WalkResult = try self.walkRef( |
| | 1205 | file, |
| | 1206 | parent_scope, |
| | 1207 | extra.data.lhs, |
| | 1208 | false, |
| | 1209 | ); |
| | 1210 | var start: DocData.WalkResult = try self.walkRef( |
| | 1211 | file, |
| | 1212 | parent_scope, |
| | 1213 | extra.data.start, |
| | 1214 | false, |
| | 1215 | ); |
| | 1216 | var end: DocData.WalkResult = try self.walkRef( |
| | 1217 | file, |
| | 1218 | parent_scope, |
| | 1219 | extra.data.end, |
| | 1220 | false, |
| | 1221 | ); |
| | 1222 | var sentinel: DocData.WalkResult = try self.walkRef( |
| | 1223 | file, |
| | 1224 | parent_scope, |
| | 1225 | extra.data.sentinel, |
| | 1226 | false, |
| | 1227 | ); |
| | 1228 | |
| | 1229 | const lhs_index = self.exprs.items.len; |
| | 1230 | try self.exprs.append(self.arena, lhs.expr); |
| | 1231 | const start_index = self.exprs.items.len; |
| | 1232 | try self.exprs.append(self.arena, start.expr); |
| | 1233 | const end_index = self.exprs.items.len; |
| | 1234 | try self.exprs.append(self.arena, end.expr); |
| | 1235 | const sentinel_index = self.exprs.items.len; |
| | 1236 | try self.exprs.append(self.arena, sentinel.expr); |
| | 1237 | self.exprs.items[slice_index] = .{ .slice = .{ .lhs = lhs_index, .start = start_index, .end = end_index, .sentinel = sentinel_index } }; |
| | 1238 | |
| | 1239 | return DocData.WalkResult{ |
| | 1240 | .typeRef = .{ .type = @enumToInt(Ref.type_type) }, |
| | 1241 | .expr = .{ .sliceIndex = slice_index }, |
| | 1242 | }; |
| | 1243 | }, |
| 1109 | .bit_or => { | 1244 | .bit_or => { |
| 1110 | const pl_node = data[inst_index].pl_node; | 1245 | const pl_node = data[inst_index].pl_node; |
| 1111 | const extra = file.zir.extraData(Zir.Inst.Bin, pl_node.payload_index); | 1246 | const extra = file.zir.extraData(Zir.Inst.Bin, pl_node.payload_index); |
| ... | @@ -1924,6 +2059,7 @@ fn walkInstruction( | ... | @@ -1924,6 +2059,7 @@ fn walkInstruction( |
| 1924 | }; | 2059 | }; |
| 1925 | }, | 2060 | }, |
| 1926 | | 2061 | |
| | 2062 | // builtin functions |
| 1927 | .align_of, | 2063 | .align_of, |
| 1928 | .bool_to_int, | 2064 | .bool_to_int, |
| 1929 | .embed_file, | 2065 | .embed_file, |
| ... | @@ -1966,6 +2102,8 @@ fn walkInstruction( | ... | @@ -1966,6 +2102,8 @@ fn walkInstruction( |
| 1966 | .expr = .{ .builtinIndex = bin_index }, | 2102 | .expr = .{ .builtinIndex = bin_index }, |
| 1967 | }; | 2103 | }; |
| 1968 | }, | 2104 | }, |
| | 2105 | // @check |
| | 2106 | // .clz, .ctz, .pop_count, .byte_swap, .bit_reverse |
| 1969 | .float_to_int, .int_to_float, .int_to_ptr, .int_to_enum, .float_cast, .int_cast, .ptr_cast, .truncate, .align_cast, .has_decl, .has_field => { | 2107 | .float_to_int, .int_to_float, .int_to_ptr, .int_to_enum, .float_cast, .int_cast, .ptr_cast, .truncate, .align_cast, .has_decl, .has_field => { |
| 1970 | const pl_node = data[inst_index].pl_node; | 2108 | const pl_node = data[inst_index].pl_node; |
| 1971 | const extra = file.zir.extraData(Zir.Inst.Bin, pl_node.payload_index); | 2109 | const extra = file.zir.extraData(Zir.Inst.Bin, pl_node.payload_index); |