Skip to main content

wowlab_tidy/languages/rust/rules/hygiene/
deny_warnings.rs

1use crate::{Example, FileCtx, Fix, Violation, infra::parse, violation};
2
3#[rustfmt::skip]
4const EXAMPLES: &[Example] = &[
5    Example {
6        label: "deny warnings",
7        code: "#![deny(warnings)]",
8        pass: false,
9    },
10    Example {
11        label: "deny unused",
12        code: "#![deny(unused)]",
13        pass: true,
14    },
15    Example {
16        label: "comment with deny warnings",
17        code: "// #![deny(warnings)]",
18        pass: true,
19    },
20];
21
22crate::line_rule!(
23    deny_warnings,
24    "Ban `#![deny(warnings)]` — breaks on compiler upgrades.",
25    "deny(warnings) causes builds to break on compiler upgrades when new warnings are introduced. Use specific lint names.",
26    Medium,
27    fix_deny_warnings,
28);
29
30fn check_deny_warnings(ctx: &FileCtx<'_>) -> Vec<Violation> {
31    let mut out = Vec::new();
32
33    for (i, line) in ctx.lines.iter().enumerate() {
34        let lineno = i + 1;
35        let trimmed = line.trim();
36
37        if parse::is_comment(trimmed) {
38            continue;
39        }
40
41        if crate::infra::helpers::contains_outside_strings(line, "deny(warnings)") {
42            out.push(violation(
43                ctx.rel,
44                lineno,
45                "`#![deny(warnings)]` breaks on compiler upgrades (use specific lint names)",
46            ));
47        }
48    }
49
50    out
51}
52
53fn fix_deny_warnings(ctx: &FileCtx<'_>, v: &Violation) -> Option<Fix> {
54    let line = ctx.line(v.line)?;
55
56    (line.trim() == "#![deny(warnings)]").then(|| Fix::delete(v.line, v.line))
57}
58
59crate::tidy_test!(check_deny_warnings, {
60    crate::example_tests!(EXAMPLES, check_deny_warnings);
61    crate::fix_tests!(line, check_deny_warnings, fix_deny_warnings);
62});