cxxbridge_macro/
type_id.rs

1use 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
20// "folly::File" => `(f, o, l, l, y, (), F, i, l, e)`
21pub(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}