From fad699525406b3635bcad1dcbd08448c04d8bce5 Mon Sep 17 00:00:00 2001 From: Nicholas Nethercote Date: Thu, 17 Mar 2022 14:16:50 +1100 Subject: [PATCH] Order rules in `quote_token!` and `quote_token_spanned!` by frequency. This reduces `cargo check` times by 4-9% on a few crates that use `quote!` heavily. --- src/lib.rs | 117 ++++++++++++++++++++++++++++------------------------- 1 file changed, 61 insertions(+), 56 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 02f6532..95d629d 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -859,9 +859,21 @@ macro_rules! quote_token_with_context_spanned { }; } +// These rules are ordered by approximate token frequency, at least for the +// first 10 or so, to improve compile times. Having `ident` first is by far the +// most important, because it's typically 2-3x more common than the next most +// common token. #[macro_export] #[doc(hidden)] macro_rules! quote_token { + ($tokens:ident $ident:ident) => { + $crate::__private::push_ident(&mut $tokens, stringify!($ident)); + }; + + ($tokens:ident ::) => { + $crate::__private::push_colon2(&mut $tokens); + }; + ($tokens:ident ( $($inner:tt)* )) => { $crate::__private::push_group( &mut $tokens, @@ -886,6 +898,26 @@ macro_rules! quote_token { ); }; + ($tokens:ident #) => { + $crate::__private::push_pound(&mut $tokens); + }; + + ($tokens:ident ,) => { + $crate::__private::push_comma(&mut $tokens); + }; + + ($tokens:ident .) => { + $crate::__private::push_dot(&mut $tokens); + }; + + ($tokens:ident ;) => { + $crate::__private::push_semi(&mut $tokens); + }; + + ($tokens:ident :) => { + $crate::__private::push_colon(&mut $tokens); + }; + ($tokens:ident +) => { $crate::__private::push_add(&mut $tokens); }; @@ -922,18 +954,6 @@ macro_rules! quote_token { $crate::__private::push_caret_eq(&mut $tokens); }; - ($tokens:ident :) => { - $crate::__private::push_colon(&mut $tokens); - }; - - ($tokens:ident ::) => { - $crate::__private::push_colon2(&mut $tokens); - }; - - ($tokens:ident ,) => { - $crate::__private::push_comma(&mut $tokens); - }; - ($tokens:ident /) => { $crate::__private::push_div(&mut $tokens); }; @@ -942,10 +962,6 @@ macro_rules! quote_token { $crate::__private::push_div_eq(&mut $tokens); }; - ($tokens:ident .) => { - $crate::__private::push_dot(&mut $tokens); - }; - ($tokens:ident ..) => { $crate::__private::push_dot2(&mut $tokens); }; @@ -1002,10 +1018,6 @@ macro_rules! quote_token { $crate::__private::push_or_or(&mut $tokens); }; - ($tokens:ident #) => { - $crate::__private::push_pound(&mut $tokens); - }; - ($tokens:ident ?) => { $crate::__private::push_question(&mut $tokens); }; @@ -1030,10 +1042,6 @@ macro_rules! quote_token { $crate::__private::push_fat_arrow(&mut $tokens); }; - ($tokens:ident ;) => { - $crate::__private::push_semi(&mut $tokens); - }; - ($tokens:ident <<) => { $crate::__private::push_shl(&mut $tokens); }; @@ -1062,10 +1070,6 @@ macro_rules! quote_token { $crate::__private::push_sub_eq(&mut $tokens); }; - ($tokens:ident $ident:ident) => { - $crate::__private::push_ident(&mut $tokens, stringify!($ident)); - }; - ($tokens:ident $lifetime:lifetime) => { $crate::__private::push_lifetime(&mut $tokens, stringify!($lifetime)); }; @@ -1079,9 +1083,18 @@ macro_rules! quote_token { }; } +// See the comment above `quote_token!` about the rule ordering. #[macro_export] #[doc(hidden)] macro_rules! quote_token_spanned { + ($tokens:ident $span:ident $ident:ident) => { + $crate::__private::push_ident_spanned(&mut $tokens, $span, stringify!($ident)); + }; + + ($tokens:ident $span:ident ::) => { + $crate::__private::push_colon2_spanned(&mut $tokens, $span); + }; + ($tokens:ident $span:ident ( $($inner:tt)* )) => { $crate::__private::push_group_spanned( &mut $tokens, @@ -1109,6 +1122,26 @@ macro_rules! quote_token_spanned { ); }; + ($tokens:ident $span:ident #) => { + $crate::__private::push_pound_spanned(&mut $tokens, $span); + }; + + ($tokens:ident $span:ident ,) => { + $crate::__private::push_comma_spanned(&mut $tokens, $span); + }; + + ($tokens:ident $span:ident .) => { + $crate::__private::push_dot_spanned(&mut $tokens, $span); + }; + + ($tokens:ident $span:ident ;) => { + $crate::__private::push_semi_spanned(&mut $tokens, $span); + }; + + ($tokens:ident $span:ident :) => { + $crate::__private::push_colon_spanned(&mut $tokens, $span); + }; + ($tokens:ident $span:ident +) => { $crate::__private::push_add_spanned(&mut $tokens, $span); }; @@ -1145,18 +1178,6 @@ macro_rules! quote_token_spanned { $crate::__private::push_caret_eq_spanned(&mut $tokens, $span); }; - ($tokens:ident $span:ident :) => { - $crate::__private::push_colon_spanned(&mut $tokens, $span); - }; - - ($tokens:ident $span:ident ::) => { - $crate::__private::push_colon2_spanned(&mut $tokens, $span); - }; - - ($tokens:ident $span:ident ,) => { - $crate::__private::push_comma_spanned(&mut $tokens, $span); - }; - ($tokens:ident $span:ident /) => { $crate::__private::push_div_spanned(&mut $tokens, $span); }; @@ -1165,10 +1186,6 @@ macro_rules! quote_token_spanned { $crate::__private::push_div_eq_spanned(&mut $tokens, $span); }; - ($tokens:ident $span:ident .) => { - $crate::__private::push_dot_spanned(&mut $tokens, $span); - }; - ($tokens:ident $span:ident ..) => { $crate::__private::push_dot2_spanned(&mut $tokens, $span); }; @@ -1225,10 +1242,6 @@ macro_rules! quote_token_spanned { $crate::__private::push_or_or_spanned(&mut $tokens, $span); }; - ($tokens:ident $span:ident #) => { - $crate::__private::push_pound_spanned(&mut $tokens, $span); - }; - ($tokens:ident $span:ident ?) => { $crate::__private::push_question_spanned(&mut $tokens, $span); }; @@ -1253,10 +1266,6 @@ macro_rules! quote_token_spanned { $crate::__private::push_fat_arrow_spanned(&mut $tokens, $span); }; - ($tokens:ident $span:ident ;) => { - $crate::__private::push_semi_spanned(&mut $tokens, $span); - }; - ($tokens:ident $span:ident <<) => { $crate::__private::push_shl_spanned(&mut $tokens, $span); }; @@ -1285,10 +1294,6 @@ macro_rules! quote_token_spanned { $crate::__private::push_sub_eq_spanned(&mut $tokens, $span); }; - ($tokens:ident $span:ident $ident:ident) => { - $crate::__private::push_ident_spanned(&mut $tokens, $span, stringify!($ident)); - }; - ($tokens:ident $span:ident $lifetime:lifetime) => { $crate::__private::push_lifetime_spanned(&mut $tokens, $span, stringify!($lifetime)); };