difftreelog
fix add vec support in solidity_interface
in: master
1 file changed
crates/evm-coder/procedural/src/solidity_interface.rsdiffbeforeafterboth20// about Procedural Macros in Rust book:20// about Procedural Macros in Rust book:21// https://doc.rust-lang.org/reference/procedural-macros.html21// https://doc.rust-lang.org/reference/procedural-macros.html222223use proc_macro2::TokenStream;23use proc_macro2::{TokenStream, token_stream};24use quote::{quote, ToTokens, format_ident};24use quote::{quote, ToTokens, format_ident};25use inflector::cases;25use inflector::cases;26use std::fmt::Write;26use std::fmt::Write;847 read_signature: bool,847 read_signature: bool,848 ) {848 ) {849 match ty {849 match ty {850 AbiType::Plain(ref ident) => token_stream.extend(if read_signature {850 AbiType::Plain(ref ident) => {851 let plain_token = if read_signature {851 quote! {852 quote! {852 (<#ident>::SIGNATURE),853 (<#ident>::SIGNATURE)853 }854 }854 } else {855 } else {855 quote! {856 quote! {856 #ident,857 #ident857 }858 }858 }),859 };860861 token_stream.extend(plain_token);862 }859863860 AbiType::Tuple(ref tuple_type) => {864 AbiType::Tuple(ref tuple_type) => {861 let mut tuple_types = proc_macro2::TokenStream::new();865 let mut tuple_types = proc_macro2::TokenStream::new();866 let mut is_first = true;867862 for ty in tuple_type {868 for ty in tuple_type {869 if is_first {870 is_first = false871 } else {872 tuple_types.extend(quote!(,));873 }863 Self::expand_type(ty, &mut tuple_types, false);874 Self::expand_type(ty, &mut tuple_types, false);864 }875 }865 tuple_types = quote! { (<(#tuple_types)>::SIGNATURE), };876 tuple_types = if read_signature {866 // println!("{}", tuple_types);877 quote! { (<(#tuple_types)>::SIGNATURE) }878 } else {879 quote! { (#tuple_types) }880 };867 token_stream.extend(tuple_types);881 token_stream.extend(tuple_types);868 }882 }869883870 AbiType::Vec(ref _vec_type) => {}884 AbiType::Vec(ref vec_type) => {885 let mut vec_token = proc_macro2::TokenStream::new();886 Self::expand_type(vec_type.as_ref(), &mut vec_token, false);887 vec_token = if read_signature {888 quote! { (<Vec<#vec_token>>::SIGNATURE) }889 } else {890 quote! { <Vec<#vec_token>> }891 };892 token_stream.extend(vec_token);893 }871894872 AbiType::Array(_, _) => todo!("Array eth signature"),895 AbiType::Array(_, _) => todo!("Array eth signature"),876 fn expand_custom_signature(&self) -> proc_macro2::TokenStream {899 fn expand_custom_signature(&self) -> proc_macro2::TokenStream {877 let mut token_stream = TokenStream::new();900 let mut token_stream = TokenStream::new();878901902 let mut is_first = true;879 for arg in &self.args {903 for arg in &self.args {880 if arg.is_special() {904 if arg.is_special() {881 continue;905 continue;882 }906 }883907908 if is_first {909 is_first = false;910 } else {911 token_stream.extend(quote!(,));912 }884 Self::expand_type(&arg.ty, &mut token_stream, true);913 Self::expand_type(&arg.ty, &mut token_stream, true);885 }914 }886 // println!("!!!!! {}", token_stream);915916 if !is_first {917 token_stream.extend(quote!(,));918 }887919888 let func_name = self.camel_name.clone();920 let func_name = self.camel_name.clone();889 let func_name = quote!(SignaturePreferences {921 let func_name = quote!(SignaturePreferences {893 close_delimiter: Some(SignatureUnit::new(")")),925 close_delimiter: Some(SignatureUnit::new(")")),894 close_name: None,926 close_name: None,895 });927 });896 token_stream = quote!({ ::evm_coder::make_signature!(new fn(#func_name),#token_stream) });928 quote!({ ::evm_coder::make_signature!(new fn(#func_name), #token_stream) })897 token_stream898 }929 }899930900 fn expand_solidity_function(&self) -> proc_macro2::TokenStream {931 fn expand_solidity_function(&self) -> proc_macro2::TokenStream {