difftreelog
misk: Add more checks for enum
in: master
8 files changed
crates/evm-coder/procedural/src/abi_derive.rsdiffbeforeafterboth--- a/crates/evm-coder/procedural/src/abi_derive.rs
+++ b/crates/evm-coder/procedural/src/abi_derive.rs
@@ -58,9 +58,26 @@
})
}
syn::Data::Enum(de) => {
- let _ = check_repr_u8(name, &ast.attrs)?;
+ check_repr_u8(name, &ast.attrs)?;
- // dbg!(de);
+ dbg!(&de);
+ for f in de.variants.iter().filter_map(|v| {
+ if !v.fields.is_empty() {
+ Some(Err(syn::Error::new(
+ v.ident.span(),
+ "Enumeration parameters should not have fields",
+ )))
+ } else if v.discriminant.is_some() {
+ Some(Err(syn::Error::new(
+ v.ident.span(),
+ "Enumeration options should not have an explicit specified value",
+ )))
+ } else {
+ None
+ }
+ }) {
+ f?;
+ }
Ok(quote!())
}
syn::Data::Union(_) => Err(syn::Error::new(name.span(), "Unions not supported")),
crates/evm-coder/tests/abi_derive_generation.rsdiffbeforeafterboth5 #[test]5 #[test]6 fn empty_struct() {6 fn empty_struct() {7 let t = trybuild::TestCases::new();7 let t = trybuild::TestCases::new();8 t.compile_fail("tests/build_failed/abi_derive_generation.rs");8 t.compile_fail("tests/build_failed/abi_derive_struct_generation.rs");9 }9 }101011 #[derive(AbiCoder, PartialEq, Debug)]11 #[derive(AbiCoder, PartialEq, Debug)]744 enum Color {744 enum Color {745 Red,745 Red,746 Green,746 Green,747 Blue = 255,747 Blue,748 }748 }749749750 #[test]750 #[test]751 fn empty() {}751 fn empty() {}752753 #[test]754 fn bad_enums() {755 let t = trybuild::TestCases::new();756 t.compile_fail("tests/build_failed/abi_derive_enum_generation.rs");757 }752}758}753759crates/evm-coder/tests/build_failed/abi_derive_enum_generation.rsdiffbeforeafterboth--- /dev/null
+++ b/crates/evm-coder/tests/build_failed/abi_derive_enum_generation.rs
@@ -0,0 +1,36 @@
+use evm_coder_procedural::AbiCoder;
+
+#[derive(AbiCoder)]
+enum NonRepr {
+ A,
+ B,
+ C,
+}
+
+#[derive(AbiCoder)]
+#[repr(u32)]
+enum NonReprU8 {
+ A,
+ B,
+ C,
+}
+
+#[derive(AbiCoder)]
+#[repr(u8)]
+enum RustEnum {
+ A(u128),
+ B,
+ C,
+}
+
+#[derive(AbiCoder)]
+#[repr(u8)]
+enum WithExplicit {
+ A = 128,
+ B,
+ C,
+}
+
+fn main() {
+ assert!(false);
+}
crates/evm-coder/tests/build_failed/abi_derive_enum_generation.stderrdiffbeforeafterboth--- /dev/null
+++ b/crates/evm-coder/tests/build_failed/abi_derive_enum_generation.stderr
@@ -0,0 +1,23 @@
+error: Enum is not "repr(u8)"
+ --> tests/build_failed/abi_derive_enum_generation.rs:4:6
+ |
+4 | enum NonRepr {
+ | ^^^^^^^
+
+error: Enum is not "repr(u8)"
+ --> tests/build_failed/abi_derive_enum_generation.rs:12:6
+ |
+12 | enum NonReprU8 {
+ | ^^^^^^^^^
+
+error: Enumeration parameters should not have fields
+ --> tests/build_failed/abi_derive_enum_generation.rs:21:2
+ |
+21 | A(u128),
+ | ^
+
+error: Enumeration options should not have an explicit specified value
+ --> tests/build_failed/abi_derive_enum_generation.rs:29:2
+ |
+29 | A = 128,
+ | ^
crates/evm-coder/tests/build_failed/abi_derive_generation.rsdiffbeforeafterboth--- a/crates/evm-coder/tests/build_failed/abi_derive_generation.rs
+++ /dev/null
@@ -1,11 +0,0 @@
-use evm_coder_procedural::AbiCoder;
-
-#[derive(AbiCoder, PartialEq, Debug)]
-struct EmptyStruct {}
-
-#[derive(AbiCoder, PartialEq, Debug)]
-struct EmptyTupleStruct();
-
-fn main() {
- assert!(false);
-}
crates/evm-coder/tests/build_failed/abi_derive_generation.stderrdiffbeforeafterboth--- a/crates/evm-coder/tests/build_failed/abi_derive_generation.stderr
+++ /dev/null
@@ -1,11 +0,0 @@
-error: Empty structs not supported
- --> tests/build_failed/abi_derive_generation.rs:4:8
- |
-4 | struct EmptyStruct {}
- | ^^^^^^^^^^^
-
-error: Empty structs not supported
- --> tests/build_failed/abi_derive_generation.rs:7:8
- |
-7 | struct EmptyTupleStruct();
- | ^^^^^^^^^^^^^^^^
crates/evm-coder/tests/build_failed/abi_derive_struct_generation.rsdiffbeforeafterboth--- /dev/null
+++ b/crates/evm-coder/tests/build_failed/abi_derive_struct_generation.rs
@@ -0,0 +1,11 @@
+use evm_coder_procedural::AbiCoder;
+
+#[derive(AbiCoder, PartialEq, Debug)]
+struct EmptyStruct {}
+
+#[derive(AbiCoder, PartialEq, Debug)]
+struct EmptyTupleStruct();
+
+fn main() {
+ assert!(false);
+}
crates/evm-coder/tests/build_failed/abi_derive_struct_generation.stderrdiffbeforeafterboth--- /dev/null
+++ b/crates/evm-coder/tests/build_failed/abi_derive_struct_generation.stderr
@@ -0,0 +1,11 @@
+error: Empty structs not supported
+ --> tests/build_failed/abi_derive_struct_generation.rs:4:8
+ |
+4 | struct EmptyStruct {}
+ | ^^^^^^^^^^^
+
+error: Empty structs not supported
+ --> tests/build_failed/abi_derive_struct_generation.rs:7:8
+ |
+7 | struct EmptyTupleStruct();
+ | ^^^^^^^^^^^^^^^^