use crate::{LitBool, LitByte, LitByteStr, LitCStr, LitChar, LitFloat, LitInt, LitStr};
use proc_macro2::{Ident, Literal, TokenStream, TokenTree};
pub trait ToTokens {
fn to_token_stream(&self) -> TokenStream;
}
impl ToTokens for LitStr {
#[inline]
fn to_token_stream(&self) -> TokenStream {
let mut lit = Literal::string(&self.value);
lit.set_span(self.span);
TokenTree::Literal(lit).into()
}
}
impl ToTokens for LitBool {
#[inline]
fn to_token_stream(&self) -> TokenStream {
let ident = Ident::new(if self.value { "true" } else { "false" }, self.span);
TokenTree::Ident(ident).into()
}
}
impl ToTokens for LitChar {
#[inline]
fn to_token_stream(&self) -> TokenStream {
let mut lit = Literal::character(self.value);
lit.set_span(self.span);
TokenTree::Literal(lit).into()
}
}
impl ToTokens for LitByte {
#[inline]
fn to_token_stream(&self) -> TokenStream {
let mut lit = Literal::byte_character(self.value);
lit.set_span(self.span);
TokenTree::Literal(lit).into()
}
}
impl ToTokens for LitByteStr {
#[inline]
fn to_token_stream(&self) -> TokenStream {
let mut lit = Literal::byte_string(&self.value);
lit.set_span(self.span);
TokenTree::Literal(lit).into()
}
}
impl ToTokens for LitCStr {
#[inline]
fn to_token_stream(&self) -> TokenStream {
let mut lit = Literal::c_string(&self.value);
lit.set_span(self.span);
TokenTree::Literal(lit).into()
}
}
macro_rules! impl_to_tokens_int {
($($t:ty => $suffixed:ident, $unsuffixed:ident),* $(,)?) => {
$(
impl ToTokens for LitInt<$t> {
#[inline]
fn to_token_stream(&self) -> TokenStream {
let mut lit = if self.suffix.is_some() {
Literal::$suffixed(self.value)
} else {
Literal::$unsuffixed(self.value)
};
lit.set_span(self.span);
TokenTree::Literal(lit).into()
}
}
)*
};
}
impl_to_tokens_int!(
i8 => i8_suffixed, i8_unsuffixed,
i16 => i16_suffixed, i16_unsuffixed,
i32 => i32_suffixed, i32_unsuffixed,
i64 => i64_suffixed, i64_unsuffixed,
i128 => i128_suffixed, i128_unsuffixed,
isize => isize_suffixed, isize_unsuffixed,
u8 => u8_suffixed, u8_unsuffixed,
u16 => u16_suffixed, u16_unsuffixed,
u32 => u32_suffixed, u32_unsuffixed,
u64 => u64_suffixed, u64_unsuffixed,
u128 => u128_suffixed, u128_unsuffixed,
usize => usize_suffixed, usize_unsuffixed,
);
macro_rules! impl_to_tokens_float {
($($t:ty => $suffixed:ident, $unsuffixed:ident),* $(,)?) => {
$(
impl ToTokens for LitFloat<$t> {
#[inline]
fn to_token_stream(&self) -> TokenStream {
let mut lit = if self.suffix.is_some() {
Literal::$suffixed(self.value)
} else {
Literal::$unsuffixed(self.value)
};
lit.set_span(self.span);
TokenTree::Literal(lit).into()
}
}
)*
};
}
impl_to_tokens_float!(
f32 => f32_suffixed, f32_unsuffixed,
f64 => f64_suffixed, f64_unsuffixed,
);