@@ -159,45 +159,7 @@ pub fn resolve(
159159
160160 // If we have a shell, emit warnings about required deps used as feature.
161161 if print_warnings && config. is_some ( ) {
162- let mut new_cx = cx. clone ( ) ;
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- }
198- }
199- }
200- assert_eq ! ( cx. resolve_features, new_cx. resolve_features) ;
162+ emit_warnings ( & cx, & resolve, summaries, config)
201163 }
202164
203165 Ok ( resolve)
@@ -1129,3 +1091,51 @@ fn check_duplicate_pkgs_in_lockfile(resolve: &Resolve) -> CargoResult<()> {
11291091 }
11301092 Ok ( ( ) )
11311093}
1094+
1095+ /// re-run all used resolve_features so it can print warnings
1096+ fn emit_warnings (
1097+ cx : & Context ,
1098+ resolve : & Resolve ,
1099+ summaries : & [ ( Summary , Method < ' _ > ) ] ,
1100+ config : Option < & Config > ,
1101+ ) {
1102+ let mut new_cx = cx. clone ( ) ;
1103+ new_cx. resolve_features = im_rc:: HashMap :: new ( ) ;
1104+ let mut features_from_dep = HashMap :: new ( ) ;
1105+ for ( summery, method) in summaries {
1106+ for ( dep, features) in new_cx
1107+ . resolve_features ( None , summery, & method, config)
1108+ . expect ( "can not resolve_features for a required summery" )
1109+ {
1110+ features_from_dep. insert ( ( summery. package_id ( ) , dep) , features) ;
1111+ }
1112+ }
1113+ for summery in resolve. sort ( ) . iter ( ) . rev ( ) . map ( |id| {
1114+ cx. activations
1115+ . get ( & id. as_activations_key ( ) )
1116+ . expect ( "id in dependency graph but not in activations" )
1117+ . 0
1118+ . clone ( )
1119+ } ) {
1120+ for ( parent, deps) in cx. parents . edges ( & summery. package_id ( ) ) {
1121+ for dep in deps. iter ( ) {
1122+ let features = features_from_dep
1123+ . remove ( & ( * parent, dep. clone ( ) ) )
1124+ . expect ( "fulfilled a dep that was not needed" ) ;
1125+ let method = Method :: Required {
1126+ dev_deps : false ,
1127+ features : & features,
1128+ all_features : false ,
1129+ uses_default_features : dep. uses_default_features ( ) ,
1130+ } ;
1131+ for ( dep, features) in new_cx
1132+ . resolve_features ( None , & summery, & method, config)
1133+ . expect ( "can not resolve_features for a used dep" )
1134+ {
1135+ features_from_dep. insert ( ( summery. package_id ( ) , dep) , features) ;
1136+ }
1137+ }
1138+ }
1139+ }
1140+ assert_eq ! ( cx. resolve_features, new_cx. resolve_features) ;
1141+ }
0 commit comments