Split Receiver's ToTokens into a wrapper type
diff --git a/macro/src/expand.rs b/macro/src/expand.rs
index 350ee97..36f25c5 100644
--- a/macro/src/expand.rs
+++ b/macro/src/expand.rs
@@ -126,7 +126,10 @@
fn expand_cxx_function_decl(namespace: &Namespace, efn: &ExternFn, types: &Types) -> TokenStream {
let ident = &efn.ident;
- let receiver = efn.receiver.iter().map(|receiver| quote!(_: #receiver));
+ let receiver = efn.receiver.iter().map(|receiver| {
+ let receiver_type = receiver.ty();
+ quote!(_: #receiver_type)
+ });
let args = efn.args.iter().map(|arg| {
let ident = &arg.ident;
let ty = expand_extern_type(&arg.ty);
@@ -383,10 +386,10 @@
.receiver
.as_ref()
.map(|receiver| quote_spanned!(receiver.var.span=> __self));
- let receiver = sig
- .receiver
- .as_ref()
- .map(|receiver| quote!(#receiver_var: #receiver));
+ let receiver = sig.receiver.as_ref().map(|receiver| {
+ let receiver_type = receiver.ty();
+ quote!(#receiver_var: #receiver_type)
+ });
let args = sig.args.iter().map(|arg| {
let ident = &arg.ident;
let ty = expand_extern_type(&arg.ty);
diff --git a/syntax/tokens.rs b/syntax/tokens.rs
index 6e3db9b..08c966a 100644
--- a/syntax/tokens.rs
+++ b/syntax/tokens.rs
@@ -98,10 +98,19 @@
}
}
-impl ToTokens for Receiver {
+pub struct ReceiverType<'a>(&'a Receiver);
+
+impl Receiver {
+ // &TheType
+ pub fn ty(&self) -> ReceiverType {
+ ReceiverType(self)
+ }
+}
+
+impl ToTokens for ReceiverType<'_> {
fn to_tokens(&self, tokens: &mut TokenStream) {
- self.ampersand.to_tokens(tokens);
- self.mutability.to_tokens(tokens);
- self.ty.to_tokens(tokens);
+ self.0.ampersand.to_tokens(tokens);
+ self.0.mutability.to_tokens(tokens);
+ self.0.ty.to_tokens(tokens);
}
}