git.delta.rocks / unique-network / refs/commits / 9b94d7cf0b98

difftreelog

feat allow generics in new coder macros

Yaroslav Bolyukin2021-07-20parent: #5262156.patch.diff
in: master

3 files changed

modifiedcrates/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>
modifiedcrates/evm-coder-macros/src/solidity_interface.rsdiffbeforeafterboth
4use 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};
118
12use 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}
383380
384pub 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;
408405
409 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;
410408
411 let call_sub = self409 let call_sub = self
412 .info410 .info
485 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 calls
490 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;
modifiedcrates/evm-coder-macros/src/to_log.rsdiffbeforeafterboth
--- 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<Self> {
 		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;
 				}