mirror of https://github.com/astral-sh/ruff
Move rule-enabled checks to local logic, extract some bits
This commit is contained in:
parent
e19ddb6e15
commit
f48d4a437b
|
|
@ -1,7 +1,7 @@
|
|||
use ruff_macros::{ViolationMetadata, derive_message_formats};
|
||||
|
||||
use crate::AlwaysFixableViolation;
|
||||
use crate::suppression::{InvalidSuppressionKind, ParseErrorKind};
|
||||
use crate::{AlwaysFixableViolation, Violation};
|
||||
|
||||
/// ## What it does
|
||||
/// Checks for invalid suppression comments
|
||||
|
|
|
|||
|
|
@ -163,16 +163,7 @@ impl Suppressions {
|
|||
}
|
||||
|
||||
pub(crate) fn check_suppressions(&self, context: &LintContext, locator: &Locator) {
|
||||
// TODO: wrap these around relevant bits below
|
||||
if !context.any_rule_enabled(&[
|
||||
Rule::UnusedNOQA,
|
||||
Rule::InvalidRuleCode,
|
||||
Rule::InvalidSuppressionComment,
|
||||
Rule::UnmatchedSuppressionComment,
|
||||
]) {
|
||||
return;
|
||||
}
|
||||
|
||||
if context.is_rule_enabled(Rule::UnusedNOQA) {
|
||||
let unused = self
|
||||
.valid
|
||||
.iter()
|
||||
|
|
@ -183,29 +174,8 @@ impl Suppressions {
|
|||
continue; // TODO: invalid code
|
||||
};
|
||||
for comment in &suppression.comments {
|
||||
let mut range = comment.range;
|
||||
let edit = if comment.codes.len() == 1 {
|
||||
delete_comment(comment.range, locator)
|
||||
} else {
|
||||
let code_index = comment
|
||||
.codes
|
||||
.iter()
|
||||
.position(|range| locator.slice(range) == suppression.code)
|
||||
.unwrap();
|
||||
range = comment.codes[code_index];
|
||||
let code_range = if code_index < (comment.codes.len() - 1) {
|
||||
TextRange::new(
|
||||
comment.codes[code_index].start(),
|
||||
comment.codes[code_index + 1].start(),
|
||||
)
|
||||
} else {
|
||||
TextRange::new(
|
||||
comment.codes[code_index - 1].end(),
|
||||
comment.codes[code_index].end(),
|
||||
)
|
||||
};
|
||||
Edit::range_deletion(code_range)
|
||||
};
|
||||
let (range, edit) =
|
||||
Suppressions::delete_code_or_comment(locator, suppression, comment);
|
||||
|
||||
let codes = if context.is_rule_enabled(rule) {
|
||||
UnusedCodes {
|
||||
|
|
@ -230,24 +200,36 @@ impl Suppressions {
|
|||
}
|
||||
}
|
||||
|
||||
for error in &self.errors {
|
||||
// treat comments with no codes as unused suppression
|
||||
let mut diagnostic = if error.kind == ParseErrorKind::MissingCodes {
|
||||
context.report_diagnostic(
|
||||
for error in self
|
||||
.errors
|
||||
.iter()
|
||||
.filter(|error| error.kind == ParseErrorKind::MissingCodes)
|
||||
{
|
||||
let mut diagnostic = context.report_diagnostic(
|
||||
UnusedNOQA {
|
||||
codes: Some(UnusedCodes::default()),
|
||||
kind: UnusedNOQAKind::Suppression,
|
||||
},
|
||||
error.range,
|
||||
)
|
||||
} else {
|
||||
context.report_diagnostic(
|
||||
);
|
||||
diagnostic.set_fix(Fix::safe_edit(delete_comment(error.range, locator)));
|
||||
}
|
||||
}
|
||||
|
||||
if context.is_rule_enabled(Rule::InvalidSuppressionComment) {
|
||||
// missing codes already handled above, report the rest as invalid comments
|
||||
for error in self
|
||||
.errors
|
||||
.iter()
|
||||
.filter(|error| error.kind != ParseErrorKind::MissingCodes)
|
||||
{
|
||||
let mut diagnostic = context.report_diagnostic(
|
||||
InvalidSuppressionComment {
|
||||
kind: InvalidSuppressionCommentKind::Error(error.kind),
|
||||
},
|
||||
error.range,
|
||||
)
|
||||
};
|
||||
);
|
||||
diagnostic.set_fix(Fix::safe_edit(delete_comment(error.range, locator)));
|
||||
}
|
||||
|
||||
|
|
@ -263,8 +245,10 @@ impl Suppressions {
|
|||
locator,
|
||||
)));
|
||||
}
|
||||
}
|
||||
|
||||
let unmatched = self
|
||||
if context.is_rule_enabled(Rule::UnmatchedSuppressionComment) {
|
||||
for range in self
|
||||
.valid
|
||||
.iter()
|
||||
.filter(|suppression| {
|
||||
|
|
@ -272,11 +256,42 @@ impl Suppressions {
|
|||
&& suppression.comments[0].action == SuppressionAction::Disable
|
||||
})
|
||||
.map(|suppression| suppression.comments[0].range)
|
||||
.collect::<FxHashSet<TextRange>>();
|
||||
for range in unmatched {
|
||||
.collect::<FxHashSet<TextRange>>()
|
||||
{
|
||||
context.report_diagnostic(UnmatchedSuppressionComment {}, range);
|
||||
}
|
||||
}
|
||||
}
|
||||
fn delete_code_or_comment(
|
||||
locator: &Locator<'_>,
|
||||
suppression: &Suppression,
|
||||
comment: &SuppressionComment,
|
||||
) -> (TextRange, Edit) {
|
||||
let mut range = comment.range;
|
||||
let edit = if comment.codes.len() == 1 {
|
||||
delete_comment(comment.range, locator)
|
||||
} else {
|
||||
let code_index = comment
|
||||
.codes
|
||||
.iter()
|
||||
.position(|range| locator.slice(range) == suppression.code)
|
||||
.unwrap();
|
||||
range = comment.codes[code_index];
|
||||
let code_range = if code_index < (comment.codes.len() - 1) {
|
||||
TextRange::new(
|
||||
comment.codes[code_index].start(),
|
||||
comment.codes[code_index + 1].start(),
|
||||
)
|
||||
} else {
|
||||
TextRange::new(
|
||||
comment.codes[code_index - 1].end(),
|
||||
comment.codes[code_index].end(),
|
||||
)
|
||||
};
|
||||
Edit::range_deletion(code_range)
|
||||
};
|
||||
(range, edit)
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Default)]
|
||||
|
|
|
|||
Loading…
Reference in New Issue