skullbrain-parser 0.1.0

Parses skullbrain tokens into a concrete syntax tree (CST).
Documentation
use cstree::{
    build::{Checkpoint, GreenNodeBuilder, NodeCache},
    green::GreenNode,
};

use crate::{
    state::{ConcreteSyntaxTreeBuilder, PositionedToken},
    SyntaxKind,
};

pub(crate) struct CstreeBuilder<'cache, 'interner, S: AsRef<str>> {
    builder: GreenNodeBuilder<'cache, 'interner, SyntaxKind>,
    source: S,
}

impl<'cache, 'interner, S: AsRef<str>> CstreeBuilder<'cache, 'interner, S> {
    pub(crate) fn new(cache: &'cache mut NodeCache<'interner>, source: S) -> Self {
        Self {
            builder: GreenNodeBuilder::with_cache(cache),
            source,
        }
    }
}

impl<'cache, 'interner, S: AsRef<str>> ConcreteSyntaxTreeBuilder
    for CstreeBuilder<'cache, 'interner, S>
{
    type Output = GreenNode;
    type Checkpoint = Checkpoint;
    fn start_node(&mut self, kind: SyntaxKind) {
        self.builder.start_node(kind);
    }

    fn finish_node(&mut self) {
        self.builder.finish_node();
    }

    fn token(&mut self, kind: SyntaxKind, item: PositionedToken) {
        let text = self.source.as_ref();
        let Some(text) = text.get(item.into_range()) else {
            unreachable!()
        };

        self.builder.token(kind, text);
    }

    fn finish(self) -> Self::Output {
        self.builder.finish().0
    }

    fn checkpoint(&self) -> Self::Checkpoint {
        self.builder.checkpoint()
    }

    fn start_node_at(&mut self, checkpoint: Self::Checkpoint, kind: SyntaxKind) {
        self.builder.start_node_at(checkpoint, kind);
    }
}