Coverage for src / renaissance / integrations / tree_sitter / visualizer.py: 100%
24 statements
« prev ^ index » next coverage.py v7.13.4, created at 2026-09-09 14:04 +0000
« prev ^ index » next coverage.py v7.13.4, created at 2026-09-09 14:04 +0000
1from renaissance.integrations.tree_sitter.lst import LST
2from renaissance.utils.text_utils import signature2id
5class LstVisualizer:
6 def __init__(self):
7 self.lines = ["graph TD"]
8 self.counter = 0
9 self.node_ids = {}
11 def _get_node_id(self, node):
12 if node not in self.node_ids:
13 self.counter += 1
14 self.node_ids[node] = f"n{self.counter}"
15 return self.node_ids[node]
17 def _render_node(self, node):
18 node_id = self._get_node_id(node)
19 label = f"""\
20 {node_id}: {node.ast_type.__name__} {{
21 offset: {node.offset}
22 signature: {signature2id(node.signature)}
23 }}"""
24 label = label.replace("\n", "<br>")
25 self.lines.append(f'{node_id}["{label}"]')
26 for child in node.children:
27 self._render_node(child)
28 child_id = self._get_node_id(child)
29 self.lines.append(f"{node_id} --> {child_id}")
31 def render(self, lst: LST):
32 self._render_node(lst.root)
33 return "\n".join(self.lines)