rstsc/
node_table.rs

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/**
43 * Node id
44 */
45#[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}