diff options
author | Douman <douman@gmx.se> | 2019-09-24 16:03:26 +0200 |
---|---|---|
committer | Douman <douman@gmx.se> | 2019-10-01 13:15:46 +0200 |
commit | a1d1eb5eb352f722eb8f7ed6be5963127da59b21 (patch) | |
tree | 4521812113ad38f14ac901aa2e0a9dac05fb5fec | |
parent | 5efe31f2ed3c797e8055306a05faa3d7e786e7b6 (diff) |
macros: Allow arguments in non-main functions
-rw-r--r-- | build-tests/tests/fail/macros_invalid_input.rs | 3 | ||||
-rw-r--r-- | build-tests/tests/fail/macros_invalid_input.stderr | 34 | ||||
-rw-r--r-- | tokio-macros/src/lib.rs | 17 |
3 files changed, 24 insertions, 30 deletions
diff --git a/build-tests/tests/fail/macros_invalid_input.rs b/build-tests/tests/fail/macros_invalid_input.rs index 827507eb..8396a71c 100644 --- a/build-tests/tests/fail/macros_invalid_input.rs +++ b/build-tests/tests/fail/macros_invalid_input.rs @@ -3,9 +3,6 @@ use build_tests::tokio; #[tokio::main] fn main_is_not_async() {} -#[tokio::main] -async fn main_fn_has_args(_x: u8) {} - #[tokio::main(foo)] async fn main_attr_has_unknown_args() {} diff --git a/build-tests/tests/fail/macros_invalid_input.stderr b/build-tests/tests/fail/macros_invalid_input.stderr index 2f136125..7aa90499 100644 --- a/build-tests/tests/fail/macros_invalid_input.stderr +++ b/build-tests/tests/fail/macros_invalid_input.stderr @@ -4,44 +4,38 @@ error: the async keyword is missing from the function declaration 4 | fn main_is_not_async() {} | ^^ -error: the main function cannot accept arguments - --> $DIR/macros_invalid_input.rs:7:27 - | -7 | async fn main_fn_has_args(_x: u8) {} - | ^^^^^^ - error: Unknown attribute foo is specified - --> $DIR/macros_invalid_input.rs:9:15 + --> $DIR/macros_invalid_input.rs:6:15 | -9 | #[tokio::main(foo)] +6 | #[tokio::main(foo)] | ^^^ error: Must have specified ident - --> $DIR/macros_invalid_input.rs:12:15 - | -12 | #[tokio::main(multi_thread::bar)] - | ^^^^^^^^^^^^^^^^^ + --> $DIR/macros_invalid_input.rs:9:15 + | +9 | #[tokio::main(multi_thread::bar)] + | ^^^^^^^^^^^^^^^^^ error: the async keyword is missing from the function declaration - --> $DIR/macros_invalid_input.rs:16:1 + --> $DIR/macros_invalid_input.rs:13:1 | -16 | fn test_is_not_async() {} +13 | fn test_is_not_async() {} | ^^ error: the test function cannot accept arguments - --> $DIR/macros_invalid_input.rs:19:27 + --> $DIR/macros_invalid_input.rs:16:27 | -19 | async fn test_fn_has_args(_x: u8) {} +16 | async fn test_fn_has_args(_x: u8) {} | ^^^^^^ error: unexpected token - --> $DIR/macros_invalid_input.rs:21:15 + --> $DIR/macros_invalid_input.rs:18:15 | -21 | #[tokio::test(foo)] +18 | #[tokio::test(foo)] | ^^^ error: second test attribute is supplied - --> $DIR/macros_invalid_input.rs:25:1 + --> $DIR/macros_invalid_input.rs:22:1 | -25 | #[test] +22 | #[test] | ^^^^^^^ diff --git a/tokio-macros/src/lib.rs b/tokio-macros/src/lib.rs index c7138552..07adfa0d 100644 --- a/tokio-macros/src/lib.rs +++ b/tokio-macros/src/lib.rs @@ -25,6 +25,10 @@ use quote::quote; /// - `single_thread` - Uses `current_thread`. /// - `multi_thread` - Uses multi-threaded runtime. Used by default. /// +/// ## Function arguments: +/// +/// Arguments are allowed for any functions aside from `main` which is special +/// /// ## Usage /// /// ### Select runtime @@ -57,6 +61,7 @@ pub fn main(args: TokenStream, item: TokenStream) -> TokenStream { let ret = &input.sig.output; let name = &input.sig.ident; + let inputs = &input.sig.inputs; let body = &input.block; let attrs = &input.attrs; @@ -65,7 +70,7 @@ pub fn main(args: TokenStream, item: TokenStream) -> TokenStream { return syn::Error::new_spanned(input.sig.fn_token, msg) .to_compile_error() .into(); - } else if !input.sig.inputs.is_empty() { + } else if name == "main" && !inputs.is_empty() { let msg = "the main function cannot accept arguments"; return syn::Error::new_spanned(&input.sig.inputs, msg) .to_compile_error() @@ -95,16 +100,14 @@ pub fn main(args: TokenStream, item: TokenStream) -> TokenStream { let result = match runtime { RuntimeType::Multi => quote! { #(#attrs)* - fn #name() #ret { - let mut rt = tokio::runtime::Runtime::new().unwrap(); - rt.block_on(async { #body }) + fn #name(#inputs) #ret { + tokio::runtime::Runtime::new().unwrap().block_on(async { #body }) } }, RuntimeType::Single => quote! { #(#attrs)* - fn #name() #ret { - let mut rt = tokio::runtime::current_thread::Runtime::new().unwrap(); - rt.block_on(async { #body }) + fn #name(#inputs) #ret { + tokio::runtime::current_thread::Runtime::new().unwrap().block_on(async { #body }) } }, RuntimeType::Auto => quote! { |