Skip to content

Commit 1ac4ed5

Browse files
committed
fix(implicit_features): Work with any dep table
1 parent a863322 commit 1ac4ed5

File tree

4 files changed

+139
-29
lines changed

4 files changed

+139
-29
lines changed

src/cargo/util/lints.rs

Lines changed: 22 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -168,48 +168,41 @@ pub fn check_implicit_features(
168168
}
169169

170170
let manifest = pkg.manifest();
171-
let user_defined_features = manifest.resolved_toml().features();
172-
let features = user_defined_features.map_or(HashSet::new(), |f| {
173-
f.keys().map(|k| InternedString::new(&k)).collect()
174-
});
175-
// Add implicit features for optional dependencies if they weren't
176-
// explicitly listed anywhere.
177-
let explicitly_listed = user_defined_features.map_or(HashSet::new(), |f| {
178-
f.values()
179-
.flatten()
180-
.filter_map(|v| match FeatureValue::new(v.into()) {
181-
Dep { dep_name } => Some(dep_name),
182-
_ => None,
183-
})
184-
.collect()
185-
});
171+
let activated_opt_deps = manifest
172+
.resolved_toml()
173+
.features()
174+
.map(|map| {
175+
map.values()
176+
.flatten()
177+
.filter_map(|f| match FeatureValue::new(InternedString::new(f)) {
178+
Dep { dep_name } => Some(dep_name.as_str()),
179+
_ => None,
180+
})
181+
.collect::<HashSet<_>>()
182+
})
183+
.unwrap_or_default();
186184

187185
for dep in manifest.dependencies() {
188186
let dep_name_in_toml = dep.name_in_toml();
189-
if !dep.is_optional()
190-
|| features.contains(&dep_name_in_toml)
191-
|| explicitly_listed.contains(&dep_name_in_toml)
192-
{
187+
if !dep.is_optional() || activated_opt_deps.contains(dep_name_in_toml.as_str()) {
193188
continue;
194189
}
190+
195191
if lint_level == LintLevel::Forbid || lint_level == LintLevel::Deny {
196192
*error_count += 1;
197193
}
194+
let mut toml_path = vec![dep.kind().kind_table(), dep_name_in_toml.as_str()];
195+
let platform = dep.platform().map(|p| p.to_string());
196+
if let Some(platform) = platform.as_ref() {
197+
toml_path.insert(0, platform);
198+
toml_path.insert(0, "target");
199+
}
198200
let level = lint_level.to_diagnostic_level();
199201
let manifest_path = rel_cwd_manifest_path(path, gctx);
200202
let message = level.title(IMPLICIT_FEATURES.desc).snippet(
201203
Snippet::source(manifest.contents())
202204
.origin(&manifest_path)
203-
.annotation(
204-
level.span(
205-
get_span(
206-
manifest.document(),
207-
&["dependencies", &dep_name_in_toml],
208-
false,
209-
)
210-
.unwrap(),
211-
),
212-
)
205+
.annotation(level.span(get_span(manifest.document(), &toml_path, false).unwrap()))
213206
.fold(true),
214207
);
215208
let renderer = Renderer::styled().term_width(
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
use cargo_test_support::prelude::*;
2+
use cargo_test_support::registry::Package;
3+
use cargo_test_support::str;
4+
use cargo_test_support::{file, project};
5+
6+
#[cargo_test]
7+
fn case() {
8+
Package::new("bar", "0.1.0").publish();
9+
Package::new("baz", "0.1.0").publish();
10+
Package::new("target-dep", "0.1.0").publish();
11+
let p = project()
12+
.file(
13+
"Cargo.toml",
14+
r#"
15+
[package]
16+
name = "foo"
17+
version = "0.1.0"
18+
edition = "2021"
19+
20+
[dependencies]
21+
bar = { version = "0.1.0", optional = true }
22+
23+
[build-dependencies]
24+
baz = { version = "0.1.0", optional = true }
25+
26+
[target.'cfg(target_os = "linux")'.dependencies]
27+
target-dep = { version = "0.1.0", optional = true }
28+
29+
[lints.cargo]
30+
implicit-features = "warn"
31+
"#,
32+
)
33+
.file("src/lib.rs", "")
34+
.build();
35+
36+
snapbox::cmd::Command::cargo_ui()
37+
.masquerade_as_nightly_cargo(&["cargo-lints"])
38+
.current_dir(p.root())
39+
.arg("check")
40+
.arg("-Zcargo-lints")
41+
.assert()
42+
.success()
43+
.stdout_matches(str![""])
44+
.stderr_matches(file!["stderr.term.svg"]);
45+
}
Lines changed: 71 additions & 0 deletions
Loading
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
mod correct_dep_table;
12
mod edition_2021;
23
mod edition_2021_warn;
34
mod edition_2024;

0 commit comments

Comments
 (0)