tstr_proc_macros/
utils.rs

1use std::iter::{self, FromIterator, Once};
2
3#[allow(unused_imports)]
4use crate::used_proc_macro::{
5    Delimiter, Group, Ident, Literal, Punct, Spacing, Span, TokenStream, TokenTree,
6};
7
8pub(crate) fn ident_token(ident: &str, span: Span) -> Once<TokenTree> {
9    let ident = Ident::new(ident, span);
10    let tt = TokenTree::from(ident);
11    iter::once(tt)
12}
13
14#[cfg(all(feature = "min_const_generics", not(feature = "const_generics")))]
15pub(crate) fn char_token(c: char, span: Span) -> Once<TokenTree> {
16    let mut lit = Literal::character(c);
17    lit.set_span(span);
18    let tt = TokenTree::from(lit);
19    iter::once(tt)
20}
21
22pub(crate) fn punct_token(token: char, span: Span) -> Once<TokenTree> {
23    let mut token = Punct::new(token, Spacing::Alone);
24    token.set_span(span);
25    let tt = TokenTree::from(token);
26    iter::once(tt)
27}
28pub(crate) fn colon2_token(span: Span) -> TokenStream {
29    let mut token = Punct::new(':', Spacing::Joint);
30    token.set_span(span);
31    TokenStream::from_iter(vec![TokenTree::from(token.clone()), TokenTree::from(token)])
32}
33
34pub(crate) fn paren<F>(span: Span, f: F) -> TokenTree
35where
36    F: FnOnce(&mut TokenStream),
37{
38    let mut ts = TokenStream::new();
39    f(&mut ts);
40    let mut tt = Group::new(Delimiter::Parenthesis, ts);
41    tt.set_span(span);
42    TokenTree::from(tt)
43}