Skip to content

Commit 371ab62

Browse files
committed
Merge pull request #24 from taiki-e/mutability
Propagate mutability of `mut self` argument
2 parents 2fe612f + d620fe5 commit 371ab62

File tree

2 files changed

+36
-4
lines changed

2 files changed

+36
-4
lines changed

src/expand.rs

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -307,21 +307,25 @@ fn transform_block(
307307
}
308308
}
309309
Some(arg @ FnArg::Receiver(_)) => {
310-
let self_token = match arg {
311-
FnArg::Receiver(Receiver { self_token, .. }) => self_token,
310+
let (self_token, mutability) = match arg {
311+
FnArg::Receiver(Receiver {
312+
self_token,
313+
mutability,
314+
..
315+
}) => (self_token, mutability),
312316
_ => unreachable!(),
313317
};
314318
let under_self = Ident::new("_self", self_token.span);
315319
match context {
316320
Context::Trait { .. } => {
317321
self_bound = Some(parse_quote!(core::marker::Send));
318322
*arg = parse_quote! {
319-
#under_self: AsyncTrait
323+
#mutability #under_self: AsyncTrait
320324
};
321325
}
322326
Context::Impl { receiver, .. } => {
323327
*arg = parse_quote! {
324-
#under_self: #receiver
328+
#mutability #under_self: #receiver
325329
};
326330
}
327331
}

tests/test.rs

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -225,3 +225,31 @@ mod issue17 {
225225
}
226226
}
227227
}
228+
229+
// https://github.com/dtolnay/async-trait/issues/23
230+
mod issue23 {
231+
use async_trait::async_trait;
232+
233+
#[async_trait]
234+
pub trait Issue23 {
235+
async fn f(self);
236+
237+
async fn g(mut self)
238+
where
239+
Self: Sized,
240+
{
241+
do_something(&mut self);
242+
}
243+
}
244+
245+
struct S {}
246+
247+
#[async_trait]
248+
impl Issue23 for S {
249+
async fn f(mut self) {
250+
do_something(&mut self);
251+
}
252+
}
253+
254+
fn do_something<T>(_: &mut T) {}
255+
}

0 commit comments

Comments
 (0)