diff --git a/src/expand.rs b/src/expand.rs index 4772d57..d3258cf 100644 --- a/src/expand.rs +++ b/src/expand.rs @@ -11,14 +11,46 @@ impl ToTokens for AsyncItem { } pub fn expand(item: &mut AsyncItem, args: &RecursionArgs) { + let return_type: Option> = match &item.0.sig.output { + ReturnType::Default => None, + ReturnType::Type(_, typ) => Some(typ.clone()), + }; transform_sig(&mut item.0.sig, args); - transform_block(&mut item.0.block); + transform_block(&mut item.0.block, return_type); } -fn transform_block(block: &mut Block) { +// Input: +// { } +// +// Output: +// { +// Box::pin({ +// let __ret: Ret = async move { }; +// __ret +// }) +// } +fn transform_block(block: &mut Block, return_type: Option>) { let brace = block.brace_token; + + let bound = match return_type { + Some(typ) => { + quote!( + let __ret: #typ = #block; + __ret + ) + } + None => { + quote!( + let __ret: () = #block; + __ret + ) + } + }; + *block = parse_quote!({ - Box::pin(async move #block) + Box::pin(async move { + #bound + }) }); block.brace_token = brace; } diff --git a/tests/dyn.rs b/tests/dyn.rs new file mode 100644 index 0000000..6ede7e1 --- /dev/null +++ b/tests/dyn.rs @@ -0,0 +1,12 @@ +use async_recursion::async_recursion; + +#[async_recursion] +#[allow(dead_code)] +async fn dyn_coercion() -> Box { + Box::new("hello world!") +} + +#[async_recursion] +async fn no_return_type() { + () +} diff --git a/tests/struct_methods.rs b/tests/struct_methods.rs index 98a1296..ca33cfd 100644 --- a/tests/struct_methods.rs +++ b/tests/struct_methods.rs @@ -69,7 +69,7 @@ fn struct_method_with_generic_parameter_works() { block_on(async move { let e = Empty {}; assert_eq!( - e.generic_parameter::<*const u64>(&(0 as *const u64)).await, + e.generic_parameter::<*const u64>(&std::ptr::null()).await, 0 ); })