Skip to content

Commit 20dc88a

Browse files
committed
update codegen.SymbolTree.dump to better handle nested nodes
1 parent 9b10e5e commit 20dc88a

File tree

1 file changed

+18
-8
lines changed

1 file changed

+18
-8
lines changed

src/codegen/codegen.zig

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -249,26 +249,36 @@ const SymbolTree = struct {
249249

250250
/// Useful for debugging
251251
fn dump(tree: *const SymbolTree) error{WriteFailed}!void {
252-
const dumpNode = struct {
252+
const Landfill = struct {
253+
indent_stack: std.bit_set.IntegerBitSet(64) = undefined,
254+
indent_stack_size: u8 = 0,
255+
253256
fn dumpNode(
257+
l: *@This(),
254258
children: std.StringArrayHashMapUnmanaged(Node),
255259
writer: *std.Io.Writer,
256-
indent: usize,
257260
) error{WriteFailed}!void {
258261
for (children.keys(), children.values(), 0..) |name, child_node, i| {
259262
const is_last = i + 1 == children.count();
260-
try writer.splatBytesAll("│ ", indent);
261-
try writer.print("{s}── {s} {s}\n", .{ @as([]const u8, if (is_last) "└" else "├"), name });
262-
try dumpNode(child_node.children, writer, indent + 1);
263+
for (0..l.indent_stack_size) |indent_index| {
264+
try writer.writeAll(if (l.indent_stack.isSet(indent_index)) " " else "| ");
265+
}
266+
try writer.print("{s}── {s}\n", .{ @as([]const u8, if (is_last) "└" else "├"), name });
267+
268+
l.indent_stack.setValue(l.indent_stack_size, is_last);
269+
l.indent_stack_size += 1;
270+
defer l.indent_stack_size -= 1;
271+
try l.dumpNode(child_node.children, writer);
263272
}
264273
}
265-
}.dumpNode;
274+
};
266275

267276
var buffer: [4096]u8 = undefined;
268-
const writer = std.debug.lockStderrWriter(&buffer);
277+
const writer, _ = std.debug.lockStderrWriter(&buffer);
269278
defer std.debug.unlockStderrWriter();
270279

271-
try dumpNode(tree.root, writer, 0);
280+
var landfill: Landfill = .{};
281+
try landfill.dumpNode(tree.root, writer);
272282
}
273283
};
274284

0 commit comments

Comments
 (0)