authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2018-05-12 19:03:39-04:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2018-05-12 19:03:39-04:00
log911cbf57cd10159176950285feb9ee14fb88a803
treee8e7ca423294fc5265f6aff5bc2880fe77550ddf
parenta6ae45145f5814963cfdff4e18c1f984729588b9

recursive render top level decl


1 files changed, 19 insertions(+), 23 deletions(-)

std/zig/render.zig+19-23
...@@ -21,32 +21,28 @@ const RenderState = union(enum) {...@@ -21,32 +21,28 @@ const RenderState = union(enum) {
21const indent_delta = 4;21const indent_delta = 4;
2222
23pub fn render(allocator: &mem.Allocator, stream: var, tree: &ast.Tree) !void {23pub fn render(allocator: &mem.Allocator, stream: var, tree: &ast.Tree) !void {
24 var it = tree.root_node.decls.iterator(0);
25 while (it.next()) |decl| {
26 try renderTopLevelDecl(allocator, stream, tree, *decl);
27 if (it.peek()) |next_decl| {
28 const n = if (nodeLineOffset(tree, *decl, *next_decl) >= 2) u8(2) else u8(1);
29 try stream.writeByteNTimes('\n', n);
30 }
31 }
32 try stream.write("\n");
33}
34
35fn nodeLineOffset(tree: &ast.Tree, a: &ast.Node, b: &ast.Node) usize {
36 const a_last_token = tree.tokens.at(a.lastToken());
37 const loc = tree.tokenLocation(a_last_token.end, b.firstToken());
38 return loc.line;
39}
40
41fn renderTopLevelDecl(allocator: &mem.Allocator, stream: var, tree: &ast.Tree, decl_ptr: &ast.Node) !void {
24 var stack = std.ArrayList(RenderState).init(allocator);42 var stack = std.ArrayList(RenderState).init(allocator);
25 defer stack.deinit();43 defer stack.deinit();
2644
27 {45 try stack.append(RenderState {.TopLevelDecl = decl_ptr});
28 try stack.append(RenderState { .Text = "\n"});
29
30 var i = tree.root_node.decls.len;
31 while (i != 0) {
32 i -= 1;
33 const decl = *tree.root_node.decls.at(i);
34 try stack.append(RenderState {.TopLevelDecl = decl});
35 if (i != 0) {
36 try stack.append(RenderState {
37 .Text = blk: {
38 const prev_node = *tree.root_node.decls.at(i - 1);
39 const prev_node_last_token = tree.tokens.at(prev_node.lastToken());
40 const loc = tree.tokenLocation(prev_node_last_token.end, decl.firstToken());
41 if (loc.line >= 2) {
42 break :blk "\n\n";
43 }
44 break :blk "\n";
45 },
46 });
47 }
48 }
49 }
5046
51 var indent: usize = 0;47 var indent: usize = 0;
52 while (stack.popOrNull()) |state| {48 while (stack.popOrNull()) |state| {