From 9b94d7cf0b98a6afa16c32cbdc63237ce6c9b635 Mon Sep 17 00:00:00 2001 From: Yaroslav Bolyukin Date: Tue, 20 Jul 2021 20:44:19 +0000 Subject: [PATCH] feat: allow generics in new coder macros --- --- a/crates/evm-coder-macros/src/lib.rs +++ b/crates/evm-coder-macros/src/lib.rs @@ -103,8 +103,8 @@ } } -fn parse_ident_from_segment(segment: &PathSegment) -> syn::Result<&Ident> { - if segment.arguments != PathArguments::None { +fn parse_ident_from_segment(segment: &PathSegment, allow_generics: bool) -> syn::Result<&Ident> { + if segment.arguments != PathArguments::None && !allow_generics { return Err(syn::Error::new( segment.arguments.span(), "unexpected generic type", @@ -113,14 +113,14 @@ Ok(&segment.ident) } -fn parse_ident_from_path(path: &Path) -> syn::Result<&Ident> { +fn parse_ident_from_path(path: &Path, allow_generics: bool) -> syn::Result<&Ident> { let segment = parse_path_segment(path)?; - parse_ident_from_segment(segment) + parse_ident_from_segment(segment, allow_generics) } -fn parse_ident_from_type(ty: &Type) -> syn::Result<&Ident> { +fn parse_ident_from_type(ty: &Type, allow_generics: bool) -> syn::Result<&Ident> { let path = parse_path(ty)?; - parse_ident_from_path(path) + parse_ident_from_path(path, allow_generics) } // Gets T out of Result --- a/crates/evm-coder-macros/src/solidity_interface.rs +++ b/crates/evm-coder-macros/src/solidity_interface.rs @@ -4,10 +4,7 @@ use darling::FromMeta; use inflector::cases; use std::fmt::Write; -use syn::{ - FnArg, Ident, ImplItem, ImplItemMethod, ItemImpl, Meta, NestedMeta, PatType, Path, ReturnType, - Type, spanned::Spanned, -}; +use syn::{FnArg, Generics, Ident, ImplItem, ImplItemMethod, ItemImpl, Meta, NestedMeta, PatType, Path, ReturnType, Type, spanned::Spanned}; use crate::{ fn_selector_str, parse_ident_from_pat, parse_ident_from_path, parse_ident_from_type, @@ -22,7 +19,7 @@ } impl Is { fn try_from(path: &Path) -> syn::Result { - let name = parse_ident_from_path(path)?.clone(); + let name = parse_ident_from_path(path, false)?.clone(); Ok(Self { pascal_call_name: pascal_ident_to_call(&name), snake_call_name: pascal_ident_to_snake_call(&name), @@ -115,7 +112,7 @@ fn try_from(value: &PatType) -> syn::Result { Ok(Self { name: parse_ident_from_pat(&value.pat)?.clone(), - ty: parse_ident_from_type(&value.ty)?.clone(), + ty: parse_ident_from_type(&value.ty, false)?.clone(), }) } fn is_value(&self) -> bool { @@ -193,7 +190,7 @@ rename_selector: None, }; for attr in &value.attrs { - let ident = parse_ident_from_path(&attr.path)?; + let ident = parse_ident_from_path(&attr.path, false)?; if ident == "solidity" { let args = attr.parse_meta().unwrap(); info = MethodInfo::from_meta(&args).unwrap(); @@ -382,8 +379,8 @@ } pub struct SolidityInterface { + generics: Generics, name: Box, - ident: Ident, info: InterfaceInfo, methods: Vec, } @@ -397,8 +394,8 @@ } } Ok(Self { + generics: value.generics.clone(), name: value.self_ty.clone(), - ident: parse_ident_from_type(&value.self_ty)?.clone(), info, methods, }) @@ -407,6 +404,7 @@ let name = self.name; let call_name = pascal_ident_to_call(&self.info.name); + let generics = self.generics; let call_sub = self .info @@ -485,7 +483,7 @@ return Ok(None); } } - impl ::evm_coder::Callable<#call_name> for #name { + impl #generics ::evm_coder::Callable<#call_name> for #name { #[allow(unreachable_code)] // In case of no inner calls fn call(&mut self, c: Msg<#call_name>) -> Result<::evm_coder::abi::AbiWriter> { use ::evm_coder::abi::AbiWrite; --- a/crates/evm-coder-macros/src/to_log.rs +++ b/crates/evm-coder-macros/src/to_log.rs @@ -13,10 +13,10 @@ impl EventField { fn try_from(field: &Field) -> syn::Result { let name = field.ident.as_ref().unwrap(); - let ty = parse_ident_from_type(&field.ty)?; + let ty = parse_ident_from_type(&field.ty, false)?; let mut indexed = false; for attr in &field.attrs { - if let Ok(ident) = parse_ident_from_path(&attr.path) { + if let Ok(ident) = parse_ident_from_path(&attr.path, false) { if ident == "indexed" { indexed = true; } -- gitstuff