aboutsummaryrefslogtreecommitdiff
path: root/std
diff options
context:
space:
mode:
authorAndrew Kelley <superjoe30@gmail.com>2018-05-12 19:03:39 -0400
committerAndrew Kelley <superjoe30@gmail.com>2018-05-12 19:03:39 -0400
commit911cbf57cd10159176950285feb9ee14fb88a803 (patch)
treee8e7ca423294fc5265f6aff5bc2880fe77550ddf /std
parenta6ae45145f5814963cfdff4e18c1f984729588b9 (diff)
downloadzig-911cbf57cd10159176950285feb9ee14fb88a803.tar.gz
zig-911cbf57cd10159176950285feb9ee14fb88a803.zip
recursive render top level decl
Diffstat (limited to 'std')
-rw-r--r--std/zig/render.zig42
1 files changed, 19 insertions, 23 deletions
diff --git a/std/zig/render.zig b/std/zig/render.zig
index cced30cd60..c7a08a11fd 100644
--- a/std/zig/render.zig
+++ b/std/zig/render.zig
@@ -21,32 +21,28 @@ const RenderState = union(enum) {
const indent_delta = 4;
pub fn render(allocator: &mem.Allocator, stream: var, tree: &ast.Tree) !void {
+ var it = tree.root_node.decls.iterator(0);
+ while (it.next()) |decl| {
+ try renderTopLevelDecl(allocator, stream, tree, *decl);
+ if (it.peek()) |next_decl| {
+ const n = if (nodeLineOffset(tree, *decl, *next_decl) >= 2) u8(2) else u8(1);
+ try stream.writeByteNTimes('\n', n);
+ }
+ }
+ try stream.write("\n");
+}
+
+fn nodeLineOffset(tree: &ast.Tree, a: &ast.Node, b: &ast.Node) usize {
+ const a_last_token = tree.tokens.at(a.lastToken());
+ const loc = tree.tokenLocation(a_last_token.end, b.firstToken());
+ return loc.line;
+}
+
+fn renderTopLevelDecl(allocator: &mem.Allocator, stream: var, tree: &ast.Tree, decl_ptr: &ast.Node) !void {
var stack = std.ArrayList(RenderState).init(allocator);
defer stack.deinit();
- {
- try stack.append(RenderState { .Text = "\n"});
-
- var i = tree.root_node.decls.len;
- while (i != 0) {
- i -= 1;
- const decl = *tree.root_node.decls.at(i);
- try stack.append(RenderState {.TopLevelDecl = decl});
- if (i != 0) {
- try stack.append(RenderState {
- .Text = blk: {
- const prev_node = *tree.root_node.decls.at(i - 1);
- const prev_node_last_token = tree.tokens.at(prev_node.lastToken());
- const loc = tree.tokenLocation(prev_node_last_token.end, decl.firstToken());
- if (loc.line >= 2) {
- break :blk "\n\n";
- }
- break :blk "\n";
- },
- });
- }
- }
- }
+ try stack.append(RenderState {.TopLevelDecl = decl_ptr});
var indent: usize = 0;
while (stack.popOrNull()) |state| {