diff --git a/source/ast/renderer/renderer.hon b/source/ast/renderer/renderer.hon index 3ce24b4..5f024ed 100644 --- a/source/ast/renderer/renderer.hon +++ b/source/ast/renderer/renderer.hon @@ -15,11 +15,50 @@ deinit proc(renderer @mut Renderer) void { } render proc(renderer @mut Renderer, tree @ast.Tree) void ! mem.AllocError { - _ = tree arraylist.clear(&renderer.bytes) try append_text(renderer, "package\n") + for 0..ast.package_decl_count(tree) |index| { + declaration :: ast.package_decl(tree, index) + match ast.decl_kind(tree, declaration) { + .statement: try render_statement(renderer, tree, declaration, " ") + .function: try render_function(renderer, tree, declaration) + .invalid: try append_text(renderer, " invalid declaration\n") + } + } } +@hide:file +render_function proc( + renderer @mut Renderer, + tree @ast.Tree, + declaration ast.NodeId, +) void ! mem.AllocError { + function :: ast.function_decl(tree, declaration) + try append_text(renderer, " function ") + try append_text(renderer, ast.source_text(tree, function.name)) + try append_text(renderer, "\n") + for 0..ast.block_statement_count(tree, function.body) |index| { + statement :: ast.block_statement(tree, function.body, index) + match ast.stmt_kind(tree, statement) { + .declaration: try render_statement(renderer, tree, statement, " ") + .invalid: try append_text(renderer, " invalid statement\n") + } + } +} + +@hide:file +render_statement proc( + renderer @mut Renderer, + tree @ast.Tree, + declaration ast.NodeId, + indent []u8, +) void ! mem.AllocError { + statement :: ast.statement_decl(tree, declaration) + try append_text(renderer, indent) + try append_text(renderer, "declaration ") + try append_text(renderer, ast.source_text(tree, statement.name)) + try append_text(renderer, "\n") +} @hide:file append_text proc(renderer @mut Renderer, text []u8) void ! mem.AllocError { diff --git a/source/ast/renderer/renderer.test.hon b/source/ast/renderer/renderer.test.hon new file mode 100644 index 0000000..7387023 --- /dev/null +++ b/source/ast/renderer/renderer.test.hon @@ -0,0 +1,27 @@ +import "@std/mem" +import "@std/testing" +import "@source/ast" + +renders_semantic_debug_view test { + builder := ast.init_builder(mem.c_allocator, "value :: 42") + defer ast.deinit_builder(&builder) + value :: try ast.add_literal(&builder, .int, ast.Span{ start = 9, end = 11 }) + declaration :: try ast.add_statement_decl( + &builder, + ast.Span{ start = 0, end = 11 }, + ast.Span{ start = 0, end = 5 }, + null, + .constant, + value, + ) + declarations [1]ast.NodeId := [declaration] + package :: try ast.add_package(&builder, ast.Span{ start = 0, end = 11 }, declarations[..]) + tree := ast.finish(&builder, package) + defer ast.deinit(&tree) + renderer := init(mem.c_allocator) + defer deinit(&renderer) + + try render(&renderer, &tree) + + try testing.expect(mem.eql(u8, "package\n declaration value\n", renderer.bytes.items)) +}