git.delta.rocks / unique-network / refs/commits / 11dcf7d2998d

difftreelog

misk: Add more checks for enum

Trubnikov Sergey2022-11-23parent: #bcfbebc.patch.diff
in: master

8 files changed

modifiedcrates/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")),
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
@@ -5,7 +5,7 @@
 	#[test]
 	fn empty_struct() {
 		let t = trybuild::TestCases::new();
-		t.compile_fail("tests/build_failed/abi_derive_generation.rs");
+		t.compile_fail("tests/build_failed/abi_derive_struct_generation.rs");
 	}
 
 	#[derive(AbiCoder, PartialEq, Debug)]
@@ -744,9 +744,15 @@
 	enum Color {
 		Red,
 		Green,
-		Blue = 255,
+		Blue,
 	}
 
 	#[test]
 	fn empty() {}
+
+	#[test]
+	fn bad_enums() {
+		let t = trybuild::TestCases::new();
+		t.compile_fail("tests/build_failed/abi_derive_enum_generation.rs");
+	}
 }
addedcrates/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);
+}
addedcrates/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,
+   |     ^
deletedcrates/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);
-}
deletedcrates/evm-coder/tests/build_failed/abi_derive_generation.stderrdiffbeforeafterboth

no changes

addedcrates/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);
+}
addedcrates/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();
+  |        ^^^^^^^^^^^^^^^^