difftreelog
misc: Check enum is repr(u8)
in: master
2 files changed
crates/evm-coder/procedural/src/abi_derive.rsdiffbeforeafterboth223pub(crate) fn impl_abi_macro(ast: &syn::DeriveInput) -> syn::Result<proc_macro2::TokenStream> {3pub(crate) fn impl_abi_macro(ast: &syn::DeriveInput) -> syn::Result<proc_macro2::TokenStream> {4 let name = &ast.ident;4 let name = &ast.ident;5 let docs = extract_docs(&ast.attrs)?;657 match &ast.data {6 match &ast.data {8 syn::Data::Struct(ds) => {7 syn::Data::Struct(ds) => {8 let docs = extract_docs(&ast.attrs)?;9 let (is_named_fields, field_names, field_types, field_docs, params_count) =9 let (is_named_fields, field_names, field_types, field_docs, params_count) =10 match ds.fields {10 match ds.fields {11 syn::Fields::Named(ref fields) => Ok((11 syn::Fields::Named(ref fields) => Ok((57 #solidity_struct_collect57 #solidity_struct_collect58 })58 })59 }59 }60 syn::Data::Enum(_) => Err(syn::Error::new(name.span(), "Enums not supported")),60 syn::Data::Enum(de) => {61 let _ = check_repr_u8(name, &ast.attrs)?;6263 // dbg!(de);64 Ok(quote!())65 }61 syn::Data::Union(_) => Err(syn::Error::new(name.span(), "Unions not supported")),66 syn::Data::Union(_) => Err(syn::Error::new(name.span(), "Unions not supported")),62 }67 }63}68}6970fn check_repr_u8(name: &syn::Ident, attrs: &Vec<syn::Attribute>) -> syn::Result<()> {71 let repr_u8 = attrs72 .iter()73 .filter_map(|attr| {74 if let Some(ps) = attr.path.segments.first() {75 if ps.ident == "repr" {76 let meta = match attr.parse_meta() {77 Ok(meta) => meta,78 Err(e) => return Some(Err(e)),79 };80 let is_repr_u8 = match meta {81 syn::Meta::List(p) => {82 p.nested83 .iter()84 .filter(|nm| match nm {85 syn::NestedMeta::Meta(m) => match m {86 syn::Meta::Path(p) => {87 p.segments.iter().filter(|ps| ps.ident == "u8").count()88 == 189 }90 _ => false,91 },92 _ => false,93 })94 .count() == 195 }96 _ => false,97 };9899 if is_repr_u8 {100 return Some(Ok(()));101 };102 }103 }104 None::<syn::Result<()>>105 })106 .collect::<syn::Result<Vec<_>>>()?;107108 if repr_u8.len() != 1 {109 return Err(syn::Error::new(name.span(), "Enum is not \"repr(u8)\""));110 };111112 Ok(())113}6411465fn tuple_type<'a>(115fn tuple_type<'a>(66 field_types: impl Iterator<Item = &'a syn::Type> + Clone,116 field_types: impl Iterator<Item = &'a syn::Type> + Clone,crates/evm-coder/tests/abi_derive_generation.rsdiffbeforeafterboth736 }736 }737}737}738739mod test_enum {740 use evm_coder::AbiCoder;741742 #[derive(AbiCoder)]743 #[repr(u8)]744 enum Color {745 Red,746 Green,747 Blue = 255,748 }749750 #[test]751 fn empty() {}752}738753