|  | // 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)]) | 
|  | } |