@@ -360,9 +360,10 @@ fn extend_direct_dependencies(
360
360
) {
361
361
// Add a direct dependency on each starting crate.
362
362
let mut summaries = Vec :: new ( ) ;
363
- let mut valid_for_our_platform = BTreeSet :: new ( ) ;
363
+ let mut packages_to_build = BTreeSet :: new ( ) ;
364
+
364
365
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 ( ) ) ;
366
367
summaries. push ( (
367
368
dep. summary ,
368
369
ResolveOpts {
@@ -391,20 +392,32 @@ fn extend_direct_dependencies(
391
392
. expect ( "Unable to resolve dependencies" ) ;
392
393
393
394
// 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 ( ) ;
395
396
while !to_visit. is_empty ( ) {
396
397
let mut visit_next = BTreeSet :: new ( ) ;
397
398
398
399
for package_id in to_visit {
400
+ let selected_features = resolve. features ( package_id) ;
401
+
399
402
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| {
402
413
platform. matches ( PLAYGROUND_TARGET_PLATFORM , global. target_info . cfg ( ) )
403
- } )
414
+ } ) ;
415
+
416
+ selected_or_opted_in && for_this_platform
404
417
} ) ;
405
418
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) ;
408
421
visit_next. insert ( dep_pkg) ;
409
422
}
410
423
}
@@ -416,7 +429,7 @@ fn extend_direct_dependencies(
416
429
// Remove invalid and excluded packages that have been added due to resolution
417
430
let package_ids = resolve
418
431
. iter ( )
419
- . filter ( |pkg| valid_for_our_platform . contains ( pkg) )
432
+ . filter ( |pkg| packages_to_build . contains ( pkg) )
420
433
. filter ( |pkg| !global. modifications . excluded ( pkg. name ( ) . as_str ( ) ) )
421
434
. collect_vec ( ) ;
422
435
0 commit comments