tstr_proc_macros/
utils.rs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
use std::iter::{self, FromIterator, Once};

#[allow(unused_imports)]
use crate::used_proc_macro::{
    Delimiter, Group, Ident, Literal, Punct, Spacing, Span, TokenStream, TokenTree,
};

pub(crate) fn ident_token(ident: &str, span: Span) -> Once<TokenTree> {
    let ident = Ident::new(ident, span);
    let tt = TokenTree::from(ident);
    iter::once(tt)
}

#[cfg(all(feature = "min_const_generics", not(feature = "const_generics")))]
pub(crate) fn char_token(c: char, span: Span) -> Once<TokenTree> {
    let mut lit = Literal::character(c);
    lit.set_span(span);
    let tt = TokenTree::from(lit);
    iter::once(tt)
}

pub(crate) fn punct_token(token: char, span: Span) -> Once<TokenTree> {
    let mut token = Punct::new(token, Spacing::Alone);
    token.set_span(span);
    let tt = TokenTree::from(token);
    iter::once(tt)
}
pub(crate) fn colon2_token(span: Span) -> TokenStream {
    let mut token = Punct::new(':', Spacing::Joint);
    token.set_span(span);
    TokenStream::from_iter(vec![TokenTree::from(token.clone()), TokenTree::from(token)])
}

pub(crate) fn paren<F>(span: Span, f: F) -> TokenTree
where
    F: FnOnce(&mut TokenStream),
{
    let mut ts = TokenStream::new();
    f(&mut ts);
    let mut tt = Group::new(Delimiter::Parenthesis, ts);
    tt.set_span(span);
    TokenTree::from(tt)
}