| ... | ... | @@ -138,68 +138,33 @@ pub fn print( |
| 138 | 138 | .extern_options_type => return writer.writeAll("std.builtin.ExternOptions"), |
| 139 | 139 | .type_info_type => return writer.writeAll("std.builtin.Type"), |
| 140 | 140 | |
| 141 | | .empty_struct_value => return writer.writeAll(".{}"), |
| 142 | | .aggregate => { |
| 141 | .empty_struct_value, .aggregate => { |
| 143 | 142 | if (level == 0) { |
| 144 | 143 | return writer.writeAll(".{ ... }"); |
| 145 | 144 | } |
| 146 | | const vals = val.castTag(.aggregate).?.data; |
| 147 | | if (ty.castTag(.anon_struct)) |anon_struct| { |
| 148 | | const field_names = anon_struct.data.names; |
| 149 | | const types = anon_struct.data.types; |
| 150 | | const max_len = std.math.min(types.len, max_aggregate_items); |
| 145 | if (ty.zigTypeTag() == .Struct) { |
| 146 | try writer.writeAll(".{"); |
| 147 | const max_len = std.math.min(ty.structFieldCount(), max_aggregate_items); |
| 151 | 148 | |
| 152 | 149 | var i: u32 = 0; |
| 153 | 150 | while (i < max_len) : (i += 1) { |
| 154 | 151 | if (i != 0) try writer.writeAll(", "); |
| 155 | | try writer.print(".{s} = ", .{field_names[i]}); |
| 152 | switch (ty.tag()) { |
| 153 | .anon_struct, .@"struct" => try writer.print(".{s} = ", .{ty.structFieldName(i)}), |
| 154 | else => {}, |
| 155 | } |
| 156 | 156 | try print(.{ |
| 157 | | .ty = types[i], |
| 158 | | .val = vals[i], |
| 157 | .ty = ty.structFieldType(i), |
| 158 | .val = ty.structFieldValueComptime(i) orelse b: { |
| 159 | const vals = val.castTag(.aggregate).?.data; |
| 160 | break :b vals[i]; |
| 161 | }, |
| 159 | 162 | }, writer, level - 1, mod); |
| 160 | 163 | } |
| 161 | | if (types.len > max_aggregate_items) { |
| 164 | if (ty.structFieldCount() > max_aggregate_items) { |
| 162 | 165 | try writer.writeAll(", ..."); |
| 163 | 166 | } |
| 164 | | return writer.writeAll(" }"); |
| 165 | | } else if (ty.isTuple()) { |
| 166 | | const fields = ty.tupleFields(); |
| 167 | | const max_len = std.math.min(fields.types.len, max_aggregate_items); |
| 168 | | |
| 169 | | var i: u32 = 0; |
| 170 | | while (i < max_len) : (i += 1) { |
| 171 | | if (i != 0) try writer.writeAll(", "); |
| 172 | | try print(.{ |
| 173 | | .ty = fields.types[i], |
| 174 | | .val = vals[i], |
| 175 | | }, writer, level - 1, mod); |
| 176 | | } |
| 177 | | if (fields.types.len > max_aggregate_items) { |
| 178 | | try writer.writeAll(", ..."); |
| 179 | | } |
| 180 | | return writer.writeAll(" }"); |
| 181 | | } else if (ty.zigTypeTag() == .Struct) { |
| 182 | | try writer.writeAll(".{ "); |
| 183 | | const struct_fields = ty.structFields(); |
| 184 | | const len = struct_fields.count(); |
| 185 | | const max_len = std.math.min(len, max_aggregate_items); |
| 186 | | |
| 187 | | const field_names = struct_fields.keys(); |
| 188 | | const fields = struct_fields.values(); |
| 189 | | |
| 190 | | var i: u32 = 0; |
| 191 | | while (i < max_len) : (i += 1) { |
| 192 | | if (i != 0) try writer.writeAll(", "); |
| 193 | | try writer.print(".{s} = ", .{field_names[i]}); |
| 194 | | try print(.{ |
| 195 | | .ty = fields[i].ty, |
| 196 | | .val = vals[i], |
| 197 | | }, writer, level - 1, mod); |
| 198 | | } |
| 199 | | if (len > max_aggregate_items) { |
| 200 | | try writer.writeAll(", ..."); |
| 201 | | } |
| 202 | | return writer.writeAll(" }"); |
| 167 | return writer.writeAll("}"); |
| 203 | 168 | } else { |
| 204 | 169 | try writer.writeAll(".{ "); |
| 205 | 170 | const elem_ty = ty.elemType2(); |
| ... | ... | @@ -211,7 +176,7 @@ pub fn print( |
| 211 | 176 | if (i != 0) try writer.writeAll(", "); |
| 212 | 177 | try print(.{ |
| 213 | 178 | .ty = elem_ty, |
| 214 | | .val = vals[i], |
| 179 | .val = val.castTag(.aggregate).?.data[i], |
| 215 | 180 | }, writer, level - 1, mod); |
| 216 | 181 | } |
| 217 | 182 | if (len > max_aggregate_items) { |
| ... | ... | @@ -335,12 +300,23 @@ pub fn print( |
| 335 | 300 | } |
| 336 | 301 | |
| 337 | 302 | if (field_ptr.container_ty.zigTypeTag() == .Struct) { |
| 338 | | const field_name = field_ptr.container_ty.structFields().keys()[field_ptr.field_index]; |
| 339 | | return writer.print(".{s}", .{field_name}); |
| 303 | switch (field_ptr.container_ty.tag()) { |
| 304 | .tuple => return writer.print(".@\"{d}\"", .{field_ptr.field_index}), |
| 305 | else => { |
| 306 | const field_name = field_ptr.container_ty.structFieldName(field_ptr.field_index); |
| 307 | return writer.print(".{s}", .{field_name}); |
| 308 | }, |
| 309 | } |
| 340 | 310 | } else if (field_ptr.container_ty.zigTypeTag() == .Union) { |
| 341 | 311 | const field_name = field_ptr.container_ty.unionFields().keys()[field_ptr.field_index]; |
| 342 | 312 | return writer.print(".{s}", .{field_name}); |
| 343 | | } else unreachable; |
| 313 | } else if (field_ptr.container_ty.isSlice()) { |
| 314 | switch (field_ptr.field_index) { |
| 315 | Value.Payload.Slice.ptr_index => return writer.writeAll(".ptr"), |
| 316 | Value.Payload.Slice.len_index => return writer.writeAll(".len"), |
| 317 | else => unreachable, |
| 318 | } |
| 319 | } |
| 344 | 320 | }, |
| 345 | 321 | .empty_array => return writer.writeAll(".{}"), |
| 346 | 322 | .enum_literal => return writer.print(".{}", .{std.zig.fmtId(val.castTag(.enum_literal).?.data)}), |