use crate::{SrcPos, TokenAccess, TokenId, TokenSpan};
#[derive(Eq, PartialEq, Debug, Clone)]
pub struct WithToken<T> {
pub item: T,
pub token: TokenId,
}
impl<T> WithToken<T> {
pub fn new(item: T, token: TokenId) -> WithToken<T> {
WithToken { item, token }
}
pub fn pos<'a>(&'a self, ctx: &'a dyn TokenAccess) -> &'a SrcPos {
ctx.get_pos(self.token)
}
pub(crate) fn map_into<F, U>(self, f: F) -> WithToken<U>
where
F: FnOnce(T) -> U,
{
WithToken {
item: f(self.item),
token: self.token,
}
}
pub(crate) fn map_into_span<F, U>(self, f: F) -> WithTokenSpan<U>
where
F: FnOnce(T) -> U,
{
WithTokenSpan {
item: f(self.item),
span: self.token.into(),
}
}
}
#[derive(PartialEq, Eq, Clone, Debug)]
pub struct WithTokenSpan<T> {
pub item: T,
pub span: TokenSpan,
}
impl<T> WithTokenSpan<T> {
pub fn new(item: T, span: TokenSpan) -> WithTokenSpan<T> {
WithTokenSpan { item, span }
}
pub fn from(item: T, span: impl Into<TokenSpan>) -> WithTokenSpan<T> {
WithTokenSpan {
item,
span: span.into(),
}
}
pub fn pos(&self, ctx: &dyn TokenAccess) -> SrcPos {
self.span.pos(ctx)
}
pub(crate) fn map_into<F, U>(self, f: F) -> WithTokenSpan<U>
where
F: FnOnce(T) -> U,
{
WithTokenSpan {
item: f(self.item),
span: self.span,
}
}
pub(crate) fn try_map_into<F, U>(self, f: F) -> Option<WithTokenSpan<U>>
where
F: FnOnce(T) -> Option<U>,
{
Some(WithTokenSpan {
item: f(self.item)?,
span: self.span,
})
}
pub(crate) fn start_with(self, id: TokenId) -> Self {
WithTokenSpan {
item: self.item,
span: self.span.start_with(id),
}
}
pub fn as_ref(&self) -> WithTokenSpan<&T> {
WithTokenSpan {
item: &self.item,
span: self.span,
}
}
}