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