cxxbridge_macro/
type_id.rs1use crate::syntax::qualified::QualifiedName;
2use proc_macro2::{TokenStream, TokenTree};
3use quote::{format_ident, quote, ToTokens};
4use syn::ext::IdentExt;
5
6pub(crate) enum Crate {
7 Cxx,
8 DollarCrate(TokenTree),
9}
10
11impl ToTokens for Crate {
12 fn to_tokens(&self, tokens: &mut TokenStream) {
13 match self {
14 Crate::Cxx => tokens.extend({
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "cxx");
_s
}quote!(::cxx)),
15 Crate::DollarCrate(krate) => krate.to_tokens(tokens),
16 }
17 }
18}
19
20pub(crate) fn expand(krate: Crate, arg: QualifiedName) -> TokenStream {
22 let mut ids = Vec::new();
23
24 for word in arg.segments {
25 if !ids.is_empty() {
26 ids.push({
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
::quote::__private::TokenStream::new());
_s
}quote!(()));
27 }
28 for ch in word.unraw().to_string().chars() {
29 ids.push(match ch {
30 'A'..='Z' | 'a'..='z' => {
31 let t = match ::quote::__private::IdentFragmentAdapter(&ch) {
arg =>
::quote::__private::mk_ident(&::alloc::__export::must_use({
::alloc::fmt::format(format_args!("{0}", arg))
}), ::quote::__private::Option::None.or(arg.span())),
}format_ident!("{}", ch);
32 {
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&krate, &mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::ToTokens::to_tokens(&t, &mut _s);
_s
}quote!(#krate::#t)
33 }
34 '0'..='9' | '_' => {
35 let t = match ::quote::__private::IdentFragmentAdapter(&ch) {
arg =>
::quote::__private::mk_ident(&::alloc::__export::must_use({
::alloc::fmt::format(format_args!("_{0}", arg))
}), ::quote::__private::Option::None.or(arg.span())),
}format_ident!("_{}", ch);
36 {
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&krate, &mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::ToTokens::to_tokens(&t, &mut _s);
_s
}quote!(#krate::#t)
37 }
38 _ => {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Bracket,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
::quote::__private::TokenStream::new());
::quote::__private::push_semi(&mut _s);
::quote::ToTokens::to_tokens(&ch, &mut _s);
::quote::__private::push_ident(&mut _s, "as");
::quote::__private::push_underscore(&mut _s);
_s
});
_s
}quote!([(); #ch as _]),
39 });
40 }
41 }
42
43 {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
{
use ::quote::__private::ext::*;
let has_iter = ::quote::__private::HasIterator::<false>;
#[allow(unused_mut)]
let (mut ids, i) = ids.quote_into_iter();
let has_iter = has_iter | i;
<_ as
::quote::__private::CheckHasIterator<true>>::check(has_iter);
while true {
let ids =
match ids.next() {
Some(_x) => ::quote::__private::RepInterp(_x),
None => break,
};
::quote::ToTokens::to_tokens(&ids, &mut _s);
::quote::__private::push_comma(&mut _s);
}
}
_s
});
_s
}quote! { (#(#ids,)*) }
44}