use crate::Language;
pub use core::range::Range;
use std::sync::Arc;
#[cfg(feature = "serde")]
mod arc_slice_serde {
use super::*;
use std::sync::Arc;
pub fn serialize<K, S>(arc: &Arc<[Token<K>]>, serializer: S) -> Result<S::Ok, S::Error>
where
K: serde::Serialize,
S: serde::Serializer,
{
serde::Serialize::serialize(arc.as_ref(), serializer)
}
pub fn deserialize<'de, K, D>(deserializer: D) -> Result<Arc<[Token<K>]>, D::Error>
where
K: serde::Deserialize<'de>,
D: serde::Deserializer<'de>,
{
let vec = <Vec<Token<K>> as serde::Deserialize>::deserialize(deserializer)?;
Ok(Arc::from_iter(vec))
}
}
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[cfg_attr(feature = "serde", serde(transparent, bound(serialize = "L::TokenType: serde::Serialize", deserialize = "L::TokenType: serde::Deserialize<'de>")))]
pub struct Tokens<L: Language>(#[cfg_attr(feature = "serde", serde(with = "arc_slice_serde"))] pub Arc<[Token<L::TokenType>]>);
impl<L: Language> Clone for Tokens<L> {
fn clone(&self) -> Self {
Self(self.0.clone())
}
}
impl<L: Language> Default for Tokens<L> {
fn default() -> Self {
Self(Arc::from_iter(std::iter::empty()))
}
}
impl<L: Language> core::ops::Deref for Tokens<L> {
type Target = [Token<L::TokenType>];
fn deref(&self) -> &Self::Target {
&self.0
}
}
impl<L: Language> From<Arc<[Token<L::TokenType>]>> for Tokens<L> {
fn from(arc: Arc<[Token<L::TokenType>]>) -> Self {
Self(arc)
}
}
impl<L: Language> From<Vec<Token<L::TokenType>>> for Tokens<L> {
fn from(vec: Vec<Token<L::TokenType>>) -> Self {
Self(Arc::from_iter(vec))
}
}
#[derive(Debug, Clone, PartialEq, Eq, Copy)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct Token<K> {
pub kind: K,
#[cfg_attr(feature = "serde", serde(with = "crate::serde_range"))]
pub span: Range<usize>,
}
impl<K> Token<K> {
#[inline]
pub fn length(&self) -> usize {
self.span.end - self.span.start
}
}
#[derive(Debug, Clone)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[cfg_attr(feature = "serde", serde(bound(serialize = "K: serde::Serialize", deserialize = "K: serde::Deserialize<'de>")))]
pub struct TokenStream<K: Copy> {
pub raw: String,
#[cfg_attr(feature = "serde", serde(with = "arc_slice_serde"))]
pub tokens: Arc<[Token<K>]>,
}