Skip to content

Commit

Permalink
feat(lints): Add where lint level was set
Browse files Browse the repository at this point in the history
  • Loading branch information
Muscraft committed Apr 24, 2024
1 parent 426d526 commit a1d6135
Show file tree
Hide file tree
Showing 5 changed files with 54 additions and 24 deletions.
64 changes: 47 additions & 17 deletions src/cargo/util/lints.rs
Original file line number Diff line number Diff line change
Expand Up @@ -69,28 +69,36 @@ pub trait LevelTrait {
pkg_lints: &TomlToolLints,
ws_lints: &TomlToolLints,
edition: Edition,
) -> (LintLevel, i8) {
let unspecified_level = if let Some(level) = self
) -> (LintLevel, LintLevelReason, i8) {
let (unspecified_level, reason) = if let Some(level) = self
.edition_lint_opts()
.filter(|(e, _)| edition >= *e)
.map(|(_, l)| l)
{
level
(level, LintLevelReason::Edition(edition))
} else {
self.default_level()
(self.default_level(), LintLevelReason::Default)
};

// Don't allow the group to be overridden if the level is `Forbid`
if unspecified_level == LintLevel::Forbid {
return (unspecified_level, 0);
return (unspecified_level, reason, 0);
}

if let Some(defined_level) = pkg_lints.get(self.name()) {
(defined_level.level().into(), defined_level.priority())
(
defined_level.level().into(),
LintLevelReason::Package,
defined_level.priority(),
)
} else if let Some(defined_level) = ws_lints.get(self.name()) {
(defined_level.level().into(), defined_level.priority())
(
defined_level.level().into(),
LintLevelReason::Workspace,
defined_level.priority(),
)
} else {
(unspecified_level, 0)
(unspecified_level, reason, 0)
}
}
}
Expand Down Expand Up @@ -153,16 +161,16 @@ impl Lint {
lints: &TomlToolLints,
ws_lints: &TomlToolLints,
edition: Edition,
) -> LintLevel {
) -> (LintLevel, LintLevelReason) {
self.groups
.iter()
.map(|g| (g.name, g.level_priority(lints, ws_lints, edition)))
.chain(std::iter::once((
self.name,
self.level_priority(lints, ws_lints, edition),
)))
.max_by_key(|(n, (l, p))| (l == &LintLevel::Forbid, *p, std::cmp::Reverse(*n)))
.map(|(_, (l, _))| l)
.max_by_key(|(n, (l, _, p))| (l == &LintLevel::Forbid, *p, std::cmp::Reverse(*n)))
.map(|(_, (l, r, _))| (l, r))
.unwrap()
}
}
Expand Down Expand Up @@ -208,6 +216,25 @@ impl From<TomlLintLevel> for LintLevel {
}
}

#[derive(Copy, Clone, Debug)]
pub enum LintLevelReason {
Default,
Edition(Edition),
Package,
Workspace,
}

impl Display for LintLevelReason {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
LintLevelReason::Default => write!(f, "by default"),
LintLevelReason::Edition(edition) => write!(f, "in edition {}", edition),
LintLevelReason::Package => write!(f, "in `[lints]`"),
LintLevelReason::Workspace => write!(f, "in `[workspace.lints]`"),
}
}
}

const IM_A_TEAPOT: Lint = Lint {
name: "im_a_teapot",
desc: "`im_a_teapot` is specified",
Expand All @@ -225,7 +252,7 @@ pub fn check_im_a_teapot(
gctx: &GlobalContext,
) -> CargoResult<()> {
let manifest = pkg.manifest();
let lint_level = IM_A_TEAPOT.level(pkg_lints, ws_lints, manifest.edition());
let (lint_level, reason) = IM_A_TEAPOT.level(pkg_lints, ws_lints, manifest.edition());
if lint_level == LintLevel::Allow {
return Ok(());
}
Expand All @@ -240,7 +267,10 @@ pub fn check_im_a_teapot(
}
let level = lint_level.to_diagnostic_level();
let manifest_path = rel_cwd_manifest_path(path, gctx);
let emitted_reason = format!("`cargo::{}` is set to `{lint_level}`", IM_A_TEAPOT.name);
let emitted_reason = format!(
"`cargo::{}` is set to `{lint_level}` {reason}",
IM_A_TEAPOT.name
);

let key_span = get_span(manifest.document(), &["package", "im-a-teapot"], false).unwrap();
let value_span = get_span(manifest.document(), &["package", "im-a-teapot"], true).unwrap();
Expand Down Expand Up @@ -300,7 +330,7 @@ pub fn check_implicit_features(
return Ok(());
}

let lint_level = IMPLICIT_FEATURES.level(pkg_lints, ws_lints, edition);
let (lint_level, reason) = IMPLICIT_FEATURES.level(pkg_lints, ws_lints, edition);
if lint_level == LintLevel::Allow {
return Ok(());
}
Expand Down Expand Up @@ -345,7 +375,7 @@ pub fn check_implicit_features(
);
if emitted_source.is_none() {
emitted_source = Some(format!(
"`cargo::{}` is set to `{lint_level}`",
"`cargo::{}` is set to `{lint_level}` {reason}",
IMPLICIT_FEATURES.name
));
message = message.footer(Level::Note.title(emitted_source.as_ref().unwrap()));
Expand Down Expand Up @@ -383,7 +413,7 @@ pub fn unused_dependencies(
return Ok(());
}

let lint_level = UNUSED_OPTIONAL_DEPENDENCY.level(pkg_lints, ws_lints, edition);
let (lint_level, reason) = UNUSED_OPTIONAL_DEPENDENCY.level(pkg_lints, ws_lints, edition);
if lint_level == LintLevel::Allow {
return Ok(());
}
Expand Down Expand Up @@ -449,7 +479,7 @@ pub fn unused_dependencies(
);
if emitted_source.is_none() {
emitted_source = Some(format!(
"`cargo::{}` is set to `{lint_level}`",
"`cargo::{}` is set to `{lint_level}` {reason}",
UNUSED_OPTIONAL_DEPENDENCY.name
));
message =
Expand Down
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
8 changes: 4 additions & 4 deletions tests/testsuite/lints_table.rs
Original file line number Diff line number Diff line change
Expand Up @@ -852,7 +852,7 @@ warning: `im_a_teapot` is specified
9 | im-a-teapot = true
| ------------------
|
= note: `cargo::im_a_teapot` is set to `warn`
= note: `cargo::im_a_teapot` is set to `warn` in `[lints]`
[CHECKING] foo v0.0.1 ([CWD])
[FINISHED] [..]
",
Expand Down Expand Up @@ -892,7 +892,7 @@ warning: `im_a_teapot` is specified
9 | im-a-teapot = true
| ------------------
|
= note: `cargo::im_a_teapot` is set to `warn`
= note: `cargo::im_a_teapot` is set to `warn` in `[lints]`
[CHECKING] foo v0.0.1 ([CWD])
[FINISHED] [..]
",
Expand Down Expand Up @@ -934,7 +934,7 @@ error: `im_a_teapot` is specified
9 | im-a-teapot = true
| ^^^^^^^^^^^^^^^^^^
|
= note: `cargo::im_a_teapot` is set to `forbid`
= note: `cargo::im_a_teapot` is set to `forbid` in `[lints]`
",
)
.run();
Expand Down Expand Up @@ -977,7 +977,7 @@ error: `im_a_teapot` is specified
13 | im-a-teapot = true
| ^^^^^^^^^^^^^^^^^^
|
= note: `cargo::im_a_teapot` is set to `forbid`
= note: `cargo::im_a_teapot` is set to `forbid` in `[workspace.lints]`
",
)
.run();
Expand Down

0 comments on commit a1d6135

Please sign in to comment.