Skip to content

Commit 137642c

Browse files
committed
Change for_build_dep from a bool to enum FeaturesFor for clarity.
1 parent e0d64f9 commit 137642c

File tree

5 files changed

+49
-21
lines changed

5 files changed

+49
-21
lines changed

src/cargo/core/compiler/standard_lib.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
33
use crate::core::compiler::{BuildContext, CompileKind, CompileMode, RustcTargetData, Unit};
44
use crate::core::profiles::UnitFor;
5-
use crate::core::resolver::features::ResolvedFeatures;
5+
use crate::core::resolver::features::{FeaturesFor, ResolvedFeatures};
66
use crate::core::resolver::{HasDevUnits, ResolveOpts};
77
use crate::core::{Dependency, PackageId, PackageSet, Resolve, SourceId, Workspace};
88
use crate::ops::{self, Packages};
@@ -154,7 +154,8 @@ pub fn generate_std_roots<'a>(
154154
unit_for,
155155
mode,
156156
);
157-
let features = std_features.activated_features(pkg.package_id(), false);
157+
let features =
158+
std_features.activated_features(pkg.package_id(), FeaturesFor::NormalOrDev);
158159
Ok(bcx.units.intern(
159160
pkg, lib, profile, kind, mode, features, /*is_std*/ true,
160161
))

src/cargo/core/compiler/unit_dependencies.rs

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ use crate::core::compiler::{BuildContext, CompileKind, CompileMode};
2020
use crate::core::dependency::DepKind;
2121
use crate::core::package::Downloads;
2222
use crate::core::profiles::{Profile, UnitFor};
23-
use crate::core::resolver::features::ResolvedFeatures;
23+
use crate::core::resolver::features::{FeaturesFor, ResolvedFeatures};
2424
use crate::core::resolver::Resolve;
2525
use crate::core::{InternedString, Package, PackageId, Target};
2626
use crate::CargoResult;
@@ -586,7 +586,11 @@ fn new_unit_dep_with_profile<'a>(
586586
let public = state
587587
.resolve()
588588
.is_public_dep(parent.pkg.package_id(), pkg.package_id());
589-
let features = state.activated_features(pkg.package_id(), unit_for.is_for_build_dep());
589+
let features_for = match unit_for.is_for_build_dep() {
590+
true => FeaturesFor::BuildDep,
591+
false => FeaturesFor::NormalOrDev,
592+
};
593+
let features = state.activated_features(pkg.package_id(), features_for);
590594
let unit = state
591595
.bcx
592596
.units
@@ -691,13 +695,17 @@ impl<'a, 'cfg> State<'a, 'cfg> {
691695
}
692696
}
693697

694-
fn activated_features(&self, pkg_id: PackageId, for_build_dep: bool) -> Vec<InternedString> {
698+
fn activated_features(
699+
&self,
700+
pkg_id: PackageId,
701+
features_for: FeaturesFor,
702+
) -> Vec<InternedString> {
695703
let features = if self.is_std {
696704
self.std_features.unwrap()
697705
} else {
698706
self.usr_features
699707
};
700-
features.activated_features(pkg_id, for_build_dep)
708+
features.activated_features(pkg_id, features_for)
701709
}
702710

703711
fn get(&mut self, id: PackageId) -> CargoResult<Option<&'a Package>> {

src/cargo/core/resolver/features.rs

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,13 @@ pub enum HasDevUnits {
6868
No,
6969
}
7070

71+
/// Flag to indicate if features are requested for a build dependency or not.
72+
#[derive(PartialEq)]
73+
pub enum FeaturesFor {
74+
NormalOrDev,
75+
BuildDep,
76+
}
77+
7178
impl FeatureOpts {
7279
fn new(config: &Config, has_dev_units: HasDevUnits) -> CargoResult<FeatureOpts> {
7380
let mut opts = FeatureOpts::default();
@@ -156,8 +163,12 @@ impl RequestedFeatures {
156163

157164
impl ResolvedFeatures {
158165
/// Returns the list of features that are enabled for the given package.
159-
pub fn activated_features(&self, pkg_id: PackageId, is_build: bool) -> Vec<InternedString> {
160-
self.activated_features_int(pkg_id, is_build, true)
166+
pub fn activated_features(
167+
&self,
168+
pkg_id: PackageId,
169+
features_for: FeaturesFor,
170+
) -> Vec<InternedString> {
171+
self.activated_features_int(pkg_id, features_for, true)
161172
}
162173

163174
/// Variant of `activated_features` that returns an empty Vec if this is
@@ -166,21 +177,21 @@ impl ResolvedFeatures {
166177
pub fn activated_features_unverified(
167178
&self,
168179
pkg_id: PackageId,
169-
is_build: bool,
180+
features_for: FeaturesFor,
170181
) -> Vec<InternedString> {
171-
self.activated_features_int(pkg_id, is_build, false)
182+
self.activated_features_int(pkg_id, features_for, false)
172183
}
173184

174185
fn activated_features_int(
175186
&self,
176187
pkg_id: PackageId,
177-
is_build: bool,
188+
features_for: FeaturesFor,
178189
verify: bool,
179190
) -> Vec<InternedString> {
180191
if let Some(legacy) = &self.legacy {
181192
legacy.get(&pkg_id).map_or_else(Vec::new, |v| v.clone())
182193
} else {
183-
let is_build = self.opts.decouple_build_deps && is_build;
194+
let is_build = self.opts.decouple_build_deps && features_for == FeaturesFor::BuildDep;
184195
if let Some(fs) = self.activated_features.get(&(pkg_id, is_build)) {
185196
fs.iter().cloned().collect()
186197
} else if verify {

src/cargo/ops/cargo_clean.rs

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,9 @@ use crate::core::compiler::unit_dependencies;
77
use crate::core::compiler::{BuildConfig, BuildContext, CompileKind, CompileMode, Context};
88
use crate::core::compiler::{RustcTargetData, UnitInterner};
99
use crate::core::profiles::{Profiles, UnitFor};
10-
use crate::core::resolver::features::{FeatureResolver, HasDevUnits, RequestedFeatures};
10+
use crate::core::resolver::features::{
11+
FeatureResolver, FeaturesFor, HasDevUnits, RequestedFeatures,
12+
};
1113
use crate::core::{PackageIdSpec, Workspace};
1214
use crate::ops;
1315
use crate::util::errors::{CargoResult, CargoResultExt};
@@ -118,10 +120,12 @@ pub fn clean(ws: &Workspace<'_>, opts: &CleanOptions<'_>) -> CargoResult<()> {
118120
};
119121
// Use unverified here since this is being more
120122
// exhaustive than what is actually needed.
121-
let features = features.activated_features_unverified(
122-
pkg.package_id(),
123-
unit_for.is_for_build_dep(),
124-
);
123+
let features_for = match unit_for.is_for_build_dep() {
124+
true => FeaturesFor::BuildDep,
125+
false => FeaturesFor::NormalOrDev,
126+
};
127+
let features =
128+
features.activated_features_unverified(pkg.package_id(), features_for);
125129
units.push(bcx.units.intern(
126130
pkg, target, profile, *kind, *mode, features, /*is_std*/ false,
127131
));

src/cargo/ops/cargo_compile.rs

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ use crate::core::compiler::{BuildConfig, BuildContext, Compilation, Context};
3434
use crate::core::compiler::{CompileKind, CompileMode, RustcTargetData, Unit};
3535
use crate::core::compiler::{DefaultExecutor, Executor, UnitInterner};
3636
use crate::core::profiles::{Profiles, UnitFor};
37-
use crate::core::resolver::features;
37+
use crate::core::resolver::features::{self, FeaturesFor};
3838
use crate::core::resolver::{HasDevUnits, Resolve, ResolveOpts};
3939
use crate::core::{LibKind, Package, PackageSet, Target};
4040
use crate::core::{PackageId, PackageIdSpec, TargetKind, Workspace};
@@ -750,7 +750,7 @@ fn generate_targets<'a>(
750750

751751
let features = Vec::from(resolved_features.activated_features(
752752
pkg.package_id(),
753-
false, // Root units are never build dependencies.
753+
FeaturesFor::NormalOrDev, // Root units are never build dependencies.
754754
));
755755
bcx.units.intern(
756756
pkg,
@@ -941,7 +941,7 @@ fn resolve_all_features(
941941
package_id: PackageId,
942942
) -> HashSet<String> {
943943
let mut features: HashSet<String> = resolved_features
944-
.activated_features(package_id, false)
944+
.activated_features(package_id, FeaturesFor::NormalOrDev)
945945
.iter()
946946
.map(|s| s.to_string())
947947
.collect();
@@ -950,7 +950,11 @@ fn resolve_all_features(
950950
// required-features field when deciding whether to be built or skipped.
951951
for (dep_id, deps) in resolve_with_overrides.deps(package_id) {
952952
for dep in deps {
953-
for feature in resolved_features.activated_features(dep_id, dep.is_build()) {
953+
let features_for = match dep.is_build() {
954+
true => FeaturesFor::BuildDep,
955+
false => FeaturesFor::NormalOrDev,
956+
};
957+
for feature in resolved_features.activated_features(dep_id, features_for) {
954958
features.insert(dep.name_in_toml().to_string() + "/" + &feature);
955959
}
956960
}

0 commit comments

Comments
 (0)