oak-core 0.0.4

Core parser combinator library providing fundamental parsing primitives.
Documentation
use crate::{
    Language,
    errors::OakDiagnostics,
    source::{Source, TextEdit},
    tree::GreenNode,
};

/// Output of a builder operation.
pub type BuildOutput<L: Language> = OakDiagnostics<L::TypedRoot>;

/// Trait for building higher-level structures (like ASTs) from source text.
pub trait Builder<L: Language> {
    /// Builds the structure from the source text.
    fn build<'a, S: Source + ?Sized>(&self, text: &S, edits: &[TextEdit], cache: &'a mut impl BuilderCache<L>) -> BuildOutput<L>;
}

/// Cache trait for builder operations used by lexers and parsers.
///
/// This trait defines the interface for building green tree nodes incrementally.
/// It provides methods for adding tokens and nodes to the tree structure.
pub trait BuilderCache<L: Language>: crate::parser::ParseCache<L> {
    /// Gets a cached typed node for a given green node.
    fn get_typed_node<T: 'static + Send + Sync + Clone>(&self, green: &GreenNode<L>) -> Option<T>;

    /// Caches a typed node for a given green node.
    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)
    }
}