From e0ddca95533b061ad1d57307785e56ecb839ea90 Mon Sep 17 00:00:00 2001 From: Tyler Mandry Date: Sun, 17 Dec 2023 21:11:48 -0600 Subject: [PATCH 1/2] allow(async_fn_in_trait) on traits with Send variant --- trait-variant/examples/variant.rs | 11 +++++++++-- trait-variant/src/variant.rs | 22 ++++++++++++++++++---- 2 files changed, 27 insertions(+), 6 deletions(-) diff --git a/trait-variant/examples/variant.rs b/trait-variant/examples/variant.rs index 93c2ebe..5be07ef 100644 --- a/trait-variant/examples/variant.rs +++ b/trait-variant/examples/variant.rs @@ -10,8 +10,8 @@ use std::future::Future; use trait_variant::make_variant; -#[make_variant(SendIntFactory: Send)] -trait IntFactory { +#[make_variant(IntFactory: Send)] +pub trait LocalIntFactory { const NAME: &'static str; type MyFut<'a>: Future @@ -24,4 +24,11 @@ trait IntFactory { fn another_async(&self, input: Result<(), &str>) -> Self::MyFut<'_>; } +#[allow(dead_code)] +fn spawn_task(factory: impl IntFactory + 'static) { + tokio::spawn(async move { + let _int = factory.make(1, "foo").await; + }); +} + fn main() {} diff --git a/trait-variant/src/variant.rs b/trait-variant/src/variant.rs index 1a5bd1f..494a70c 100644 --- a/trait-variant/src/variant.rs +++ b/trait-variant/src/variant.rs @@ -56,15 +56,29 @@ pub fn make_variant( let attrs = parse_macro_input!(attr as Attrs); let item = parse_macro_input!(item as ItemTrait); + let maybe_allow_async_lint = if attrs + .variant + .bounds + .iter() + .any(|b| b.path.segments.last().unwrap().ident.to_string() == "Send") + { + quote! { #[allow(async_fn_in_trait)] } + } else { + quote! {} + }; + let variant = mk_variant(&attrs, &item); let blanket_impl = mk_blanket_impl(&attrs, &item); - let output = quote! { + + quote! { + #maybe_allow_async_lint #item + #variant - #blanket_impl - }; - output.into() + #blanket_impl + } + .into() } fn mk_variant(attrs: &Attrs, tr: &ItemTrait) -> TokenStream { From f1936772a9cc5a9d1cde38392a4923c972d0669c Mon Sep 17 00:00:00 2001 From: Travis Cross Date: Mon, 18 Dec 2023 09:45:37 +0000 Subject: [PATCH 2/2] Remove unneeded `to_string` call In `syn`, there is a `PartialEq` impl for `Ident` that allows values of this type to be compared directly against strings without calling `to_string`, so let's do that. --- trait-variant/src/variant.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/trait-variant/src/variant.rs b/trait-variant/src/variant.rs index 494a70c..8280599 100644 --- a/trait-variant/src/variant.rs +++ b/trait-variant/src/variant.rs @@ -60,7 +60,7 @@ pub fn make_variant( .variant .bounds .iter() - .any(|b| b.path.segments.last().unwrap().ident.to_string() == "Send") + .any(|b| b.path.segments.last().unwrap().ident == "Send") { quote! { #[allow(async_fn_in_trait)] } } else {