From e4be1da847f6aea37bf04af045f68d7dec4de53a Mon Sep 17 00:00:00 2001 From: Claire Foster Date: Mon, 4 Aug 2025 15:33:26 +1000 Subject: [PATCH] Abbreviated non-MIME `show()` for `GreenNode` Non-MIME `show()` for `GreenNode` was using the default implementation which is extremely verbose. Here we print it as an S-expression instead. I've made a choice to show absolute position within the parent node rather than node span so that it directly relates to indices in the string it was derived from. --- src/porcelain/green_node.jl | 19 +++++++++++++++++++ src/porcelain/syntax_tree.jl | 2 -- test/green_node.jl | 3 +++ 3 files changed, 22 insertions(+), 2 deletions(-) diff --git a/src/porcelain/green_node.jl b/src/porcelain/green_node.jl index b06dab56..7838ff73 100644 --- a/src/porcelain/green_node.jl +++ b/src/porcelain/green_node.jl @@ -118,6 +118,25 @@ function Base.show(io::IO, ::MIME"text/plain", node::GreenNode, str::AbstractStr _show_green_node(io, node, "", 1, str, show_trivia) end +function _show_green_node_sexpr(io, node::GreenNode, position) + if is_leaf(node) + print(io, position, "-", position+node.span-1, "::", untokenize(head(node); unique=false)) + else + print(io, "(", untokenize(head(node); unique=false)) + p = position + for n in children(node) + print(io, ' ') + _show_green_node_sexpr(io, n, p) + p += n.span + end + print(io, ')') + end +end + +function Base.show(io::IO, node::GreenNode) + _show_green_node_sexpr(io, node, 1) +end + function GreenNode(cursor::GreenTreeCursor) chead = head(cursor) T = typeof(chead) diff --git a/src/porcelain/syntax_tree.jl b/src/porcelain/syntax_tree.jl index 1002919c..4ad22cf6 100644 --- a/src/porcelain/syntax_tree.jl +++ b/src/porcelain/syntax_tree.jl @@ -250,11 +250,9 @@ function _show_syntax_node_sexpr(io, node::AbstractSyntaxNode, show_kind) end else print(io, "(", untokenize(head(node))) - first = true for n in children(node) print(io, ' ') _show_syntax_node_sexpr(io, n, show_kind) - first = false end print(io, ')') end diff --git a/test/green_node.jl b/test/green_node.jl index cc0294e0..0c3be658 100644 --- a/test/green_node.jl +++ b/test/green_node.jl @@ -62,4 +62,7 @@ 10:10 │ Identifier ✔ "z" 11:11 │ ) ")" """ + + @test sprint(show, parsestmt(GreenNode, "a + bb - f(ccc)")) == + "(call-i (call-i 1-1::Identifier 2-2::Whitespace-t 3-3::Identifier 4-4::Whitespace-t 5-6::Identifier) 7-7::Whitespace-t 8-8::Identifier 9-9::Whitespace-t (call 10-10::Identifier 11-11::(-t 12-14::Identifier 15-15::)-t))" end