Skip to content

Commit b83c0a4

Browse files
committed
refactor(cargo-lints): Cleanup getting the level for a lint
1 parent 52dae0c commit b83c0a4

File tree

1 file changed

+46
-30
lines changed

1 file changed

+46
-30
lines changed

src/cargo/util/lints.rs

Lines changed: 46 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -86,39 +86,27 @@ pub struct Lint {
8686

8787
impl Lint {
8888
pub fn level(&self, lints: &TomlToolLints, edition: Edition) -> LintLevel {
89-
let edition_level = self
90-
.edition_lint_opts
91-
.filter(|(e, _)| edition >= *e)
92-
.map(|(_, l)| l);
93-
94-
if self.default_level == LintLevel::Forbid || edition_level == Some(LintLevel::Forbid) {
95-
return LintLevel::Forbid;
96-
}
97-
98-
let level = self
99-
.groups
89+
self.groups
10090
.iter()
101-
.map(|g| g.name)
102-
.chain(std::iter::once(self.name))
103-
.filter_map(|n| lints.get(n).map(|l| (n, l)))
104-
.max_by_key(|(n, l)| {
91+
.map(|g| {
10592
(
106-
l.level() == TomlLintLevel::Forbid,
107-
l.priority(),
108-
std::cmp::Reverse(*n),
93+
g.name,
94+
level_priority(g.name, g.default_level, g.edition_lint_opts, lints, edition),
10995
)
110-
});
111-
112-
match level {
113-
Some((_, toml_lint)) => toml_lint.level().into(),
114-
None => {
115-
if let Some(level) = edition_level {
116-
level
117-
} else {
118-
self.default_level
119-
}
120-
}
121-
}
96+
})
97+
.chain(std::iter::once((
98+
self.name,
99+
level_priority(
100+
self.name,
101+
self.default_level,
102+
self.edition_lint_opts,
103+
lints,
104+
edition,
105+
),
106+
)))
107+
.max_by_key(|(n, (l, p))| (l == &LintLevel::Forbid, *p, std::cmp::Reverse(*n)))
108+
.map(|(_, (l, _))| l)
109+
.unwrap()
122110
}
123111
}
124112

@@ -163,6 +151,34 @@ impl From<TomlLintLevel> for LintLevel {
163151
}
164152
}
165153

154+
fn level_priority(
155+
name: &str,
156+
default_level: LintLevel,
157+
edition_lint_opts: Option<(Edition, LintLevel)>,
158+
lints: &TomlToolLints,
159+
edition: Edition,
160+
) -> (LintLevel, i8) {
161+
let unspecified_level = if let Some(level) = edition_lint_opts
162+
.filter(|(e, _)| edition >= *e)
163+
.map(|(_, l)| l)
164+
{
165+
level
166+
} else {
167+
default_level
168+
};
169+
170+
// Don't allow the group to be overridden if the level is `Forbid`
171+
if unspecified_level == LintLevel::Forbid {
172+
return (unspecified_level, 0);
173+
}
174+
175+
if let Some(defined_level) = lints.get(name) {
176+
(defined_level.level().into(), defined_level.priority())
177+
} else {
178+
(unspecified_level, 0)
179+
}
180+
}
181+
166182
const IM_A_TEAPOT: Lint = Lint {
167183
name: "im_a_teapot",
168184
desc: "`im_a_teapot` is specified",

0 commit comments

Comments
 (0)