| use crate::syntax::Receiver; |
| use proc_macro2::TokenStream; |
| use quote::{quote_spanned, ToTokens}; |
| use syn::Token; |
| |
| pub(crate) struct ReceiverType<'a>(&'a Receiver); |
| pub(crate) struct ReceiverTypeSelf<'a>(&'a Receiver); |
| |
| impl Receiver { |
| // &TheType |
| pub(crate) fn ty(&self) -> ReceiverType { |
| ReceiverType(self) |
| } |
| |
| // &Self |
| pub(crate) fn ty_self(&self) -> ReceiverTypeSelf { |
| ReceiverTypeSelf(self) |
| } |
| } |
| |
| impl ToTokens for ReceiverType<'_> { |
| fn to_tokens(&self, tokens: &mut TokenStream) { |
| let Receiver { |
| pinned: _, |
| ampersand, |
| lifetime, |
| mutable: _, |
| var: _, |
| colon_token: _, |
| ty, |
| shorthand: _, |
| pin_tokens, |
| mutability, |
| } = &self.0; |
| if let Some((pin, langle, _rangle)) = pin_tokens { |
| tokens.extend(quote_spanned!(pin.span=> ::cxx::core::pin::Pin)); |
| langle.to_tokens(tokens); |
| } |
| ampersand.to_tokens(tokens); |
| lifetime.to_tokens(tokens); |
| mutability.to_tokens(tokens); |
| ty.to_tokens(tokens); |
| if let Some((_pin, _langle, rangle)) = pin_tokens { |
| rangle.to_tokens(tokens); |
| } |
| } |
| } |
| |
| impl ToTokens for ReceiverTypeSelf<'_> { |
| fn to_tokens(&self, tokens: &mut TokenStream) { |
| let Receiver { |
| pinned: _, |
| ampersand, |
| lifetime, |
| mutable: _, |
| var: _, |
| colon_token: _, |
| ty, |
| shorthand: _, |
| pin_tokens, |
| mutability, |
| } = &self.0; |
| if let Some((pin, langle, _rangle)) = pin_tokens { |
| tokens.extend(quote_spanned!(pin.span=> ::cxx::core::pin::Pin)); |
| langle.to_tokens(tokens); |
| } |
| ampersand.to_tokens(tokens); |
| lifetime.to_tokens(tokens); |
| mutability.to_tokens(tokens); |
| Token![Self](ty.rust.span()).to_tokens(tokens); |
| if let Some((_pin, _langle, rangle)) = pin_tokens { |
| rangle.to_tokens(tokens); |
| } |
| } |
| } |