1use std::{collections::HashMap, fmt::Debug, hash::Hash};
2
3use biome_js_syntax::JsSyntaxNode;
4use biome_rowan::TextRange;
5
6pub type Node = JsSyntaxNode;
7
8#[derive(Default)]
9pub struct NodeTable {
10 id_to_node: HashMap<NodeId, Node>,
11 node_to_id: HashMap<Node, NodeId>,
12}
13impl Debug for NodeTable {
14 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
15 f.debug_struct("NodeTable")
16 .field(
17 "id_to_node",
18 &self.id_to_node.iter().map(|(k, v)| (k, v.text())),
19 )
20 .field(
21 "node_to_id",
22 &self.node_to_id.iter().map(|(k, v)| (k.text(), v)),
23 )
24 .finish()
25 }
26}
27impl NodeTable {
28 pub fn insert_node(&mut self, node: Node) -> NodeId {
29 let node_id = NodeId::from_range(node.text_trimmed_range());
30 self.id_to_node.insert(node_id, node.clone());
31 self.node_to_id.insert(node, node_id);
32 node_id
33 }
34 pub fn get_node(&self, node_id: NodeId) -> Option<&Node> {
35 self.id_to_node.get(&node_id)
36 }
37 pub fn get_id(&self, node: Node) -> Option<&NodeId> {
38 self.node_to_id.get(&node)
39 }
40}
41
42#[derive(Clone, Copy, Debug, Hash, PartialEq, Eq)]
46pub struct NodeId(TextRange);
47
48impl NodeId {
49 fn from_range(range: TextRange) -> Self {
50 Self(range)
51 }
52}