Coverage for src/renaissance/integrations/tree_sitter/visualizer.py: 100%
24 statements
« prev ^ index » next coverage.py v7.16.1, created at 2026-10-02 13:12 +0000
« prev ^ index » next coverage.py v7.16.1, created at 2026-10-02 13:12 +0000
1"""AI: Render a tree-sitter LST as a Mermaid graph for visualization."""
3from renaissance.integrations.tree_sitter.lst import LST
4from renaissance.utils.text_utils import signature_to_id
7class LstVisualizer:
8 """AI: Render a tree-sitter LST as a Mermaid graph for visualization."""
10 def __init__(self):
11 """AI: Prepare a visualizer that renders an LST as a Mermaid graph."""
12 self.lines = ["graph TD"]
13 self.counter = 0
14 self.node_ids = {}
16 def _get_node_id(self, node):
17 if node not in self.node_ids:
18 self.counter += 1
19 self.node_ids[node] = f"n{self.counter}"
20 return self.node_ids[node]
22 def _render_node(self, node):
23 node_id = self._get_node_id(node)
24 label = f"""\
25 {node_id}: {node.semantic_kind} ({node.parser_kind}) {{
26 offset: {node.offset}
27 signature: {signature_to_id(node.signature)}
28 }}"""
29 label = label.replace("\n", "<br>")
30 self.lines.append(f'{node_id}["{label}"]')
31 for child in node.children:
32 self._render_node(child)
33 child_id = self._get_node_id(child)
34 self.lines.append(f"{node_id} --> {child_id}")
36 def render(self, lst: LST):
37 """AI: Render the given LST as a Mermaid graph diagram string."""
38 self._render_node(lst.root)
39 return "\n".join(self.lines)