@@ -159,45 +159,7 @@ pub fn resolve(
159
159
160
160
// If we have a shell, emit warnings about required deps used as feature.
161
161
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)
201
163
}
202
164
203
165
Ok ( resolve)
@@ -1129,3 +1091,51 @@ fn check_duplicate_pkgs_in_lockfile(resolve: &Resolve) -> CargoResult<()> {
1129
1091
}
1130
1092
Ok ( ( ) )
1131
1093
}
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