git.delta.rocks / unique-network / refs/commits / bcfbebcaedee

difftreelog

misc: Check enum is repr(u8)

Trubnikov Sergey2022-11-22parent: #5aaab7b.patch.diff
in: master

2 files changed

modifiedcrates/evm-coder/procedural/src/abi_derive.rsdiffbeforeafterboth
22
3pub(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)?;
65
7 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_collect
58 })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)?;
62
63 // 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}
69
70fn check_repr_u8(name: &syn::Ident, attrs: &Vec<syn::Attribute>) -> syn::Result<()> {
71 let repr_u8 = attrs
72 .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.nested
83 .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 == 1
89 }
90 _ => false,
91 },
92 _ => false,
93 })
94 .count() == 1
95 }
96 _ => false,
97 };
98
99 if is_repr_u8 {
100 return Some(Ok(()));
101 };
102 }
103 }
104 None::<syn::Result<()>>
105 })
106 .collect::<syn::Result<Vec<_>>>()?;
107
108 if repr_u8.len() != 1 {
109 return Err(syn::Error::new(name.span(), "Enum is not \"repr(u8)\""));
110 };
111
112 Ok(())
113}
64114
65fn 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,
modifiedcrates/evm-coder/tests/abi_derive_generation.rsdiffbeforeafterboth
--- a/crates/evm-coder/tests/abi_derive_generation.rs
+++ b/crates/evm-coder/tests/abi_derive_generation.rs
@@ -735,3 +735,18 @@
 		);
 	}
 }
+
+mod test_enum {
+	use evm_coder::AbiCoder;
+
+	#[derive(AbiCoder)]
+	#[repr(u8)]
+	enum Color {
+		Red,
+		Green,
+		Blue = 255,
+	}
+
+	#[test]
+	fn empty() {}
+}