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).to_tokens(tokens); 71 if let Some((_pin, _langle, rangle)) = pin_tokens { 72 rangle.to_tokens(tokens); 73 } 74 } 75 } 76