From 67e8ea2e3e15a1ce2b8eaae48a800bff34855e19 Mon Sep 17 00:00:00 2001 From: Richard Feldman Date: Thu, 27 Nov 2025 22:19:41 -0500 Subject: [PATCH] Render records in snapshots --- src/eval/render_helpers.zig | 55 ++++++++++--------- src/repl/eval.zig | 8 --- .../repl/list_fold_record_accumulator.md | 4 +- 3 files changed, 30 insertions(+), 37 deletions(-) diff --git a/src/eval/render_helpers.zig b/src/eval/render_helpers.zig index 76ffe21449..2165f99068 100644 --- a/src/eval/render_helpers.zig +++ b/src/eval/render_helpers.zig @@ -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, ""); - } - 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(""); + 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(""); + } + 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 => {}, }; diff --git a/src/repl/eval.zig b/src/repl/eval.zig index cd7d63493c..db2cb42c3b 100644 --- a/src/repl/eval.zig +++ b/src/repl/eval.zig @@ -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, ""); - } 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, "") }; - } return .{ .expression = output }; } }; diff --git a/test/snapshots/repl/list_fold_record_accumulator.md b/test/snapshots/repl/list_fold_record_accumulator.md index 044632fe67..fb36abc700 100644 --- a/test/snapshots/repl/list_fold_record_accumulator.md +++ b/test/snapshots/repl/list_fold_record_accumulator.md @@ -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 - +{ count: 3, sum: 6 } # PROBLEMS -NIL +NIL \ No newline at end of file