#![cfg_attr(
nightly,
feature(
proc_macro_diagnostic,
proc_macro_span,
// proc_macro_totokens,
proc_macro_def_site,
)
)]
extern crate proc_macro;
pub mod bridge;
mod delim;
mod group;
mod ident;
pub mod keyword;
pub mod lex;
mod lit;
pub mod parser;
pub mod punct;
pub mod source;
mod spacing;
pub mod span;
mod stream;
mod tree;
#[doc(inline)]
pub use delim::*;
#[doc(inline)]
pub use group::*;
#[doc(inline)]
pub use ident::*;
#[doc(inline)]
pub use keyword::*;
#[doc(inline)]
pub use lex::{LexError, Scan};
#[doc(inline)]
pub use lit::*;
#[doc(inline)]
pub use parser::Parse;
#[doc(inline)]
pub use punct::*;
#[doc(inline)]
pub use spacing::*;
#[doc(inline)]
pub use span::{Span, Spanner};
#[doc(inline)]
pub use stream::*;
#[doc(inline)]
pub use tree::*;
pub trait ToTokens<T = TokenStream> {
fn to_tokens(&self, tokens: &mut T);
}
pub trait ToTokenStream: ToTokens<TokenStream> {
fn to_token_stream(&self) -> TokenStream {
let mut tokens = TokenStream::new();
self.to_tokens(&mut tokens);
tokens
}
fn into_token_stream(self) -> TokenStream
where
Self: Sized,
{
self.to_token_stream()
}
}
impl<X: ToTokens<TokenStream> + ?Sized> ToTokenStream for X {}
impl<T: ToTokens> ToTokens for ::std::boxed::Box<T> {
fn to_tokens(&self, tokens: &mut TokenStream) {
(**self).to_tokens(tokens);
}
}
impl<T: ToTokens> ToTokens for &T {
fn to_tokens(&self, tokens: &mut TokenStream) {
ToTokens::to_tokens(*self, tokens);
}
}
impl<T: ToTokens> ToTokens for Option<T> {
fn to_tokens(&self, tokens: &mut TokenStream) {
if let Some(v) = self {
v.to_tokens(tokens);
}
}
}
impl<T: ToTokens> ToTokens for Vec<T> {
fn to_tokens(&self, tokens: &mut TokenStream) {
for v in self {
v.to_tokens(tokens);
}
}
}
#[macro_export]
macro_rules! Token {
[&] => { $crate::And };
[|] => { $crate::Or };
[!] => { $crate::Not };
[~] => { $crate::Tilde };
[+] => { $crate::Plus };
[-] => { $crate::Minus };
[*] => { $crate::Star };
[/] => { $crate::Slash };
[%] => { $crate::Percent };
[^] => { $crate::Caret };
[=] => { $crate::Eq };
[<] => { $crate::Lt };
[>] => { $crate::Gt };
[@] => { $crate::At };
[.] => { $crate::Dot };
[,] => { $crate::Comma };
[;] => { $crate::Semi };
[:] => { $crate::Colon };
[#] => { $crate::Pound };
[$] => { $crate::Dollar };
[?] => { $crate::Question };
[&&] => { $crate::AndAnd };
[||] => { $crate::OrOr };
[<<] => { $crate::Shl };
[>>] => { $crate::Shr };
[==] => { $crate::EqEq };
[!=] => { $crate::Ne };
[<=] => { $crate::Le };
[>=] => { $crate::Ge };
[&=] => { $crate::AndEq };
[|=] => { $crate::OrEq };
[+=] => { $crate::PlusEq };
[-=] => { $crate::MinusEq };
[*=] => { $crate::StarEq };
[/=] => { $crate::SlashEq };
[%=] => { $crate::PercentEq };
[^=] => { $crate::CaretEq };
[=>] => { $crate::FatArrow };
[->] => { $crate::RArrow };
[<-] => { $crate::LArrow };
[::] => { $crate::PathSep };
[..] => { $crate::DotDot };
[<<=] => { $crate::ShlEq };
[>>=] => { $crate::ShrEq };
[...] => { $crate::DotDotDot };
[..=] => { $crate::DotDotEq };
[as] => { $crate::As };
[async] => { $crate::Async };
[auto] => { $crate::Auto };
[await] => { $crate::Await };
[become] => { $crate::Become };
[box] => { $crate::Box };
[break] => { $crate::Break };
[const] => { $crate::Const };
[continue] => { $crate::Continue };
[crate] => { $crate::Crate };
[default] => { $crate::Default };
[do] => { $crate::Do };
[dyn] => { $crate::Dyn };
[else] => { $crate::Else };
[enum] => { $crate::Enum };
[extern] => { $crate::Extern };
[final] => { $crate::Final };
[fn] => { $crate::Fn };
[for] => { $crate::For };
[if] => { $crate::If };
[impl] => { $crate::Impl };
[in] => { $crate::In };
[let] => { $crate::Let };
[loop] => { $crate::Loop };
[macro] => { $crate::Macro };
[macro_rules] => { $crate::MacroRules };
[match] => { $crate::Match };
[mod] => { $crate::Mod };
[move] => { $crate::Move };
[mut] => { $crate::Mut };
[override] => { $crate::Override };
[priv] => { $crate::Priv };
[pub] => { $crate::Pub };
[raw] => { $crate::Raw };
[ref] => { $crate::Ref };
[return] => { $crate::Return };
[Self] => { $crate::SelfType };
[self] => { $crate::SelfValue };
[static] => { $crate::Static };
[struct] => { $crate::Struct };
[super] => { $crate::Super };
[trait] => { $crate::Trait };
[try] => { $crate::Try };
[type] => { $crate::Type };
[typeof] => { $crate::Typeof };
[union] => { $crate::Union };
[unsafe] => { $crate::Unsafe };
[unsized] => { $crate::Unsized };
[use] => { $crate::Use };
[virtual] => { $crate::Virtual };
[where] => { $crate::Where };
[while] => { $crate::While };
[yield] => { $crate::Yield };
}
#[cfg(test)]
mod tests {
#[test]
fn token_macro_maps_dollar_and_macro_rules() {
let dollar: Token![$] = Default::default();
let macro_rules: Token![macro_rules] = Default::default();
assert_eq!(dollar.as_str(), "$");
assert_eq!(macro_rules.as_str(), "macro_rules");
}
}