difftreelog
feat allow generics in new coder macros
in: master
3 files changed
crates/evm-coder-macros/src/lib.rsdiffbeforeafterboth103 }103 }104}104}105105106fn parse_ident_from_segment(segment: &PathSegment) -> syn::Result<&Ident> {106fn parse_ident_from_segment(segment: &PathSegment, allow_generics: bool) -> syn::Result<&Ident> {107 if segment.arguments != PathArguments::None {107 if segment.arguments != PathArguments::None && !allow_generics {108 return Err(syn::Error::new(108 return Err(syn::Error::new(109 segment.arguments.span(),109 segment.arguments.span(),110 "unexpected generic type",110 "unexpected generic type",113 Ok(&segment.ident)113 Ok(&segment.ident)114}114}115115116fn parse_ident_from_path(path: &Path) -> syn::Result<&Ident> {116fn parse_ident_from_path(path: &Path, allow_generics: bool) -> syn::Result<&Ident> {117 let segment = parse_path_segment(path)?;117 let segment = parse_path_segment(path)?;118 parse_ident_from_segment(segment)118 parse_ident_from_segment(segment, allow_generics)119}119}120120121fn parse_ident_from_type(ty: &Type) -> syn::Result<&Ident> {121fn parse_ident_from_type(ty: &Type, allow_generics: bool) -> syn::Result<&Ident> {122 let path = parse_path(ty)?;122 let path = parse_path(ty)?;123 parse_ident_from_path(path)123 parse_ident_from_path(path, allow_generics)124}124}125125126// Gets T out of Result<T>126// Gets T out of Result<T>crates/evm-coder-macros/src/solidity_interface.rsdiffbeforeafterboth4use darling::FromMeta;4use darling::FromMeta;5use inflector::cases;5use inflector::cases;6use std::fmt::Write;6use std::fmt::Write;7use syn::{7use syn::{FnArg, Generics, Ident, ImplItem, ImplItemMethod, ItemImpl, Meta, NestedMeta, PatType, Path, ReturnType, Type, spanned::Spanned};8 FnArg, Ident, ImplItem, ImplItemMethod, ItemImpl, Meta, NestedMeta, PatType, Path, ReturnType,9 Type, spanned::Spanned,10};11812use crate::{9use crate::{22}19}23impl Is {20impl Is {24 fn try_from(path: &Path) -> syn::Result<Self> {21 fn try_from(path: &Path) -> syn::Result<Self> {25 let name = parse_ident_from_path(path)?.clone();22 let name = parse_ident_from_path(path, false)?.clone();26 Ok(Self {23 Ok(Self {27 pascal_call_name: pascal_ident_to_call(&name),24 pascal_call_name: pascal_ident_to_call(&name),28 snake_call_name: pascal_ident_to_snake_call(&name),25 snake_call_name: pascal_ident_to_snake_call(&name),115 fn try_from(value: &PatType) -> syn::Result<Self> {112 fn try_from(value: &PatType) -> syn::Result<Self> {116 Ok(Self {113 Ok(Self {117 name: parse_ident_from_pat(&value.pat)?.clone(),114 name: parse_ident_from_pat(&value.pat)?.clone(),118 ty: parse_ident_from_type(&value.ty)?.clone(),115 ty: parse_ident_from_type(&value.ty, false)?.clone(),119 })116 })120 }117 }121 fn is_value(&self) -> bool {118 fn is_value(&self) -> bool {193 rename_selector: None,190 rename_selector: None,194 };191 };195 for attr in &value.attrs {192 for attr in &value.attrs {196 let ident = parse_ident_from_path(&attr.path)?;193 let ident = parse_ident_from_path(&attr.path, false)?;197 if ident == "solidity" {194 if ident == "solidity" {198 let args = attr.parse_meta().unwrap();195 let args = attr.parse_meta().unwrap();199 info = MethodInfo::from_meta(&args).unwrap();196 info = MethodInfo::from_meta(&args).unwrap();382}379}383380384pub struct SolidityInterface {381pub struct SolidityInterface {382 generics: Generics,385 name: Box<syn::Type>,383 name: Box<syn::Type>,386 ident: Ident,387 info: InterfaceInfo,384 info: InterfaceInfo,388 methods: Vec<Method>,385 methods: Vec<Method>,389}386}397 }394 }398 }395 }399 Ok(Self {396 Ok(Self {400 name: value.self_ty.clone(),397 generics: value.generics.clone(),401 ident: parse_ident_from_type(&value.self_ty)?.clone(),398 name: value.self_ty.clone(),402 info,399 info,403 methods,400 methods,404 })401 })407 let name = self.name;404 let name = self.name;408405409 let call_name = pascal_ident_to_call(&self.info.name);406 let call_name = pascal_ident_to_call(&self.info.name);407 let generics = self.generics;410408411 let call_sub = self409 let call_sub = self412 .info410 .info485 return Ok(None);483 return Ok(None);486 }484 }487 }485 }488 impl ::evm_coder::Callable<#call_name> for #name {486 impl #generics ::evm_coder::Callable<#call_name> for #name {489 #[allow(unreachable_code)] // In case of no inner calls487 #[allow(unreachable_code)] // In case of no inner calls490 fn call(&mut self, c: Msg<#call_name>) -> Result<::evm_coder::abi::AbiWriter> {488 fn call(&mut self, c: Msg<#call_name>) -> Result<::evm_coder::abi::AbiWriter> {491 use ::evm_coder::abi::AbiWrite;489 use ::evm_coder::abi::AbiWrite;crates/evm-coder-macros/src/to_log.rsdiffbeforeafterboth13impl EventField {13impl EventField {14 fn try_from(field: &Field) -> syn::Result<Self> {14 fn try_from(field: &Field) -> syn::Result<Self> {15 let name = field.ident.as_ref().unwrap();15 let name = field.ident.as_ref().unwrap();16 let ty = parse_ident_from_type(&field.ty)?;16 let ty = parse_ident_from_type(&field.ty, false)?;17 let mut indexed = false;17 let mut indexed = false;18 for attr in &field.attrs {18 for attr in &field.attrs {19 if let Ok(ident) = parse_ident_from_path(&attr.path) {19 if let Ok(ident) = parse_ident_from_path(&attr.path, false) {20 if ident == "indexed" {20 if ident == "indexed" {21 indexed = true;21 indexed = true;22 }22 }