diff --git a/components/style_derive/to_css.rs b/components/style_derive/to_css.rs index 19c7c1ac2bc..40e219c374b 100644 --- a/components/style_derive/to_css.rs +++ b/components/style_derive/to_css.rs @@ -140,11 +140,19 @@ fn derive_variant_fields_expr( Some(pair) => pair, None => return quote! { Ok(()) }, }; + if attrs.field_bound { + let ty = &first.ast().ty; + // TODO(emilio): IntoIterator might not be enough for every type of + // iterable thing (like ArcSlice<> or what not). We might want to expose + // an `item = "T"` attribute to handle that in the future. + let predicate = if attrs.iterable { + parse_quote!(<#ty as IntoIterator>::Item: style_traits::ToCss) + } else { + parse_quote!(#ty: style_traits::ToCss) + }; + cg::add_predicate(where_clause, predicate); + } if !attrs.iterable && iter.peek().is_none() { - if attrs.field_bound { - let ty = &first.ast().ty; - cg::add_predicate(where_clause, parse_quote!(#ty: style_traits::ToCss)); - } let mut expr = quote! { style_traits::ToCss::to_css(#first, dest) }; if let Some(condition) = attrs.skip_if { expr = quote! { diff --git a/components/style_traits/owned_slice.rs b/components/style_traits/owned_slice.rs index f6068365360..36ba3162e59 100644 --- a/components/style_traits/owned_slice.rs +++ b/components/style_traits/owned_slice.rs @@ -93,12 +93,6 @@ impl OwnedSlice { ret } - /// Iterate over all the elements in the slice taking ownership of them. - #[inline] - pub fn into_iter(self) -> impl Iterator + ExactSizeIterator { - self.into_vec().into_iter() - } - /// Convert the regular slice into an owned slice. #[inline] pub fn from_slice(s: &[T]) -> Self @@ -109,6 +103,16 @@ impl OwnedSlice { } } +impl IntoIterator for OwnedSlice { + type Item = T; + type IntoIter = as IntoIterator>::IntoIter; + + #[inline] + fn into_iter(self) -> Self::IntoIter { + self.into_vec().into_iter() + } +} + impl Deref for OwnedSlice { type Target = [T];