use crate::{
Language,
lexer::{LexOutput, Token},
};
#[allow(unused_variables)]
pub trait LexerCache<L: Language> {
fn set_lex_output(&mut self, output: LexOutput<L>);
fn get_token(&self, index: usize) -> Option<Token<L::TokenType>>;
fn count_tokens(&self) -> usize;
fn has_tokens(&self) -> bool;
fn get_tokens(&self) -> Option<&[Token<L::TokenType>]> {
None
}
}
impl<'a, L: Language, C: LexerCache<L> + ?Sized> LexerCache<L> for &'a mut C {
fn set_lex_output(&mut self, output: LexOutput<L>) {
(**self).set_lex_output(output)
}
fn get_token(&self, index: usize) -> Option<Token<L::TokenType>> {
(**self).get_token(index)
}
fn count_tokens(&self) -> usize {
(**self).count_tokens()
}
fn has_tokens(&self) -> bool {
(**self).has_tokens()
}
fn get_tokens(&self) -> Option<&[Token<L::TokenType>]> {
(**self).get_tokens()
}
}
#[derive(Debug, Clone, Copy, Default)]
pub struct NoLexerCache;
impl<L: Language> LexerCache<L> for NoLexerCache {
fn set_lex_output(&mut self, _output: LexOutput<L>) {}
fn get_token(&self, _index: usize) -> Option<Token<L::TokenType>> {
None
}
fn count_tokens(&self) -> usize {
0
}
fn has_tokens(&self) -> bool {
false
}
}