Render records in snapshots

This commit is contained in:
Richard Feldman 2025-11-27 22:19:41 -05:00
parent 26b8631faa
commit 67e8ea2e3e
No known key found for this signature in database
3 changed files with 30 additions and 37 deletions

View file

@ -284,37 +284,38 @@ pub fn renderValueRocWithType(ctx: *RenderCtx, value: StackValue, rt_var: types.
}
},
.record => |rec| {
// Try to render using type information first
const ext_resolved = ctx.runtime_types.resolveVar(rec.ext);
const use_placeholder = switch (ext_resolved.desc.content) {
.structure => |st| st != .empty_record,
else => true,
const has_complete_type_info = switch (ext_resolved.desc.content) {
.structure => |st| st == .empty_record,
else => false,
};
if (use_placeholder) {
return try gpa.dupe(u8, "<record>");
}
var out = std.array_list.AlignedManaged(u8, null).init(gpa);
errdefer out.deinit();
try out.appendSlice("{ ");
var acc = try value.asRecord(ctx.layout_store);
const fields = ctx.runtime_types.getRecordFieldsSlice(rec.fields);
var i: usize = 0;
while (i < fields.len) : (i += 1) {
const f = fields.get(i);
const name_text = ctx.env.getIdent(f.name);
try out.appendSlice(name_text);
try out.appendSlice(": ");
if (acc.findFieldIndex(f.name)) |idx| {
const field_val = try acc.getFieldByIndex(idx);
const rendered = try renderValueRoc(ctx, field_val);
defer gpa.free(rendered);
try out.appendSlice(rendered);
} else {
try out.appendSlice("<missing>");
if (has_complete_type_info) {
var out = std.array_list.AlignedManaged(u8, null).init(gpa);
errdefer out.deinit();
try out.appendSlice("{ ");
var acc = try value.asRecord(ctx.layout_store);
const fields = ctx.runtime_types.getRecordFieldsSlice(rec.fields);
var i: usize = 0;
while (i < fields.len) : (i += 1) {
const f = fields.get(i);
const name_text = ctx.env.getIdent(f.name);
try out.appendSlice(name_text);
try out.appendSlice(": ");
if (acc.findFieldIndex(f.name)) |idx| {
const field_val = try acc.getFieldByIndex(idx);
const rendered = try renderValueRocWithType(ctx, field_val, f.var_);
defer gpa.free(rendered);
try out.appendSlice(rendered);
} else {
try out.appendSlice("<missing>");
}
if (i + 1 < fields.len) try out.appendSlice(", ");
}
if (i + 1 < fields.len) try out.appendSlice(", ");
try out.appendSlice(" }");
return out.toOwnedSlice();
}
try out.appendSlice(" }");
return out.toOwnedSlice();
// Fall through to renderValueRoc which can use layout info
},
else => {},
};

View file

@ -680,10 +680,6 @@ pub const Repl = struct {
};
result.decref(&interpreter.runtime_layout_store, self.roc_ops);
if (result.layout.tag == .record) {
self.allocator.free(output);
return try self.allocator.dupe(u8, "<record>");
}
return output;
}
@ -864,10 +860,6 @@ pub const Repl = struct {
};
result.decref(&interpreter.runtime_layout_store, self.roc_ops);
if (result.layout.tag == .record) {
self.allocator.free(output);
return .{ .expression = try self.allocator.dupe(u8, "<record>") };
}
return .{ .expression = output };
}
};

View file

@ -8,6 +8,6 @@ type=repl
» List.fold([1, 2, 3], {sum: 0, count: 0}, |acc, item| {sum: acc.sum + item, count: acc.count + 1})
~~~
# OUTPUT
<record>
{ count: 3, sum: 6 }
# PROBLEMS
NIL
NIL