git.delta.rocks / unique-network / refs/commits / 1602901e39d7

difftreelog

fix add vec support in solidity_interface

Trubnikov Sergey2022-10-25parent: #65f1bac.patch.diff
in: master

1 file changed

modifiedcrates/evm-coder/procedural/src/solidity_interface.rsdiffbeforeafterboth
20// 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.html
2222
23use 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 #ident
857 }858 }
858 }),859 };
860
861 token_stream.extend(plain_token);
862 }
859863
860 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;
867
862 for ty in tuple_type {868 for ty in tuple_type {
869 if is_first {
870 is_first = false
871 } 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 }
869883
870 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 }
871894
872 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();
878901
902 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 }
883907
908 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);915
916 if !is_first {
917 token_stream.extend(quote!(,));
918 }
887919
888 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_stream
898 }929 }
899930
900 fn expand_solidity_function(&self) -> proc_macro2::TokenStream {931 fn expand_solidity_function(&self) -> proc_macro2::TokenStream {