use crate::cst::SyntaxNode;
use crate::{LexToken, SyntaxKind};
pub struct ParseTreeBuilder {
inner: rowan::GreenNodeBuilder<'static>,
}
impl ParseTreeBuilder {
pub fn new() -> Self {
let mut inner = crate::cst::builder();
inner.start_node(SyntaxKind::Document.into());
Self { inner }
}
pub fn push_node(&mut self, kind: SyntaxKind, tokens: &[LexToken]) {
self.inner.start_node(kind.into());
for token in tokens {
self.inner.token(token.kind.into(), token.text.as_str());
}
self.inner.finish_node();
}
pub fn push_tokens(&mut self, tokens: &[LexToken]) {
for token in tokens {
self.inner.token(token.kind.into(), token.text.as_str());
}
}
pub fn finish(mut self) -> SyntaxNode {
self.inner.finish_node();
SyntaxNode::new_root(self.inner.finish())
}
}