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

1"""AI: Render a tree-sitter LST as a Mermaid graph for visualization.""" 

2 

3from renaissance.integrations.tree_sitter.lst import LST 

4from renaissance.utils.text_utils import signature_to_id 

5 

6 

7class LstVisualizer: 

8 """AI: Render a tree-sitter LST as a Mermaid graph for visualization.""" 

9 

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 = {} 

15 

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] 

21 

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}") 

35 

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)