use luau_lexer::prelude::{Lexer, Error, Token};
use lsp_types::Range;
pub trait Print {
fn print_final_trivia(&self) -> String;
fn print_without_final_trivia(&self) -> String;
#[inline]
fn print(&self) -> String {
self.print_without_final_trivia() + &self.print_final_trivia()
}
}
pub trait Parse<O = Self> {
fn parse(token: Token, lexer: &mut Lexer, errors: &mut Vec<Error>) -> Option<O>;
}
pub trait TryParse<O = Self>
where
O: Parse<O>,
{
fn try_parse(lexer: &mut Lexer, errors: &mut Vec<Error>) -> Option<O> {
let state = lexer.save_state();
match O::parse(lexer.next_token(), lexer, errors) {
value @ Some(_) => value,
None => {
lexer.set_state(state);
None
}
}
}
}
pub trait ParseWithArgs<T, O = Self> {
fn parse_with(
token: Token,
lexer: &mut Lexer,
errors: &mut Vec<Error>,
args: T,
) -> Option<O>;
}
pub trait TryParseWithArgs<T, O = Self, O2 = O>
where
O2: ParseWithArgs<T, O>,
{
#[inline]
fn try_parse_with(lexer: &mut Lexer, errors: &mut Vec<Error>, args: T) -> Option<O> {
let state = lexer.save_state();
match O2::parse_with(lexer.next_token(), lexer, errors, args) {
value @ Some(_) => value,
None => {
lexer.set_state(state);
None
}
}
}
}
#[derive(Clone, Copy, Debug, Hash, PartialEq, Eq, PartialOrd, Ord)]
#[cfg_attr(feature = "serde", derive(serde::Deserialize, serde::Serialize))]
pub enum GetRangeError {
ErrorVariant,
EmptyList,
EmptyBlock,
UndefinedKey,
}
pub trait GetRange {
fn get_range(&self) -> Result<Range, GetRangeError>;
}