use async_trait_ext::async_trait_ext; use std::task::{Context, Poll}; #[async_trait_ext] pub trait Foo { async fn method1(self) where Self: Copy + Unpin; async fn method2(&self); async fn method3(&mut self); async fn method4(); #[allow(clippy::needless_lifetimes)] async fn method5<'a, A: Clone>(self, a: &'a A) where Self: Copy + Unpin; async fn method6<'a, A: Clone>(&self, a: &'a A); async fn method7<'a, A: Clone>(&mut self, a: &'a A); #[allow(clippy::needless_lifetimes)] async fn method8<'a, A: Clone>(a: &'a A); async fn method9(self) where Self: Copy + Unpin; async fn method10(&self); async fn method11(&mut self); async fn method12(); async fn method13(self) -> A where Self: Copy + Unpin; async fn method14(&self) -> A; async fn method15(&mut self) -> A; async fn method16() -> A; #[allow(clippy::extra_unused_lifetimes)] async fn method17<'a>(self) where Self: Copy + Unpin; #[allow(clippy::extra_unused_lifetimes)] async fn method18<'a>(&self); #[allow(clippy::extra_unused_lifetimes)] async fn method19<'a>(&mut self); #[allow(clippy::extra_unused_lifetimes)] async fn method20<'a>(); fn method21(); #[allow(clippy::extra_unused_lifetimes)] fn method22<'a>(); } #[test] fn test_empty() { #[async_trait_ext] trait Foo { async fn bar(); } struct Baz; impl Foo for Baz { fn poll_bar(_: &mut Context) -> Poll<()> { unimplemented!() } } let _ = async { Baz::bar().await; }; } #[test] fn test_receiver() { #[async_trait_ext] trait Foo { async fn bar(self) where Self: Copy + Unpin; async fn baz(&self); async fn qux(&mut self); } #[derive(Clone, Copy)] struct Quux; impl Foo for Quux { fn poll_bar(self, _: &mut Context) -> Poll<()> { unimplemented!() } fn poll_baz(&self, _: &mut Context) -> Poll<()> { unimplemented!() } fn poll_qux(&mut self, _: &mut Context) -> Poll<()> { unimplemented!() } } let _ = async { Quux.bar().await; Quux.baz().await; Quux.qux().await; }; } #[test] fn test_without_receiver() { #[async_trait_ext] trait Foo { async fn bar(_: i32); async fn baz(_: Self, _: i32) where Self: Copy + Unpin; } #[derive(Clone, Copy)] struct Qux; impl Foo for Qux { fn poll_bar(_: i32, _: &mut Context) -> Poll<()> { unimplemented!() } fn poll_baz(_: Self, _: i32, _: &mut Context) -> Poll<()> { unimplemented!() } } let _ = async { Qux::bar(1).await; Qux::baz(Qux, 1).await; }; }