@@ -296,6 +296,9 @@ fn resolve_toml(
296
296
badges : None ,
297
297
lints : None ,
298
298
_unused_keys : Default :: default ( ) ,
299
+ _unused_dependencies : Default :: default ( ) ,
300
+ _unused_dev_dependencies : Default :: default ( ) ,
301
+ _unused_build_dependencies : Default :: default ( ) ,
299
302
} ;
300
303
301
304
let package_root = manifest_file. parent ( ) . unwrap ( ) ;
@@ -375,7 +378,10 @@ fn resolve_toml(
375
378
} )
376
379
. unwrap_or_default ( ) ;
377
380
378
- resolved_toml. dependencies = resolve_dependencies (
381
+ (
382
+ resolved_toml. dependencies ,
383
+ resolved_toml. _unused_dependencies ,
384
+ ) = resolve_dependencies (
379
385
gctx,
380
386
edition,
381
387
& features,
@@ -395,7 +401,10 @@ fn resolve_toml(
395
401
edition,
396
402
warnings,
397
403
) ?;
398
- resolved_toml. dev_dependencies = resolve_dependencies (
404
+ (
405
+ resolved_toml. dev_dependencies ,
406
+ resolved_toml. _unused_dev_dependencies ,
407
+ ) = resolve_dependencies (
399
408
gctx,
400
409
edition,
401
410
& features,
@@ -415,7 +424,10 @@ fn resolve_toml(
415
424
edition,
416
425
warnings,
417
426
) ?;
418
- resolved_toml. build_dependencies = resolve_dependencies (
427
+ (
428
+ resolved_toml. build_dependencies ,
429
+ resolved_toml. _unused_build_dependencies ,
430
+ ) = resolve_dependencies (
419
431
gctx,
420
432
edition,
421
433
& features,
@@ -428,7 +440,7 @@ fn resolve_toml(
428
440
) ?;
429
441
let mut resolved_target = BTreeMap :: new ( ) ;
430
442
for ( name, platform) in original_toml. target . iter ( ) . flatten ( ) {
431
- let resolved_dependencies = resolve_dependencies (
443
+ let ( resolved_dependencies, _unused_dependencies ) = resolve_dependencies (
432
444
gctx,
433
445
edition,
434
446
& features,
@@ -448,7 +460,7 @@ fn resolve_toml(
448
460
edition,
449
461
warnings,
450
462
) ?;
451
- let resolved_dev_dependencies = resolve_dependencies (
463
+ let ( resolved_dev_dependencies, _unused_dev_dependencies ) = resolve_dependencies (
452
464
gctx,
453
465
edition,
454
466
& features,
@@ -468,7 +480,7 @@ fn resolve_toml(
468
480
edition,
469
481
warnings,
470
482
) ?;
471
- let resolved_build_dependencies = resolve_dependencies (
483
+ let ( resolved_build_dependencies, _unused_build_dependencies ) = resolve_dependencies (
472
484
gctx,
473
485
edition,
474
486
& features,
@@ -487,6 +499,9 @@ fn resolve_toml(
487
499
build_dependencies2 : None ,
488
500
dev_dependencies : resolved_dev_dependencies,
489
501
dev_dependencies2 : None ,
502
+ _unused_dependencies,
503
+ _unused_dev_dependencies,
504
+ _unused_build_dependencies,
490
505
} ,
491
506
) ;
492
507
}
@@ -694,12 +709,16 @@ fn resolve_dependencies<'a>(
694
709
inherit : & dyn Fn ( ) -> CargoResult < & ' a InheritableFields > ,
695
710
package_root : & Path ,
696
711
warnings : & mut Vec < String > ,
697
- ) -> CargoResult < Option < BTreeMap < manifest:: PackageName , manifest:: InheritableDependency > > > {
712
+ ) -> CargoResult < (
713
+ Option < BTreeMap < manifest:: PackageName , manifest:: InheritableDependency > > ,
714
+ Option < BTreeMap < manifest:: PackageName , manifest:: InheritableDependency > > ,
715
+ ) > {
698
716
let Some ( dependencies) = orig_deps else {
699
- return Ok ( None ) ;
717
+ return Ok ( ( None , None ) ) ;
700
718
} ;
701
719
702
720
let mut deps = BTreeMap :: new ( ) ;
721
+ let mut ununsed_deps = BTreeMap :: new ( ) ;
703
722
for ( name_in_toml, v) in dependencies. iter ( ) {
704
723
let mut resolved = dependency_inherit_with (
705
724
v. clone ( ) ,
@@ -763,9 +782,14 @@ fn resolve_dependencies<'a>(
763
782
name_in_toml. clone ( ) ,
764
783
manifest:: InheritableDependency :: Value ( resolved. clone ( ) ) ,
765
784
) ;
785
+ } else {
786
+ ununsed_deps. insert (
787
+ name_in_toml. clone ( ) ,
788
+ manifest:: InheritableDependency :: Value ( resolved. clone ( ) ) ,
789
+ ) ;
766
790
}
767
791
}
768
- Ok ( Some ( deps) )
792
+ Ok ( ( Some ( deps) , Some ( ununsed_deps ) ) )
769
793
}
770
794
771
795
fn load_inheritable_fields (
@@ -1292,36 +1316,52 @@ fn to_real_manifest(
1292
1316
1293
1317
// Collect the dependencies.
1294
1318
let mut deps = Vec :: new ( ) ;
1319
+ let mut unused_deps = Vec :: new ( ) ;
1295
1320
let mut manifest_ctx = ManifestContext {
1296
1321
deps : & mut deps,
1297
1322
source_id,
1298
1323
gctx,
1299
1324
warnings,
1300
1325
platform : None ,
1301
1326
root : package_root,
1327
+ unused_deps : & mut unused_deps,
1302
1328
} ;
1303
- gather_dependencies ( & mut manifest_ctx, resolved_toml. dependencies . as_ref ( ) , None ) ?;
1329
+ gather_dependencies (
1330
+ & mut manifest_ctx,
1331
+ resolved_toml. dependencies . as_ref ( ) ,
1332
+ resolved_toml. _unused_dependencies . as_ref ( ) ,
1333
+ None ,
1334
+ ) ?;
1304
1335
gather_dependencies (
1305
1336
& mut manifest_ctx,
1306
1337
resolved_toml. dev_dependencies ( ) ,
1338
+ None ,
1307
1339
Some ( DepKind :: Development ) ,
1308
1340
) ?;
1309
1341
gather_dependencies (
1310
1342
& mut manifest_ctx,
1311
1343
resolved_toml. build_dependencies ( ) ,
1344
+ resolved_toml. _unused_build_dependencies . as_ref ( ) ,
1312
1345
Some ( DepKind :: Build ) ,
1313
1346
) ?;
1314
1347
for ( name, platform) in resolved_toml. target . iter ( ) . flatten ( ) {
1315
1348
manifest_ctx. platform = Some ( name. parse ( ) ?) ;
1316
- gather_dependencies ( & mut manifest_ctx, platform. dependencies . as_ref ( ) , None ) ?;
1349
+ gather_dependencies (
1350
+ & mut manifest_ctx,
1351
+ platform. dependencies . as_ref ( ) ,
1352
+ platform. _unused_dependencies . as_ref ( ) ,
1353
+ None ,
1354
+ ) ?;
1317
1355
gather_dependencies (
1318
1356
& mut manifest_ctx,
1319
1357
platform. build_dependencies ( ) ,
1358
+ None ,
1320
1359
Some ( DepKind :: Build ) ,
1321
1360
) ?;
1322
1361
gather_dependencies (
1323
1362
& mut manifest_ctx,
1324
1363
platform. dev_dependencies ( ) ,
1364
+ None ,
1325
1365
Some ( DepKind :: Development ) ,
1326
1366
) ?;
1327
1367
}
@@ -1452,6 +1492,7 @@ fn to_real_manifest(
1452
1492
. collect ( ) ,
1453
1493
resolved_package. links . as_deref ( ) ,
1454
1494
rust_version. clone ( ) ,
1495
+ Some ( unused_deps) ,
1455
1496
) ?;
1456
1497
if summary. features ( ) . contains_key ( "default-features" ) {
1457
1498
warnings. push (
@@ -1582,6 +1623,7 @@ fn to_virtual_manifest(
1582
1623
warnings,
1583
1624
platform : None ,
1584
1625
root,
1626
+ unused_deps : & mut Vec :: new ( ) ,
1585
1627
} ;
1586
1628
(
1587
1629
replace ( & original_toml, & mut manifest_ctx) ?,
@@ -1650,23 +1692,31 @@ struct ManifestContext<'a, 'b> {
1650
1692
warnings : & ' a mut Vec < String > ,
1651
1693
platform : Option < Platform > ,
1652
1694
root : & ' a Path ,
1695
+ unused_deps : & ' a mut Vec < Dependency > ,
1653
1696
}
1654
1697
1655
1698
#[ tracing:: instrument( skip_all) ]
1656
1699
fn gather_dependencies (
1657
1700
manifest_ctx : & mut ManifestContext < ' _ , ' _ > ,
1658
1701
resolved_deps : Option < & BTreeMap < manifest:: PackageName , manifest:: InheritableDependency > > ,
1702
+ unuse_resolved_deps : Option < & BTreeMap < manifest:: PackageName , manifest:: InheritableDependency > > ,
1659
1703
kind : Option < DepKind > ,
1660
1704
) -> CargoResult < ( ) > {
1661
- let Some ( dependencies) = resolved_deps else {
1662
- return Ok ( ( ) ) ;
1705
+ if let Some ( dependencies) = resolved_deps {
1706
+ for ( n, v) in dependencies. iter ( ) {
1707
+ let resolved = v. resolved ( ) . expect ( "previously resolved" ) ;
1708
+ let dep = dep_to_dependency ( & resolved, n, manifest_ctx, kind) ?;
1709
+ manifest_ctx. deps . push ( dep) ;
1710
+ }
1711
+ } ;
1712
+ if let Some ( dependencies) = unuse_resolved_deps {
1713
+ for ( n, v) in dependencies. iter ( ) {
1714
+ let resolved = v. resolved ( ) . expect ( "previously resolved" ) ;
1715
+ let dep = dep_to_dependency ( & resolved, n, manifest_ctx, kind) ?;
1716
+ manifest_ctx. unused_deps . push ( dep) ;
1717
+ }
1663
1718
} ;
1664
1719
1665
- for ( n, v) in dependencies. iter ( ) {
1666
- let resolved = v. resolved ( ) . expect ( "previously resolved" ) ;
1667
- let dep = dep_to_dependency ( & resolved, n, manifest_ctx, kind) ?;
1668
- manifest_ctx. deps . push ( dep) ;
1669
- }
1670
1720
Ok ( ( ) )
1671
1721
}
1672
1722
@@ -1775,6 +1825,7 @@ pub(crate) fn to_dependency<P: ResolveToPath + Clone>(
1775
1825
warnings,
1776
1826
platform,
1777
1827
root,
1828
+ unused_deps : & mut Vec :: new ( ) ,
1778
1829
} ,
1779
1830
kind,
1780
1831
)
@@ -2642,6 +2693,9 @@ fn prepare_toml_for_publish(
2642
2693
dev_dependencies2 : None ,
2643
2694
build_dependencies : map_deps ( gctx, v. build_dependencies ( ) , all) ?,
2644
2695
build_dependencies2 : None ,
2696
+ _unused_dependencies : Default :: default ( ) ,
2697
+ _unused_dev_dependencies : Default :: default ( ) ,
2698
+ _unused_build_dependencies : Default :: default ( ) ,
2645
2699
} ,
2646
2700
) )
2647
2701
} )
@@ -2658,6 +2712,9 @@ fn prepare_toml_for_publish(
2658
2712
cargo_features : me. cargo_features . clone ( ) ,
2659
2713
lints : me. lints . clone ( ) ,
2660
2714
_unused_keys : Default :: default ( ) ,
2715
+ _unused_dependencies : Default :: default ( ) ,
2716
+ _unused_dev_dependencies : Default :: default ( ) ,
2717
+ _unused_build_dependencies : Default :: default ( ) ,
2661
2718
} ;
2662
2719
strip_features ( & mut manifest) ;
2663
2720
return Ok ( manifest) ;
0 commit comments