concat_idents.rs 712 B

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