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
103 }103 }
104}104}
105105
106fn 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}
115115
116fn 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}
120120
121fn 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}
125125
126// Gets T out of Result<T>126// 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
13impl 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 }