Get syn building on 1.15.0 again by changing the Fields::iter implementation
diff --git a/src/data.rs b/src/data.rs
index 004a938..b6199a7 100644
--- a/src/data.rs
+++ b/src/data.rs
@@ -65,6 +65,48 @@
}
}
+/// The `Iterator` type returned by [`Fields::iter`].
+///
+/// [`Fields::iter`]: struct.Fields.html#method.iter
+///
+/// *This type is available if Syn is build with the `"derive"` or `"full"`
+/// feature.*
+pub struct FieldsIter<'a>(Option<punctuated::Iter<'a, Field, Token![,]>>);
+
+impl<'a> Iterator for FieldsIter<'a> {
+ type Item = &'a Field;
+ fn next(&mut self) -> Option<&'a Field> {
+ match self.0 {
+ Some(ref mut i) => i.next(),
+ None => None,
+ }
+ }
+}
+
+impl Fields {
+ /// Get an iterator over the [`Field`] items in this object. This iterator
+ /// can be used to iterate over a named or unnamed struct or variant's
+ /// fields uniformly.
+ ///
+ /// [`Field`]: struct.Field.html
+ pub fn iter(&self) -> FieldsIter {
+ match *self {
+ Fields::Unit => FieldsIter(None),
+ Fields::Named(ref f) => FieldsIter(Some(f.named.iter())),
+ Fields::Unnamed(ref f) => FieldsIter(Some(f.unnamed.iter())),
+ }
+ }
+}
+
+impl<'a> IntoIterator for &'a Fields {
+ type Item = &'a Field;
+ type IntoIter = FieldsIter<'a>;
+
+ fn into_iter(self) -> Self::IntoIter {
+ self.iter()
+ }
+}
+
ast_struct! {
/// A field of a struct or enum variant.
///
diff --git a/src/derive.rs b/src/derive.rs
index 1fb0e8f..3ad893d 100644
--- a/src/derive.rs
+++ b/src/derive.rs
@@ -7,7 +7,7 @@
// except according to those terms.
use super::*;
-use punctuated::{Iter, Punctuated};
+use punctuated::Punctuated;
ast_struct! {
/// Data structure sent to a `proc_macro_derive` macro.
@@ -75,26 +75,6 @@
do_not_generate_to_tokens
}
-impl Fields {
- /// Returns an iterator over the fields
- pub fn iter(&self) -> Iter<Field, Token![,]> {
- match *self {
- Fields::Unit => Iter::empty(),
- Fields::Named(FieldsNamed { ref named, .. }) => named.iter(),
- Fields::Unnamed(FieldsUnnamed { ref unnamed, .. }) => unnamed.iter(),
- }
- }
-}
-
-impl<'a> IntoIterator for &'a Fields {
- type Item = &'a Field;
- type IntoIter = Iter<'a, Field, Token![,]>;
-
- fn into_iter(self) -> Self::IntoIter {
- self.iter()
- }
-}
-
#[cfg(feature = "parsing")]
pub mod parsing {
use super::*;
diff --git a/src/lib.rs b/src/lib.rs
index 77b0d23..380552c 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -287,8 +287,8 @@
#[cfg(any(feature = "full", feature = "derive"))]
mod data;
#[cfg(any(feature = "full", feature = "derive"))]
-pub use data::{Field, Fields, FieldsNamed, FieldsUnnamed, Variant, VisCrate, VisPublic,
- VisRestricted, Visibility};
+pub use data::{Field, Fields, FieldsNamed, FieldsUnnamed, FieldsIter, Variant,
+ VisCrate, VisPublic, VisRestricted, Visibility};
#[cfg(any(feature = "full", feature = "derive"))]
mod expr;
diff --git a/src/punctuated.rs b/src/punctuated.rs
index dd5af25..afc163c 100644
--- a/src/punctuated.rs
+++ b/src/punctuated.rs
@@ -398,14 +398,6 @@
inner: slice::Iter<'a, (T, Option<P>)>,
}
-impl<'a, T: 'a, P: 'a> Iter<'a, T, P> {
- pub(crate) fn empty() -> Self {
- Self {
- inner: [].iter(),
- }
- }
-}
-
impl<'a, T, P> Iterator for Iter<'a, T, P> {
type Item = &'a T;