| ... | ... | @@ -21,32 +21,28 @@ const RenderState = union(enum) { |
| 21 | 21 | const indent_delta = 4; |
| 22 | 22 | |
| 23 | 23 | pub 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 | |
| 35 | fn 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 | |
| 41 | fn renderTopLevelDecl(allocator: &mem.Allocator, stream: var, tree: &ast.Tree, decl_ptr: &ast.Node) !void { |
| 24 | 42 | var stack = std.ArrayList(RenderState).init(allocator); |
| 25 | 43 | defer stack.deinit(); |
| 26 | 44 | |
| 27 | | { |
| 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 | | } |
| 45 | try stack.append(RenderState {.TopLevelDecl = decl_ptr}); |
| 50 | 46 | |
| 51 | 47 | var indent: usize = 0; |
| 52 | 48 | while (stack.popOrNull()) |state| { |