diff options
author | Aapo Alasuutari <aapo.alasuutari@gmail.com> | 2022-05-12 22:51:57 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-05-12 21:51:57 +0200 |
commit | 6fff813029b47c0ca9497aaba5920f8acf981772 (patch) | |
tree | e6d3f30597f49ceb99b59c0193dab11c370fd3a9 | |
parent | f18d0539b141f808ca9baa44674756fadbe884be (diff) |
cleanup(ops): shorter codegen'd infallible sync ops return (#14587)
Co-authored-by: Aaron O'Mullan <aaron.omullan@gmail.com>
-rw-r--r-- | ops/lib.rs | 28 |
1 files changed, 13 insertions, 15 deletions
diff --git a/ops/lib.rs b/ops/lib.rs index bfc949af7..9ee5fa371 100644 --- a/ops/lib.rs +++ b/ops/lib.rs @@ -309,19 +309,16 @@ fn codegen_sync_ret( core: &TokenStream2, output: &syn::ReturnType, ) -> TokenStream2 { - let ret_type = match output { - // Func with no return no-ops - syn::ReturnType::Default => return quote! { let ret = (); }, - // Func with a return Result<T, E> - syn::ReturnType::Type(_, ty) => ty, - }; + if is_void(output) { + return quote! {}; + } // Optimize Result<(), Err> to skip serde_v8 when Ok(...) - let ok_block = if is_unit_result(&**ret_type) { + let ok_block = if is_unit_result(output) { quote! {} } else { quote! { - match #core::serde_v8::to_v8(scope, v) { + match #core::serde_v8::to_v8(scope, result) { Ok(ret) => rv.set(ret), Err(err) => #core::_ops::throw_type_error( scope, @@ -331,16 +328,13 @@ fn codegen_sync_ret( } }; - let result_wrapper = match is_result(&**ret_type) { - true => quote! {}, - false => quote! { let result = Ok(result); }, - }; + if !is_result(output) { + return ok_block; + } quote! { - #result_wrapper - match result { - Ok(v) => { + Ok(result) => { #ok_block }, Err(err) => { @@ -351,6 +345,10 @@ fn codegen_sync_ret( } } +fn is_void(ty: impl ToTokens) -> bool { + tokens(ty).is_empty() +} + fn is_result(ty: impl ToTokens) -> bool { let tokens = tokens(ty); if tokens.trim_start_matches("-> ").starts_with("Result <") { |