Skip to content

Commit

Permalink
feat: directly return inner with named tuple return params
Browse files Browse the repository at this point in the history
  • Loading branch information
yash-atreya committed Jan 14, 2025
1 parent 705dbd5 commit 4b30bbb
Show file tree
Hide file tree
Showing 3 changed files with 32 additions and 5 deletions.
7 changes: 3 additions & 4 deletions crates/sol-macro-expander/src/expand/function.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
use super::{
anon_name, expand_fields, expand_from_into_tuples, expand_tokenize, expand_tuple_types,
expand_types, ExpCtxt,
expand_types, generate_return_tuple, ExpCtxt,
};
use alloy_sol_macro_input::{mk_doc, ContainsSolAttrs};
use ast::{FunctionKind, ItemFunction, Spanned};
Expand Down Expand Up @@ -41,7 +41,7 @@ pub(super) fn expand(cx: &ExpCtxt<'_>, function: &ItemFunction) -> Result<TokenS
let returns = returns.as_ref().map(|r| &r.returns).unwrap_or_default();

let is_singular_noname = returns.len() == 1;
let is_tuple_noname = returns.len() > 1 && returns.iter().all(|r| r.name.is_none());
let is_tuple_noname = returns.len() > 1;

cx.assert_resolved(parameters)?;
if !returns.is_empty() {
Expand Down Expand Up @@ -114,8 +114,7 @@ pub(super) fn expand(cx: &ExpCtxt<'_>, function: &ItemFunction) -> Result<TokenS
quote!(#return_name)
};

let ret_params = (0..returns.len()).map(|i| format_ident!("_{i}"));
let tuple_ret = quote! { (#(r.#ret_params),*) };
let tuple_ret = generate_return_tuple(returns);
let decode_returns = if is_singular_noname {
let name = anon_name((0, returns.first().unwrap().name.as_ref()));
quote! {
Expand Down
7 changes: 6 additions & 1 deletion crates/sol-macro-expander/src/expand/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ use std::{
fmt::Write,
sync::atomic::{AtomicBool, Ordering},
};
use syn::{ext::IdentExt, parse_quote, Attribute, Error, Result};
use syn::{ext::IdentExt, parse_quote, token::Comma, Attribute, Error, Result};

#[macro_use]
mod macros;
Expand Down Expand Up @@ -791,6 +791,11 @@ fn expand_types<'a, P>(
params.iter().map(move |var| cx.expand_rust_type(&var.ty))
}

fn generate_return_tuple<'a>(params: &'a Parameters<Comma>) -> TokenStream {
let fields = params.iter().enumerate().map(|(i, var)| anon_name((i, var.name.as_ref())));
quote! { (#(r.#fields),*) }
}

/// Generates an anonymous name from an integer. Used in [`anon_name`].
#[inline]
pub fn generate_name(i: usize) -> Ident {
Expand Down
23 changes: 23 additions & 0 deletions crates/sol-types/tests/macros/sol/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -192,6 +192,29 @@ fn ret_param_single_test() {
assert_eq!(res, U256::from(42));
}

#[test]
fn ret_tuple_param() {
use alloy_sol_types::SolValue;
sol! {
function balanceOfTuple(address owner) returns (uint256, uint256);

function balanceOfTupleNamed(address owner) returns (uint256 bal, uint256);

function balanceOfDoubleTuple(address owner) returns ((uint256, uint256), uint256);
}

let data = vec![24, 42].abi_encode_sequence();
let (u1, u2) = balanceOfTupleCall::abi_decode_returns(&data, true).unwrap();

assert_eq!(u1, U256::from(24));
assert_eq!(u2, U256::from(42));

let (u1, u2) = balanceOfTupleNamedCall::abi_decode_returns(&data, true).unwrap();

assert_eq!(u1, U256::from(24));
assert_eq!(u2, U256::from(42));
}

#[test]
fn error() {
sol! {
Expand Down

0 comments on commit 4b30bbb

Please sign in to comment.