From 4c9523749b30f4eec243f330d7f138c988d589fb Mon Sep 17 00:00:00 2001 From: Trubnikov Sergey Date: Thu, 10 Nov 2022 10:24:59 +0000 Subject: [PATCH] feat: add derive macro AbiCoder for unnamed struct to implement AbiType --- --- a/crates/evm-coder/procedural/src/abi_derive.rs +++ b/crates/evm-coder/procedural/src/abi_derive.rs @@ -5,7 +5,7 @@ let name = &ast.ident; let can_be_plcaed_in_vec = impl_can_be_placed_in_vec(name); let abi_type = impl_abi_type(ast); - println!("{}", abi_type); + // println!("{}", abi_type); quote! { #can_be_plcaed_in_vec #abi_type @@ -18,15 +18,22 @@ } } +fn map_field_to_type<'a>(field: &'a syn::Field) -> &'a syn::Type { + &field.ty +} + fn impl_abi_type(ast: &syn::DeriveInput) -> proc_macro2::TokenStream { let name = &ast.ident; let (fields, params_count) = match &ast.data { syn::Data::Struct(ds) => match ds.fields { syn::Fields::Named(ref fields) => ( - fields.named.iter().map(|field| &field.ty), + fields.named.iter().map(map_field_to_type), fields.named.len(), ), - syn::Fields::Unnamed(_) => todo!(), + syn::Fields::Unnamed(ref fields) => ( + fields.unnamed.iter().map(map_field_to_type), + fields.unnamed.len(), + ), syn::Fields::Unit => unimplemented!("Unit structs not supported"), }, syn::Data::Enum(_) => unimplemented!("Enums not supported"), --- a/crates/evm-coder/procedural/src/lib.rs +++ b/crates/evm-coder/procedural/src/lib.rs @@ -248,6 +248,6 @@ pub fn abi_derive(input: proc_macro::TokenStream) -> proc_macro::TokenStream { let ast = syn::parse(input).unwrap(); let ts = abi_derive::impl_abi_macro(&ast); - println!("{}", &ts); + // println!("{}", &ts); ts.into() } --- a/crates/evm-coder/tests/abi_derive_generation.rs +++ b/crates/evm-coder/tests/abi_derive_generation.rs @@ -65,6 +65,9 @@ } #[test] +fn empty() {} + +#[test] fn impl_abi_type_signature() { assert_eq!( ::SIGNATURE.as_str().unwrap(), @@ -201,3 +204,209 @@ ABI_ALIGNMENT * 5 ); } + +#[derive(AbiCoder)] +struct TupleStruct1SimpleParam(u8); + +#[derive(AbiCoder)] +struct TupleStruct1DynamicParam(String); + +#[derive(AbiCoder)] +struct TupleStruct2SimpleParam(u8, u32); + +#[derive(AbiCoder)] +struct TupleStruct2DynamicParam(String, bytes); + +#[derive(AbiCoder)] +struct TupleStruct2MixedParam(u8, bytes); + +#[derive(AbiCoder)] +struct TupleStruct1DerivedSimpleParam(TupleStruct1SimpleParam); + +#[derive(AbiCoder)] +struct TupleStruct2DerivedSimpleParam(TupleStruct1SimpleParam, TupleStruct2SimpleParam); + +#[derive(AbiCoder)] +struct TupleStruct1DerivedDynamicParam(TupleStruct1DynamicParam); + +#[derive(AbiCoder)] +struct TupleStruct2DerivedDynamicParam(TupleStruct1DynamicParam, TupleStruct2DynamicParam); + +#[derive(AbiCoder)] +struct TupleStruct3DerivedMixedParam( + TupleStruct1SimpleParam, + TupleStruct2DynamicParam, + TupleStruct2MixedParam, +); + +#[test] +fn impl_abi_type_signature_same_for_structs() { + assert_eq!( + ::SIGNATURE + .as_str() + .unwrap(), + ::SIGNATURE + .as_str() + .unwrap() + ); + assert_eq!( + ::SIGNATURE + .as_str() + .unwrap(), + ::SIGNATURE + .as_str() + .unwrap() + ); + assert_eq!( + ::SIGNATURE + .as_str() + .unwrap(), + ::SIGNATURE + .as_str() + .unwrap() + ); + assert_eq!( + ::SIGNATURE + .as_str() + .unwrap(), + ::SIGNATURE + .as_str() + .unwrap() + ); + assert_eq!( + ::SIGNATURE + .as_str() + .unwrap(), + ::SIGNATURE + .as_str() + .unwrap(), + ); + assert_eq!( + ::SIGNATURE + .as_str() + .unwrap(), + ::SIGNATURE + .as_str() + .unwrap(), + ); + assert_eq!( + ::SIGNATURE + .as_str() + .unwrap(), + ::SIGNATURE + .as_str() + .unwrap(), + ); + assert_eq!( + ::SIGNATURE + .as_str() + .unwrap(), + ::SIGNATURE + .as_str() + .unwrap(), + ); + assert_eq!( + ::SIGNATURE + .as_str() + .unwrap(), + ::SIGNATURE + .as_str() + .unwrap(), + ); + assert_eq!( + ::SIGNATURE + .as_str() + .unwrap(), + ::SIGNATURE + .as_str() + .unwrap(), + ); +} + +#[test] +fn impl_abi_type_is_dynamic_same_for_structs() { + assert_eq!( + ::is_dynamic(), + ::is_dynamic() + ); + assert_eq!( + ::is_dynamic(), + ::is_dynamic() + ); + assert_eq!( + ::is_dynamic(), + ::is_dynamic() + ); + assert_eq!( + ::is_dynamic(), + ::is_dynamic() + ); + assert_eq!( + ::is_dynamic(), + ::is_dynamic() + ); + assert_eq!( + ::is_dynamic(), + ::is_dynamic() + ); + assert_eq!( + ::is_dynamic(), + ::is_dynamic() + ); + assert_eq!( + ::is_dynamic(), + ::is_dynamic() + ); + assert_eq!( + ::is_dynamic(), + ::is_dynamic() + ); + assert_eq!( + ::is_dynamic(), + ::is_dynamic() + ); +} + +#[test] +fn impl_abi_type_size_same_for_structs() { + assert_eq!( + ::size(), + ::size() + ); + assert_eq!( + ::size(), + ::size() + ); + assert_eq!( + ::size(), + ::size() + ); + assert_eq!( + ::size(), + ::size() + ); + assert_eq!( + ::size(), + ::size() + ); + assert_eq!( + ::size(), + ::size() + ); + assert_eq!( + ::size(), + ::size() + ); + assert_eq!( + ::size(), + ::size() + ); + assert_eq!( + ::size(), + ::size() + ); + assert_eq!( + ::size(), + ::size() + ); +} -- gitstuff