Skip to content

Commit dbb72b9

Browse files
committed
feat(sol!)!: gen unit/tuple structs for call types with 0/1 param
1 parent a5ffce7 commit dbb72b9

File tree

4 files changed

+38
-23
lines changed

4 files changed

+38
-23
lines changed

crates/sol-macro-expander/src/expand/function.rs

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -60,12 +60,12 @@ pub(super) fn expand(cx: &ExpCtxt<'_>, function: &ItemFunction) -> Result<TokenS
6060
let call_tuple = expand_tuple_types(parameters.types(), cx).0;
6161
let return_tuple = expand_tuple_types(returns.types(), cx).0;
6262

63-
let converts = expand_from_into_tuples(&call_name, parameters, cx, true);
63+
let converts = expand_from_into_tuples(&call_name, parameters, cx, false);
6464
let return_converts = expand_from_into_tuples(&return_name, returns, cx, true);
6565

6666
let signature = cx.function_signature(function);
6767
let selector = crate::utils::selector(&signature);
68-
let tokenize_impl = expand_tokenize(parameters, cx, true);
68+
let tokenize_impl = expand_tokenize(parameters, cx, false);
6969

7070
let call_doc = docs.then(|| {
7171
let selector = hex::encode_prefixed(selector.array.as_slice());
@@ -97,16 +97,31 @@ pub(super) fn expand(cx: &ExpCtxt<'_>, function: &ItemFunction) -> Result<TokenS
9797
}
9898
});
9999

100+
let call_struct = if parameters.is_empty() {
101+
quote! {
102+
pub struct #call_name;
103+
}
104+
} else if parameters.len() == 1 {
105+
let ty = cx.expand_rust_type(&parameters[0].ty);
106+
quote! {
107+
pub struct #call_name(pub #ty);
108+
}
109+
} else {
110+
quote! {
111+
pub struct #call_name {
112+
#(#call_fields),*
113+
}
114+
}
115+
};
116+
100117
let alloy_sol_types = &cx.crates.sol_types;
101118

102119
let tokens = quote! {
103120
#(#call_attrs)*
104121
#call_doc
105122
#[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)]
106123
#[derive(Clone)]
107-
pub struct #call_name {
108-
#(#call_fields),*
109-
}
124+
#call_struct
110125

111126
#(#return_attrs)*
112127
#return_doc

crates/sol-macro/doctests/function_like.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,14 +29,14 @@ fn function() {
2929
let _ = overloaded_0Call {};
3030
assert_call_signature::<overloaded_0Call>("overloaded()");
3131

32-
let _ = overloaded_1Call { _0: U256::from(1) };
32+
let _ = overloaded_1Call(U256::from(1));
3333
assert_call_signature::<overloaded_1Call>("overloaded(uint256)");
3434

35-
let _ = overloaded_2Call { _0: "hello".into() };
35+
let _ = overloaded_2Call("hello".into());
3636
assert_call_signature::<overloaded_2Call>("overloaded(string)");
3737

3838
// Exactly the same as `function variableGetter(uint256) returns (bool)`.
39-
let _ = variableGetterCall { k: U256::from(2) };
39+
let _ = variableGetterCall(U256::from(2));
4040
assert_call_signature::<variableGetterCall>("variableGetter(uint256)");
4141
let _ = variableGetterReturn { v: false };
4242
}

crates/sol-types/tests/macros/sol/json.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ fn large_array() {
1313
"../json-abi/tests/abi/LargeArray.json"
1414
);
1515

16-
let call = LargeArray::callWithLongArrayCall { longArray: [0; 128] };
16+
let call = LargeArray::callWithLongArrayCall([0; 128]);
1717
let _ = format!("{call:#?}");
1818

1919
assert_eq!(LargeArray::callWithLongArrayCall::SIGNATURE, "callWithLongArray(uint64[128])");

crates/sol-types/tests/macros/sol/mod.rs

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -254,13 +254,13 @@ fn getter_names() {
254254
let _ = Getters::valueCall {};
255255
let _ = Getters::valueReturn { value: String::new() };
256256

257-
let _ = Getters::arrayCall { _0: U256::ZERO };
257+
let _ = Getters::arrayCall(U256::ZERO);
258258
let _ = Getters::arrayReturn { _0: String::new() };
259259

260-
let _ = Getters::mapCall { _0: B256::ZERO };
260+
let _ = Getters::mapCall(B256::ZERO);
261261
let _ = Getters::mapReturn { _0: String::new() };
262262

263-
let _ = Getters::mapWithNamesCall { k: B256::ZERO };
263+
let _ = Getters::mapWithNamesCall(B256::ZERO);
264264
let _ = Getters::mapWithNamesReturn { v: String::new() };
265265

266266
let _ = Getters::nestedMapWithNamesCall { k1: B256::ZERO, k2: U256::ZERO };
@@ -497,17 +497,17 @@ fn rust_keywords() {
497497
bytes32 box;
498498
}
499499

500-
function mod(address impl) returns (bool is, bool fn);
500+
function mod(address impl, address some) returns (bool is, bool fn);
501501
}
502502
}
503503
use r#dyn::*;
504504

505505
let _ = r#const { r#unsafe: true, r#box: Default::default() };
506-
let m = modCall { r#impl: Address::ZERO };
506+
let m = modCall { r#impl: Address::ZERO, some: Address::ZERO };
507507
let _ = dynCalls::r#mod(m);
508508
let _ = modReturn { is: true, r#fn: false };
509509
assert_eq!(r#const::NAME, "const");
510-
assert_eq!(modCall::SIGNATURE, "mod(address)");
510+
assert_eq!(modCall::SIGNATURE, "mod(address,address)");
511511
}
512512

513513
#[test]
@@ -543,7 +543,7 @@ fn most_rust_keywords() {
543543
assert_eq!($raw::NAME, stringify!($kw));
544544
assert_ne!($raw::NAME, stringify!($raw));
545545
assert_eq!(<[<$kw Call>]>::SIGNATURE, concat!(stringify!($kw), "(bytes1)"));
546-
let _ = [<$kw Call>] { $raw: [0u8; 1].into() };
546+
let _ = [<$kw Call>]([0u8; 1].into());
547547
assert_eq!(error::$raw::SIGNATURE, concat!(stringify!($kw), "(bytes2)"));
548548
let _ = error::$raw([0u8; 2].into());
549549
assert_eq!(event::$raw::SIGNATURE, concat!(stringify!($kw), "(bytes3)"));
@@ -914,16 +914,16 @@ fn contract_derive_default() {
914914
sol! {
915915
#[derive(Debug, Default)]
916916
contract MyContract {
917-
function f1();
918-
function f2();
917+
function f1(address);
918+
function f2(address b);
919919
event e1();
920920
event e2();
921921
error c();
922922
}
923923
}
924924

925-
let MyContract::f1Call {} = MyContract::f1Call::default();
926-
let MyContract::f2Call {} = MyContract::f2Call::default();
925+
let MyContract::f1Call(_) = MyContract::f1Call::default();
926+
let MyContract::f2Call(_) = MyContract::f2Call::default();
927927
let MyContract::e1 {} = MyContract::e1::default();
928928
let MyContract::e2 {} = MyContract::e2::default();
929929
#[allow(clippy::default_constructed_unit_structs)]
@@ -995,11 +995,11 @@ fn regression_overloads() {
995995
}
996996
}
997997

998-
let _ = Vm::getNonce_0Call { account: Address::ZERO };
998+
let _ = Vm::getNonce_0Call(Address::ZERO);
999999
let _ = Vm::getNonce_0Return { nonce: 0 };
10001000
assert_eq!(Vm::getNonce_0Call::SIGNATURE, "getNonce(address)");
10011001

1002-
let _ = Vm::getNonce_1Call { wallet: Vm::Wallet { stuff: U256::ZERO } };
1002+
let _ = Vm::getNonce_1Call(Vm::Wallet { stuff: U256::ZERO });
10031003
let _ = Vm::getNonce_1Return { nonce: 0 };
10041004
assert_eq!(Vm::getNonce_1Call::SIGNATURE, "getNonce((uint256))");
10051005
}
@@ -1015,7 +1015,7 @@ fn normal_paths() {
10151015
function func(I.S memory stuff);
10161016
}
10171017

1018-
let _ = funcCall { stuff: I::S { x: U256::ZERO } };
1018+
let _ = funcCall(I::S { x: U256::ZERO });
10191019
}
10201020

10211021
#[test]

0 commit comments

Comments
 (0)