Implement lifetime elision inside of pins
diff --git a/macro/src/expand.rs b/macro/src/expand.rs
index 1b09cf0..d4ceb3d 100644
--- a/macro/src/expand.rs
+++ b/macro/src/expand.rs
@@ -436,7 +436,7 @@
let receiver = efn.receiver.iter().map(|receiver| {
let var = receiver.var;
if receiver.pinned {
- let ty = receiver.ty();
+ let ty = receiver.ty_self();
quote!(#var: #ty)
} else {
let ampersand = receiver.ampersand;
diff --git a/syntax/tokens.rs b/syntax/tokens.rs
index 7664427..bb04e16 100644
--- a/syntax/tokens.rs
+++ b/syntax/tokens.rs
@@ -270,12 +270,18 @@
}
pub struct ReceiverType<'a>(&'a Receiver);
+pub struct ReceiverTypeSelf<'a>(&'a Receiver);
impl Receiver {
// &TheType
pub fn ty(&self) -> ReceiverType {
ReceiverType(self)
}
+
+ // &Self
+ pub fn ty_self(&self) -> ReceiverTypeSelf {
+ ReceiverTypeSelf(self)
+ }
}
impl ToTokens for ReceiverType<'_> {
@@ -304,3 +310,30 @@
}
}
}
+
+impl ToTokens for ReceiverTypeSelf<'_> {
+ fn to_tokens(&self, tokens: &mut TokenStream) {
+ let Receiver {
+ pinned: _,
+ ampersand,
+ lifetime,
+ mutable: _,
+ var: _,
+ ty,
+ shorthand: _,
+ pin_tokens,
+ mutability,
+ } = &self.0;
+ if let Some((pin, langle, _rangle)) = pin_tokens {
+ tokens.extend(quote_spanned!(pin.span=> ::std::pin::Pin));
+ langle.to_tokens(tokens);
+ }
+ ampersand.to_tokens(tokens);
+ lifetime.to_tokens(tokens);
+ mutability.to_tokens(tokens);
+ Token).to_tokens(tokens);
+ if let Some((_pin, _langle, rangle)) = pin_tokens {
+ rangle.to_tokens(tokens);
+ }
+ }
+}