cxxbridge_macro/
tokens.rs

1use crate::syntax::Receiver;
2use proc_macro2::TokenStream;
3use quote::{quote_spanned, ToTokens};
4use syn::Token;
5
6pub(crate) struct ReceiverType<'a>(&'a Receiver);
7pub(crate) struct ReceiverTypeSelf<'a>(&'a Receiver);
8
9impl Receiver {
10    // &TheType
11    pub(crate) fn ty(&self) -> ReceiverType {
12        ReceiverType(self)
13    }
14
15    // &Self
16    pub(crate) fn ty_self(&self) -> ReceiverTypeSelf {
17        ReceiverTypeSelf(self)
18    }
19}
20
21impl ToTokens for ReceiverType<'_> {
22    fn to_tokens(&self, tokens: &mut TokenStream) {
23        let Receiver {
24            pinned: _,
25            ampersand,
26            lifetime,
27            mutable: _,
28            var: _,
29            colon_token: _,
30            ty,
31            shorthand: _,
32            pin_tokens,
33            mutability,
34        } = &self.0;
35        if let Some((pin, langle, _rangle)) = pin_tokens {
36            tokens.extend(quote_spanned!(pin.span=> ::cxx::core::pin::Pin));
37            langle.to_tokens(tokens);
38        }
39        ampersand.to_tokens(tokens);
40        lifetime.to_tokens(tokens);
41        mutability.to_tokens(tokens);
42        ty.to_tokens(tokens);
43        if let Some((_pin, _langle, rangle)) = pin_tokens {
44            rangle.to_tokens(tokens);
45        }
46    }
47}
48
49impl ToTokens for ReceiverTypeSelf<'_> {
50    fn to_tokens(&self, tokens: &mut TokenStream) {
51        let Receiver {
52            pinned: _,
53            ampersand,
54            lifetime,
55            mutable: _,
56            var: _,
57            colon_token: _,
58            ty,
59            shorthand: _,
60            pin_tokens,
61            mutability,
62        } = &self.0;
63        if let Some((pin, langle, _rangle)) = pin_tokens {
64            tokens.extend(quote_spanned!(pin.span=> ::cxx::core::pin::Pin));
65            langle.to_tokens(tokens);
66        }
67        ampersand.to_tokens(tokens);
68        lifetime.to_tokens(tokens);
69        mutability.to_tokens(tokens);
70        Token![Self](ty.rust.span()).to_tokens(tokens);
71        if let Some((_pin, _langle, rangle)) = pin_tokens {
72            rangle.to_tokens(tokens);
73        }
74    }
75}