Skip to content

Commit 05d4958

Browse files
committed
(fix) RUF100 to detect unused file-level noqa directives
by implementing a check on them. There is different handling necessary as the matches array is prepopulated for file level directives.
1 parent 6b02c39 commit 05d4958

File tree

1 file changed

+32
-11
lines changed
  • crates/ruff_linter/src/checkers

1 file changed

+32
-11
lines changed

crates/ruff_linter/src/checkers/noqa.rs

Lines changed: 32 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -110,10 +110,20 @@ pub(crate) fn check_noqa(
110110
&& !exemption.includes(Rule::UnusedNOQA)
111111
&& !per_file_ignores.contains(Rule::UnusedNOQA)
112112
{
113-
for line in noqa_directives.lines() {
114-
match &line.directive {
113+
let directives = noqa_directives
114+
.lines()
115+
.iter()
116+
.map(|line| (&line.directive, &line.matches, false))
117+
.chain(
118+
file_noqa_directives
119+
.lines()
120+
.iter()
121+
.map(|line| (&line.parsed_file_exemption, &line.matches, true)),
122+
);
123+
for (directive, matches, is_file_level) in directives {
124+
match directive {
115125
Directive::All(directive) => {
116-
if line.matches.is_empty() {
126+
if matches.is_empty() {
117127
let edit = delete_comment(directive.range(), locator);
118128
let mut diagnostic =
119129
Diagnostic::new(UnusedNOQA { codes: None }, directive.range());
@@ -139,15 +149,21 @@ pub(crate) fn check_noqa(
139149

140150
if !seen_codes.insert(original_code) {
141151
duplicated_codes.push(original_code);
142-
} else if line.matches.iter().any(|match_| *match_ == code)
143-
|| settings
152+
} else {
153+
let is_code_used = if is_file_level {
154+
diagnostics
155+
.iter()
156+
.any(|diag| diag.kind.rule().noqa_code() == code)
157+
} else {
158+
matches.iter().any(|match_| *match_ == code)
159+
} || settings
144160
.external
145161
.iter()
146-
.any(|external| code.starts_with(external))
147-
{
148-
valid_codes.push(original_code);
149-
} else {
150-
if let Ok(rule) = Rule::from_code(code) {
162+
.any(|external| code.starts_with(external));
163+
164+
if is_code_used {
165+
valid_codes.push(original_code);
166+
} else if let Ok(rule) = Rule::from_code(code) {
151167
if settings.rules.enabled(rule) {
152168
unmatched_codes.push(original_code);
153169
} else {
@@ -171,8 +187,13 @@ pub(crate) fn check_noqa(
171187
let edit = if valid_codes.is_empty() {
172188
delete_comment(directive.range(), locator)
173189
} else {
190+
let prefix = if is_file_level {
191+
"# ruff: noqa: "
192+
} else {
193+
"# noqa: "
194+
};
174195
Edit::range_replacement(
175-
format!("# noqa: {}", valid_codes.join(", ")),
196+
format!("{}{}", prefix, valid_codes.join(", ")),
176197
directive.range(),
177198
)
178199
};

0 commit comments

Comments
 (0)