Skip to content

Commit b8fcee9

Browse files
committed
feat: add treeviewer for output
1 parent 488a8ca commit b8fcee9

File tree

2 files changed

+64
-0
lines changed

2 files changed

+64
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
package chapi.ast.javaast
2+
3+
import org.antlr.v4.runtime.misc.Utils;
4+
import org.antlr.v4.runtime.tree.Tree;
5+
import org.antlr.v4.runtime.tree.Trees;
6+
7+
class TreeViewer {
8+
9+
/** Platform dependent end-of-line marker */
10+
val Eol = System.lineSeparator()
11+
12+
/** The literal indent char(s) used for pretty-printing */
13+
val Indents = " "
14+
private var level = 0
15+
16+
/**
17+
* Pretty print out a whole tree. [.getNodeText] is used on the node payloads to get the text
18+
* for the nodes. (Derived from Trees.toStringTree(....))
19+
*/
20+
fun toPrettyTree(t: Tree, ruleNames: List<String>): String {
21+
level = 0
22+
return process(t, ruleNames).replace("(?m)^\\s+$".toRegex(), "").replace("\\r?\\n\\r?\\n".toRegex(), Eol)
23+
}
24+
25+
private fun process(t: Tree, ruleNames: List<String>): String {
26+
if (t.childCount == 0) return Utils.escapeWhitespace(Trees.getNodeText(t, ruleNames), false)
27+
val sb = StringBuilder()
28+
sb.append(lead(level))
29+
level++
30+
val s: String = Utils.escapeWhitespace(Trees.getNodeText(t, ruleNames), false)
31+
sb.append("$s ")
32+
for (i in 0 until t.getChildCount()) {
33+
sb.append(process(t.getChild(i), ruleNames))
34+
}
35+
level--
36+
sb.append(lead(level))
37+
return sb.toString()
38+
}
39+
40+
private fun lead(level: Int): String {
41+
val sb = StringBuilder()
42+
if (level > 0) {
43+
sb.append(Eol)
44+
for (cnt in 0 until level) {
45+
sb.append(Indents)
46+
}
47+
}
48+
49+
return sb.toString()
50+
}
51+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package chapi.ast.javaast
2+
3+
import org.junit.jupiter.api.Test
4+
5+
internal class TreeViewerTest {
6+
@Test
7+
fun show() {
8+
JavaAnalyser().parse("public class Test { }").let {
9+
val ruleNamesList: List<String> = it.ruleNames.toList()
10+
println(TreeViewer().toPrettyTree(it.compilationUnit(), ruleNamesList))
11+
}
12+
}
13+
}

0 commit comments

Comments
 (0)