From aa0ba7b1e71747511795d24baec6b41b9a56b3d7 Mon Sep 17 00:00:00 2001 From: Horaci Macias Date: Thu, 28 Sep 2023 17:30:36 +0200 Subject: [PATCH] Fix EnumIter for enums named Option --- strum_macros/src/macros/enum_iter.rs | 10 +++++----- strum_tests/tests/enum_iter.rs | 13 +++++++++++++ 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/strum_macros/src/macros/enum_iter.rs b/strum_macros/src/macros/enum_iter.rs index ce8237f8..0e700aa0 100644 --- a/strum_macros/src/macros/enum_iter.rs +++ b/strum_macros/src/macros/enum_iter.rs @@ -91,7 +91,7 @@ pub fn enum_iter_inner(ast: &DeriveInput) -> syn::Result { } impl #impl_generics #iter_name #ty_generics #where_clause { - fn get(&self, idx: usize) -> Option<#name #ty_generics> { + fn get(&self, idx: usize) -> ::core::option::Option<#name #ty_generics> { match idx { #(#arms),* } @@ -112,16 +112,16 @@ pub fn enum_iter_inner(ast: &DeriveInput) -> syn::Result { impl #impl_generics Iterator for #iter_name #ty_generics #where_clause { type Item = #name #ty_generics; - fn next(&mut self) -> Option<::Item> { + fn next(&mut self) -> ::core::option::Option<::Item> { self.nth(0) } - fn size_hint(&self) -> (usize, Option) { + fn size_hint(&self) -> (usize, ::core::option::Option) { let t = if self.idx + self.back_idx >= #variant_count { 0 } else { #variant_count - self.idx - self.back_idx }; (t, Some(t)) } - fn nth(&mut self, n: usize) -> Option<::Item> { + fn nth(&mut self, n: usize) -> ::core::option::Option<::Item> { let idx = self.idx + n + 1; if idx + self.back_idx > #variant_count { // We went past the end of the iterator. Freeze idx at #variant_count @@ -143,7 +143,7 @@ pub fn enum_iter_inner(ast: &DeriveInput) -> syn::Result { } impl #impl_generics DoubleEndedIterator for #iter_name #ty_generics #where_clause { - fn next_back(&mut self) -> Option<::Item> { + fn next_back(&mut self) -> ::core::option::Option<::Item> { let back_idx = self.back_idx + 1; if self.idx + back_idx > #variant_count { diff --git a/strum_tests/tests/enum_iter.rs b/strum_tests/tests/enum_iter.rs index 313ed5cf..ce6ecb24 100644 --- a/strum_tests/tests/enum_iter.rs +++ b/strum_tests/tests/enum_iter.rs @@ -211,3 +211,16 @@ fn crate_module_path_test() { assert_eq!(expected, results); } + +#[test] +fn enum_iter_option() { + #[derive(Debug, Eq, PartialEq, EnumIter)] + enum Option { + BluePill, + RedPill, + } + let results = Option::iter().collect::>(); + let expected = vec![Option::BluePill, Option::RedPill]; + + assert_eq!(expected, results); +}