@@ -160,18 +160,44 @@ pub fn resolve(
160160 // If we have a shell, emit warnings about required deps used as feature.
161161 if print_warnings && config. is_some ( ) {
162162 let mut new_cx = cx. clone ( ) ;
163- for ( j, _) in cx. activations . values ( ) {
164- if let Some ( features) = cx. resolve_features . get ( & j. package_id ( ) ) {
165- let features: Vec < _ > = features. iter ( ) . cloned ( ) . collect ( ) ;
166- let method = Method :: Required {
167- dev_deps : false ,
168- features : & features,
169- all_features : false ,
170- uses_default_features : false ,
171- } ;
172- let _ = new_cx. resolve_features ( None , j, & method, config) ;
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+ }
173198 }
174199 }
200+ assert_eq ! ( cx. resolve_features, new_cx. resolve_features) ;
175201 }
176202
177203 Ok ( resolve)
0 commit comments