1use crate::syntax::Receiver; 2use proc_macro2::TokenStream; 3use quote::{quote_spanned, ToTokens}; 4use syn::Token; 5 6pub struct ReceiverType<'a>(&'a Receiver); 7pub struct ReceiverTypeSelf<'a>(&'a Receiver); 8 9impl Receiver { 10 // &TheType 11 pub fn ty(&self) -> ReceiverType { 12 ReceiverType(self) 13 } 14 15 // &Self 16 pub 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).to_tokens(tokens); 71 if let Some((_pin, _langle, rangle)) = pin_tokens { 72 rangle.to_tokens(tokens); 73 } 74 } 75} 76