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);
}
}