@@ -9,6 +9,7 @@ use anyhow::Context as _;
99use super :: dependency:: Dependency ;
1010use crate :: core:: dependency:: DepKind ;
1111use crate :: core:: FeatureValue ;
12+ use crate :: core:: PackageIdSpec ;
1213use crate :: util:: interning:: InternedString ;
1314use crate :: CargoResult ;
1415
@@ -393,6 +394,7 @@ impl LocalManifest {
393394 let explicit_dep_activation = self . is_explicit_dep_activation ( dep_key) ;
394395 let status = self . dep_status ( dep_key) ;
395396
397+ // clean up features
396398 if let Some ( toml_edit:: Item :: Table ( feature_table) ) =
397399 self . data . as_table_mut ( ) . get_mut ( "features" )
398400 {
@@ -409,6 +411,54 @@ impl LocalManifest {
409411 }
410412 }
411413 }
414+
415+ // continue only if the dep is fully removed
416+ if status != DependencyStatus :: None {
417+ return ;
418+ }
419+
420+ // clean up profile sections
421+ if let Some ( toml_edit:: Item :: Table ( profile_table) ) = self . data . get_mut ( "profile" ) {
422+ profile_table. set_implicit ( true ) ;
423+ for ( _, item) in profile_table. iter_mut ( ) {
424+ if let toml_edit:: Item :: Table ( profile_table) = item {
425+ profile_table. set_implicit ( true ) ;
426+ if let Some ( toml_edit:: Item :: Table ( package_table) ) =
427+ profile_table. get_mut ( "package" )
428+ {
429+ package_table. set_implicit ( true ) ;
430+ package_table. remove ( dep_key) ;
431+ }
432+ }
433+ }
434+ }
435+
436+ // clean up patch sections
437+ if let Some ( toml_edit:: Item :: Table ( patch_table) ) = self . data . get_mut ( "patch" ) {
438+ patch_table. set_implicit ( true ) ;
439+ for ( _, item) in patch_table. iter_mut ( ) {
440+ if let toml_edit:: Item :: Table ( table) = item {
441+ table. set_implicit ( true ) ;
442+ for ( key, item) in table. iter_mut ( ) {
443+ if key. get ( ) == dep_key {
444+ * item = toml_edit:: Item :: None ;
445+ }
446+ }
447+ }
448+ }
449+ }
450+
451+ // clean up replace section
452+ if let Some ( toml_edit:: Item :: Table ( replace_table) ) = self . data . get_mut ( "replace" ) {
453+ replace_table. set_implicit ( true ) ;
454+ for ( key, item) in replace_table. iter_mut ( ) {
455+ if let Ok ( spec) = PackageIdSpec :: parse ( key. get ( ) ) {
456+ if spec. name ( ) == dep_key {
457+ * item = toml_edit:: Item :: None ;
458+ }
459+ }
460+ }
461+ }
412462 }
413463
414464 fn is_explicit_dep_activation ( & self , dep_key : & str ) -> bool {
@@ -500,7 +550,7 @@ fn fix_feature_activations(
500550 } )
501551 . collect ( ) ;
502552
503- // Remove found idx in revers order so we don't invalidate the idx.
553+ // Remove found idx in reverse order so we don't invalidate the idx.
504554 for idx in remove_list. iter ( ) . rev ( ) {
505555 feature_values. remove ( * idx) ;
506556 }
0 commit comments