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}