Skip to content

Commit f9fb03d

Browse files
committed
Do not include optional crates that are not selected features
1 parent 07d0c10 commit f9fb03d

File tree

1 file changed

+22
-9
lines changed

1 file changed

+22
-9
lines changed

top-crates/src/lib.rs

Lines changed: 22 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -360,9 +360,10 @@ fn extend_direct_dependencies(
360360
) {
361361
// Add a direct dependency on each starting crate.
362362
let mut summaries = Vec::new();
363-
let mut valid_for_our_platform = BTreeSet::new();
363+
let mut packages_to_build = BTreeSet::new();
364+
364365
for dep in mem::take(crates).into_values() {
365-
valid_for_our_platform.insert(dep.summary.package_id());
366+
packages_to_build.insert(dep.summary.package_id());
366367
summaries.push((
367368
dep.summary,
368369
ResolveOpts {
@@ -391,20 +392,32 @@ fn extend_direct_dependencies(
391392
.expect("Unable to resolve dependencies");
392393

393394
// Find transitive deps compatible with the playground's platform.
394-
let mut to_visit = valid_for_our_platform.clone();
395+
let mut to_visit = packages_to_build.clone();
395396
while !to_visit.is_empty() {
396397
let mut visit_next = BTreeSet::new();
397398

398399
for package_id in to_visit {
400+
let selected_features = resolve.features(package_id);
401+
399402
for (dep_pkg, deps) in resolve.deps(package_id) {
400-
let for_this_platform = deps.iter().any(|dep| {
401-
dep.platform().map_or(true, |platform| {
403+
let will_be_built = deps.iter().any(|dep| {
404+
let selected_or_opted_in = match dep.is_optional() {
405+
false => true,
406+
true => {
407+
let name = dep.name_in_toml();
408+
selected_features.contains(&name)
409+
}
410+
};
411+
412+
let for_this_platform = dep.platform().is_none_or(|platform| {
402413
platform.matches(PLAYGROUND_TARGET_PLATFORM, global.target_info.cfg())
403-
})
414+
});
415+
416+
selected_or_opted_in && for_this_platform
404417
});
405418

406-
if for_this_platform {
407-
valid_for_our_platform.insert(dep_pkg);
419+
if will_be_built {
420+
packages_to_build.insert(dep_pkg);
408421
visit_next.insert(dep_pkg);
409422
}
410423
}
@@ -416,7 +429,7 @@ fn extend_direct_dependencies(
416429
// Remove invalid and excluded packages that have been added due to resolution
417430
let package_ids = resolve
418431
.iter()
419-
.filter(|pkg| valid_for_our_platform.contains(pkg))
432+
.filter(|pkg| packages_to_build.contains(pkg))
420433
.filter(|pkg| !global.modifications.excluded(pkg.name().as_str()))
421434
.collect_vec();
422435

0 commit comments

Comments
 (0)