diff --git a/crates/crates_io_index/features.rs b/crates/crates_io_index/features.rs index 993e45a5874..6875b206f91 100644 --- a/crates/crates_io_index/features.rs +++ b/crates/crates_io_index/features.rs @@ -13,40 +13,37 @@ pub fn split_features( // First, we partition the features into two groups: those that use the new // features syntax (`features2`) and those that don't (`features`). - let (mut features, mut features2) = - features - .into_iter() - .partition::(|(_k, vals)| { - !vals - .iter() - .any(|v| v.starts_with("dep:") || v.contains("?/")) - }); + let (mut features, mut features2): (FeaturesMap, FeaturesMap) = features + .into_iter() + .partition(|(_k, vals)| !vals.iter().map(String::as_ref).any(has_features2_syntax)); // Then, we recursively move features from `features` to `features2` if they // depend on features in `features2`. for i in (0..ITERATION_LIMIT).rev() { let split = features .into_iter() - .partition::(|(_k, vals)| { - !vals.iter().any(|v| features2.contains_key(v)) - }); + .partition(|(_k, vals)| !vals.iter().any(|v| features2.contains_key(v))); features = split.0; - if !split.1.is_empty() { - features2.extend(split.1); - - if i == 0 { - warn!("Iteration limit reached while splitting features!"); - } - } else { + if split.1.is_empty() { break; } + + features2.extend(split.1); + + if i == 0 { + warn!("Iteration limit reached while splitting features!"); + } } (features, features2) } +fn has_features2_syntax(s: &str) -> bool { + s.starts_with("dep:") || s.contains("?/") +} + #[cfg(test)] mod tests { use super::*;