From 36496b1446554143a16b9fc717de0c63cc335ef7 Mon Sep 17 00:00:00 2001 From: Sherlock Holo Date: Sun, 4 Feb 2024 17:18:08 +0800 Subject: [PATCH 1/2] feat: support default implement method --- trait-variant/examples/variant.rs | 8 ++++++++ trait-variant/src/variant.rs | 13 +++++++++++++ 2 files changed, 21 insertions(+) diff --git a/trait-variant/examples/variant.rs b/trait-variant/examples/variant.rs index 04bcc6a..48c9c33 100644 --- a/trait-variant/examples/variant.rs +++ b/trait-variant/examples/variant.rs @@ -20,12 +20,20 @@ pub trait LocalIntFactory { fn stream(&self) -> impl Iterator; fn call(&self) -> u32; fn another_async(&self, input: Result<(), &str>) -> Self::MyFut<'_>; + async fn default_method(&self) -> u32 { + 1 + } + fn sync_default_method(&self) -> u32 { + 1 + } } #[allow(dead_code)] fn spawn_task(factory: impl IntFactory + 'static) { tokio::spawn(async move { let _int = factory.make(1, "foo").await; + let _default_int = factory.default_method().await; + let _sync_default_int = factory.sync_default_method(); }); } diff --git a/trait-variant/src/variant.rs b/trait-variant/src/variant.rs index f7f0d27..3fb1933 100644 --- a/trait-variant/src/variant.rs +++ b/trait-variant/src/variant.rs @@ -150,12 +150,25 @@ fn transform_item(item: &TraitItem, bounds: &Vec) -> TraitItem { ReturnType::Default => return item.clone(), } }; + + let default_impl = fn_item.default.as_ref().map(|default_impl| { + syn::parse2(quote! { + { + async move { + #default_impl + } + } + }) + .unwrap() + }); + TraitItem::Fn(TraitItemFn { sig: Signature { asyncness: None, output: ReturnType::Type(arrow, Box::new(output)), ..sig.clone() }, + default: default_impl, ..fn_item.clone() }) } From 19765448beffe6afd775d66fbe448b8aeb5507af Mon Sep 17 00:00:00 2001 From: Sherlock Holo Date: Sun, 4 Feb 2024 19:52:35 +0800 Subject: [PATCH 2/2] fix: only wrap async fn body block --- trait-variant/examples/variant.rs | 4 ++++ trait-variant/src/variant.rs | 19 ++++++++++++------- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/trait-variant/examples/variant.rs b/trait-variant/examples/variant.rs index 48c9c33..6971ca6 100644 --- a/trait-variant/examples/variant.rs +++ b/trait-variant/examples/variant.rs @@ -20,6 +20,9 @@ pub trait LocalIntFactory { fn stream(&self) -> impl Iterator; fn call(&self) -> u32; fn another_async(&self, input: Result<(), &str>) -> Self::MyFut<'_>; + fn default_stream(&self) -> impl Iterator { + [1].into_iter() + } async fn default_method(&self) -> u32 { 1 } @@ -33,6 +36,7 @@ fn spawn_task(factory: impl IntFactory + 'static) { tokio::spawn(async move { let _int = factory.make(1, "foo").await; let _default_int = factory.default_method().await; + let _default_stream = factory.default_stream(); let _sync_default_int = factory.sync_default_method(); }); } diff --git a/trait-variant/src/variant.rs b/trait-variant/src/variant.rs index 3fb1933..1af07fe 100644 --- a/trait-variant/src/variant.rs +++ b/trait-variant/src/variant.rs @@ -152,14 +152,19 @@ fn transform_item(item: &TraitItem, bounds: &Vec) -> TraitItem { }; let default_impl = fn_item.default.as_ref().map(|default_impl| { - syn::parse2(quote! { - { - async move { - #default_impl + // only wrap async fn block with async move {} + if sig.asyncness.is_some() { + syn::parse2(quote! { + { + async move { + #default_impl + } } - } - }) - .unwrap() + }) + .unwrap() + } else { + default_impl.clone() + } }); TraitItem::Fn(TraitItemFn {