Skip to content

Commit 58351ab

Browse files
committed
Explicitly move all arguments into the async block
1 parent fbe0eb2 commit 58351ab

File tree

3 files changed

+32
-10
lines changed

3 files changed

+32
-10
lines changed

Diff for: trait-variant/Cargo.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ proc-macro = true
2525
[dependencies]
2626
proc-macro2 = "1.0"
2727
quote = "1.0"
28-
syn = { version = "2.0", features = ["full"] }
28+
syn = { version = "2.0", features = ["full", "visit-mut"] }
2929

3030
[dev-dependencies]
3131
tokio = { version = "1", features = ["rt"] }

Diff for: trait-variant/examples/variant.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,8 @@ pub trait LocalIntFactory {
2121
fn stream(&self) -> impl Iterator<Item = i32>;
2222
fn call(&self) -> u32;
2323
fn another_async(&self, input: Result<(), &str>) -> Self::MyFut<'_>;
24-
async fn defaulted(&self) -> i32 {
25-
self.make(10, "10").await
24+
async fn defaulted(&self, x: u32) -> i32 {
25+
self.make(x, "10").await
2626
}
2727
async fn defaulted_mut(&mut self) -> i32 {
2828
self.make(10, "10").await

Diff for: trait-variant/src/variant.rs

+29-7
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,9 @@ use syn::{
1515
parse_macro_input, parse_quote,
1616
punctuated::Punctuated,
1717
token::{Comma, Plus},
18-
Error, FnArg, GenericParam, Generics, Ident, ItemTrait, Lifetime, Pat, PatType, Receiver,
19-
Result, ReturnType, Signature, Token, TraitBound, TraitItem, TraitItemConst, TraitItemFn,
20-
TraitItemType, Type, TypeImplTrait, TypeParamBound, WhereClause,
18+
Error, FnArg, GenericParam, Generics, Ident, ItemTrait, Lifetime, Pat, PatIdent, PatType,
19+
Receiver, Result, ReturnType, Signature, Token, TraitBound, TraitItem, TraitItemConst,
20+
TraitItemFn, TraitItemType, Type, TypeImplTrait, TypeParamBound, WhereClause,
2121
};
2222

2323
struct Attrs {
@@ -145,10 +145,32 @@ fn transform_item(item: &TraitItem, bounds: &Vec<TypeParamBound>) -> TraitItem {
145145
output: ReturnType::Type(syn::parse2(quote! { -> }).unwrap(), Box::new(ty)),
146146
..sig.clone()
147147
},
148-
fn_item
149-
.default
150-
.as_ref()
151-
.map(|b| syn::parse2(quote! { { async move #b } }).unwrap()),
148+
fn_item.default.as_ref().map(|b| {
149+
let items = sig.inputs.iter().map(|i| match i {
150+
FnArg::Receiver(Receiver { self_token, .. }) => {
151+
quote! { let __self = #self_token; }
152+
}
153+
FnArg::Typed(PatType { pat, .. }) => match pat.as_ref() {
154+
Pat::Ident(PatIdent { ident, .. }) => quote! { let #ident = #ident; },
155+
_ => todo!(),
156+
},
157+
});
158+
159+
struct ReplaceSelfVisitor;
160+
impl syn::visit_mut::VisitMut for ReplaceSelfVisitor {
161+
fn visit_ident_mut(&mut self, ident: &mut syn::Ident) {
162+
if ident == "self" {
163+
*ident = syn::Ident::new("__self", ident.span());
164+
}
165+
syn::visit_mut::visit_ident_mut(self, ident);
166+
}
167+
}
168+
169+
let mut block = b.clone();
170+
syn::visit_mut::visit_block_mut(&mut ReplaceSelfVisitor, &mut block);
171+
172+
parse_quote! { { async move { #(#items)* #block} } }
173+
}),
152174
)
153175
} else {
154176
match &sig.output {

0 commit comments

Comments
 (0)