1
+ use std:: collections:: hash_map:: Entry ;
1
2
use std:: collections:: { BTreeMap , BTreeSet , HashMap , HashSet } ;
2
3
use std:: fmt:: Write ;
3
4
@@ -86,16 +87,17 @@ fn create_dependencies_vars<'a>(
86
87
. or_default ( )
87
88
. insert ( ( kind, platform) , solver. new_var ( ) ) ;
88
89
89
- let dep_feature_var_map = dep
90
- . features ( )
91
- . iter ( )
92
- . map ( |& f| ( f, solver. new_var ( ) ) )
93
- . collect ( ) ;
94
-
95
- var_for_is_dependencies_features_used
90
+ let dep_feature_vars = var_for_is_dependencies_features_used
96
91
. entry ( name)
97
92
. or_default ( )
98
- . insert ( ( kind, platform) , dep_feature_var_map) ;
93
+ . entry ( ( kind, platform) )
94
+ . or_default ( ) ;
95
+
96
+ for & feature_name in dep. features ( ) {
97
+ if let Entry :: Vacant ( entry) = dep_feature_vars. entry ( feature_name) {
98
+ entry. insert ( solver. new_var ( ) ) ;
99
+ }
100
+ }
99
101
}
100
102
101
103
for feature_values in pkg_features. values ( ) {
@@ -109,12 +111,14 @@ fn create_dependencies_vars<'a>(
109
111
continue ;
110
112
} ;
111
113
112
- for dep_features_vars in var_for_is_dependencies_features_used
114
+ for dep_feature_vars in var_for_is_dependencies_features_used
113
115
. get_mut ( & dep_name)
114
116
. expect ( "feature dep name exists" )
115
117
. values_mut ( )
116
118
{
117
- dep_features_vars. insert ( dep_feature, solver. new_var ( ) ) ;
119
+ if let Entry :: Vacant ( entry) = dep_feature_vars. entry ( dep_feature) {
120
+ entry. insert ( solver. new_var ( ) ) ;
121
+ }
118
122
}
119
123
}
120
124
}
@@ -176,7 +180,6 @@ fn process_pkg_features(
176
180
pkg_feature_var_map : & HashMap < InternedString , varisat:: Var > ,
177
181
pkg_dependencies : & [ Dependency ] ,
178
182
pkg_features : & FeatureMap ,
179
- check_dev_dependencies : bool ,
180
183
) {
181
184
let optional_dependencies = pkg_dependencies
182
185
. iter ( )
@@ -199,7 +202,7 @@ fn process_pkg_features(
199
202
FeatureValue :: Dep { dep_name } => {
200
203
// Add a clause for each dependency with the provided name (normal/build/dev with target)
201
204
for ( & ( dep_kind, _) , & dep_var) in & var_for_is_dependencies_used[ & dep_name] {
202
- if dep_kind == DepKind :: Development && !check_dev_dependencies {
205
+ if dep_kind == DepKind :: Development {
203
206
continue ;
204
207
}
205
208
solver. add_clause ( & [ pkg_feature_var. negative ( ) , dep_var. positive ( ) ] ) ;
@@ -223,7 +226,7 @@ fn process_pkg_features(
223
226
// Add clauses for each dependency with the provided name (normal/build/dev with target)
224
227
let dep_var_map = & var_for_is_dependencies_used[ & dep_name] ;
225
228
for ( & ( dep_kind, dep_platform) , & dep_var) in dep_var_map {
226
- if dep_kind == DepKind :: Development && !check_dev_dependencies {
229
+ if dep_kind == DepKind :: Development {
227
230
continue ;
228
231
}
229
232
@@ -270,36 +273,32 @@ fn process_compatible_dep_summaries(
270
273
}
271
274
272
275
let ( name, kind, platform) = ( dep. name_in_toml ( ) , dep. kind ( ) , dep. platform ( ) ) ;
273
- let dep_var_map = & var_for_is_dependencies_used[ & name] ;
274
- let dep_var = dep_var_map[ & ( kind, platform) ] ;
275
-
276
+ let dep_var = var_for_is_dependencies_used[ & name] [ & ( kind, platform) ] ;
276
277
let dep_feature_var_map = & var_for_is_dependencies_features_used[ & name] [ & ( kind, platform) ] ;
277
278
278
- let compatible_summaries = by_name
279
+ let compatible_pkg_ids = by_name
279
280
. get ( & dep. package_name ( ) )
280
281
. into_iter ( )
281
282
. flatten ( )
282
283
. filter ( |s| dep. matches ( s) )
283
284
. filter ( |s| dep. features ( ) . iter ( ) . all ( |f| s. features ( ) . contains_key ( f) ) )
284
- . cloned ( )
285
+ . map ( |s| s . package_id ( ) )
285
286
. collect :: < Vec < _ > > ( ) ;
286
287
287
288
// At least one compatible package should be activated
288
- let dep_clause = compatible_summaries
289
+ let dep_clause = compatible_pkg_ids
289
290
. iter ( )
290
- . map ( |s | var_for_is_packages_used[ & s . package_id ( ) ] . positive ( ) )
291
+ . map ( |id | var_for_is_packages_used[ & id ] . positive ( ) )
291
292
. chain ( [ dep_var. negative ( ) ] )
292
293
. collect :: < Vec < _ > > ( ) ;
293
294
294
295
solver. add_clause ( & dep_clause) ;
295
296
296
297
for ( & feature_name, & dep_feature_var) in dep_feature_var_map {
297
298
// At least one compatible package with the additional feature should be activated
298
- let dep_feature_clause = compatible_summaries
299
+ let dep_feature_clause = compatible_pkg_ids
299
300
. iter ( )
300
- . filter_map ( |s| {
301
- var_for_is_packages_features_used[ & s. package_id ( ) ] . get ( & feature_name)
302
- } )
301
+ . filter_map ( |id| var_for_is_packages_features_used[ & id] . get ( & feature_name) )
303
302
. map ( |var| var. positive ( ) )
304
303
. chain ( [ dep_feature_var. negative ( ) ] )
305
304
. collect :: < Vec < _ > > ( ) ;
@@ -311,10 +310,9 @@ fn process_compatible_dep_summaries(
311
310
// For the selected package for this dependency, the `"default"` feature should be activated if it exists
312
311
let mut dep_default_clause = vec ! [ dep_var. negative( ) ] ;
313
312
314
- for s in & compatible_summaries {
315
- let s_pkg_id = s. package_id ( ) ;
316
- let s_var = var_for_is_packages_used[ & s_pkg_id] ;
317
- let s_feature_var_map = & var_for_is_packages_features_used[ & s_pkg_id] ;
313
+ for & id in & compatible_pkg_ids {
314
+ let s_var = var_for_is_packages_used[ & id] ;
315
+ let s_feature_var_map = & var_for_is_packages_features_used[ & id] ;
318
316
319
317
if let Some ( s_default_feature_var) = s_feature_var_map. get ( & INTERNED_DEFAULT ) {
320
318
dep_default_clause
@@ -348,8 +346,6 @@ pub struct SatResolver {
348
346
349
347
impl SatResolver {
350
348
pub fn new < ' a > ( registry : impl IntoIterator < Item = & ' a Summary > ) -> Self {
351
- let check_dev_dependencies = false ;
352
-
353
349
let mut by_name: HashMap < InternedString , Vec < Summary > > = HashMap :: new ( ) ;
354
350
for pkg in registry {
355
351
by_name. entry ( pkg. name ( ) ) . or_default ( ) . push ( pkg. clone ( ) ) ;
@@ -423,7 +419,6 @@ impl SatResolver {
423
419
& var_for_is_packages_features_used[ & pkg_id] ,
424
420
pkg_dependencies,
425
421
pkg_features,
426
- check_dev_dependencies,
427
422
) ;
428
423
429
424
process_compatible_dep_summaries (
@@ -434,7 +429,7 @@ impl SatResolver {
434
429
& var_for_is_packages_features_used,
435
430
& by_name,
436
431
pkg_dependencies,
437
- check_dev_dependencies ,
432
+ false ,
438
433
) ;
439
434
}
440
435
0 commit comments