difftreelog
feat allow generics in new coder macros
in: master
3 files changed
crates/evm-coder-macros/src/lib.rsdiffbeforeafterboth--- 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<T>
crates/evm-coder-macros/src/solidity_interface.rsdiffbeforeafterboth--- 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<Self> {
- 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<Self> {
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<syn::Type>,
- ident: Ident,
info: InterfaceInfo,
methods: Vec<Method>,
}
@@ -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;
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 }