mirror of
https://github.com/roc-lang/roc.git
synced 2025-12-23 08:48:03 +00:00
Render records in snapshots
This commit is contained in:
parent
26b8631faa
commit
67e8ea2e3e
3 changed files with 30 additions and 37 deletions
|
|
@ -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 => {},
|
||||
};
|
||||
|
|
|
|||
|
|
@ -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 };
|
||||
}
|
||||
};
|
||||
|
|
|
|||
|
|
@ -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
|
||||
Loading…
Add table
Add a link
Reference in a new issue