1*60f18c22SBjörn Roy Baron // SPDX-License-Identifier: GPL-2.0 2*60f18c22SBjörn Roy Baron 3*60f18c22SBjörn Roy Baron use proc_macro::{token_stream, Ident, TokenStream, TokenTree}; 4*60f18c22SBjörn Roy Baron 5*60f18c22SBjörn Roy Baron use crate::helpers::expect_punct; 6*60f18c22SBjörn Roy Baron expect_ident(it: &mut token_stream::IntoIter) -> Ident7*60f18c22SBjörn Roy Baronfn expect_ident(it: &mut token_stream::IntoIter) -> Ident { 8*60f18c22SBjörn Roy Baron if let Some(TokenTree::Ident(ident)) = it.next() { 9*60f18c22SBjörn Roy Baron ident 10*60f18c22SBjörn Roy Baron } else { 11*60f18c22SBjörn Roy Baron panic!("Expected Ident") 12*60f18c22SBjörn Roy Baron } 13*60f18c22SBjörn Roy Baron } 14*60f18c22SBjörn Roy Baron concat_idents(ts: TokenStream) -> TokenStream15*60f18c22SBjörn Roy Baronpub(crate) fn concat_idents(ts: TokenStream) -> TokenStream { 16*60f18c22SBjörn Roy Baron let mut it = ts.into_iter(); 17*60f18c22SBjörn Roy Baron let a = expect_ident(&mut it); 18*60f18c22SBjörn Roy Baron assert_eq!(expect_punct(&mut it), ','); 19*60f18c22SBjörn Roy Baron let b = expect_ident(&mut it); 20*60f18c22SBjörn Roy Baron assert!(it.next().is_none(), "only two idents can be concatenated"); 21*60f18c22SBjörn Roy Baron let res = Ident::new(&format!("{a}{b}"), b.span()); 22*60f18c22SBjörn Roy Baron TokenStream::from_iter([TokenTree::Ident(res)]) 23*60f18c22SBjörn Roy Baron } 24