@@ -13,8 +13,8 @@ use crate::core::resolver::context::ResolverContext;
1313use crate :: core:: resolver:: errors:: describe_path_in_context;
1414use crate :: core:: resolver:: types:: { ConflictReason , DepInfo , FeaturesSet } ;
1515use crate :: core:: resolver:: {
16- ActivateError , ActivateResult , CliFeatures , RequestedFeatures , ResolveOpts , VersionOrdering ,
17- VersionPreferences ,
16+ ActivateError , ActivateResult , CliFeatures , RequestedFeatures , ResolveOpts , ResolveVersion ,
17+ VersionOrdering , VersionPreferences ,
1818} ;
1919use crate :: core:: {
2020 Dependency , FeatureValue , PackageId , PackageIdSpec , PackageIdSpecQuery , Registry , Summary ,
@@ -229,6 +229,7 @@ impl<'a> RegistryQueryer<'a> {
229229 candidate : & Summary ,
230230 opts : & ResolveOpts ,
231231 first_version : Option < VersionOrdering > ,
232+ version : ResolveVersion ,
232233 ) -> ActivateResult < Rc < ( HashSet < InternedString > , Rc < Vec < DepInfo > > ) > > {
233234 // if we have calculated a result before, then we can just return it,
234235 // as it is a "pure" query of its arguments.
@@ -241,7 +242,7 @@ impl<'a> RegistryQueryer<'a> {
241242 // First, figure out our set of dependencies based on the requested set
242243 // of features. This also calculates what features we're going to enable
243244 // for our own dependencies.
244- let ( used_features, deps) = resolve_features ( parent, candidate, opts) ?;
245+ let ( used_features, deps) = resolve_features ( parent, candidate, opts, version ) ?;
245246
246247 // Next, transform all dependencies into a list of possible candidates
247248 // which can satisfy that dependency.
@@ -291,12 +292,13 @@ pub fn resolve_features<'b>(
291292 parent : Option < PackageId > ,
292293 s : & ' b Summary ,
293294 opts : & ' b ResolveOpts ,
295+ version : ResolveVersion ,
294296) -> ActivateResult < ( HashSet < InternedString > , Vec < ( Dependency , FeaturesSet ) > ) > {
295297 // First, filter by dev-dependencies.
296298 let deps = s. dependencies ( ) ;
297299 let deps = deps. iter ( ) . filter ( |d| d. is_transitive ( ) || opts. dev_deps ) ;
298300
299- let reqs = build_requirements ( parent, s, opts) ?;
301+ let reqs = build_requirements ( parent, s, opts, version ) ?;
300302 let mut ret = Vec :: new ( ) ;
301303 let default_dep = BTreeSet :: new ( ) ;
302304 let mut valid_dep_names = HashSet :: new ( ) ;
@@ -344,21 +346,24 @@ fn build_requirements<'a, 'b: 'a>(
344346 parent : Option < PackageId > ,
345347 s : & ' a Summary ,
346348 opts : & ' b ResolveOpts ,
349+ version : ResolveVersion ,
347350) -> ActivateResult < Requirements < ' a > > {
348351 let mut reqs = Requirements :: new ( s) ;
349352
350353 let handle_default = |uses_default_features, reqs : & mut Requirements < ' _ > | {
351354 if uses_default_features && s. features ( ) . contains_key ( "default" ) {
352- if let Err ( e) = reqs. require_feature ( INTERNED_DEFAULT ) {
355+ if let Err ( e) = reqs. require_feature ( INTERNED_DEFAULT , version ) {
353356 return Err ( e. into_activate_error ( parent, s) ) ;
354357 }
355358 }
356- // all features(including those containing 'weak' ones) have been enabled,
357- // so we assume all packages have been enabled, thus run the second
358- // (also final) scan to enable the rest weak dependency features
359- for feature in std:: mem:: take ( & mut reqs. weak_feature_values ) {
360- if let Err ( e) = reqs. require_value ( & feature) {
361- return Err ( e. into_activate_error ( parent, s) ) ;
359+ if version >= ResolveVersion :: V5 {
360+ // all features(including those containing 'weak' ones) have been enabled,
361+ // so we assume all packages have been enabled, thus run the second
362+ // (also final) scan to enable the rest weak dependency features
363+ for feature in std:: mem:: take ( & mut reqs. weak_feature_values ) {
364+ if let Err ( e) = reqs. require_value ( & feature, version) {
365+ return Err ( e. into_activate_error ( parent, s) ) ;
366+ }
362367 }
363368 }
364369 Ok ( ( ) )
@@ -372,14 +377,14 @@ fn build_requirements<'a, 'b: 'a>(
372377 } ) => {
373378 if * all_features {
374379 for key in s. features ( ) . keys ( ) {
375- if let Err ( e) = reqs. require_feature ( * key) {
380+ if let Err ( e) = reqs. require_feature ( * key, version ) {
376381 return Err ( e. into_activate_error ( parent, s) ) ;
377382 }
378383 }
379384 }
380385
381386 for fv in features. iter ( ) {
382- if let Err ( e) = reqs. require_value ( fv) {
387+ if let Err ( e) = reqs. require_value ( fv, version ) {
383388 return Err ( e. into_activate_error ( parent, s) ) ;
384389 }
385390 }
@@ -390,7 +395,7 @@ fn build_requirements<'a, 'b: 'a>(
390395 uses_default_features,
391396 } => {
392397 for feature in features. iter ( ) {
393- if let Err ( e) = reqs. require_feature ( * feature) {
398+ if let Err ( e) = reqs. require_feature ( * feature, version ) {
394399 return Err ( e. into_activate_error ( parent, s) ) ;
395400 }
396401 }
@@ -453,6 +458,7 @@ impl Requirements<'_> {
453458 package : InternedString ,
454459 feat : InternedString ,
455460 weak : bool ,
461+ version : ResolveVersion ,
456462 ) -> Result < ( ) , RequirementError > {
457463 // If `package` is indeed an optional dependency then we activate the
458464 // feature named `package`, but otherwise if `package` is a required
@@ -468,16 +474,20 @@ impl Requirements<'_> {
468474 // the same name if the `dep:` syntax is used to avoid creating
469475 // that implicit feature.
470476 if self . summary . features ( ) . contains_key ( & package) {
471- self . require_feature ( package) ?;
477+ self . require_feature ( package, version ) ?;
472478 }
473479 }
474480 self . deps . entry ( package) . or_default ( ) . insert ( feat) ;
475481 } else {
476- // If parent package haven't enabled this package, the feature will
477- // be ignored.
478- self . deps . entry ( package) . and_modify ( |feats| {
479- feats. insert ( feat) ;
480- } ) ;
482+ if version >= ResolveVersion :: V5 {
483+ // If parent package haven't enabled this package, the feature will
484+ // be ignored.
485+ self . deps . entry ( package) . and_modify ( |feats| {
486+ feats. insert ( feat) ;
487+ } ) ;
488+ } else {
489+ self . deps . entry ( package) . or_default ( ) . insert ( feat) ;
490+ }
481491 }
482492
483493 Ok ( ( ) )
@@ -487,7 +497,11 @@ impl Requirements<'_> {
487497 self . deps . entry ( pkg) . or_default ( ) ;
488498 }
489499
490- fn require_feature ( & mut self , feat : InternedString ) -> Result < ( ) , RequirementError > {
500+ fn require_feature (
501+ & mut self ,
502+ feat : InternedString ,
503+ version : ResolveVersion ,
504+ ) -> Result < ( ) , RequirementError > {
491505 if !self . features . insert ( feat) {
492506 // Already seen this feature.
493507 return Ok ( ( ) ) ;
@@ -503,25 +517,30 @@ impl Requirements<'_> {
503517 return Err ( RequirementError :: Cycle ( feat) ) ;
504518 }
505519 }
506- if let FeatureValue :: DepFeature { weak, .. } = & fv
520+ if version >= ResolveVersion :: V5
521+ && let FeatureValue :: DepFeature { weak, .. } = & fv
507522 && * weak
508523 {
509524 self . weak_feature_values . insert ( fv. clone ( ) ) ;
510525 }
511- self . require_value ( fv) ?;
526+ self . require_value ( fv, version ) ?;
512527 }
513528 Ok ( ( ) )
514529 }
515530
516- fn require_value ( & mut self , fv : & FeatureValue ) -> Result < ( ) , RequirementError > {
531+ fn require_value (
532+ & mut self ,
533+ fv : & FeatureValue ,
534+ version : ResolveVersion ,
535+ ) -> Result < ( ) , RequirementError > {
517536 match fv {
518- FeatureValue :: Feature ( feat) => self . require_feature ( * feat) ?,
537+ FeatureValue :: Feature ( feat) => self . require_feature ( * feat, version ) ?,
519538 FeatureValue :: Dep { dep_name } => self . require_dependency ( * dep_name) ,
520539 FeatureValue :: DepFeature {
521540 dep_name,
522541 dep_feature,
523542 weak,
524- } => self . require_dep_feature ( * dep_name, * dep_feature, * weak) ?,
543+ } => self . require_dep_feature ( * dep_name, * dep_feature, * weak, version ) ?,
525544 } ;
526545 Ok ( ( ) )
527546 }
0 commit comments