| ... | ... | @@ -668,6 +668,8 @@ const DocData = struct { |
| 668 | 668 | compileError: []const u8, |
| 669 | 669 | errorSets: usize, |
| 670 | 670 | string: []const u8, // direct value |
| 671 | sliceIndex: usize, |
| 672 | slice: Slice, |
| 671 | 673 | builtin: Builtin, |
| 672 | 674 | builtinIndex: usize, |
| 673 | 675 | builtinBin: BuiltinBin, |
| ... | ... | @@ -709,6 +711,12 @@ const DocData = struct { |
| 709 | 711 | name: []const u8 = "", // fn name |
| 710 | 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 | 720 | const As = struct { |
| 713 | 721 | typeRefArg: ?usize, // index in `exprs` |
| 714 | 722 | exprArg: usize, // index in `exprs` |
| ... | ... | @@ -833,6 +841,16 @@ const DocData = struct { |
| 833 | 841 | options, |
| 834 | 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 | 854 | .typeOf_peer => |v| try std.json.stringify( |
| 837 | 855 | struct { typeOf_peer: []usize }{ .typeOf_peer = v }, |
| 838 | 856 | options, |
| ... | ... | @@ -1106,6 +1124,123 @@ fn walkInstruction( |
| 1106 | 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 | 1244 | .bit_or => { |
| 1110 | 1245 | const pl_node = data[inst_index].pl_node; |
| 1111 | 1246 | const extra = file.zir.extraData(Zir.Inst.Bin, pl_node.payload_index); |
| ... | ... | @@ -1924,6 +2059,7 @@ fn walkInstruction( |
| 1924 | 2059 | }; |
| 1925 | 2060 | }, |
| 1926 | 2061 | |
| 2062 | // builtin functions |
| 1927 | 2063 | .align_of, |
| 1928 | 2064 | .bool_to_int, |
| 1929 | 2065 | .embed_file, |
| ... | ... | @@ -1966,6 +2102,8 @@ fn walkInstruction( |
| 1966 | 2102 | .expr = .{ .builtinIndex = bin_index }, |
| 1967 | 2103 | }; |
| 1968 | 2104 | }, |
| 2105 | // @check |
| 2106 | // .clz, .ctz, .pop_count, .byte_swap, .bit_reverse |
| 1969 | 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 | 2108 | const pl_node = data[inst_index].pl_node; |
| 1971 | 2109 | const extra = file.zir.extraData(Zir.Inst.Bin, pl_node.payload_index); |