From 42fa703288f5de179d62fa4ef83201597c160917 Mon Sep 17 00:00:00 2001 From: Nicholas Nethercote Date: Fri, 8 Apr 2022 09:21:10 +1000 Subject: [PATCH] Special case `quote!`/`quote_spanned!` for 1 and 2 tts. These make crates that use `quote` compile faster. I also tried specializing for 3 tts, but the rules are more complex and the additional perf wins are much smaller than they are for 1 and 2 tts. --- src/lib.rs | 47 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/src/lib.rs b/src/lib.rs index 1e48d0e..293190a 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -473,6 +473,28 @@ macro_rules! quote { () => { $crate::__private::TokenStream::new() }; + + // Special case rule for a single tt, for performance. + ($tt:tt) => {{ + let mut _s = $crate::__private::TokenStream::new(); + $crate::quote_token!($tt _s); + _s + }}; + + // Special case rules for two tts, for performance. + (# $var:ident) => {{ + let mut _s = $crate::__private::TokenStream::new(); + $crate::ToTokens::to_tokens(&$var, &mut _s); + _s + }}; + ($tt1:tt $tt2:tt) => {{ + let mut _s = $crate::__private::TokenStream::new(); + $crate::quote_token!($tt1 _s); + $crate::quote_token!($tt2 _s); + _s + }}; + + // Catch-all rule for all remaining inputs. ($($tt:tt)*) => {{ let mut _s = $crate::__private::TokenStream::new(); $crate::quote_each_token!(_s $($tt)*); @@ -582,6 +604,31 @@ macro_rules! quote_spanned { let _: $crate::__private::Span = $span; $crate::__private::TokenStream::new() }}; + + // Special case rule for a single tt, for performance. + ($span:expr=> $tt:tt) => {{ + let mut _s = $crate::__private::TokenStream::new(); + let _span: $crate::__private::Span = $span; + $crate::quote_token_spanned!($tt _s _span); + _s + }}; + + // Special case rules for two tts, for performance. + ($span:expr=> # $var:ident) => {{ + let mut _s = $crate::__private::TokenStream::new(); + let _span: $crate::__private::Span = $span; + $crate::ToTokens::to_tokens(&$var, &mut _s); + _s + }}; + ($span:expr=> $tt1:tt $tt2:tt) => {{ + let mut _s = $crate::__private::TokenStream::new(); + let _span: $crate::__private::Span = $span; + $crate::quote_token_spanned!($tt1 _s _span); + $crate::quote_token_spanned!($tt2 _s _span); + _s + }}; + + // Catch-all rule for all remaining inputs. ($span:expr=> $($tt:tt)*) => {{ let mut _s = $crate::__private::TokenStream::new(); let _span: $crate::__private::Span = $span;