Skip to content

Commit dfc9bd2

Browse files
committed
feat(lints): Add where lint level was set
1 parent d5bc35d commit dfc9bd2

File tree

5 files changed

+54
-24
lines changed

5 files changed

+54
-24
lines changed

src/cargo/util/lints.rs

+47-17
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ impl Lint {
9090
pkg_lints: &TomlToolLints,
9191
ws_lints: &TomlToolLints,
9292
edition: Edition,
93-
) -> LintLevel {
93+
) -> (LintLevel, LintLevelReason) {
9494
self.groups
9595
.iter()
9696
.map(|g| {
@@ -117,8 +117,8 @@ impl Lint {
117117
edition,
118118
),
119119
)))
120-
.max_by_key(|(n, (l, p))| (l == &LintLevel::Forbid, *p, std::cmp::Reverse(*n)))
121-
.map(|(_, (l, _))| l)
120+
.max_by_key(|(n, (l, _, p))| (l == &LintLevel::Forbid, *p, std::cmp::Reverse(*n)))
121+
.map(|(_, (l, r, _))| (l, r))
122122
.unwrap()
123123
}
124124
}
@@ -164,34 +164,61 @@ impl From<TomlLintLevel> for LintLevel {
164164
}
165165
}
166166

167+
#[derive(Copy, Clone, Debug)]
168+
pub enum LintLevelReason {
169+
Default,
170+
Edition(Edition),
171+
Package,
172+
Workspace,
173+
}
174+
175+
impl Display for LintLevelReason {
176+
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
177+
match self {
178+
LintLevelReason::Default => write!(f, "by default"),
179+
LintLevelReason::Edition(edition) => write!(f, "in edition {}", edition),
180+
LintLevelReason::Package => write!(f, "in `[lints]`"),
181+
LintLevelReason::Workspace => write!(f, "in `[workspace.lints]`"),
182+
}
183+
}
184+
}
185+
167186
fn level_priority(
168187
name: &str,
169188
default_level: LintLevel,
170189
edition_lint_opts: Option<(Edition, LintLevel)>,
171190
pkg_lints: &TomlToolLints,
172191
ws_lints: &TomlToolLints,
173192
edition: Edition,
174-
) -> (LintLevel, i8) {
175-
let unspecified_level = if let Some(level) = edition_lint_opts
193+
) -> (LintLevel, LintLevelReason, i8) {
194+
let (unspecified_level, reason) = if let Some(level) = edition_lint_opts
176195
.filter(|(e, _)| edition >= *e)
177196
.map(|(_, l)| l)
178197
{
179-
level
198+
(level, LintLevelReason::Edition(edition))
180199
} else {
181-
default_level
200+
(default_level, LintLevelReason::Default)
182201
};
183202

184203
// Don't allow the group to be overridden if the level is `Forbid`
185204
if unspecified_level == LintLevel::Forbid {
186-
return (unspecified_level, 0);
205+
return (unspecified_level, reason, 0);
187206
}
188207

189208
if let Some(defined_level) = pkg_lints.get(name) {
190-
(defined_level.level().into(), defined_level.priority())
209+
(
210+
defined_level.level().into(),
211+
LintLevelReason::Package,
212+
defined_level.priority(),
213+
)
191214
} else if let Some(defined_level) = ws_lints.get(name) {
192-
(defined_level.level().into(), defined_level.priority())
215+
(
216+
defined_level.level().into(),
217+
LintLevelReason::Workspace,
218+
defined_level.priority(),
219+
)
193220
} else {
194-
(unspecified_level, 0)
221+
(unspecified_level, reason, 0)
195222
}
196223
}
197224

@@ -212,7 +239,7 @@ pub fn check_im_a_teapot(
212239
gctx: &GlobalContext,
213240
) -> CargoResult<()> {
214241
let manifest = pkg.manifest();
215-
let lint_level = IM_A_TEAPOT.level(pkg_lints, ws_lints, manifest.edition());
242+
let (lint_level, reason) = IM_A_TEAPOT.level(pkg_lints, ws_lints, manifest.edition());
216243
if lint_level == LintLevel::Allow {
217244
return Ok(());
218245
}
@@ -227,7 +254,10 @@ pub fn check_im_a_teapot(
227254
}
228255
let level = lint_level.to_diagnostic_level();
229256
let manifest_path = rel_cwd_manifest_path(path, gctx);
230-
let emitted_reason = format!("`cargo::{}` is set to `{lint_level}`", IM_A_TEAPOT.name);
257+
let emitted_reason = format!(
258+
"`cargo::{}` is set to `{lint_level}` {reason}",
259+
IM_A_TEAPOT.name
260+
);
231261

232262
let key_span = get_span(manifest.document(), &["package", "im-a-teapot"], false).unwrap();
233263
let value_span = get_span(manifest.document(), &["package", "im-a-teapot"], true).unwrap();
@@ -287,7 +317,7 @@ pub fn check_implicit_features(
287317
return Ok(());
288318
}
289319

290-
let lint_level = IMPLICIT_FEATURES.level(pkg_lints, ws_lints, edition);
320+
let (lint_level, reason) = IMPLICIT_FEATURES.level(pkg_lints, ws_lints, edition);
291321
if lint_level == LintLevel::Allow {
292322
return Ok(());
293323
}
@@ -332,7 +362,7 @@ pub fn check_implicit_features(
332362
);
333363
if emitted_source.is_none() {
334364
emitted_source = Some(format!(
335-
"`cargo::{}` is set to `{lint_level}`",
365+
"`cargo::{}` is set to `{lint_level}` {reason}",
336366
IMPLICIT_FEATURES.name
337367
));
338368
message = message.footer(Level::Note.title(emitted_source.as_ref().unwrap()));
@@ -370,7 +400,7 @@ pub fn unused_dependencies(
370400
return Ok(());
371401
}
372402

373-
let lint_level = UNUSED_OPTIONAL_DEPENDENCY.level(pkg_lints, ws_lints, edition);
403+
let (lint_level, reason) = UNUSED_OPTIONAL_DEPENDENCY.level(pkg_lints, ws_lints, edition);
374404
if lint_level == LintLevel::Allow {
375405
return Ok(());
376406
}
@@ -436,7 +466,7 @@ pub fn unused_dependencies(
436466
);
437467
if emitted_source.is_none() {
438468
emitted_source = Some(format!(
439-
"`cargo::{}` is set to `{lint_level}`",
469+
"`cargo::{}` is set to `{lint_level}` {reason}",
440470
UNUSED_OPTIONAL_DEPENDENCY.name
441471
));
442472
message =

tests/testsuite/lints/implicit_features/edition_2021_warn/stderr.term.svg

+1-1
Loading

tests/testsuite/lints/unused_optional_dependencies/edition_2024/stderr.term.svg

+1-1
Loading

tests/testsuite/lints/unused_optional_dependencies/renamed_deps/stderr.term.svg

+1-1
Loading

tests/testsuite/lints_table.rs

+4-4
Original file line numberDiff line numberDiff line change
@@ -852,7 +852,7 @@ warning: `im_a_teapot` is specified
852852
9 | im-a-teapot = true
853853
| ------------------
854854
|
855-
= note: `cargo::im_a_teapot` is set to `warn`
855+
= note: `cargo::im_a_teapot` is set to `warn` in `[lints]`
856856
[CHECKING] foo v0.0.1 ([CWD])
857857
[FINISHED] [..]
858858
",
@@ -892,7 +892,7 @@ warning: `im_a_teapot` is specified
892892
9 | im-a-teapot = true
893893
| ------------------
894894
|
895-
= note: `cargo::im_a_teapot` is set to `warn`
895+
= note: `cargo::im_a_teapot` is set to `warn` in `[lints]`
896896
[CHECKING] foo v0.0.1 ([CWD])
897897
[FINISHED] [..]
898898
",
@@ -934,7 +934,7 @@ error: `im_a_teapot` is specified
934934
9 | im-a-teapot = true
935935
| ^^^^^^^^^^^^^^^^^^
936936
|
937-
= note: `cargo::im_a_teapot` is set to `forbid`
937+
= note: `cargo::im_a_teapot` is set to `forbid` in `[lints]`
938938
",
939939
)
940940
.run();
@@ -977,7 +977,7 @@ error: `im_a_teapot` is specified
977977
13 | im-a-teapot = true
978978
| ^^^^^^^^^^^^^^^^^^
979979
|
980-
= note: `cargo::im_a_teapot` is set to `forbid`
980+
= note: `cargo::im_a_teapot` is set to `forbid` in `[workspace.lints]`
981981
",
982982
)
983983
.run();

0 commit comments

Comments
 (0)