1 use crate::syntax::Receiver;
2 use proc_macro2::TokenStream;
3 use quote::{quote_spanned, ToTokens};
4 use syn::Token;
5 
6 pub(crate) struct ReceiverType<'a>(&'a Receiver);
7 pub(crate) struct ReceiverTypeSelf<'a>(&'a Receiver);
8 
9 impl Receiver {
10     // &TheType
ty(&self) -> ReceiverType11     pub(crate) fn ty(&self) -> ReceiverType {
12         ReceiverType(self)
13     }
14 
15     // &Self
ty_self(&self) -> ReceiverTypeSelf16     pub(crate) fn ty_self(&self) -> ReceiverTypeSelf {
17         ReceiverTypeSelf(self)
18     }
19 }
20 
21 impl ToTokens for ReceiverType<'_> {
to_tokens(&self, tokens: &mut TokenStream)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 
49 impl ToTokens for ReceiverTypeSelf<'_> {
to_tokens(&self, tokens: &mut TokenStream)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 }
76