diff --git a/src/lib.rs b/src/lib.rs index 8670e02..da1fb24 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1074,6 +1074,10 @@ macro_rules! quote_token { $crate::__private::push_literal(&mut $tokens, stringify!($literal)); }; + ($tokens:ident _) => { + $crate::__private::push_underscore(&mut $tokens); + }; + ($tokens:ident $other:tt) => { $crate::__private::parse(&mut $tokens, stringify!($other)); }; @@ -1297,6 +1301,10 @@ macro_rules! quote_token_spanned { $crate::__private::push_literal_spanned(&mut $tokens, $span, stringify!($literal)); }; + ($tokens:ident $span:ident _) => { + $crate::__private::push_underscore_spanned(&mut $tokens, $span); + }; + ($tokens:ident $span:ident $other:tt) => { $crate::__private::parse_spanned(&mut $tokens, $span, stringify!($other)); }; diff --git a/src/runtime.rs b/src/runtime.rs index 94a9f8c..aad0a51 100644 --- a/src/runtime.rs +++ b/src/runtime.rs @@ -396,6 +396,14 @@ push_punct!(push_star push_star_spanned '*'); push_punct!(push_sub push_sub_spanned '-'); push_punct!(push_sub_eq push_sub_eq_spanned '-' '='); +pub fn push_underscore(tokens: &mut TokenStream) { + push_underscore_spanned(tokens, Span::call_site()); +} + +pub fn push_underscore_spanned(tokens: &mut TokenStream, span: Span) { + tokens.append(Ident::new("_", span)); +} + // Helper method for constructing identifiers from the `format_ident!` macro, // handling `r#` prefixes. // diff --git a/tests/test.rs b/tests/test.rs index 289955e..dd08a59 100644 --- a/tests/test.rs +++ b/tests/test.rs @@ -263,6 +263,13 @@ fn test_ident() { assert_eq!(expected, tokens.to_string()); } +#[test] +fn test_underscore() { + let tokens = quote!(let _;); + let expected = "let _ ;"; + assert_eq!(expected, tokens.to_string()); +} + #[test] fn test_duplicate() { let ch = 'x';