Skip to content

Commit 4590e74

Browse files
committed
calculate features the hard way
1 parent f0f8565 commit 4590e74

File tree

3 files changed

+38
-11
lines changed

3 files changed

+38
-11
lines changed

src/cargo/core/resolver/errors.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ impl fmt::Display for ResolveError {
5050

5151
pub type ActivateResult<T> = Result<T, ActivateError>;
5252

53+
#[derive(Debug)]
5354
pub enum ActivateError {
5455
Fatal(failure::Error),
5556
Conflict(PackageId, ConflictReason),

src/cargo/core/resolver/mod.rs

Lines changed: 36 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -160,18 +160,44 @@ pub fn resolve(
160160
// If we have a shell, emit warnings about required deps used as feature.
161161
if print_warnings && config.is_some() {
162162
let mut new_cx = cx.clone();
163-
for (j, _) in cx.activations.values() {
164-
if let Some(features) = cx.resolve_features.get(&j.package_id()) {
165-
let features: Vec<_> = features.iter().cloned().collect();
166-
let method = Method::Required {
167-
dev_deps: false,
168-
features: &features,
169-
all_features: false,
170-
uses_default_features: false,
171-
};
172-
let _ = new_cx.resolve_features(None, j, &method, config);
163+
new_cx.resolve_features = im_rc::HashMap::new();
164+
let mut features_from_dep = HashMap::new();
165+
for (summery, method) in summaries {
166+
for (dep, features) in new_cx
167+
.resolve_features(None, summery, &method, config)
168+
.expect("can not resolve_features for a required summery")
169+
{
170+
features_from_dep.insert((summery.package_id(), dep), features);
171+
}
172+
}
173+
for summery in resolve.sort().iter().rev().map(|id| {
174+
cx.activations
175+
.get(&id.as_activations_key())
176+
.expect("id in dependency graph but not in activations")
177+
.0
178+
.clone()
179+
}) {
180+
for (parent, deps) in cx.parents.edges(&summery.package_id()) {
181+
for dep in deps.iter() {
182+
let features = features_from_dep
183+
.remove(&(*parent, dep.clone()))
184+
.expect("fulfilled a dep that was not needed");
185+
let method = Method::Required {
186+
dev_deps: false,
187+
features: &features,
188+
all_features: false,
189+
uses_default_features: dep.uses_default_features(),
190+
};
191+
for (dep, features) in new_cx
192+
.resolve_features(None, &summery, &method, config)
193+
.expect("can not resolve_features for a used dep")
194+
{
195+
features_from_dep.insert((summery.package_id(), dep), features);
196+
}
197+
}
173198
}
174199
}
200+
assert_eq!(cx.resolve_features, new_cx.resolve_features);
175201
}
176202

177203
Ok(resolve)

tests/testsuite/support/resolver.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ pub fn resolve_with_config_raw(
114114
&mut registry,
115115
&HashSet::new(),
116116
config,
117-
false,
117+
true,
118118
true,
119119
);
120120

0 commit comments

Comments
 (0)