sipha_tree/
node.rs

1//! CST node types.
2
3use builder_pattern::Builder;
4use sipha_core::{span::Span, token::Token, traits::NodeId, traits::RuleId, traits::TokenKind};
5
6use crate::children::NodeChildren;
7
8/// Type of node stored in the CST arena.
9#[derive(Clone, Debug)]
10pub enum CstKind<K: TokenKind, R: RuleId> {
11    /// Leaf node produced directly from a token.
12    Token(K),
13    /// Node produced by a grammar rule.
14    Rule(R),
15    /// Node representing trivia.
16    Trivia(K),
17    /// Parser error node.
18    Error(&'static str),
19}
20
21/// A single CST node stored in the arena.
22#[derive(Builder, Clone, Debug)]
23pub struct CstNode<K: TokenKind, R: RuleId, N: NodeId> {
24    /// Type of node we are storing.
25    pub kind: CstKind<K, R>,
26    /// Span covered by the node.
27    pub span: Span,
28    /// Children stored by identifier.
29    #[default(NodeChildren::new())]
30    pub children: NodeChildren<N>,
31}
32
33impl<K: TokenKind, R: RuleId, N: NodeId> CstNode<K, R, N> {
34    /// Create a new CST node.
35    ///
36    /// For builder pattern usage, use `CstNodeBuilder::new()` instead.
37    pub fn create(kind: CstKind<K, R>, span: Span, children: NodeChildren<N>) -> Self {
38        Self {
39            kind,
40            span,
41            children,
42        }
43    }
44}
45
46impl<K: TokenKind, R: RuleId, N: NodeId> From<&Token<K>> for CstNode<K, R, N> {
47    fn from(token: &Token<K>) -> Self {
48        Self {
49            kind: CstKind::Token(token.kind),
50            span: token.span.clone(),
51            children: NodeChildren::new(),
52        }
53    }
54}