@@ -160,18 +160,44 @@ pub fn resolve(
160
160
// If we have a shell, emit warnings about required deps used as feature.
161
161
if print_warnings && config. is_some ( ) {
162
162
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
+ }
173
198
}
174
199
}
200
+ assert_eq ! ( cx. resolve_features, new_cx. resolve_features) ;
175
201
}
176
202
177
203
Ok ( resolve)
0 commit comments