| // SPDX-License-Identifier: GPL-2.0 |
| |
| use proc_macro::{token_stream, Ident, TokenStream, TokenTree}; |
| |
| use crate::helpers::expect_punct; |
| |
| fn expect_ident(it: &mut token_stream::IntoIter) -> Ident { |
| if let Some(TokenTree::Ident(ident)) = it.next() { |
| ident |
| } else { |
| panic!("Expected Ident") |
| } |
| } |
| |
| pub(crate) fn concat_idents(ts: TokenStream) -> TokenStream { |
| let mut it = ts.into_iter(); |
| let a = expect_ident(&mut it); |
| assert_eq!(expect_punct(&mut it), ','); |
| let b = expect_ident(&mut it); |
| assert!(it.next().is_none(), "only two idents can be concatenated"); |
| let res = Ident::new(&format!("{a}{b}"), b.span()); |
| TokenStream::from_iter([TokenTree::Ident(res)]) |
| } |