fe_parser/
node.rs

1pub use fe_common::{Span, Spanned};
2use serde::{Deserialize, Serialize};
3use std::sync::atomic::{AtomicU32, Ordering};
4
5#[derive(Debug, PartialEq, Copy, Clone, Hash, Eq, Default, PartialOrd, Ord)]
6pub struct NodeId(u32);
7
8impl NodeId {
9    pub fn create() -> Self {
10        static NEXT_ID: AtomicU32 = AtomicU32::new(0);
11        Self(NEXT_ID.fetch_add(1, Ordering::Relaxed))
12    }
13
14    pub fn dummy() -> Self {
15        Self(u32::MAX)
16    }
17
18    pub fn is_dummy(self) -> bool {
19        self == Self::dummy()
20    }
21}
22
23#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Hash, Clone)]
24pub struct Node<T> {
25    pub kind: T,
26    #[serde(skip_serializing, skip_deserializing)]
27    pub id: NodeId,
28    pub span: Span,
29}
30
31impl<T> Node<T> {
32    pub fn new(kind: T, span: Span) -> Self {
33        let id = NodeId::create();
34        Self { kind, id, span }
35    }
36}
37
38impl<T> Spanned for Node<T> {
39    fn span(&self) -> Span {
40        self.span
41    }
42}
43
44impl<T> From<&Node<T>> for Span {
45    fn from(node: &Node<T>) -> Self {
46        node.span
47    }
48}
49
50impl<T> From<&Box<Node<T>>> for Span {
51    fn from(node: &Box<Node<T>>) -> Self {
52        node.span
53    }
54}
55
56impl<T> From<&Node<T>> for NodeId {
57    fn from(node: &Node<T>) -> Self {
58        node.id
59    }
60}
61
62impl<T> From<&Box<Node<T>>> for NodeId {
63    fn from(node: &Box<Node<T>>) -> Self {
64        node.id
65    }
66}