use crate::{
Language,
errors::OakDiagnostics,
source::{Source, TextEdit},
tree::GreenNode,
};
pub type BuildOutput<L: Language> = OakDiagnostics<L::TypedRoot>;
pub trait Builder<L: Language> {
fn build<'a, S: Source + ?Sized>(&self, text: &S, edits: &[TextEdit], cache: &'a mut impl BuilderCache<L>) -> BuildOutput<L>;
}
pub trait BuilderCache<L: Language>: crate::parser::ParseCache<L> {
fn get_typed_node<T: 'static + Send + Sync + Clone>(&self, green: &GreenNode<L>) -> Option<T>;
fn set_typed_node<T: 'static + Send + Sync>(&mut self, green: &GreenNode<L>, typed: T);
}
impl<'a, L: Language, C: BuilderCache<L> + ?Sized> BuilderCache<L> for &'a mut C {
fn get_typed_node<T: 'static + Send + Sync + Clone>(&self, green: &GreenNode<L>) -> Option<T> {
(**self).get_typed_node(green)
}
fn set_typed_node<T: 'static + Send + Sync>(&mut self, green: &GreenNode<L>, typed: T) {
(**self).set_typed_node(green, typed)
}
}
impl<L: Language + Send + Sync> BuilderCache<L> for crate::parser::ParseSession<L> {
fn get_typed_node<T: 'static + Send + Sync + Clone>(&self, green: &GreenNode<L>) -> Option<T> {
self.get_typed_node(green)
}
fn set_typed_node<T: 'static + Send + Sync>(&mut self, green: &GreenNode<L>, typed: T) {
self.set_typed_node(green, typed)
}
}