Rename `ruff_linter::Diagnostic` to `OldDiagnostic` (#18355)

Summary
--

It's a bit late in the refactoring process, but I think there are still
a couple of PRs left before getting rid of this type entirely, so I
thought it would still be worth doing.

This PR is just a quick rename with no other changes.

Test Plan
--

Existing tests
This commit is contained in:
Brent Westbrook 2025-05-29 15:04:31 -04:00 committed by GitHub
parent 9d3cad95bc
commit 2c3f091e0e
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
67 changed files with 316 additions and 304 deletions

View File

@ -12,7 +12,7 @@ use rayon::prelude::*;
use rustc_hash::FxHashMap; use rustc_hash::FxHashMap;
use ruff_db::panic::catch_unwind; use ruff_db::panic::catch_unwind;
use ruff_linter::Diagnostic; use ruff_linter::OldDiagnostic;
use ruff_linter::message::Message; use ruff_linter::message::Message;
use ruff_linter::package::PackageRoot; use ruff_linter::package::PackageRoot;
use ruff_linter::registry::Rule; use ruff_linter::registry::Rule;
@ -131,7 +131,7 @@ pub(crate) fn check(
Diagnostics::new( Diagnostics::new(
vec![Message::from_diagnostic( vec![Message::from_diagnostic(
Diagnostic::new(IOError { message }, TextRange::default()), OldDiagnostic::new(IOError { message }, TextRange::default()),
dummy, dummy,
None, None,
)], )],

View File

@ -12,7 +12,7 @@ use colored::Colorize;
use log::{debug, warn}; use log::{debug, warn};
use rustc_hash::FxHashMap; use rustc_hash::FxHashMap;
use ruff_linter::Diagnostic; use ruff_linter::OldDiagnostic;
use ruff_linter::codes::Rule; use ruff_linter::codes::Rule;
use ruff_linter::linter::{FixTable, FixerResult, LinterResult, ParseSource, lint_fix, lint_only}; use ruff_linter::linter::{FixTable, FixerResult, LinterResult, ParseSource, lint_fix, lint_only};
use ruff_linter::message::Message; use ruff_linter::message::Message;
@ -64,7 +64,7 @@ impl Diagnostics {
let source_file = SourceFileBuilder::new(name, "").finish(); let source_file = SourceFileBuilder::new(name, "").finish();
Self::new( Self::new(
vec![Message::from_diagnostic( vec![Message::from_diagnostic(
Diagnostic::new( OldDiagnostic::new(
IOError { IOError {
message: err.to_string(), message: err.to_string(),
}, },

View File

@ -73,7 +73,7 @@ use crate::rules::pyflakes::rules::{
use crate::rules::pylint::rules::{AwaitOutsideAsync, LoadBeforeGlobalDeclaration}; use crate::rules::pylint::rules::{AwaitOutsideAsync, LoadBeforeGlobalDeclaration};
use crate::rules::{flake8_pyi, flake8_type_checking, pyflakes, pyupgrade}; use crate::rules::{flake8_pyi, flake8_type_checking, pyflakes, pyupgrade};
use crate::settings::{LinterSettings, TargetVersion, flags}; use crate::settings::{LinterSettings, TargetVersion, flags};
use crate::{Diagnostic, Edit, Violation}; use crate::{Edit, OldDiagnostic, Violation};
use crate::{Locator, docstrings, noqa}; use crate::{Locator, docstrings, noqa};
mod analyze; mod analyze;
@ -225,7 +225,7 @@ pub(crate) struct Checker<'a> {
/// A set of deferred nodes to be analyzed after the AST traversal (e.g., `for` loops). /// A set of deferred nodes to be analyzed after the AST traversal (e.g., `for` loops).
analyze: deferred::Analyze, analyze: deferred::Analyze,
/// The cumulative set of diagnostics computed across all lint rules. /// The cumulative set of diagnostics computed across all lint rules.
diagnostics: RefCell<Vec<Diagnostic>>, diagnostics: RefCell<Vec<OldDiagnostic>>,
/// The list of names already seen by flake8-bugbear diagnostics, to avoid duplicate violations. /// The list of names already seen by flake8-bugbear diagnostics, to avoid duplicate violations.
flake8_bugbear_seen: RefCell<FxHashSet<TextRange>>, flake8_bugbear_seen: RefCell<FxHashSet<TextRange>>,
/// The end offset of the last visited statement. /// The end offset of the last visited statement.
@ -391,7 +391,7 @@ impl<'a> Checker<'a> {
) -> DiagnosticGuard<'chk, 'a> { ) -> DiagnosticGuard<'chk, 'a> {
DiagnosticGuard { DiagnosticGuard {
checker: self, checker: self,
diagnostic: Some(Diagnostic::new(kind, range)), diagnostic: Some(OldDiagnostic::new(kind, range)),
} }
} }
@ -405,7 +405,7 @@ impl<'a> Checker<'a> {
kind: T, kind: T,
range: TextRange, range: TextRange,
) -> Option<DiagnosticGuard<'chk, 'a>> { ) -> Option<DiagnosticGuard<'chk, 'a>> {
let diagnostic = Diagnostic::new(kind, range); let diagnostic = OldDiagnostic::new(kind, range);
if self.enabled(diagnostic.rule()) { if self.enabled(diagnostic.rule()) {
Some(DiagnosticGuard { Some(DiagnosticGuard {
checker: self, checker: self,
@ -2892,7 +2892,7 @@ impl<'a> Checker<'a> {
if self.semantic.global_scope().uses_star_imports() { if self.semantic.global_scope().uses_star_imports() {
if self.enabled(Rule::UndefinedLocalWithImportStarUsage) { if self.enabled(Rule::UndefinedLocalWithImportStarUsage) {
self.diagnostics.get_mut().push( self.diagnostics.get_mut().push(
Diagnostic::new( OldDiagnostic::new(
pyflakes::rules::UndefinedLocalWithImportStarUsage { pyflakes::rules::UndefinedLocalWithImportStarUsage {
name: name.to_string(), name: name.to_string(),
}, },
@ -2907,7 +2907,7 @@ impl<'a> Checker<'a> {
|| !self.path.ends_with("__init__.py") || !self.path.ends_with("__init__.py")
{ {
self.diagnostics.get_mut().push( self.diagnostics.get_mut().push(
Diagnostic::new( OldDiagnostic::new(
pyflakes::rules::UndefinedExport { pyflakes::rules::UndefinedExport {
name: name.to_string(), name: name.to_string(),
}, },
@ -2975,7 +2975,7 @@ pub(crate) fn check_ast(
cell_offsets: Option<&CellOffsets>, cell_offsets: Option<&CellOffsets>,
notebook_index: Option<&NotebookIndex>, notebook_index: Option<&NotebookIndex>,
target_version: TargetVersion, target_version: TargetVersion,
) -> (Vec<Diagnostic>, Vec<SemanticSyntaxError>) { ) -> (Vec<OldDiagnostic>, Vec<SemanticSyntaxError>) {
let module_path = package let module_path = package
.map(PackageRoot::path) .map(PackageRoot::path)
.and_then(|package| to_module_path(package, path)); .and_then(|package| to_module_path(package, path));
@ -3062,7 +3062,7 @@ pub(crate) struct DiagnosticGuard<'a, 'b> {
/// The diagnostic that we want to report. /// The diagnostic that we want to report.
/// ///
/// This is always `Some` until the `Drop` (or `defuse`) call. /// This is always `Some` until the `Drop` (or `defuse`) call.
diagnostic: Option<Diagnostic>, diagnostic: Option<OldDiagnostic>,
} }
impl DiagnosticGuard<'_, '_> { impl DiagnosticGuard<'_, '_> {
@ -3076,9 +3076,9 @@ impl DiagnosticGuard<'_, '_> {
} }
impl std::ops::Deref for DiagnosticGuard<'_, '_> { impl std::ops::Deref for DiagnosticGuard<'_, '_> {
type Target = Diagnostic; type Target = OldDiagnostic;
fn deref(&self) -> &Diagnostic { fn deref(&self) -> &OldDiagnostic {
// OK because `self.diagnostic` is only `None` within `Drop`. // OK because `self.diagnostic` is only `None` within `Drop`.
self.diagnostic.as_ref().unwrap() self.diagnostic.as_ref().unwrap()
} }
@ -3086,7 +3086,7 @@ impl std::ops::Deref for DiagnosticGuard<'_, '_> {
/// Return a mutable borrow of the diagnostic in this guard. /// Return a mutable borrow of the diagnostic in this guard.
impl std::ops::DerefMut for DiagnosticGuard<'_, '_> { impl std::ops::DerefMut for DiagnosticGuard<'_, '_> {
fn deref_mut(&mut self) -> &mut Diagnostic { fn deref_mut(&mut self) -> &mut OldDiagnostic {
// OK because `self.diagnostic` is only `None` within `Drop`. // OK because `self.diagnostic` is only `None` within `Drop`.
self.diagnostic.as_mut().unwrap() self.diagnostic.as_mut().unwrap()
} }

View File

@ -3,8 +3,8 @@ use std::path::Path;
use ruff_python_ast::PythonVersion; use ruff_python_ast::PythonVersion;
use ruff_python_trivia::CommentRanges; use ruff_python_trivia::CommentRanges;
use crate::Diagnostic;
use crate::Locator; use crate::Locator;
use crate::OldDiagnostic;
use crate::package::PackageRoot; use crate::package::PackageRoot;
use crate::preview::is_allow_nested_roots_enabled; use crate::preview::is_allow_nested_roots_enabled;
use crate::registry::Rule; use crate::registry::Rule;
@ -20,8 +20,8 @@ pub(crate) fn check_file_path(
comment_ranges: &CommentRanges, comment_ranges: &CommentRanges,
settings: &LinterSettings, settings: &LinterSettings,
target_version: PythonVersion, target_version: PythonVersion,
) -> Vec<Diagnostic> { ) -> Vec<OldDiagnostic> {
let mut diagnostics: Vec<Diagnostic> = vec![]; let mut diagnostics: Vec<OldDiagnostic> = vec![];
// flake8-no-pep420 // flake8-no-pep420
if settings.rules.enabled(Rule::ImplicitNamespacePackage) { if settings.rules.enabled(Rule::ImplicitNamespacePackage) {

View File

@ -7,8 +7,8 @@ use ruff_python_codegen::Stylist;
use ruff_python_index::Indexer; use ruff_python_index::Indexer;
use ruff_python_parser::Parsed; use ruff_python_parser::Parsed;
use crate::Diagnostic;
use crate::Locator; use crate::Locator;
use crate::OldDiagnostic;
use crate::directives::IsortDirectives; use crate::directives::IsortDirectives;
use crate::package::PackageRoot; use crate::package::PackageRoot;
use crate::registry::Rule; use crate::registry::Rule;
@ -28,7 +28,7 @@ pub(crate) fn check_imports(
source_type: PySourceType, source_type: PySourceType,
cell_offsets: Option<&CellOffsets>, cell_offsets: Option<&CellOffsets>,
target_version: PythonVersion, target_version: PythonVersion,
) -> Vec<Diagnostic> { ) -> Vec<OldDiagnostic> {
// Extract all import blocks from the AST. // Extract all import blocks from the AST.
let tracker = { let tracker = {
let mut tracker = let mut tracker =

View File

@ -4,8 +4,8 @@ use ruff_python_parser::{TokenKind, Tokens};
use ruff_source_file::LineRanges; use ruff_source_file::LineRanges;
use ruff_text_size::{Ranged, TextRange}; use ruff_text_size::{Ranged, TextRange};
use crate::Diagnostic;
use crate::Locator; use crate::Locator;
use crate::OldDiagnostic;
use crate::line_width::IndentWidth; use crate::line_width::IndentWidth;
use crate::registry::{AsRule, Rule}; use crate::registry::{AsRule, Rule};
use crate::rules::pycodestyle::rules::logical_lines::{ use crate::rules::pycodestyle::rules::logical_lines::{
@ -40,7 +40,7 @@ pub(crate) fn check_logical_lines(
indexer: &Indexer, indexer: &Indexer,
stylist: &Stylist, stylist: &Stylist,
settings: &LinterSettings, settings: &LinterSettings,
) -> Vec<Diagnostic> { ) -> Vec<OldDiagnostic> {
let mut context = LogicalLinesContext::new(settings); let mut context = LogicalLinesContext::new(settings);
let mut prev_line = None; let mut prev_line = None;
@ -196,7 +196,7 @@ pub(crate) fn check_logical_lines(
#[derive(Debug, Clone)] #[derive(Debug, Clone)]
pub(crate) struct LogicalLinesContext<'a> { pub(crate) struct LogicalLinesContext<'a> {
settings: &'a LinterSettings, settings: &'a LinterSettings,
diagnostics: Vec<Diagnostic>, diagnostics: Vec<OldDiagnostic>,
} }
impl<'a> LogicalLinesContext<'a> { impl<'a> LogicalLinesContext<'a> {
@ -207,7 +207,7 @@ impl<'a> LogicalLinesContext<'a> {
} }
} }
pub(crate) fn push_diagnostic(&mut self, diagnostic: Diagnostic) { pub(crate) fn push_diagnostic(&mut self, diagnostic: OldDiagnostic) {
if self.settings.rules.enabled(diagnostic.rule()) { if self.settings.rules.enabled(diagnostic.rule()) {
self.diagnostics.push(diagnostic); self.diagnostics.push(diagnostic);
} }

View File

@ -20,11 +20,11 @@ use crate::rules::pygrep_hooks;
use crate::rules::ruff; use crate::rules::ruff;
use crate::rules::ruff::rules::{UnusedCodes, UnusedNOQA}; use crate::rules::ruff::rules::{UnusedCodes, UnusedNOQA};
use crate::settings::LinterSettings; use crate::settings::LinterSettings;
use crate::{Diagnostic, Edit, Fix}; use crate::{Edit, Fix, OldDiagnostic};
#[expect(clippy::too_many_arguments)] #[expect(clippy::too_many_arguments)]
pub(crate) fn check_noqa( pub(crate) fn check_noqa(
diagnostics: &mut Vec<Diagnostic>, diagnostics: &mut Vec<OldDiagnostic>,
path: &Path, path: &Path,
locator: &Locator, locator: &Locator,
comment_ranges: &CommentRanges, comment_ranges: &CommentRanges,
@ -136,7 +136,7 @@ pub(crate) fn check_noqa(
if matches.is_empty() { if matches.is_empty() {
let edit = delete_comment(directive.range(), locator); let edit = delete_comment(directive.range(), locator);
let mut diagnostic = let mut diagnostic =
Diagnostic::new(UnusedNOQA { codes: None }, directive.range()); OldDiagnostic::new(UnusedNOQA { codes: None }, directive.range());
diagnostic.set_fix(Fix::safe_edit(edit)); diagnostic.set_fix(Fix::safe_edit(edit));
diagnostics.push(diagnostic); diagnostics.push(diagnostic);
@ -212,7 +212,7 @@ pub(crate) fn check_noqa(
directive.range(), directive.range(),
) )
}; };
let mut diagnostic = Diagnostic::new( let mut diagnostic = OldDiagnostic::new(
UnusedNOQA { UnusedNOQA {
codes: Some(UnusedCodes { codes: Some(UnusedCodes {
disabled: disabled_codes disabled: disabled_codes

View File

@ -5,8 +5,8 @@ use ruff_python_index::Indexer;
use ruff_source_file::UniversalNewlines; use ruff_source_file::UniversalNewlines;
use ruff_text_size::TextSize; use ruff_text_size::TextSize;
use crate::Diagnostic;
use crate::Locator; use crate::Locator;
use crate::OldDiagnostic;
use crate::registry::Rule; use crate::registry::Rule;
use crate::rules::flake8_copyright::rules::missing_copyright_notice; use crate::rules::flake8_copyright::rules::missing_copyright_notice;
use crate::rules::pycodestyle::rules::{ use crate::rules::pycodestyle::rules::{
@ -23,8 +23,8 @@ pub(crate) fn check_physical_lines(
indexer: &Indexer, indexer: &Indexer,
doc_lines: &[TextSize], doc_lines: &[TextSize],
settings: &LinterSettings, settings: &LinterSettings,
) -> Vec<Diagnostic> { ) -> Vec<OldDiagnostic> {
let mut diagnostics: Vec<Diagnostic> = vec![]; let mut diagnostics: Vec<OldDiagnostic> = vec![];
let enforce_doc_line_too_long = settings.rules.enabled(Rule::DocLineTooLong); let enforce_doc_line_too_long = settings.rules.enabled(Rule::DocLineTooLong);
let enforce_line_too_long = settings.rules.enabled(Rule::LineTooLong); let enforce_line_too_long = settings.rules.enabled(Rule::LineTooLong);

View File

@ -8,8 +8,8 @@ use ruff_python_codegen::Stylist;
use ruff_python_index::Indexer; use ruff_python_index::Indexer;
use ruff_python_parser::Tokens; use ruff_python_parser::Tokens;
use crate::Diagnostic;
use crate::Locator; use crate::Locator;
use crate::OldDiagnostic;
use crate::directives::TodoComment; use crate::directives::TodoComment;
use crate::registry::{AsRule, Rule}; use crate::registry::{AsRule, Rule};
use crate::rules::pycodestyle::rules::BlankLinesChecker; use crate::rules::pycodestyle::rules::BlankLinesChecker;
@ -29,8 +29,8 @@ pub(crate) fn check_tokens(
settings: &LinterSettings, settings: &LinterSettings,
source_type: PySourceType, source_type: PySourceType,
cell_offsets: Option<&CellOffsets>, cell_offsets: Option<&CellOffsets>,
) -> Vec<Diagnostic> { ) -> Vec<OldDiagnostic> {
let mut diagnostics: Vec<Diagnostic> = vec![]; let mut diagnostics: Vec<OldDiagnostic> = vec![];
let comment_ranges = indexer.comment_ranges(); let comment_ranges = indexer.comment_ranges();
if settings.rules.any_enabled(&[ if settings.rules.any_enabled(&[

View File

@ -8,7 +8,7 @@ use crate::violation::Violation;
use crate::{Fix, codes::Rule}; use crate::{Fix, codes::Rule};
#[derive(Debug, PartialEq, Eq, Clone)] #[derive(Debug, PartialEq, Eq, Clone)]
pub struct Diagnostic { pub struct OldDiagnostic {
/// The message body to display to the user, to explain the diagnostic. /// The message body to display to the user, to explain the diagnostic.
pub body: String, pub body: String,
/// The message to display to the user, to explain the suggested fix. /// The message to display to the user, to explain the suggested fix.
@ -20,7 +20,7 @@ pub struct Diagnostic {
pub(crate) rule: Rule, pub(crate) rule: Rule,
} }
impl Diagnostic { impl OldDiagnostic {
// TODO(brent) We temporarily allow this to avoid updating all of the call sites to add // TODO(brent) We temporarily allow this to avoid updating all of the call sites to add
// references. I expect this method to go away or change significantly with the rest of the // references. I expect this method to go away or change significantly with the rest of the
// diagnostic refactor, but if it still exists in this form at the end of the refactor, we // diagnostic refactor, but if it still exists in this form at the end of the refactor, we
@ -87,13 +87,13 @@ impl Diagnostic {
} }
} }
impl AsRule for Diagnostic { impl AsRule for OldDiagnostic {
fn rule(&self) -> Rule { fn rule(&self) -> Rule {
self.rule self.rule
} }
} }
impl Ranged for Diagnostic { impl Ranged for OldDiagnostic {
fn range(&self) -> TextRange { fn range(&self) -> TextRange {
self.range self.range
} }

View File

@ -607,7 +607,7 @@ mod tests {
add_to_dunder_all, make_redundant_alias, next_stmt_break, trailing_semicolon, add_to_dunder_all, make_redundant_alias, next_stmt_break, trailing_semicolon,
}; };
use crate::message::Message; use crate::message::Message;
use crate::{Diagnostic, Edit, Fix}; use crate::{Edit, Fix, OldDiagnostic};
/// Parse the given source using [`Mode::Module`] and return the first statement. /// Parse the given source using [`Mode::Module`] and return the first statement.
fn parse_first_stmt(source: &str) -> Result<Stmt> { fn parse_first_stmt(source: &str) -> Result<Stmt> {
@ -738,7 +738,7 @@ x = 1 \
let diag = { let diag = {
use crate::rules::pycodestyle::rules::MissingNewlineAtEndOfFile; use crate::rules::pycodestyle::rules::MissingNewlineAtEndOfFile;
let mut iter = edits.into_iter(); let mut iter = edits.into_iter();
let diag = Diagnostic::new( let diag = OldDiagnostic::new(
MissingNewlineAtEndOfFile, // The choice of rule here is arbitrary. MissingNewlineAtEndOfFile, // The choice of rule here is arbitrary.
TextRange::default(), TextRange::default(),
) )

View File

@ -163,7 +163,7 @@ mod tests {
use ruff_text_size::{Ranged, TextSize}; use ruff_text_size::{Ranged, TextSize};
use crate::Locator; use crate::Locator;
use crate::diagnostic::Diagnostic; use crate::diagnostic::OldDiagnostic;
use crate::fix::{FixResult, apply_fixes}; use crate::fix::{FixResult, apply_fixes};
use crate::message::Message; use crate::message::Message;
use crate::rules::pycodestyle::rules::MissingNewlineAtEndOfFile; use crate::rules::pycodestyle::rules::MissingNewlineAtEndOfFile;
@ -177,7 +177,7 @@ mod tests {
edit.into_iter() edit.into_iter()
.map(|edit| { .map(|edit| {
// The choice of rule here is arbitrary. // The choice of rule here is arbitrary.
let diagnostic = Diagnostic::new(MissingNewlineAtEndOfFile, edit.range()); let diagnostic = OldDiagnostic::new(MissingNewlineAtEndOfFile, edit.range());
Message::from_diagnostic( Message::from_diagnostic(
diagnostic.with_fix(Fix::safe_edit(edit)), diagnostic.with_fix(Fix::safe_edit(edit)),
SourceFileBuilder::new(filename, source).finish(), SourceFileBuilder::new(filename, source).finish(),

View File

@ -14,7 +14,7 @@ pub use rule_selector::RuleSelector;
pub use rule_selector::clap_completion::RuleSelectorParser; pub use rule_selector::clap_completion::RuleSelectorParser;
pub use rules::pycodestyle::rules::IOError; pub use rules::pycodestyle::rules::IOError;
pub use diagnostic::Diagnostic; pub use diagnostic::OldDiagnostic;
pub(crate) use ruff_diagnostics::{Applicability, Edit, Fix}; pub(crate) use ruff_diagnostics::{Applicability, Edit, Fix};
pub use violation::{AlwaysFixableViolation, FixAvailability, Violation, ViolationMetadata}; pub use violation::{AlwaysFixableViolation, FixAvailability, Violation, ViolationMetadata};

View File

@ -17,7 +17,7 @@ use ruff_python_parser::{ParseError, ParseOptions, Parsed, UnsupportedSyntaxErro
use ruff_source_file::SourceFileBuilder; use ruff_source_file::SourceFileBuilder;
use ruff_text_size::Ranged; use ruff_text_size::Ranged;
use crate::Diagnostic; use crate::OldDiagnostic;
use crate::checkers::ast::check_ast; use crate::checkers::ast::check_ast;
use crate::checkers::filesystem::check_file_path; use crate::checkers::filesystem::check_file_path;
use crate::checkers::imports::check_imports; use crate::checkers::imports::check_imports;
@ -438,7 +438,7 @@ pub fn add_noqa_to_path(
) )
} }
/// Generate a [`Message`] for each [`Diagnostic`] triggered by the given source /// Generate a [`Message`] for each [`OldDiagnostic`] triggered by the given source
/// code. /// code.
pub fn lint_only( pub fn lint_only(
path: &Path, path: &Path,
@ -503,7 +503,7 @@ pub fn lint_only(
/// Convert from diagnostics to messages. /// Convert from diagnostics to messages.
fn diagnostics_to_messages( fn diagnostics_to_messages(
diagnostics: Vec<Diagnostic>, diagnostics: Vec<OldDiagnostic>,
parse_errors: &[ParseError], parse_errors: &[ParseError],
unsupported_syntax_errors: &[UnsupportedSyntaxError], unsupported_syntax_errors: &[UnsupportedSyntaxError],
semantic_syntax_errors: &[SemanticSyntaxError], semantic_syntax_errors: &[SemanticSyntaxError],

View File

@ -27,7 +27,7 @@ use crate::Locator;
use crate::codes::NoqaCode; use crate::codes::NoqaCode;
use crate::logging::DisplayParseErrorType; use crate::logging::DisplayParseErrorType;
use crate::registry::Rule; use crate::registry::Rule;
use crate::{Diagnostic, Fix}; use crate::{Fix, OldDiagnostic};
mod azure; mod azure;
mod diff; mod diff;
@ -50,7 +50,7 @@ mod text;
/// `noqa` offsets. /// `noqa` offsets.
/// ///
/// For diagnostic messages, the [`db::Diagnostic`]'s primary message contains the /// For diagnostic messages, the [`db::Diagnostic`]'s primary message contains the
/// [`Diagnostic::body`], and the primary annotation optionally contains the suggestion accompanying /// [`OldDiagnostic::body`], and the primary annotation optionally contains the suggestion accompanying
/// a fix. The `db::Diagnostic::id` field contains the kebab-case lint name derived from the `Rule`. /// a fix. The `db::Diagnostic::id` field contains the kebab-case lint name derived from the `Rule`.
#[derive(Clone, Debug, PartialEq, Eq)] #[derive(Clone, Debug, PartialEq, Eq)]
pub struct Message { pub struct Message {
@ -113,13 +113,13 @@ impl Message {
} }
} }
/// Create a [`Message`] from the given [`Diagnostic`] corresponding to a rule violation. /// Create a [`Message`] from the given [`OldDiagnostic`] corresponding to a rule violation.
pub fn from_diagnostic( pub fn from_diagnostic(
diagnostic: Diagnostic, diagnostic: OldDiagnostic,
file: SourceFile, file: SourceFile,
noqa_offset: Option<TextSize>, noqa_offset: Option<TextSize>,
) -> Message { ) -> Message {
let Diagnostic { let OldDiagnostic {
body, body,
suggestion, suggestion,
range, range,

View File

@ -1233,7 +1233,7 @@ mod tests {
use crate::rules::pycodestyle::rules::{AmbiguousVariableName, UselessSemicolon}; use crate::rules::pycodestyle::rules::{AmbiguousVariableName, UselessSemicolon};
use crate::rules::pyflakes::rules::UnusedVariable; use crate::rules::pyflakes::rules::UnusedVariable;
use crate::rules::pyupgrade::rules::PrintfStringFormatting; use crate::rules::pyupgrade::rules::PrintfStringFormatting;
use crate::{Diagnostic, Edit}; use crate::{Edit, OldDiagnostic};
use crate::{Locator, generate_noqa_edits}; use crate::{Locator, generate_noqa_edits};
fn assert_lexed_ranges_match_slices( fn assert_lexed_ranges_match_slices(
@ -1253,7 +1253,7 @@ mod tests {
/// Create a [`Message`] with a placeholder filename and rule code from `diagnostic`. /// Create a [`Message`] with a placeholder filename and rule code from `diagnostic`.
fn message_from_diagnostic( fn message_from_diagnostic(
diagnostic: Diagnostic, diagnostic: OldDiagnostic,
path: impl AsRef<Path>, path: impl AsRef<Path>,
source: &str, source: &str,
) -> Message { ) -> Message {
@ -2842,7 +2842,7 @@ mod tests {
assert_eq!(count, 0); assert_eq!(count, 0);
assert_eq!(output, format!("{contents}")); assert_eq!(output, format!("{contents}"));
let messages = [Diagnostic::new( let messages = [OldDiagnostic::new(
UnusedVariable { UnusedVariable {
name: "x".to_string(), name: "x".to_string(),
}, },
@ -2865,11 +2865,11 @@ mod tests {
assert_eq!(output, "x = 1 # noqa: F841\n"); assert_eq!(output, "x = 1 # noqa: F841\n");
let messages = [ let messages = [
Diagnostic::new( OldDiagnostic::new(
AmbiguousVariableName("x".to_string()), AmbiguousVariableName("x".to_string()),
TextRange::new(TextSize::from(0), TextSize::from(0)), TextRange::new(TextSize::from(0), TextSize::from(0)),
), ),
Diagnostic::new( OldDiagnostic::new(
UnusedVariable { UnusedVariable {
name: "x".to_string(), name: "x".to_string(),
}, },
@ -2894,11 +2894,11 @@ mod tests {
assert_eq!(output, "x = 1 # noqa: E741, F841\n"); assert_eq!(output, "x = 1 # noqa: E741, F841\n");
let messages = [ let messages = [
Diagnostic::new( OldDiagnostic::new(
AmbiguousVariableName("x".to_string()), AmbiguousVariableName("x".to_string()),
TextRange::new(TextSize::from(0), TextSize::from(0)), TextRange::new(TextSize::from(0), TextSize::from(0)),
), ),
Diagnostic::new( OldDiagnostic::new(
UnusedVariable { UnusedVariable {
name: "x".to_string(), name: "x".to_string(),
}, },
@ -2936,7 +2936,7 @@ print(
) )
"#; "#;
let noqa_line_for = [TextRange::new(8.into(), 68.into())].into_iter().collect(); let noqa_line_for = [TextRange::new(8.into(), 68.into())].into_iter().collect();
let messages = [Diagnostic::new( let messages = [OldDiagnostic::new(
PrintfStringFormatting, PrintfStringFormatting,
TextRange::new(12.into(), 79.into()), TextRange::new(12.into(), 79.into()),
)] )]
@ -2968,7 +2968,7 @@ print(
foo; foo;
bar = bar =
"; ";
let messages = [Diagnostic::new( let messages = [OldDiagnostic::new(
UselessSemicolon, UselessSemicolon,
TextRange::new(4.into(), 5.into()), TextRange::new(4.into(), 5.into()),
)] )]

View File

@ -5,8 +5,8 @@ use ruff_text_size::{TextRange, TextSize};
use ruff_source_file::SourceFile; use ruff_source_file::SourceFile;
use crate::Diagnostic;
use crate::IOError; use crate::IOError;
use crate::OldDiagnostic;
use crate::message::Message; use crate::message::Message;
use crate::registry::Rule; use crate::registry::Rule;
use crate::rules::ruff::rules::InvalidPyprojectToml; use crate::rules::ruff::rules::InvalidPyprojectToml;
@ -29,7 +29,7 @@ pub fn lint_pyproject_toml(source_file: SourceFile, settings: &LinterSettings) -
source_file.name(), source_file.name(),
); );
if settings.rules.enabled(Rule::IOError) { if settings.rules.enabled(Rule::IOError) {
let diagnostic = Diagnostic::new(IOError { message }, TextRange::default()); let diagnostic = OldDiagnostic::new(IOError { message }, TextRange::default());
messages.push(Message::from_diagnostic(diagnostic, source_file, None)); messages.push(Message::from_diagnostic(diagnostic, source_file, None));
} else { } else {
warn!( warn!(
@ -51,7 +51,7 @@ pub fn lint_pyproject_toml(source_file: SourceFile, settings: &LinterSettings) -
if settings.rules.enabled(Rule::InvalidPyprojectToml) { if settings.rules.enabled(Rule::InvalidPyprojectToml) {
let toml_err = err.message().to_string(); let toml_err = err.message().to_string();
let diagnostic = Diagnostic::new(InvalidPyprojectToml { message: toml_err }, range); let diagnostic = OldDiagnostic::new(InvalidPyprojectToml { message: toml_err }, range);
messages.push(Message::from_diagnostic(diagnostic, source_file, None)); messages.push(Message::from_diagnostic(diagnostic, source_file, None));
} }

View File

@ -5,7 +5,7 @@ use ruff_text_size::TextRange;
use crate::Locator; use crate::Locator;
use crate::settings::LinterSettings; use crate::settings::LinterSettings;
use crate::{Diagnostic, Edit, Fix, FixAvailability, Violation}; use crate::{Edit, Fix, FixAvailability, OldDiagnostic, Violation};
use super::super::detection::comment_contains_code; use super::super::detection::comment_contains_code;
@ -47,7 +47,7 @@ impl Violation for CommentedOutCode {
/// ERA001 /// ERA001
pub(crate) fn commented_out_code( pub(crate) fn commented_out_code(
diagnostics: &mut Vec<Diagnostic>, diagnostics: &mut Vec<OldDiagnostic>,
locator: &Locator, locator: &Locator,
comment_ranges: &CommentRanges, comment_ranges: &CommentRanges,
settings: &LinterSettings, settings: &LinterSettings,
@ -65,7 +65,7 @@ pub(crate) fn commented_out_code(
// Verify that the comment is on its own line, and that it contains code. // Verify that the comment is on its own line, and that it contains code.
if is_own_line_comment(line) && comment_contains_code(line, &settings.task_tags[..]) { if is_own_line_comment(line) && comment_contains_code(line, &settings.task_tags[..]) {
let mut diagnostic = Diagnostic::new(CommentedOutCode, range); let mut diagnostic = OldDiagnostic::new(CommentedOutCode, range);
diagnostic.set_fix(Fix::display_only_edit(Edit::range_deletion( diagnostic.set_fix(Fix::display_only_edit(Edit::range_deletion(
locator.full_lines_range(range), locator.full_lines_range(range),
))); )));

View File

@ -8,7 +8,7 @@ use ruff_python_stdlib::sys::is_known_standard_library;
use ruff_text_size::TextRange; use ruff_text_size::TextRange;
use crate::settings::LinterSettings; use crate::settings::LinterSettings;
use crate::{Diagnostic, Violation}; use crate::{OldDiagnostic, Violation};
/// ## What it does /// ## What it does
/// Checks for modules that use the same names as Python standard-library /// Checks for modules that use the same names as Python standard-library
@ -69,7 +69,7 @@ pub(crate) fn stdlib_module_shadowing(
mut path: &Path, mut path: &Path,
settings: &LinterSettings, settings: &LinterSettings,
target_version: PythonVersion, target_version: PythonVersion,
) -> Option<Diagnostic> { ) -> Option<OldDiagnostic> {
if !PySourceType::try_from_path(path).is_some_and(PySourceType::is_py_file) { if !PySourceType::try_from_path(path).is_some_and(PySourceType::is_py_file) {
return None; return None;
} }
@ -107,7 +107,7 @@ pub(crate) fn stdlib_module_shadowing(
return None; return None;
} }
Some(Diagnostic::new( Some(OldDiagnostic::new(
StdlibModuleShadowing { StdlibModuleShadowing {
name: module_name.to_string(), name: module_name.to_string(),
}, },

View File

@ -5,7 +5,7 @@ use ruff_text_size::{Ranged, TextRange};
use crate::Locator; use crate::Locator;
use crate::{AlwaysFixableViolation, Violation}; use crate::{AlwaysFixableViolation, Violation};
use crate::{Diagnostic, Edit, Fix}; use crate::{Edit, Fix, OldDiagnostic};
/// Simplified token type. /// Simplified token type.
#[derive(Copy, Clone, PartialEq, Eq)] #[derive(Copy, Clone, PartialEq, Eq)]
@ -238,7 +238,7 @@ impl AlwaysFixableViolation for ProhibitedTrailingComma {
/// COM812, COM818, COM819 /// COM812, COM818, COM819
pub(crate) fn trailing_commas( pub(crate) fn trailing_commas(
diagnostics: &mut Vec<Diagnostic>, diagnostics: &mut Vec<OldDiagnostic>,
tokens: &Tokens, tokens: &Tokens,
locator: &Locator, locator: &Locator,
indexer: &Indexer, indexer: &Indexer,
@ -319,7 +319,7 @@ fn check_token(
prev_prev: SimpleToken, prev_prev: SimpleToken,
context: Context, context: Context,
locator: &Locator, locator: &Locator,
) -> Option<Diagnostic> { ) -> Option<OldDiagnostic> {
// Is it allowed to have a trailing comma before this token? // Is it allowed to have a trailing comma before this token?
let comma_allowed = token.ty == TokenType::ClosingBracket let comma_allowed = token.ty == TokenType::ClosingBracket
&& match context.ty { && match context.ty {
@ -352,7 +352,7 @@ fn check_token(
}; };
if comma_prohibited { if comma_prohibited {
let mut diagnostic = Diagnostic::new(ProhibitedTrailingComma, prev.range()); let mut diagnostic = OldDiagnostic::new(ProhibitedTrailingComma, prev.range());
diagnostic.set_fix(Fix::safe_edit(Edit::range_deletion(diagnostic.range()))); diagnostic.set_fix(Fix::safe_edit(Edit::range_deletion(diagnostic.range())));
return Some(diagnostic); return Some(diagnostic);
} }
@ -361,7 +361,7 @@ fn check_token(
// Approximation: any comma followed by a statement-ending newline. // Approximation: any comma followed by a statement-ending newline.
let bare_comma_prohibited = prev.ty == TokenType::Comma && token.ty == TokenType::Newline; let bare_comma_prohibited = prev.ty == TokenType::Comma && token.ty == TokenType::Newline;
if bare_comma_prohibited { if bare_comma_prohibited {
return Some(Diagnostic::new(TrailingCommaOnBareTuple, prev.range())); return Some(OldDiagnostic::new(TrailingCommaOnBareTuple, prev.range()));
} }
if !comma_allowed { if !comma_allowed {
@ -383,7 +383,7 @@ fn check_token(
); );
if comma_required { if comma_required {
let mut diagnostic = let mut diagnostic =
Diagnostic::new(MissingTrailingComma, TextRange::empty(prev_prev.end())); OldDiagnostic::new(MissingTrailingComma, TextRange::empty(prev_prev.end()));
// Create a replacement that includes the final bracket (or other token), // Create a replacement that includes the final bracket (or other token),
// rather than just inserting a comma at the end. This prevents the UP034 fix // rather than just inserting a comma at the end. This prevents the UP034 fix
// removing any brackets in the same linter pass - doing both at the same time could // removing any brackets in the same linter pass - doing both at the same time could

View File

@ -3,7 +3,7 @@ use ruff_text_size::{TextRange, TextSize};
use crate::Locator; use crate::Locator;
use crate::settings::LinterSettings; use crate::settings::LinterSettings;
use crate::{Diagnostic, Violation}; use crate::{OldDiagnostic, Violation};
/// ## What it does /// ## What it does
/// Checks for the absence of copyright notices within Python files. /// Checks for the absence of copyright notices within Python files.
@ -32,7 +32,7 @@ impl Violation for MissingCopyrightNotice {
pub(crate) fn missing_copyright_notice( pub(crate) fn missing_copyright_notice(
locator: &Locator, locator: &Locator,
settings: &LinterSettings, settings: &LinterSettings,
) -> Option<Diagnostic> { ) -> Option<OldDiagnostic> {
// Ignore files that are too small to contain a copyright notice. // Ignore files that are too small to contain a copyright notice.
if locator.len() < settings.flake8_copyright.min_file_size { if locator.len() < settings.flake8_copyright.min_file_size {
return None; return None;
@ -54,7 +54,7 @@ pub(crate) fn missing_copyright_notice(
} }
} }
Some(Diagnostic::new( Some(OldDiagnostic::new(
MissingCopyrightNotice, MissingCopyrightNotice,
TextRange::default(), TextRange::default(),
)) ))

View File

@ -7,8 +7,8 @@ pub(crate) use shebang_missing_python::*;
pub(crate) use shebang_not_executable::*; pub(crate) use shebang_not_executable::*;
pub(crate) use shebang_not_first_line::*; pub(crate) use shebang_not_first_line::*;
use crate::Diagnostic;
use crate::Locator; use crate::Locator;
use crate::OldDiagnostic;
use crate::codes::Rule; use crate::codes::Rule;
use crate::comments::shebang::ShebangDirective; use crate::comments::shebang::ShebangDirective;
use crate::settings::LinterSettings; use crate::settings::LinterSettings;
@ -20,7 +20,7 @@ mod shebang_not_executable;
mod shebang_not_first_line; mod shebang_not_first_line;
pub(crate) fn from_tokens( pub(crate) fn from_tokens(
diagnostics: &mut Vec<Diagnostic>, diagnostics: &mut Vec<OldDiagnostic>,
path: &Path, path: &Path,
locator: &Locator, locator: &Locator,
comment_ranges: &CommentRanges, comment_ranges: &CommentRanges,

View File

@ -3,7 +3,7 @@ use ruff_python_trivia::is_python_whitespace;
use ruff_text_size::{TextRange, TextSize}; use ruff_text_size::{TextRange, TextSize};
use crate::Locator; use crate::Locator;
use crate::{AlwaysFixableViolation, Diagnostic, Edit, Fix}; use crate::{AlwaysFixableViolation, Edit, Fix, OldDiagnostic};
/// ## What it does /// ## What it does
/// Checks for whitespace before a shebang directive. /// Checks for whitespace before a shebang directive.
@ -47,7 +47,7 @@ impl AlwaysFixableViolation for ShebangLeadingWhitespace {
pub(crate) fn shebang_leading_whitespace( pub(crate) fn shebang_leading_whitespace(
range: TextRange, range: TextRange,
locator: &Locator, locator: &Locator,
) -> Option<Diagnostic> { ) -> Option<OldDiagnostic> {
// If the shebang is at the beginning of the file, abort. // If the shebang is at the beginning of the file, abort.
if range.start() == TextSize::from(0) { if range.start() == TextSize::from(0) {
return None; return None;
@ -63,7 +63,7 @@ pub(crate) fn shebang_leading_whitespace(
} }
let prefix = TextRange::up_to(range.start()); let prefix = TextRange::up_to(range.start());
let mut diagnostic = Diagnostic::new(ShebangLeadingWhitespace, prefix); let mut diagnostic = OldDiagnostic::new(ShebangLeadingWhitespace, prefix);
diagnostic.set_fix(Fix::safe_edit(Edit::range_deletion(prefix))); diagnostic.set_fix(Fix::safe_edit(Edit::range_deletion(prefix)));
Some(diagnostic) Some(diagnostic)
} }

View File

@ -9,7 +9,7 @@ use ruff_macros::{ViolationMetadata, derive_message_formats};
use crate::registry::AsRule; use crate::registry::AsRule;
#[cfg(target_family = "unix")] #[cfg(target_family = "unix")]
use crate::rules::flake8_executable::helpers::is_executable; use crate::rules::flake8_executable::helpers::is_executable;
use crate::{Diagnostic, Violation}; use crate::{OldDiagnostic, Violation};
/// ## What it does /// ## What it does
/// Checks for executable `.py` files that do not have a shebang. /// Checks for executable `.py` files that do not have a shebang.
@ -49,14 +49,14 @@ impl Violation for ShebangMissingExecutableFile {
/// EXE002 /// EXE002
#[cfg(target_family = "unix")] #[cfg(target_family = "unix")]
pub(crate) fn shebang_missing_executable_file(filepath: &Path) -> Option<Diagnostic> { pub(crate) fn shebang_missing_executable_file(filepath: &Path) -> Option<OldDiagnostic> {
// WSL supports Windows file systems, which do not have executable bits. // WSL supports Windows file systems, which do not have executable bits.
// Instead, everything is executable. Therefore, we skip this rule on WSL. // Instead, everything is executable. Therefore, we skip this rule on WSL.
if is_wsl::is_wsl() { if is_wsl::is_wsl() {
return None; return None;
} }
if let Ok(true) = is_executable(filepath) { if let Ok(true) = is_executable(filepath) {
return Some(Diagnostic::new( return Some(OldDiagnostic::new(
ShebangMissingExecutableFile, ShebangMissingExecutableFile,
TextRange::default(), TextRange::default(),
)); ));
@ -65,6 +65,6 @@ pub(crate) fn shebang_missing_executable_file(filepath: &Path) -> Option<Diagnos
} }
#[cfg(not(target_family = "unix"))] #[cfg(not(target_family = "unix"))]
pub(crate) fn shebang_missing_executable_file(_filepath: &Path) -> Option<Diagnostic> { pub(crate) fn shebang_missing_executable_file(_filepath: &Path) -> Option<OldDiagnostic> {
None None
} }

View File

@ -3,7 +3,7 @@ use ruff_text_size::TextRange;
use ruff_macros::{ViolationMetadata, derive_message_formats}; use ruff_macros::{ViolationMetadata, derive_message_formats};
use crate::comments::shebang::ShebangDirective; use crate::comments::shebang::ShebangDirective;
use crate::{Diagnostic, Violation}; use crate::{OldDiagnostic, Violation};
/// ## What it does /// ## What it does
/// Checks for a shebang directive in `.py` files that does not contain `python`, /// Checks for a shebang directive in `.py` files that does not contain `python`,
@ -44,10 +44,10 @@ impl Violation for ShebangMissingPython {
pub(crate) fn shebang_missing_python( pub(crate) fn shebang_missing_python(
range: TextRange, range: TextRange,
shebang: &ShebangDirective, shebang: &ShebangDirective,
) -> Option<Diagnostic> { ) -> Option<OldDiagnostic> {
if shebang.contains("python") || shebang.contains("pytest") || shebang.contains("uv run") { if shebang.contains("python") || shebang.contains("pytest") || shebang.contains("uv run") {
return None; return None;
} }
Some(Diagnostic::new(ShebangMissingPython, range)) Some(OldDiagnostic::new(ShebangMissingPython, range))
} }

View File

@ -5,7 +5,7 @@ use ruff_text_size::TextRange;
#[cfg(target_family = "unix")] #[cfg(target_family = "unix")]
use crate::rules::flake8_executable::helpers::is_executable; use crate::rules::flake8_executable::helpers::is_executable;
use crate::{Diagnostic, Violation}; use crate::{OldDiagnostic, Violation};
/// ## What it does /// ## What it does
/// Checks for a shebang directive in a file that is not executable. /// Checks for a shebang directive in a file that is not executable.
@ -48,7 +48,7 @@ impl Violation for ShebangNotExecutable {
/// EXE001 /// EXE001
#[cfg(target_family = "unix")] #[cfg(target_family = "unix")]
pub(crate) fn shebang_not_executable(filepath: &Path, range: TextRange) -> Option<Diagnostic> { pub(crate) fn shebang_not_executable(filepath: &Path, range: TextRange) -> Option<OldDiagnostic> {
// WSL supports Windows file systems, which do not have executable bits. // WSL supports Windows file systems, which do not have executable bits.
// Instead, everything is executable. Therefore, we skip this rule on WSL. // Instead, everything is executable. Therefore, we skip this rule on WSL.
if is_wsl::is_wsl() { if is_wsl::is_wsl() {
@ -56,13 +56,13 @@ pub(crate) fn shebang_not_executable(filepath: &Path, range: TextRange) -> Optio
} }
if let Ok(false) = is_executable(filepath) { if let Ok(false) = is_executable(filepath) {
return Some(Diagnostic::new(ShebangNotExecutable, range)); return Some(OldDiagnostic::new(ShebangNotExecutable, range));
} }
None None
} }
#[cfg(not(target_family = "unix"))] #[cfg(not(target_family = "unix"))]
pub(crate) fn shebang_not_executable(_filepath: &Path, _range: TextRange) -> Option<Diagnostic> { pub(crate) fn shebang_not_executable(_filepath: &Path, _range: TextRange) -> Option<OldDiagnostic> {
None None
} }

View File

@ -3,7 +3,7 @@ use ruff_python_trivia::is_python_whitespace;
use ruff_text_size::{TextRange, TextSize}; use ruff_text_size::{TextRange, TextSize};
use crate::Locator; use crate::Locator;
use crate::{Diagnostic, Violation}; use crate::{OldDiagnostic, Violation};
/// ## What it does /// ## What it does
/// Checks for a shebang directive that is not at the beginning of the file. /// Checks for a shebang directive that is not at the beginning of the file.
@ -42,7 +42,7 @@ impl Violation for ShebangNotFirstLine {
} }
/// EXE005 /// EXE005
pub(crate) fn shebang_not_first_line(range: TextRange, locator: &Locator) -> Option<Diagnostic> { pub(crate) fn shebang_not_first_line(range: TextRange, locator: &Locator) -> Option<OldDiagnostic> {
// If the shebang is at the beginning of the file, abort. // If the shebang is at the beginning of the file, abort.
if range.start() == TextSize::from(0) { if range.start() == TextSize::from(0) {
return None; return None;
@ -57,5 +57,5 @@ pub(crate) fn shebang_not_first_line(range: TextRange, locator: &Locator) -> Opt
return None; return None;
} }
Some(Diagnostic::new(ShebangNotFirstLine, range)) Some(OldDiagnostic::new(ShebangNotFirstLine, range))
} }

View File

@ -1,7 +1,7 @@
use ruff_macros::{ViolationMetadata, derive_message_formats}; use ruff_macros::{ViolationMetadata, derive_message_formats};
use crate::directives::{TodoComment, TodoDirectiveKind}; use crate::directives::{TodoComment, TodoDirectiveKind};
use crate::{Diagnostic, Violation}; use crate::{OldDiagnostic, Violation};
/// ## What it does /// ## What it does
/// Checks for "TODO" comments. /// Checks for "TODO" comments.
@ -114,19 +114,19 @@ impl Violation for LineContainsHack {
} }
} }
pub(crate) fn todos(diagnostics: &mut Vec<Diagnostic>, directive_ranges: &[TodoComment]) { pub(crate) fn todos(diagnostics: &mut Vec<OldDiagnostic>, directive_ranges: &[TodoComment]) {
diagnostics.extend( diagnostics.extend(
directive_ranges directive_ranges
.iter() .iter()
.map(|TodoComment { directive, .. }| match directive.kind { .map(|TodoComment { directive, .. }| match directive.kind {
// FIX001 // FIX001
TodoDirectiveKind::Fixme => Diagnostic::new(LineContainsFixme, directive.range), TodoDirectiveKind::Fixme => OldDiagnostic::new(LineContainsFixme, directive.range),
// FIX002 // FIX002
TodoDirectiveKind::Hack => Diagnostic::new(LineContainsHack, directive.range), TodoDirectiveKind::Hack => OldDiagnostic::new(LineContainsHack, directive.range),
// FIX003 // FIX003
TodoDirectiveKind::Todo => Diagnostic::new(LineContainsTodo, directive.range), TodoDirectiveKind::Todo => OldDiagnostic::new(LineContainsTodo, directive.range),
// FIX004 // FIX004
TodoDirectiveKind::Xxx => Diagnostic::new(LineContainsXxx, directive.range), TodoDirectiveKind::Xxx => OldDiagnostic::new(LineContainsXxx, directive.range),
}), }),
); );
} }

View File

@ -11,7 +11,7 @@ use ruff_text_size::{Ranged, TextRange};
use crate::Locator; use crate::Locator;
use crate::settings::LinterSettings; use crate::settings::LinterSettings;
use crate::{Diagnostic, Edit, Fix, FixAvailability, Violation}; use crate::{Edit, Fix, FixAvailability, OldDiagnostic, Violation};
/// ## What it does /// ## What it does
/// Checks for implicitly concatenated strings on a single line. /// Checks for implicitly concatenated strings on a single line.
@ -103,7 +103,7 @@ impl Violation for MultiLineImplicitStringConcatenation {
/// ISC001, ISC002 /// ISC001, ISC002
pub(crate) fn implicit( pub(crate) fn implicit(
diagnostics: &mut Vec<Diagnostic>, diagnostics: &mut Vec<OldDiagnostic>,
tokens: &Tokens, tokens: &Tokens,
locator: &Locator, locator: &Locator,
indexer: &Indexer, indexer: &Indexer,
@ -145,12 +145,12 @@ pub(crate) fn implicit(
}; };
if locator.contains_line_break(TextRange::new(a_range.end(), b_range.start())) { if locator.contains_line_break(TextRange::new(a_range.end(), b_range.start())) {
diagnostics.push(Diagnostic::new( diagnostics.push(OldDiagnostic::new(
MultiLineImplicitStringConcatenation, MultiLineImplicitStringConcatenation,
TextRange::new(a_range.start(), b_range.end()), TextRange::new(a_range.start(), b_range.end()),
)); ));
} else { } else {
let mut diagnostic = Diagnostic::new( let mut diagnostic = OldDiagnostic::new(
SingleLineImplicitStringConcatenation, SingleLineImplicitStringConcatenation,
TextRange::new(a_range.start(), b_range.end()), TextRange::new(a_range.start(), b_range.end()),
); );

View File

@ -10,7 +10,7 @@ use crate::Locator;
use crate::comments::shebang::ShebangDirective; use crate::comments::shebang::ShebangDirective;
use crate::fs; use crate::fs;
use crate::package::PackageRoot; use crate::package::PackageRoot;
use crate::{Diagnostic, Violation}; use crate::{OldDiagnostic, Violation};
/// ## What it does /// ## What it does
/// Checks for packages that are missing an `__init__.py` file. /// Checks for packages that are missing an `__init__.py` file.
@ -64,7 +64,7 @@ pub(crate) fn implicit_namespace_package(
project_root: &Path, project_root: &Path,
src: &[PathBuf], src: &[PathBuf],
allow_nested_roots: bool, allow_nested_roots: bool,
) -> Option<Diagnostic> { ) -> Option<OldDiagnostic> {
if package.is_none() if package.is_none()
// Ignore non-`.py` files, which don't require an `__init__.py`. // Ignore non-`.py` files, which don't require an `__init__.py`.
&& PySourceType::try_from_path(path).is_some_and(PySourceType::is_py_file) && PySourceType::try_from_path(path).is_some_and(PySourceType::is_py_file)
@ -83,7 +83,7 @@ pub(crate) fn implicit_namespace_package(
// Ignore PEP 723 scripts. // Ignore PEP 723 scripts.
&& ScriptTag::parse(locator.contents().as_bytes()).is_none() && ScriptTag::parse(locator.contents().as_bytes()).is_none()
{ {
return Some(Diagnostic::new( return Some(OldDiagnostic::new(
ImplicitNamespacePackage { ImplicitNamespacePackage {
filename: fs::relativize_path(path), filename: fs::relativize_path(path),
parent: None, parent: None,
@ -100,7 +100,7 @@ pub(crate) fn implicit_namespace_package(
.ancestors() .ancestors()
.find(|parent| !parent.join("__init__.py").exists()) .find(|parent| !parent.join("__init__.py").exists())
{ {
return Some(Diagnostic::new( return Some(OldDiagnostic::new(
ImplicitNamespacePackage { ImplicitNamespacePackage {
filename: fs::relativize_path(path), filename: fs::relativize_path(path),
parent: Some(fs::relativize_path(parent)), parent: Some(fs::relativize_path(parent)),

View File

@ -6,7 +6,7 @@ use ruff_macros::{ViolationMetadata, derive_message_formats};
use ruff_python_trivia::CommentRanges; use ruff_python_trivia::CommentRanges;
use crate::Locator; use crate::Locator;
use crate::{Diagnostic, Violation}; use crate::{OldDiagnostic, Violation};
/// ## What it does /// ## What it does
/// Checks for the use of type comments (e.g., `x = 1 # type: int`) in stub /// Checks for the use of type comments (e.g., `x = 1 # type: int`) in stub
@ -38,7 +38,7 @@ impl Violation for TypeCommentInStub {
/// PYI033 /// PYI033
pub(crate) fn type_comment_in_stub( pub(crate) fn type_comment_in_stub(
diagnostics: &mut Vec<Diagnostic>, diagnostics: &mut Vec<OldDiagnostic>,
locator: &Locator, locator: &Locator,
comment_ranges: &CommentRanges, comment_ranges: &CommentRanges,
) { ) {
@ -46,7 +46,7 @@ pub(crate) fn type_comment_in_stub(
let comment = locator.slice(range); let comment = locator.slice(range);
if TYPE_COMMENT_REGEX.is_match(comment) && !TYPE_IGNORE_REGEX.is_match(comment) { if TYPE_COMMENT_REGEX.is_match(comment) && !TYPE_IGNORE_REGEX.is_match(comment) {
diagnostics.push(Diagnostic::new(TypeCommentInStub, range)); diagnostics.push(OldDiagnostic::new(TypeCommentInStub, range));
} }
} }
} }

View File

@ -8,7 +8,7 @@ use ruff_text_size::{TextLen, TextRange, TextSize};
use crate::Locator; use crate::Locator;
use crate::directives::{TodoComment, TodoDirective, TodoDirectiveKind}; use crate::directives::{TodoComment, TodoDirective, TodoDirectiveKind};
use crate::{AlwaysFixableViolation, Diagnostic, Edit, Fix, Violation}; use crate::{AlwaysFixableViolation, Edit, Fix, OldDiagnostic, Violation};
/// ## What it does /// ## What it does
/// Checks that a TODO comment is labelled with "TODO". /// Checks that a TODO comment is labelled with "TODO".
@ -248,7 +248,7 @@ static ISSUE_LINK_TODO_LINE_REGEX_SET: LazyLock<RegexSet> = LazyLock::new(|| {
}); });
pub(crate) fn todos( pub(crate) fn todos(
diagnostics: &mut Vec<Diagnostic>, diagnostics: &mut Vec<OldDiagnostic>,
todo_comments: &[TodoComment], todo_comments: &[TodoComment],
locator: &Locator, locator: &Locator,
comment_ranges: &CommentRanges, comment_ranges: &CommentRanges,
@ -307,20 +307,20 @@ pub(crate) fn todos(
if !has_issue_link { if !has_issue_link {
// TD003 // TD003
diagnostics.push(Diagnostic::new(MissingTodoLink, directive.range)); diagnostics.push(OldDiagnostic::new(MissingTodoLink, directive.range));
} }
} }
} }
/// Check that the directive itself is valid. This function modifies `diagnostics` in-place. /// Check that the directive itself is valid. This function modifies `diagnostics` in-place.
fn directive_errors(diagnostics: &mut Vec<Diagnostic>, directive: &TodoDirective) { fn directive_errors(diagnostics: &mut Vec<OldDiagnostic>, directive: &TodoDirective) {
if directive.content == "TODO" { if directive.content == "TODO" {
return; return;
} }
if directive.content.to_uppercase() == "TODO" { if directive.content.to_uppercase() == "TODO" {
// TD006 // TD006
let mut diagnostic = Diagnostic::new( let mut diagnostic = OldDiagnostic::new(
InvalidTodoCapitalization { InvalidTodoCapitalization {
tag: directive.content.to_string(), tag: directive.content.to_string(),
}, },
@ -335,7 +335,7 @@ fn directive_errors(diagnostics: &mut Vec<Diagnostic>, directive: &TodoDirective
diagnostics.push(diagnostic); diagnostics.push(diagnostic);
} else { } else {
// TD001 // TD001
diagnostics.push(Diagnostic::new( diagnostics.push(OldDiagnostic::new(
InvalidTodoTag { InvalidTodoTag {
tag: directive.content.to_string(), tag: directive.content.to_string(),
}, },
@ -346,7 +346,7 @@ fn directive_errors(diagnostics: &mut Vec<Diagnostic>, directive: &TodoDirective
/// Checks for "static" errors in the comment: missing colon, missing author, etc. /// Checks for "static" errors in the comment: missing colon, missing author, etc.
fn static_errors( fn static_errors(
diagnostics: &mut Vec<Diagnostic>, diagnostics: &mut Vec<OldDiagnostic>,
comment: &str, comment: &str,
comment_range: TextRange, comment_range: TextRange,
directive: &TodoDirective, directive: &TodoDirective,
@ -367,13 +367,13 @@ fn static_errors(
TextSize::try_from(end_index).unwrap() TextSize::try_from(end_index).unwrap()
} else { } else {
// TD002 // TD002
diagnostics.push(Diagnostic::new(MissingTodoAuthor, directive.range)); diagnostics.push(OldDiagnostic::new(MissingTodoAuthor, directive.range));
TextSize::new(0) TextSize::new(0)
} }
} else { } else {
// TD002 // TD002
diagnostics.push(Diagnostic::new(MissingTodoAuthor, directive.range)); diagnostics.push(OldDiagnostic::new(MissingTodoAuthor, directive.range));
TextSize::new(0) TextSize::new(0)
}; };
@ -382,18 +382,21 @@ fn static_errors(
if let Some(after_colon) = after_author.strip_prefix(':') { if let Some(after_colon) = after_author.strip_prefix(':') {
if after_colon.is_empty() { if after_colon.is_empty() {
// TD005 // TD005
diagnostics.push(Diagnostic::new(MissingTodoDescription, directive.range)); diagnostics.push(OldDiagnostic::new(MissingTodoDescription, directive.range));
} else if !after_colon.starts_with(char::is_whitespace) { } else if !after_colon.starts_with(char::is_whitespace) {
// TD007 // TD007
diagnostics.push(Diagnostic::new(MissingSpaceAfterTodoColon, directive.range)); diagnostics.push(OldDiagnostic::new(
MissingSpaceAfterTodoColon,
directive.range,
));
} }
} else { } else {
// TD004 // TD004
diagnostics.push(Diagnostic::new(MissingTodoColon, directive.range)); diagnostics.push(OldDiagnostic::new(MissingTodoColon, directive.range));
if after_author.is_empty() { if after_author.is_empty() {
// TD005 // TD005
diagnostics.push(Diagnostic::new(MissingTodoDescription, directive.range)); diagnostics.push(OldDiagnostic::new(MissingTodoDescription, directive.range));
} }
} }
} }

View File

@ -9,7 +9,7 @@ use ruff_text_size::{TextRange, TextSize};
use crate::Locator; use crate::Locator;
use crate::importer::Importer; use crate::importer::Importer;
use crate::settings::LinterSettings; use crate::settings::LinterSettings;
use crate::{AlwaysFixableViolation, Diagnostic, Fix}; use crate::{AlwaysFixableViolation, Fix, OldDiagnostic};
/// ## What it does /// ## What it does
/// Adds any required imports, as specified by the user, to the top of the /// Adds any required imports, as specified by the user, to the top of the
@ -91,7 +91,7 @@ fn add_required_import(
locator: &Locator, locator: &Locator,
stylist: &Stylist, stylist: &Stylist,
source_type: PySourceType, source_type: PySourceType,
) -> Option<Diagnostic> { ) -> Option<OldDiagnostic> {
// Don't add imports to semantically-empty files. // Don't add imports to semantically-empty files.
if parsed.suite().iter().all(is_docstring_stmt) { if parsed.suite().iter().all(is_docstring_stmt) {
return None; return None;
@ -112,7 +112,7 @@ fn add_required_import(
} }
// Always insert the diagnostic at top-of-file. // Always insert the diagnostic at top-of-file.
let mut diagnostic = Diagnostic::new( let mut diagnostic = OldDiagnostic::new(
MissingRequiredImport(required_import.to_string()), MissingRequiredImport(required_import.to_string()),
TextRange::default(), TextRange::default(),
); );
@ -129,7 +129,7 @@ pub(crate) fn add_required_imports(
stylist: &Stylist, stylist: &Stylist,
settings: &LinterSettings, settings: &LinterSettings,
source_type: PySourceType, source_type: PySourceType,
) -> Vec<Diagnostic> { ) -> Vec<OldDiagnostic> {
settings settings
.isort .isort
.required_imports .required_imports

View File

@ -18,7 +18,7 @@ use crate::package::PackageRoot;
use crate::preview::is_full_path_match_source_strategy_enabled; use crate::preview::is_full_path_match_source_strategy_enabled;
use crate::rules::isort::categorize::MatchSourceStrategy; use crate::rules::isort::categorize::MatchSourceStrategy;
use crate::settings::LinterSettings; use crate::settings::LinterSettings;
use crate::{Diagnostic, Edit, Fix, FixAvailability, Violation}; use crate::{Edit, Fix, FixAvailability, OldDiagnostic, Violation};
/// ## What it does /// ## What it does
/// De-duplicates, groups, and sorts imports based on the provided `isort` settings. /// De-duplicates, groups, and sorts imports based on the provided `isort` settings.
@ -98,7 +98,7 @@ pub(crate) fn organize_imports(
source_type: PySourceType, source_type: PySourceType,
tokens: &Tokens, tokens: &Tokens,
target_version: PythonVersion, target_version: PythonVersion,
) -> Option<Diagnostic> { ) -> Option<OldDiagnostic> {
let indentation = locator.slice(extract_indentation_range(&block.imports, locator)); let indentation = locator.slice(extract_indentation_range(&block.imports, locator));
let indentation = leading_indentation(indentation); let indentation = leading_indentation(indentation);
@ -110,7 +110,7 @@ pub(crate) fn organize_imports(
|| indexer || indexer
.followed_by_multi_statement_line(block.imports.last().unwrap(), locator.contents()) .followed_by_multi_statement_line(block.imports.last().unwrap(), locator.contents())
{ {
return Some(Diagnostic::new(UnsortedImports, range)); return Some(OldDiagnostic::new(UnsortedImports, range));
} }
// Extract comments. Take care to grab any inline comments from the last line. // Extract comments. Take care to grab any inline comments from the last line.
@ -155,7 +155,7 @@ pub(crate) fn organize_imports(
if matches_ignoring_indentation(actual, &expected) { if matches_ignoring_indentation(actual, &expected) {
return None; return None;
} }
let mut diagnostic = Diagnostic::new(UnsortedImports, range); let mut diagnostic = OldDiagnostic::new(UnsortedImports, range);
diagnostic.set_fix(Fix::safe_edit(Edit::range_replacement( diagnostic.set_fix(Fix::safe_edit(Edit::range_replacement(
indent(&expected, indentation).to_string(), indent(&expected, indentation).to_string(),
fix_range, fix_range,

View File

@ -9,7 +9,7 @@ use ruff_text_size::TextRange;
use crate::package::PackageRoot; use crate::package::PackageRoot;
use crate::rules::pep8_naming::settings::IgnoreNames; use crate::rules::pep8_naming::settings::IgnoreNames;
use crate::{Diagnostic, Violation}; use crate::{OldDiagnostic, Violation};
/// ## What it does /// ## What it does
/// Checks for module names that do not follow the `snake_case` naming /// Checks for module names that do not follow the `snake_case` naming
@ -54,7 +54,7 @@ pub(crate) fn invalid_module_name(
path: &Path, path: &Path,
package: Option<PackageRoot<'_>>, package: Option<PackageRoot<'_>>,
ignore_names: &IgnoreNames, ignore_names: &IgnoreNames,
) -> Option<Diagnostic> { ) -> Option<OldDiagnostic> {
if !PySourceType::try_from_path(path).is_some_and(PySourceType::is_py_file_or_stub) { if !PySourceType::try_from_path(path).is_some_and(PySourceType::is_py_file_or_stub) {
return None; return None;
} }
@ -80,7 +80,7 @@ pub(crate) fn invalid_module_name(
if ignore_names.matches(&module_name) { if ignore_names.matches(&module_name) {
return None; return None;
} }
return Some(Diagnostic::new( return Some(OldDiagnostic::new(
InvalidModuleName { InvalidModuleName {
name: module_name.to_string(), name: module_name.to_string(),
}, },

View File

@ -18,10 +18,10 @@ use ruff_text_size::TextRange;
use ruff_text_size::TextSize; use ruff_text_size::TextSize;
use crate::AlwaysFixableViolation; use crate::AlwaysFixableViolation;
use crate::Diagnostic;
use crate::Edit; use crate::Edit;
use crate::Fix; use crate::Fix;
use crate::Locator; use crate::Locator;
use crate::OldDiagnostic;
use crate::checkers::logical_lines::expand_indent; use crate::checkers::logical_lines::expand_indent;
use crate::line_width::IndentWidth; use crate::line_width::IndentWidth;
use crate::rules::pycodestyle::helpers::is_non_logical_token; use crate::rules::pycodestyle::helpers::is_non_logical_token;
@ -721,7 +721,7 @@ impl<'a> BlankLinesChecker<'a> {
} }
/// E301, E302, E303, E304, E305, E306 /// E301, E302, E303, E304, E305, E306
pub(crate) fn check_lines(&self, tokens: &Tokens, diagnostics: &mut Vec<Diagnostic>) { pub(crate) fn check_lines(&self, tokens: &Tokens, diagnostics: &mut Vec<OldDiagnostic>) {
let mut prev_indent_length: Option<usize> = None; let mut prev_indent_length: Option<usize> = None;
let mut prev_logical_line: Option<LogicalLineInfo> = None; let mut prev_logical_line: Option<LogicalLineInfo> = None;
let mut state = BlankLinesState::default(); let mut state = BlankLinesState::default();
@ -824,7 +824,7 @@ impl<'a> BlankLinesChecker<'a> {
line: &LogicalLineInfo, line: &LogicalLineInfo,
state: &BlankLinesState, state: &BlankLinesState,
prev_indent_length: Option<usize>, prev_indent_length: Option<usize>,
diagnostics: &mut Vec<Diagnostic>, diagnostics: &mut Vec<OldDiagnostic>,
) { ) {
if line.preceding_blank_lines == 0 if line.preceding_blank_lines == 0
// Only applies to methods. // Only applies to methods.
@ -842,7 +842,8 @@ impl<'a> BlankLinesChecker<'a> {
&& !self.source_type.is_stub() && !self.source_type.is_stub()
{ {
// E301 // E301
let mut diagnostic = Diagnostic::new(BlankLineBetweenMethods, line.first_token_range); let mut diagnostic =
OldDiagnostic::new(BlankLineBetweenMethods, line.first_token_range);
diagnostic.set_fix(Fix::safe_edit(Edit::insertion( diagnostic.set_fix(Fix::safe_edit(Edit::insertion(
self.stylist.line_ending().to_string(), self.stylist.line_ending().to_string(),
self.locator.line_start(state.last_non_comment_line_end), self.locator.line_start(state.last_non_comment_line_end),
@ -896,7 +897,7 @@ impl<'a> BlankLinesChecker<'a> {
&& !line.is_beginning_of_cell && !line.is_beginning_of_cell
{ {
// E302 // E302
let mut diagnostic = Diagnostic::new( let mut diagnostic = OldDiagnostic::new(
BlankLinesTopLevel { BlankLinesTopLevel {
actual_blank_lines: line.preceding_blank_lines.count(), actual_blank_lines: line.preceding_blank_lines.count(),
expected_blank_lines: expected_blank_lines_before_definition, expected_blank_lines: expected_blank_lines_before_definition,
@ -940,7 +941,7 @@ impl<'a> BlankLinesChecker<'a> {
if line.blank_lines > max_blank_lines { if line.blank_lines > max_blank_lines {
// E303 // E303
let mut diagnostic = Diagnostic::new( let mut diagnostic = OldDiagnostic::new(
TooManyBlankLines { TooManyBlankLines {
actual_blank_lines: line.blank_lines.count(), actual_blank_lines: line.blank_lines.count(),
}, },
@ -966,7 +967,7 @@ impl<'a> BlankLinesChecker<'a> {
&& line.preceding_blank_lines > 0 && line.preceding_blank_lines > 0
{ {
// E304 // E304
let mut diagnostic = Diagnostic::new( let mut diagnostic = OldDiagnostic::new(
BlankLineAfterDecorator { BlankLineAfterDecorator {
actual_blank_lines: line.preceding_blank_lines.count(), actual_blank_lines: line.preceding_blank_lines.count(),
}, },
@ -1013,7 +1014,7 @@ impl<'a> BlankLinesChecker<'a> {
&& !line.is_beginning_of_cell && !line.is_beginning_of_cell
{ {
// E305 // E305
let mut diagnostic = Diagnostic::new( let mut diagnostic = OldDiagnostic::new(
BlankLinesAfterFunctionOrClass { BlankLinesAfterFunctionOrClass {
actual_blank_lines: line.preceding_blank_lines.count(), actual_blank_lines: line.preceding_blank_lines.count(),
}, },
@ -1057,7 +1058,7 @@ impl<'a> BlankLinesChecker<'a> {
{ {
// E306 // E306
let mut diagnostic = let mut diagnostic =
Diagnostic::new(BlankLinesBeforeNestedDefinition, line.first_token_range); OldDiagnostic::new(BlankLinesBeforeNestedDefinition, line.first_token_range);
diagnostic.set_fix(Fix::safe_edit(Edit::insertion( diagnostic.set_fix(Fix::safe_edit(Edit::insertion(
self.stylist.line_ending().to_string(), self.stylist.line_ending().to_string(),

View File

@ -7,7 +7,7 @@ use ruff_text_size::{Ranged, TextSize};
use crate::Locator; use crate::Locator;
use crate::{AlwaysFixableViolation, Violation}; use crate::{AlwaysFixableViolation, Violation};
use crate::{Diagnostic, Edit, Fix}; use crate::{Edit, Fix, OldDiagnostic};
/// ## What it does /// ## What it does
/// Checks for compound statements (multiple statements on the same line). /// Checks for compound statements (multiple statements on the same line).
@ -98,7 +98,7 @@ impl AlwaysFixableViolation for UselessSemicolon {
/// E701, E702, E703 /// E701, E702, E703
pub(crate) fn compound_statements( pub(crate) fn compound_statements(
diagnostics: &mut Vec<Diagnostic>, diagnostics: &mut Vec<OldDiagnostic>,
tokens: &Tokens, tokens: &Tokens,
locator: &Locator, locator: &Locator,
indexer: &Indexer, indexer: &Indexer,
@ -167,7 +167,7 @@ pub(crate) fn compound_statements(
!has_non_trivia_tokens_till(token_iter.clone(), cell_range.end()) !has_non_trivia_tokens_till(token_iter.clone(), cell_range.end())
})) }))
{ {
let mut diagnostic = Diagnostic::new(UselessSemicolon, range); let mut diagnostic = OldDiagnostic::new(UselessSemicolon, range);
diagnostic.set_fix(Fix::safe_edit(Edit::deletion( diagnostic.set_fix(Fix::safe_edit(Edit::deletion(
indexer indexer
.preceded_by_continuations(range.start(), locator.contents()) .preceded_by_continuations(range.start(), locator.contents())
@ -224,7 +224,10 @@ pub(crate) fn compound_statements(
| TokenKind::NonLogicalNewline => {} | TokenKind::NonLogicalNewline => {}
_ => { _ => {
if let Some(range) = semi { if let Some(range) = semi {
diagnostics.push(Diagnostic::new(MultipleStatementsOnOneLineSemicolon, range)); diagnostics.push(OldDiagnostic::new(
MultipleStatementsOnOneLineSemicolon,
range,
));
// Reset. // Reset.
semi = None; semi = None;
@ -232,7 +235,7 @@ pub(crate) fn compound_statements(
} }
if let Some(range) = colon { if let Some(range) = colon {
diagnostics.push(Diagnostic::new(MultipleStatementsOnOneLineColon, range)); diagnostics.push(OldDiagnostic::new(MultipleStatementsOnOneLineColon, range));
// Reset. // Reset.
colon = None; colon = None;

View File

@ -4,7 +4,7 @@ use ruff_source_file::Line;
use crate::rules::pycodestyle::overlong::Overlong; use crate::rules::pycodestyle::overlong::Overlong;
use crate::settings::LinterSettings; use crate::settings::LinterSettings;
use crate::{Diagnostic, Violation}; use crate::{OldDiagnostic, Violation};
/// ## What it does /// ## What it does
/// Checks for doc lines that exceed the specified maximum character length. /// Checks for doc lines that exceed the specified maximum character length.
@ -86,7 +86,7 @@ pub(crate) fn doc_line_too_long(
line: &Line, line: &Line,
comment_ranges: &CommentRanges, comment_ranges: &CommentRanges,
settings: &LinterSettings, settings: &LinterSettings,
) -> Option<Diagnostic> { ) -> Option<OldDiagnostic> {
let limit = settings.pycodestyle.max_doc_length?; let limit = settings.pycodestyle.max_doc_length?;
Overlong::try_from_line( Overlong::try_from_line(
line, line,
@ -100,7 +100,7 @@ pub(crate) fn doc_line_too_long(
settings.tab_size, settings.tab_size,
) )
.map(|overlong| { .map(|overlong| {
Diagnostic::new( OldDiagnostic::new(
DocLineTooLong(overlong.width(), limit.value() as usize), DocLineTooLong(overlong.width(), limit.value() as usize),
overlong.range(), overlong.range(),
) )

View File

@ -4,7 +4,7 @@ use ruff_source_file::Line;
use crate::rules::pycodestyle::overlong::Overlong; use crate::rules::pycodestyle::overlong::Overlong;
use crate::settings::LinterSettings; use crate::settings::LinterSettings;
use crate::{Diagnostic, Violation}; use crate::{OldDiagnostic, Violation};
/// ## What it does /// ## What it does
/// Checks for lines that exceed the specified maximum character length. /// Checks for lines that exceed the specified maximum character length.
@ -84,7 +84,7 @@ pub(crate) fn line_too_long(
line: &Line, line: &Line,
comment_ranges: &CommentRanges, comment_ranges: &CommentRanges,
settings: &LinterSettings, settings: &LinterSettings,
) -> Option<Diagnostic> { ) -> Option<OldDiagnostic> {
let limit = settings.pycodestyle.max_line_length; let limit = settings.pycodestyle.max_line_length;
Overlong::try_from_line( Overlong::try_from_line(
@ -99,7 +99,7 @@ pub(crate) fn line_too_long(
settings.tab_size, settings.tab_size,
) )
.map(|overlong| { .map(|overlong| {
Diagnostic::new( OldDiagnostic::new(
LineTooLong(overlong.width(), limit.value() as usize), LineTooLong(overlong.width(), limit.value() as usize),
overlong.range(), overlong.range(),
) )

View File

@ -3,9 +3,9 @@ use ruff_python_parser::TokenKind;
use ruff_text_size::{Ranged, TextRange}; use ruff_text_size::{Ranged, TextRange};
use crate::AlwaysFixableViolation; use crate::AlwaysFixableViolation;
use crate::Diagnostic;
use crate::Edit; use crate::Edit;
use crate::Fix; use crate::Fix;
use crate::OldDiagnostic;
use crate::checkers::logical_lines::LogicalLinesContext; use crate::checkers::logical_lines::LogicalLinesContext;
use super::{LogicalLine, Whitespace}; use super::{LogicalLine, Whitespace};
@ -165,7 +165,7 @@ pub(crate) fn extraneous_whitespace(line: &LogicalLine, context: &mut LogicalLin
BracketOrPunctuation::OpenBracket(symbol) if symbol != '{' || fstrings == 0 => { BracketOrPunctuation::OpenBracket(symbol) if symbol != '{' || fstrings == 0 => {
let (trailing, trailing_len) = line.trailing_whitespace(token); let (trailing, trailing_len) = line.trailing_whitespace(token);
if !matches!(trailing, Whitespace::None) { if !matches!(trailing, Whitespace::None) {
let mut diagnostic = Diagnostic::new( let mut diagnostic = OldDiagnostic::new(
WhitespaceAfterOpenBracket { symbol }, WhitespaceAfterOpenBracket { symbol },
TextRange::at(token.end(), trailing_len), TextRange::at(token.end(), trailing_len),
); );
@ -179,7 +179,7 @@ pub(crate) fn extraneous_whitespace(line: &LogicalLine, context: &mut LogicalLin
if let (Whitespace::Single | Whitespace::Many | Whitespace::Tab, offset) = if let (Whitespace::Single | Whitespace::Many | Whitespace::Tab, offset) =
line.leading_whitespace(token) line.leading_whitespace(token)
{ {
let mut diagnostic = Diagnostic::new( let mut diagnostic = OldDiagnostic::new(
WhitespaceBeforeCloseBracket { symbol }, WhitespaceBeforeCloseBracket { symbol },
TextRange::at(token.start() - offset, offset), TextRange::at(token.start() - offset, offset),
); );
@ -205,7 +205,7 @@ pub(crate) fn extraneous_whitespace(line: &LogicalLine, context: &mut LogicalLin
// If we're in the second half of a double colon, disallow // If we're in the second half of a double colon, disallow
// any whitespace (e.g., `foo[1: :2]` or `foo[1 : : 2]`). // any whitespace (e.g., `foo[1: :2]` or `foo[1 : : 2]`).
if matches!(prev_token, Some(TokenKind::Colon)) { if matches!(prev_token, Some(TokenKind::Colon)) {
let mut diagnostic = Diagnostic::new( let mut diagnostic = OldDiagnostic::new(
WhitespaceBeforePunctuation { symbol }, WhitespaceBeforePunctuation { symbol },
TextRange::at(token.start() - offset, offset), TextRange::at(token.start() - offset, offset),
); );
@ -220,7 +220,7 @@ pub(crate) fn extraneous_whitespace(line: &LogicalLine, context: &mut LogicalLin
// Or `foo[index :, 2]`, but not `foo[index :, 2]`. // Or `foo[index :, 2]`, but not `foo[index :, 2]`.
if let (Whitespace::Many | Whitespace::Tab, offset) = whitespace if let (Whitespace::Many | Whitespace::Tab, offset) = whitespace
{ {
let mut diagnostic = Diagnostic::new( let mut diagnostic = OldDiagnostic::new(
WhitespaceBeforePunctuation { symbol }, WhitespaceBeforePunctuation { symbol },
TextRange::at(token.start() - offset, offset), TextRange::at(token.start() - offset, offset),
); );
@ -245,7 +245,7 @@ pub(crate) fn extraneous_whitespace(line: &LogicalLine, context: &mut LogicalLin
// whitespace before the colon and so should the fix // whitespace before the colon and so should the fix
if let (Whitespace::Many | Whitespace::Tab, offset) = whitespace if let (Whitespace::Many | Whitespace::Tab, offset) = whitespace
{ {
let mut diagnostic = Diagnostic::new( let mut diagnostic = OldDiagnostic::new(
WhitespaceBeforePunctuation { symbol }, WhitespaceBeforePunctuation { symbol },
TextRange::at(token.start() - offset, offset), TextRange::at(token.start() - offset, offset),
); );
@ -262,7 +262,7 @@ pub(crate) fn extraneous_whitespace(line: &LogicalLine, context: &mut LogicalLin
.filter(|next| matches!(next.kind(), TokenKind::Colon)) .filter(|next| matches!(next.kind(), TokenKind::Colon))
.unwrap_or(&token); .unwrap_or(&token);
if line.trailing_whitespace(token) != whitespace { if line.trailing_whitespace(token) != whitespace {
let mut diagnostic = Diagnostic::new( let mut diagnostic = OldDiagnostic::new(
WhitespaceBeforePunctuation { symbol }, WhitespaceBeforePunctuation { symbol },
TextRange::at(token.start() - offset, offset), TextRange::at(token.start() - offset, offset),
); );
@ -280,7 +280,7 @@ pub(crate) fn extraneous_whitespace(line: &LogicalLine, context: &mut LogicalLin
// Avoid removing any whitespace for f-string debug expressions. // Avoid removing any whitespace for f-string debug expressions.
continue; continue;
} }
let mut diagnostic = Diagnostic::new( let mut diagnostic = OldDiagnostic::new(
WhitespaceBeforePunctuation { symbol }, WhitespaceBeforePunctuation { symbol },
TextRange::at(token.start() - offset, offset), TextRange::at(token.start() - offset, offset),
); );

View File

@ -2,7 +2,7 @@ use ruff_macros::{ViolationMetadata, derive_message_formats};
use ruff_python_parser::TokenKind; use ruff_python_parser::TokenKind;
use ruff_text_size::TextRange; use ruff_text_size::TextRange;
use crate::Diagnostic; use crate::OldDiagnostic;
use crate::Violation; use crate::Violation;
use super::LogicalLine; use super::LogicalLine;
@ -264,19 +264,19 @@ pub(crate) fn indentation(
prev_indent_level: Option<usize>, prev_indent_level: Option<usize>,
indent_size: usize, indent_size: usize,
range: TextRange, range: TextRange,
) -> Vec<Diagnostic> { ) -> Vec<OldDiagnostic> {
let mut diagnostics = vec![]; let mut diagnostics = vec![];
if indent_level % indent_size != 0 { if indent_level % indent_size != 0 {
diagnostics.push(if logical_line.is_comment_only() { diagnostics.push(if logical_line.is_comment_only() {
Diagnostic::new( OldDiagnostic::new(
IndentationWithInvalidMultipleComment { IndentationWithInvalidMultipleComment {
indent_width: indent_size, indent_width: indent_size,
}, },
range, range,
) )
} else { } else {
Diagnostic::new( OldDiagnostic::new(
IndentationWithInvalidMultiple { IndentationWithInvalidMultiple {
indent_width: indent_size, indent_width: indent_size,
}, },
@ -290,24 +290,24 @@ pub(crate) fn indentation(
if indent_expect && indent_level <= prev_indent_level.unwrap_or(0) { if indent_expect && indent_level <= prev_indent_level.unwrap_or(0) {
diagnostics.push(if logical_line.is_comment_only() { diagnostics.push(if logical_line.is_comment_only() {
Diagnostic::new(NoIndentedBlockComment, range) OldDiagnostic::new(NoIndentedBlockComment, range)
} else { } else {
Diagnostic::new(NoIndentedBlock, range) OldDiagnostic::new(NoIndentedBlock, range)
}); });
} else if !indent_expect } else if !indent_expect
&& prev_indent_level.is_some_and(|prev_indent_level| indent_level > prev_indent_level) && prev_indent_level.is_some_and(|prev_indent_level| indent_level > prev_indent_level)
{ {
diagnostics.push(if logical_line.is_comment_only() { diagnostics.push(if logical_line.is_comment_only() {
Diagnostic::new(UnexpectedIndentationComment, range) OldDiagnostic::new(UnexpectedIndentationComment, range)
} else { } else {
Diagnostic::new(UnexpectedIndentation, range) OldDiagnostic::new(UnexpectedIndentation, range)
}); });
} }
if indent_expect { if indent_expect {
let expected_indent_amount = if indent_char == '\t' { 8 } else { 4 }; let expected_indent_amount = if indent_char == '\t' { 8 } else { 4 };
let expected_indent_level = prev_indent_level.unwrap_or(0) + expected_indent_amount; let expected_indent_level = prev_indent_level.unwrap_or(0) + expected_indent_amount;
if indent_level > expected_indent_level { if indent_level > expected_indent_level {
diagnostics.push(Diagnostic::new( diagnostics.push(OldDiagnostic::new(
OverIndented { OverIndented {
is_comment: logical_line.is_comment_only(), is_comment: logical_line.is_comment_only(),
}, },

View File

@ -4,7 +4,7 @@ use ruff_text_size::Ranged;
use crate::Edit; use crate::Edit;
use crate::checkers::logical_lines::LogicalLinesContext; use crate::checkers::logical_lines::LogicalLinesContext;
use crate::{AlwaysFixableViolation, Diagnostic, Fix}; use crate::{AlwaysFixableViolation, Fix, OldDiagnostic};
use super::{DefinitionState, LogicalLine}; use super::{DefinitionState, LogicalLine};
@ -104,7 +104,7 @@ pub(crate) fn missing_whitespace(line: &LogicalLine, context: &mut LogicalLinesC
} }
let diagnostic = let diagnostic =
Diagnostic::new(MissingWhitespace { token: kind }, token.range()); OldDiagnostic::new(MissingWhitespace { token: kind }, token.range());
let fix = Fix::safe_edit(Edit::insertion(" ".to_string(), token.end())); let fix = Fix::safe_edit(Edit::insertion(" ".to_string(), token.end()));
context.push_diagnostic(diagnostic.with_fix(fix)); context.push_diagnostic(diagnostic.with_fix(fix));
} }

View File

@ -4,7 +4,7 @@ use ruff_text_size::Ranged;
use crate::checkers::logical_lines::LogicalLinesContext; use crate::checkers::logical_lines::LogicalLinesContext;
use crate::rules::pycodestyle::rules::logical_lines::LogicalLine; use crate::rules::pycodestyle::rules::logical_lines::LogicalLine;
use crate::{AlwaysFixableViolation, Diagnostic, Edit, Fix}; use crate::{AlwaysFixableViolation, Edit, Fix, OldDiagnostic};
/// ## What it does /// ## What it does
/// Checks for missing whitespace after keywords. /// Checks for missing whitespace after keywords.
@ -71,7 +71,7 @@ pub(crate) fn missing_whitespace_after_keyword(
)) ))
&& tok0.end() == tok1.start() && tok0.end() == tok1.start()
{ {
let mut diagnostic = Diagnostic::new(MissingWhitespaceAfterKeyword, tok0.range()); let mut diagnostic = OldDiagnostic::new(MissingWhitespaceAfterKeyword, tok0.range());
diagnostic.set_fix(Fix::safe_edit(Edit::insertion(" ".to_string(), tok0.end()))); diagnostic.set_fix(Fix::safe_edit(Edit::insertion(" ".to_string(), tok0.end())));
context.push_diagnostic(diagnostic); context.push_diagnostic(diagnostic);
} }

View File

@ -5,7 +5,7 @@ use ruff_text_size::{Ranged, TextRange};
use crate::checkers::logical_lines::LogicalLinesContext; use crate::checkers::logical_lines::LogicalLinesContext;
use crate::rules::pycodestyle::helpers::is_non_logical_token; use crate::rules::pycodestyle::helpers::is_non_logical_token;
use crate::rules::pycodestyle::rules::logical_lines::{DefinitionState, LogicalLine}; use crate::rules::pycodestyle::rules::logical_lines::{DefinitionState, LogicalLine};
use crate::{AlwaysFixableViolation, Diagnostic, Edit, Fix}; use crate::{AlwaysFixableViolation, Edit, Fix, OldDiagnostic};
/// ## What it does /// ## What it does
/// Checks for missing whitespace around all operators. /// Checks for missing whitespace around all operators.
@ -314,15 +314,15 @@ impl From<bool> for NeedsSpace {
} }
} }
fn diagnostic_kind_for_operator(operator: TokenKind, range: TextRange) -> Diagnostic { fn diagnostic_kind_for_operator(operator: TokenKind, range: TextRange) -> OldDiagnostic {
if operator == TokenKind::Percent { if operator == TokenKind::Percent {
Diagnostic::new(MissingWhitespaceAroundModuloOperator, range) OldDiagnostic::new(MissingWhitespaceAroundModuloOperator, range)
} else if operator.is_bitwise_or_shift() { } else if operator.is_bitwise_or_shift() {
Diagnostic::new(MissingWhitespaceAroundBitwiseOrShiftOperator, range) OldDiagnostic::new(MissingWhitespaceAroundBitwiseOrShiftOperator, range)
} else if operator.is_arithmetic() { } else if operator.is_arithmetic() {
Diagnostic::new(MissingWhitespaceAroundArithmeticOperator, range) OldDiagnostic::new(MissingWhitespaceAroundArithmeticOperator, range)
} else { } else {
Diagnostic::new(MissingWhitespaceAroundOperator, range) OldDiagnostic::new(MissingWhitespaceAroundOperator, range)
} }
} }

View File

@ -6,7 +6,7 @@ use ruff_text_size::{Ranged, TextRange, TextSize};
use crate::Locator; use crate::Locator;
use crate::checkers::logical_lines::LogicalLinesContext; use crate::checkers::logical_lines::LogicalLinesContext;
use crate::{AlwaysFixableViolation, Diagnostic, Edit, Fix}; use crate::{AlwaysFixableViolation, Edit, Fix, OldDiagnostic};
use super::LogicalLine; use super::LogicalLine;
@ -75,7 +75,7 @@ pub(crate) fn redundant_backslash(
for continuation_line in &continuation_lines[start_index..end_index] { for continuation_line in &continuation_lines[start_index..end_index] {
let backslash_end = locator.line_end(*continuation_line); let backslash_end = locator.line_end(*continuation_line);
let backslash_start = backslash_end - TextSize::new(1); let backslash_start = backslash_end - TextSize::new(1);
let mut diagnostic = Diagnostic::new( let mut diagnostic = OldDiagnostic::new(
RedundantBackslash, RedundantBackslash,
TextRange::new(backslash_start, backslash_end), TextRange::new(backslash_start, backslash_end),
); );

View File

@ -3,7 +3,7 @@ use ruff_python_parser::TokenKind;
use ruff_text_size::{Ranged, TextRange}; use ruff_text_size::{Ranged, TextRange};
use crate::checkers::logical_lines::LogicalLinesContext; use crate::checkers::logical_lines::LogicalLinesContext;
use crate::{AlwaysFixableViolation, Diagnostic, Edit, Fix}; use crate::{AlwaysFixableViolation, Edit, Fix, OldDiagnostic};
use super::{LogicalLine, Whitespace}; use super::{LogicalLine, Whitespace};
@ -206,7 +206,7 @@ pub(crate) fn space_around_operator(line: &LogicalLine, context: &mut LogicalLin
if !after_operator { if !after_operator {
match line.leading_whitespace(token) { match line.leading_whitespace(token) {
(Whitespace::Tab, offset) => { (Whitespace::Tab, offset) => {
let mut diagnostic = Diagnostic::new( let mut diagnostic = OldDiagnostic::new(
TabBeforeOperator, TabBeforeOperator,
TextRange::at(token.start() - offset, offset), TextRange::at(token.start() - offset, offset),
); );
@ -217,7 +217,7 @@ pub(crate) fn space_around_operator(line: &LogicalLine, context: &mut LogicalLin
context.push_diagnostic(diagnostic); context.push_diagnostic(diagnostic);
} }
(Whitespace::Many, offset) => { (Whitespace::Many, offset) => {
let mut diagnostic = Diagnostic::new( let mut diagnostic = OldDiagnostic::new(
MultipleSpacesBeforeOperator, MultipleSpacesBeforeOperator,
TextRange::at(token.start() - offset, offset), TextRange::at(token.start() - offset, offset),
); );
@ -234,7 +234,7 @@ pub(crate) fn space_around_operator(line: &LogicalLine, context: &mut LogicalLin
match line.trailing_whitespace(token) { match line.trailing_whitespace(token) {
(Whitespace::Tab, len) => { (Whitespace::Tab, len) => {
let mut diagnostic = let mut diagnostic =
Diagnostic::new(TabAfterOperator, TextRange::at(token.end(), len)); OldDiagnostic::new(TabAfterOperator, TextRange::at(token.end(), len));
diagnostic.set_fix(Fix::safe_edit(Edit::range_replacement( diagnostic.set_fix(Fix::safe_edit(Edit::range_replacement(
" ".to_string(), " ".to_string(),
TextRange::at(token.end(), len), TextRange::at(token.end(), len),
@ -242,7 +242,7 @@ pub(crate) fn space_around_operator(line: &LogicalLine, context: &mut LogicalLin
context.push_diagnostic(diagnostic); context.push_diagnostic(diagnostic);
} }
(Whitespace::Many, len) => { (Whitespace::Many, len) => {
let mut diagnostic = Diagnostic::new( let mut diagnostic = OldDiagnostic::new(
MultipleSpacesAfterOperator, MultipleSpacesAfterOperator,
TextRange::at(token.end(), len), TextRange::at(token.end(), len),
); );
@ -267,7 +267,7 @@ pub(crate) fn space_after_comma(line: &LogicalLine, context: &mut LogicalLinesCo
match line.trailing_whitespace(token) { match line.trailing_whitespace(token) {
(Whitespace::Tab, len) => { (Whitespace::Tab, len) => {
let mut diagnostic = let mut diagnostic =
Diagnostic::new(TabAfterComma, TextRange::at(token.end(), len)); OldDiagnostic::new(TabAfterComma, TextRange::at(token.end(), len));
diagnostic.set_fix(Fix::safe_edit(Edit::range_replacement( diagnostic.set_fix(Fix::safe_edit(Edit::range_replacement(
" ".to_string(), " ".to_string(),
TextRange::at(token.end(), len), TextRange::at(token.end(), len),
@ -275,8 +275,10 @@ pub(crate) fn space_after_comma(line: &LogicalLine, context: &mut LogicalLinesCo
context.push_diagnostic(diagnostic); context.push_diagnostic(diagnostic);
} }
(Whitespace::Many, len) => { (Whitespace::Many, len) => {
let mut diagnostic = let mut diagnostic = OldDiagnostic::new(
Diagnostic::new(MultipleSpacesAfterComma, TextRange::at(token.end(), len)); MultipleSpacesAfterComma,
TextRange::at(token.end(), len),
);
diagnostic.set_fix(Fix::safe_edit(Edit::range_replacement( diagnostic.set_fix(Fix::safe_edit(Edit::range_replacement(
" ".to_string(), " ".to_string(),
TextRange::at(token.end(), len), TextRange::at(token.end(), len),

View File

@ -2,7 +2,7 @@ use ruff_macros::{ViolationMetadata, derive_message_formats};
use ruff_text_size::{Ranged, TextRange}; use ruff_text_size::{Ranged, TextRange};
use crate::checkers::logical_lines::LogicalLinesContext; use crate::checkers::logical_lines::LogicalLinesContext;
use crate::{AlwaysFixableViolation, Diagnostic, Edit, Fix}; use crate::{AlwaysFixableViolation, Edit, Fix, OldDiagnostic};
use super::{LogicalLine, Whitespace}; use super::{LogicalLine, Whitespace};
@ -133,7 +133,7 @@ pub(crate) fn whitespace_around_keywords(line: &LogicalLine, context: &mut Logic
match line.leading_whitespace(token) { match line.leading_whitespace(token) {
(Whitespace::Tab, offset) => { (Whitespace::Tab, offset) => {
let start = token.start(); let start = token.start();
let mut diagnostic = Diagnostic::new( let mut diagnostic = OldDiagnostic::new(
TabBeforeKeyword, TabBeforeKeyword,
TextRange::at(start - offset, offset), TextRange::at(start - offset, offset),
); );
@ -145,7 +145,7 @@ pub(crate) fn whitespace_around_keywords(line: &LogicalLine, context: &mut Logic
} }
(Whitespace::Many, offset) => { (Whitespace::Many, offset) => {
let start = token.start(); let start = token.start();
let mut diagnostic = Diagnostic::new( let mut diagnostic = OldDiagnostic::new(
MultipleSpacesBeforeKeyword, MultipleSpacesBeforeKeyword,
TextRange::at(start - offset, offset), TextRange::at(start - offset, offset),
); );
@ -162,7 +162,7 @@ pub(crate) fn whitespace_around_keywords(line: &LogicalLine, context: &mut Logic
match line.trailing_whitespace(token) { match line.trailing_whitespace(token) {
(Whitespace::Tab, len) => { (Whitespace::Tab, len) => {
let mut diagnostic = let mut diagnostic =
Diagnostic::new(TabAfterKeyword, TextRange::at(token.end(), len)); OldDiagnostic::new(TabAfterKeyword, TextRange::at(token.end(), len));
diagnostic.set_fix(Fix::safe_edit(Edit::range_replacement( diagnostic.set_fix(Fix::safe_edit(Edit::range_replacement(
" ".to_string(), " ".to_string(),
TextRange::at(token.end(), len), TextRange::at(token.end(), len),
@ -170,7 +170,7 @@ pub(crate) fn whitespace_around_keywords(line: &LogicalLine, context: &mut Logic
context.push_diagnostic(diagnostic); context.push_diagnostic(diagnostic);
} }
(Whitespace::Many, len) => { (Whitespace::Many, len) => {
let mut diagnostic = Diagnostic::new( let mut diagnostic = OldDiagnostic::new(
MultipleSpacesAfterKeyword, MultipleSpacesAfterKeyword,
TextRange::at(token.end(), len), TextRange::at(token.end(), len),
); );

View File

@ -4,7 +4,7 @@ use ruff_text_size::{Ranged, TextRange, TextSize};
use crate::checkers::logical_lines::LogicalLinesContext; use crate::checkers::logical_lines::LogicalLinesContext;
use crate::rules::pycodestyle::rules::logical_lines::{DefinitionState, LogicalLine}; use crate::rules::pycodestyle::rules::logical_lines::{DefinitionState, LogicalLine};
use crate::{AlwaysFixableViolation, Diagnostic, Edit, Fix}; use crate::{AlwaysFixableViolation, Edit, Fix, OldDiagnostic};
/// ## What it does /// ## What it does
/// Checks for missing whitespace around the equals sign in an unannotated /// Checks for missing whitespace around the equals sign in an unannotated
@ -126,7 +126,7 @@ pub(crate) fn whitespace_around_named_parameter_equals(
let start = token.start(); let start = token.start();
if start == prev_end && prev_end != TextSize::new(0) { if start == prev_end && prev_end != TextSize::new(0) {
let mut diagnostic = let mut diagnostic =
Diagnostic::new(MissingWhitespaceAroundParameterEquals, token.range); OldDiagnostic::new(MissingWhitespaceAroundParameterEquals, token.range);
diagnostic.set_fix(Fix::safe_edit(Edit::insertion( diagnostic.set_fix(Fix::safe_edit(Edit::insertion(
" ".to_string(), " ".to_string(),
token.start(), token.start(),
@ -141,7 +141,7 @@ pub(crate) fn whitespace_around_named_parameter_equals(
let next_start = next.start(); let next_start = next.start();
if next_start == token.end() { if next_start == token.end() {
let mut diagnostic = Diagnostic::new( let mut diagnostic = OldDiagnostic::new(
MissingWhitespaceAroundParameterEquals, MissingWhitespaceAroundParameterEquals,
token.range, token.range,
); );
@ -157,7 +157,7 @@ pub(crate) fn whitespace_around_named_parameter_equals(
} else { } else {
// If there's space between the preceding token and the equals sign, report it. // If there's space between the preceding token and the equals sign, report it.
if token.start() != prev_end { if token.start() != prev_end {
let mut diagnostic = Diagnostic::new( let mut diagnostic = OldDiagnostic::new(
UnexpectedSpacesAroundKeywordParameterEquals, UnexpectedSpacesAroundKeywordParameterEquals,
TextRange::new(prev_end, token.start()), TextRange::new(prev_end, token.start()),
); );
@ -171,7 +171,7 @@ pub(crate) fn whitespace_around_named_parameter_equals(
iter.next(); iter.next();
} else { } else {
if next.start() != token.end() { if next.start() != token.end() {
let mut diagnostic = Diagnostic::new( let mut diagnostic = OldDiagnostic::new(
UnexpectedSpacesAroundKeywordParameterEquals, UnexpectedSpacesAroundKeywordParameterEquals,
TextRange::new(token.end(), next.start()), TextRange::new(token.end(), next.start()),
); );

View File

@ -7,7 +7,7 @@ use ruff_text_size::{Ranged, TextLen, TextRange, TextSize};
use crate::Locator; use crate::Locator;
use crate::checkers::logical_lines::LogicalLinesContext; use crate::checkers::logical_lines::LogicalLinesContext;
use crate::rules::pycodestyle::rules::logical_lines::LogicalLine; use crate::rules::pycodestyle::rules::logical_lines::LogicalLine;
use crate::{AlwaysFixableViolation, Diagnostic, Edit, Fix}; use crate::{AlwaysFixableViolation, Edit, Fix, OldDiagnostic};
/// ## What it does /// ## What it does
/// Checks if inline comments are separated by at least two spaces. /// Checks if inline comments are separated by at least two spaces.
@ -185,7 +185,7 @@ pub(crate) fn whitespace_before_comment(
let is_inline_comment = !line_text.trim_whitespace().is_empty(); let is_inline_comment = !line_text.trim_whitespace().is_empty();
if is_inline_comment { if is_inline_comment {
if range.start() - prev_end < " ".text_len() { if range.start() - prev_end < " ".text_len() {
let mut diagnostic = Diagnostic::new( let mut diagnostic = OldDiagnostic::new(
TooFewSpacesBeforeInlineComment, TooFewSpacesBeforeInlineComment,
TextRange::new(prev_end, range.start()), TextRange::new(prev_end, range.start()),
); );
@ -210,7 +210,7 @@ pub(crate) fn whitespace_before_comment(
if is_inline_comment { if is_inline_comment {
if bad_prefix.is_some() || comment.chars().next().is_some_and(char::is_whitespace) { if bad_prefix.is_some() || comment.chars().next().is_some_and(char::is_whitespace) {
let mut diagnostic = Diagnostic::new(NoSpaceAfterInlineComment, range); let mut diagnostic = OldDiagnostic::new(NoSpaceAfterInlineComment, range);
diagnostic.set_fix(Fix::safe_edit(Edit::range_replacement( diagnostic.set_fix(Fix::safe_edit(Edit::range_replacement(
format_leading_space(token_text), format_leading_space(token_text),
range, range,
@ -220,7 +220,7 @@ pub(crate) fn whitespace_before_comment(
} else if let Some(bad_prefix) = bad_prefix { } else if let Some(bad_prefix) = bad_prefix {
if bad_prefix != '!' || !line.is_start_of_file() { if bad_prefix != '!' || !line.is_start_of_file() {
if bad_prefix != '#' { if bad_prefix != '#' {
let mut diagnostic = Diagnostic::new(NoSpaceAfterBlockComment, range); let mut diagnostic = OldDiagnostic::new(NoSpaceAfterBlockComment, range);
diagnostic.set_fix(Fix::safe_edit(Edit::range_replacement( diagnostic.set_fix(Fix::safe_edit(Edit::range_replacement(
format_leading_space(token_text), format_leading_space(token_text),
range, range,
@ -228,7 +228,7 @@ pub(crate) fn whitespace_before_comment(
context.push_diagnostic(diagnostic); context.push_diagnostic(diagnostic);
} else if !comment.is_empty() { } else if !comment.is_empty() {
let mut diagnostic = let mut diagnostic =
Diagnostic::new(MultipleLeadingHashesForBlockComment, range); OldDiagnostic::new(MultipleLeadingHashesForBlockComment, range);
diagnostic.set_fix(Fix::safe_edit(Edit::range_replacement( diagnostic.set_fix(Fix::safe_edit(Edit::range_replacement(
format_leading_hashes(token_text), format_leading_hashes(token_text),
range, range,

View File

@ -4,7 +4,7 @@ use ruff_text_size::{Ranged, TextRange, TextSize};
use crate::checkers::logical_lines::LogicalLinesContext; use crate::checkers::logical_lines::LogicalLinesContext;
use crate::rules::pycodestyle::rules::logical_lines::LogicalLine; use crate::rules::pycodestyle::rules::logical_lines::LogicalLine;
use crate::{AlwaysFixableViolation, Diagnostic, Edit, Fix}; use crate::{AlwaysFixableViolation, Edit, Fix, OldDiagnostic};
/// ## What it does /// ## What it does
/// Checks for extraneous whitespace immediately preceding an open parenthesis /// Checks for extraneous whitespace immediately preceding an open parenthesis
@ -76,7 +76,7 @@ pub(crate) fn whitespace_before_parameters(line: &LogicalLine, context: &mut Log
let end = token.end() - TextSize::from(1); let end = token.end() - TextSize::from(1);
let kind: WhitespaceBeforeParameters = WhitespaceBeforeParameters { bracket: kind }; let kind: WhitespaceBeforeParameters = WhitespaceBeforeParameters { bracket: kind };
let mut diagnostic = Diagnostic::new(kind, TextRange::new(start, end)); let mut diagnostic = OldDiagnostic::new(kind, TextRange::new(start, end));
diagnostic.set_fix(Fix::safe_edit(Edit::deletion(start, end))); diagnostic.set_fix(Fix::safe_edit(Edit::deletion(start, end)));
context.push_diagnostic(diagnostic); context.push_diagnostic(diagnostic);
} }

View File

@ -3,7 +3,7 @@ use ruff_python_codegen::Stylist;
use ruff_text_size::{TextLen, TextRange}; use ruff_text_size::{TextLen, TextRange};
use crate::Locator; use crate::Locator;
use crate::{AlwaysFixableViolation, Diagnostic, Edit, Fix}; use crate::{AlwaysFixableViolation, Edit, Fix, OldDiagnostic};
/// ## What it does /// ## What it does
/// Checks for files missing a new line at the end of the file. /// Checks for files missing a new line at the end of the file.
@ -40,7 +40,7 @@ impl AlwaysFixableViolation for MissingNewlineAtEndOfFile {
pub(crate) fn no_newline_at_end_of_file( pub(crate) fn no_newline_at_end_of_file(
locator: &Locator, locator: &Locator,
stylist: &Stylist, stylist: &Stylist,
) -> Option<Diagnostic> { ) -> Option<OldDiagnostic> {
let source = locator.contents(); let source = locator.contents();
// Ignore empty and BOM only files. // Ignore empty and BOM only files.
@ -51,7 +51,7 @@ pub(crate) fn no_newline_at_end_of_file(
if !source.ends_with(['\n', '\r']) { if !source.ends_with(['\n', '\r']) {
let range = TextRange::empty(locator.contents().text_len()); let range = TextRange::empty(locator.contents().text_len());
let mut diagnostic = Diagnostic::new(MissingNewlineAtEndOfFile, range); let mut diagnostic = OldDiagnostic::new(MissingNewlineAtEndOfFile, range);
diagnostic.set_fix(Fix::safe_edit(Edit::insertion( diagnostic.set_fix(Fix::safe_edit(Edit::insertion(
stylist.line_ending().to_string(), stylist.line_ending().to_string(),
range.start(), range.start(),

View File

@ -4,7 +4,7 @@ use ruff_macros::{ViolationMetadata, derive_message_formats};
use ruff_python_trivia::leading_indentation; use ruff_python_trivia::leading_indentation;
use ruff_source_file::Line; use ruff_source_file::Line;
use crate::{Diagnostic, Violation}; use crate::{OldDiagnostic, Violation};
/// ## What it does /// ## What it does
/// Checks for mixed tabs and spaces in indentation. /// Checks for mixed tabs and spaces in indentation.
@ -37,11 +37,11 @@ impl Violation for MixedSpacesAndTabs {
} }
/// E101 /// E101
pub(crate) fn mixed_spaces_and_tabs(line: &Line) -> Option<Diagnostic> { pub(crate) fn mixed_spaces_and_tabs(line: &Line) -> Option<OldDiagnostic> {
let indent = leading_indentation(line.as_str()); let indent = leading_indentation(line.as_str());
if indent.contains(' ') && indent.contains('\t') { if indent.contains(' ') && indent.contains('\t') {
Some(Diagnostic::new( Some(OldDiagnostic::new(
MixedSpacesAndTabs, MixedSpacesAndTabs,
TextRange::at(line.start(), indent.text_len()), TextRange::at(line.start(), indent.text_len()),
)) ))

View File

@ -4,7 +4,7 @@ use ruff_source_file::LineRanges;
use ruff_text_size::{TextRange, TextSize}; use ruff_text_size::{TextRange, TextSize};
use crate::Locator; use crate::Locator;
use crate::{Diagnostic, Violation}; use crate::{OldDiagnostic, Violation};
/// ## What it does /// ## What it does
/// Checks for indentation that uses tabs. /// Checks for indentation that uses tabs.
@ -34,7 +34,7 @@ impl Violation for TabIndentation {
/// W191 /// W191
pub(crate) fn tab_indentation( pub(crate) fn tab_indentation(
diagnostics: &mut Vec<Diagnostic>, diagnostics: &mut Vec<OldDiagnostic>,
locator: &Locator, locator: &Locator,
indexer: &Indexer, indexer: &Indexer,
) { ) {
@ -46,7 +46,7 @@ pub(crate) fn tab_indentation(
// Determine whether the tab is part of the line's indentation. // Determine whether the tab is part of the line's indentation.
if let Some(indent) = tab_indentation_at_line_start(range.start(), locator, indexer) { if let Some(indent) = tab_indentation_at_line_start(range.start(), locator, indexer) {
diagnostics.push(Diagnostic::new(TabIndentation, indent)); diagnostics.push(OldDiagnostic::new(TabIndentation, indent));
} }
// Advance to the next line. // Advance to the next line.

View File

@ -6,7 +6,7 @@ use ruff_notebook::CellOffsets;
use ruff_python_parser::{Token, TokenKind, Tokens}; use ruff_python_parser::{Token, TokenKind, Tokens};
use ruff_text_size::{Ranged, TextRange, TextSize}; use ruff_text_size::{Ranged, TextRange, TextSize};
use crate::{AlwaysFixableViolation, Diagnostic, Edit, Fix}; use crate::{AlwaysFixableViolation, Edit, Fix, OldDiagnostic};
/// ## What it does /// ## What it does
/// Checks for files with multiple trailing blank lines. /// Checks for files with multiple trailing blank lines.
@ -59,7 +59,7 @@ impl AlwaysFixableViolation for TooManyNewlinesAtEndOfFile {
/// W391 /// W391
pub(crate) fn too_many_newlines_at_end_of_file( pub(crate) fn too_many_newlines_at_end_of_file(
diagnostics: &mut Vec<Diagnostic>, diagnostics: &mut Vec<OldDiagnostic>,
tokens: &Tokens, tokens: &Tokens,
cell_offsets: Option<&CellOffsets>, cell_offsets: Option<&CellOffsets>,
) { ) {
@ -76,7 +76,7 @@ pub(crate) fn too_many_newlines_at_end_of_file(
fn notebook_newline_diagnostics<'a>( fn notebook_newline_diagnostics<'a>(
mut tokens_iter: Peekable<impl Iterator<Item = &'a Token>>, mut tokens_iter: Peekable<impl Iterator<Item = &'a Token>>,
cell_offsets: &CellOffsets, cell_offsets: &CellOffsets,
) -> Vec<Diagnostic> { ) -> Vec<OldDiagnostic> {
let mut results = Vec::new(); let mut results = Vec::new();
let offset_iter = cell_offsets.iter().rev(); let offset_iter = cell_offsets.iter().rev();
@ -101,7 +101,7 @@ fn notebook_newline_diagnostics<'a>(
fn newline_diagnostic<'a>( fn newline_diagnostic<'a>(
tokens_iter: &mut Peekable<impl Iterator<Item = &'a Token>>, tokens_iter: &mut Peekable<impl Iterator<Item = &'a Token>>,
in_notebook: bool, in_notebook: bool,
) -> Option<Diagnostic> { ) -> Option<OldDiagnostic> {
let mut num_trailing_newlines: u32 = 0; let mut num_trailing_newlines: u32 = 0;
let mut newline_range_start: Option<TextSize> = None; let mut newline_range_start: Option<TextSize> = None;
let mut newline_range_end: Option<TextSize> = None; let mut newline_range_end: Option<TextSize> = None;
@ -137,7 +137,7 @@ fn newline_diagnostic<'a>(
let diagnostic_range = TextRange::new(start, end); let diagnostic_range = TextRange::new(start, end);
Some( Some(
Diagnostic::new( OldDiagnostic::new(
TooManyNewlinesAtEndOfFile { TooManyNewlinesAtEndOfFile {
num_trailing_newlines, num_trailing_newlines,
in_notebook, in_notebook,

View File

@ -6,7 +6,7 @@ use ruff_text_size::{TextLen, TextRange, TextSize};
use crate::Locator; use crate::Locator;
use crate::registry::Rule; use crate::registry::Rule;
use crate::settings::LinterSettings; use crate::settings::LinterSettings;
use crate::{AlwaysFixableViolation, Applicability, Diagnostic, Edit, Fix}; use crate::{AlwaysFixableViolation, Applicability, Edit, Fix, OldDiagnostic};
/// ## What it does /// ## What it does
/// Checks for superfluous trailing whitespace. /// Checks for superfluous trailing whitespace.
@ -78,7 +78,7 @@ pub(crate) fn trailing_whitespace(
locator: &Locator, locator: &Locator,
indexer: &Indexer, indexer: &Indexer,
settings: &LinterSettings, settings: &LinterSettings,
) -> Option<Diagnostic> { ) -> Option<OldDiagnostic> {
let whitespace_len: TextSize = line let whitespace_len: TextSize = line
.chars() .chars()
.rev() .rev()
@ -95,7 +95,7 @@ pub(crate) fn trailing_whitespace(
}; };
if range == line.range() { if range == line.range() {
if settings.rules.enabled(Rule::BlankLineWithWhitespace) { if settings.rules.enabled(Rule::BlankLineWithWhitespace) {
let mut diagnostic = Diagnostic::new(BlankLineWithWhitespace, range); let mut diagnostic = OldDiagnostic::new(BlankLineWithWhitespace, range);
// Remove any preceding continuations, to avoid introducing a potential // Remove any preceding continuations, to avoid introducing a potential
// syntax error. // syntax error.
diagnostic.set_fix(Fix::applicable_edit( diagnostic.set_fix(Fix::applicable_edit(
@ -110,7 +110,7 @@ pub(crate) fn trailing_whitespace(
return Some(diagnostic); return Some(diagnostic);
} }
} else if settings.rules.enabled(Rule::TrailingWhitespace) { } else if settings.rules.enabled(Rule::TrailingWhitespace) {
let mut diagnostic = Diagnostic::new(TrailingWhitespace, range); let mut diagnostic = OldDiagnostic::new(TrailingWhitespace, range);
diagnostic.set_fix(Fix::applicable_edit( diagnostic.set_fix(Fix::applicable_edit(
Edit::range_deletion(range), Edit::range_deletion(range),
applicability, applicability,

View File

@ -4,7 +4,7 @@ use ruff_text_size::{Ranged, TextRange};
use crate::Locator; use crate::Locator;
use crate::noqa::{self, Directive, FileNoqaDirectives, NoqaDirectives}; use crate::noqa::{self, Directive, FileNoqaDirectives, NoqaDirectives};
use crate::{Diagnostic, Edit, Fix, FixAvailability, Violation}; use crate::{Edit, Fix, FixAvailability, OldDiagnostic, Violation};
/// ## What it does /// ## What it does
/// Check for `noqa` annotations that suppress all diagnostics, as opposed to /// Check for `noqa` annotations that suppress all diagnostics, as opposed to
@ -74,14 +74,14 @@ impl Violation for BlanketNOQA {
/// PGH004 /// PGH004
pub(crate) fn blanket_noqa( pub(crate) fn blanket_noqa(
diagnostics: &mut Vec<Diagnostic>, diagnostics: &mut Vec<OldDiagnostic>,
noqa_directives: &NoqaDirectives, noqa_directives: &NoqaDirectives,
locator: &Locator, locator: &Locator,
file_noqa_directives: &FileNoqaDirectives, file_noqa_directives: &FileNoqaDirectives,
) { ) {
for line in file_noqa_directives.lines() { for line in file_noqa_directives.lines() {
if let Directive::All(_) = line.parsed_file_exemption { if let Directive::All(_) = line.parsed_file_exemption {
diagnostics.push(Diagnostic::new( diagnostics.push(OldDiagnostic::new(
BlanketNOQA { BlanketNOQA {
missing_colon: false, missing_colon: false,
file_exemption: true, file_exemption: true,
@ -105,7 +105,7 @@ pub(crate) fn blanket_noqa(
// Ex) `# noqa F401` // Ex) `# noqa F401`
let start = all.end(); let start = all.end();
let end = start + cursor.token_len(); let end = start + cursor.token_len();
let mut diagnostic = Diagnostic::new( let mut diagnostic = OldDiagnostic::new(
BlanketNOQA { BlanketNOQA {
missing_colon: true, missing_colon: true,
file_exemption: false, file_exemption: false,
@ -116,7 +116,7 @@ pub(crate) fn blanket_noqa(
diagnostics.push(diagnostic); diagnostics.push(diagnostic);
} else { } else {
// Otherwise, it looks like an intentional blanket `noqa` annotation. // Otherwise, it looks like an intentional blanket `noqa` annotation.
diagnostics.push(Diagnostic::new( diagnostics.push(OldDiagnostic::new(
BlanketNOQA { BlanketNOQA {
missing_colon: false, missing_colon: false,
file_exemption: false, file_exemption: false,

View File

@ -9,7 +9,7 @@ use ruff_python_trivia::CommentRanges;
use ruff_text_size::TextSize; use ruff_text_size::TextSize;
use crate::Locator; use crate::Locator;
use crate::{Diagnostic, Violation}; use crate::{OldDiagnostic, Violation};
/// ## What it does /// ## What it does
/// Check for `type: ignore` annotations that suppress all type warnings, as /// Check for `type: ignore` annotations that suppress all type warnings, as
@ -52,7 +52,7 @@ impl Violation for BlanketTypeIgnore {
/// PGH003 /// PGH003
pub(crate) fn blanket_type_ignore( pub(crate) fn blanket_type_ignore(
diagnostics: &mut Vec<Diagnostic>, diagnostics: &mut Vec<OldDiagnostic>,
comment_ranges: &CommentRanges, comment_ranges: &CommentRanges,
locator: &Locator, locator: &Locator,
) { ) {
@ -92,7 +92,7 @@ pub(crate) fn blanket_type_ignore(
// Match the optional `[...]` tag. // Match the optional `[...]` tag.
if let Ok(codes) = parse_type_ignore_tag(comment) { if let Ok(codes) = parse_type_ignore_tag(comment) {
if codes.is_empty() { if codes.is_empty() {
diagnostics.push(Diagnostic::new( diagnostics.push(OldDiagnostic::new(
BlanketTypeIgnore, BlanketTypeIgnore,
range.add_start(TextSize::try_from(start).unwrap()), range.add_start(TextSize::try_from(start).unwrap()),
)); ));

View File

@ -1,7 +1,7 @@
use ruff_macros::{ViolationMetadata, derive_message_formats}; use ruff_macros::{ViolationMetadata, derive_message_formats};
use ruff_source_file::Line; use ruff_source_file::Line;
use crate::{Diagnostic, Violation}; use crate::{OldDiagnostic, Violation};
const BIDI_UNICODE: [char; 10] = [ const BIDI_UNICODE: [char; 10] = [
'\u{202A}', //{LEFT-TO-RIGHT EMBEDDING} '\u{202A}', //{LEFT-TO-RIGHT EMBEDDING}
@ -53,10 +53,10 @@ impl Violation for BidirectionalUnicode {
} }
/// PLE2502 /// PLE2502
pub(crate) fn bidirectional_unicode(line: &Line) -> Vec<Diagnostic> { pub(crate) fn bidirectional_unicode(line: &Line) -> Vec<OldDiagnostic> {
let mut diagnostics = Vec::new(); let mut diagnostics = Vec::new();
if line.contains(BIDI_UNICODE) { if line.contains(BIDI_UNICODE) {
diagnostics.push(Diagnostic::new(BidirectionalUnicode, line.full_range())); diagnostics.push(OldDiagnostic::new(BidirectionalUnicode, line.full_range()));
} }
diagnostics diagnostics
} }

View File

@ -4,7 +4,7 @@ use ruff_source_file::LineRanges;
use ruff_text_size::{TextRange, TextSize}; use ruff_text_size::{TextRange, TextSize};
use crate::Locator; use crate::Locator;
use crate::{Diagnostic, Edit, Fix, FixAvailability, Violation}; use crate::{Edit, Fix, FixAvailability, OldDiagnostic, Violation};
/// ## What it does /// ## What it does
/// Checks for a # symbol appearing on a line not followed by an actual comment. /// Checks for a # symbol appearing on a line not followed by an actual comment.
@ -45,7 +45,7 @@ impl Violation for EmptyComment {
/// PLR2044 /// PLR2044
pub(crate) fn empty_comments( pub(crate) fn empty_comments(
diagnostics: &mut Vec<Diagnostic>, diagnostics: &mut Vec<OldDiagnostic>,
comment_ranges: &CommentRanges, comment_ranges: &CommentRanges,
locator: &Locator, locator: &Locator,
) { ) {
@ -65,7 +65,7 @@ pub(crate) fn empty_comments(
} }
/// Return a [`Diagnostic`] if the comment at the given [`TextRange`] is empty. /// Return a [`Diagnostic`] if the comment at the given [`TextRange`] is empty.
fn empty_comment(range: TextRange, locator: &Locator) -> Option<Diagnostic> { fn empty_comment(range: TextRange, locator: &Locator) -> Option<OldDiagnostic> {
// Check: is the comment empty? // Check: is the comment empty?
if !locator if !locator
.slice(range) .slice(range)
@ -97,7 +97,7 @@ fn empty_comment(range: TextRange, locator: &Locator) -> Option<Diagnostic> {
}); });
Some( Some(
Diagnostic::new(EmptyComment, TextRange::new(first_hash_col, line.end())).with_fix( OldDiagnostic::new(EmptyComment, TextRange::new(first_hash_col, line.end())).with_fix(
Fix::safe_edit(if let Some(deletion_start_col) = deletion_start_col { Fix::safe_edit(if let Some(deletion_start_col) = deletion_start_col {
Edit::deletion(line.start() + deletion_start_col, line.end()) Edit::deletion(line.start() + deletion_start_col, line.end())
} else { } else {

View File

@ -3,7 +3,7 @@ use ruff_python_parser::{Token, TokenKind};
use ruff_text_size::{Ranged, TextLen, TextRange, TextSize}; use ruff_text_size::{Ranged, TextLen, TextRange, TextSize};
use crate::Locator; use crate::Locator;
use crate::{Diagnostic, Edit, Fix, FixAvailability, Violation}; use crate::{Edit, Fix, FixAvailability, OldDiagnostic, Violation};
/// ## What it does /// ## What it does
/// Checks for strings that contain the control character `BS`. /// Checks for strings that contain the control character `BS`.
@ -181,7 +181,7 @@ impl Violation for InvalidCharacterZeroWidthSpace {
/// PLE2510, PLE2512, PLE2513, PLE2514, PLE2515 /// PLE2510, PLE2512, PLE2513, PLE2514, PLE2515
pub(crate) fn invalid_string_characters( pub(crate) fn invalid_string_characters(
diagnostics: &mut Vec<Diagnostic>, diagnostics: &mut Vec<OldDiagnostic>,
token: &Token, token: &Token,
locator: &Locator, locator: &Locator,
) { ) {
@ -197,13 +197,13 @@ pub(crate) fn invalid_string_characters(
let c = match_.chars().next().unwrap(); let c = match_.chars().next().unwrap();
let range = TextRange::at(location, c.text_len()); let range = TextRange::at(location, c.text_len());
let (replacement, mut diagnostic) = match c { let (replacement, mut diagnostic) = match c {
'\x08' => ("\\b", Diagnostic::new(InvalidCharacterBackspace, range)), '\x08' => ("\\b", OldDiagnostic::new(InvalidCharacterBackspace, range)),
'\x1A' => ("\\x1A", Diagnostic::new(InvalidCharacterSub, range)), '\x1A' => ("\\x1A", OldDiagnostic::new(InvalidCharacterSub, range)),
'\x1B' => ("\\x1B", Diagnostic::new(InvalidCharacterEsc, range)), '\x1B' => ("\\x1B", OldDiagnostic::new(InvalidCharacterEsc, range)),
'\0' => ("\\0", Diagnostic::new(InvalidCharacterNul, range)), '\0' => ("\\0", OldDiagnostic::new(InvalidCharacterNul, range)),
'\u{200b}' => ( '\u{200b}' => (
"\\u200b", "\\u200b",
Diagnostic::new(InvalidCharacterZeroWidthSpace, range), OldDiagnostic::new(InvalidCharacterZeroWidthSpace, range),
), ),
_ => { _ => {
continue; continue;

View File

@ -5,7 +5,7 @@ use ruff_python_parser::{Token, TokenKind, Tokens};
use ruff_text_size::{Ranged, TextRange}; use ruff_text_size::{Ranged, TextRange};
use crate::Locator; use crate::Locator;
use crate::{AlwaysFixableViolation, Diagnostic, Edit, Fix}; use crate::{AlwaysFixableViolation, Edit, Fix, OldDiagnostic};
/// ## What it does /// ## What it does
/// Checks for extraneous parentheses. /// Checks for extraneous parentheses.
@ -115,7 +115,7 @@ fn match_extraneous_parentheses(tokens: &mut Iter<'_, Token>) -> Option<(TextRan
/// UP034 /// UP034
pub(crate) fn extraneous_parentheses( pub(crate) fn extraneous_parentheses(
diagnostics: &mut Vec<Diagnostic>, diagnostics: &mut Vec<OldDiagnostic>,
tokens: &Tokens, tokens: &Tokens,
locator: &Locator, locator: &Locator,
) { ) {
@ -129,7 +129,7 @@ pub(crate) fn extraneous_parentheses(
continue; continue;
}; };
let mut diagnostic = Diagnostic::new( let mut diagnostic = OldDiagnostic::new(
ExtraneousParentheses, ExtraneousParentheses,
TextRange::new(start_range.start(), end_range.end()), TextRange::new(start_range.start(), end_range.end()),
); );

View File

@ -9,7 +9,7 @@ use ruff_source_file::LineRanges;
use ruff_text_size::{Ranged, TextRange, TextSize}; use ruff_text_size::{Ranged, TextRange, TextSize};
use crate::Locator; use crate::Locator;
use crate::{AlwaysFixableViolation, Diagnostic, Edit, Fix}; use crate::{AlwaysFixableViolation, Edit, Fix, OldDiagnostic};
/// ## What it does /// ## What it does
/// Checks for unnecessary UTF-8 encoding declarations. /// Checks for unnecessary UTF-8 encoding declarations.
@ -66,7 +66,7 @@ struct CodingCommentRange {
/// UP009 /// UP009
pub(crate) fn unnecessary_coding_comment( pub(crate) fn unnecessary_coding_comment(
diagnostics: &mut Vec<Diagnostic>, diagnostics: &mut Vec<OldDiagnostic>,
locator: &Locator, locator: &Locator,
comment_ranges: &CommentRanges, comment_ranges: &CommentRanges,
) { ) {
@ -106,7 +106,7 @@ pub(crate) fn unnecessary_coding_comment(
} }
let fix = Fix::safe_edit(Edit::range_deletion(range.line)); let fix = Fix::safe_edit(Edit::range_deletion(range.line));
let diagnostic = Diagnostic::new(UTF8EncodingDeclaration, range.comment); let diagnostic = OldDiagnostic::new(UTF8EncodingDeclaration, range.comment);
diagnostics.push(diagnostic.with_fix(fix)); diagnostics.push(diagnostic.with_fix(fix));
} }

View File

@ -13,7 +13,7 @@ use crate::registry::AsRule;
use crate::rules::ruff::rules::Context; use crate::rules::ruff::rules::Context;
use crate::rules::ruff::rules::confusables::confusable; use crate::rules::ruff::rules::confusables::confusable;
use crate::settings::LinterSettings; use crate::settings::LinterSettings;
use crate::{Diagnostic, Violation}; use crate::{OldDiagnostic, Violation};
/// ## What it does /// ## What it does
/// Checks for ambiguous Unicode characters in strings. /// Checks for ambiguous Unicode characters in strings.
@ -176,7 +176,7 @@ impl Violation for AmbiguousUnicodeCharacterComment {
/// RUF003 /// RUF003
pub(crate) fn ambiguous_unicode_character_comment( pub(crate) fn ambiguous_unicode_character_comment(
diagnostics: &mut Vec<Diagnostic>, diagnostics: &mut Vec<OldDiagnostic>,
locator: &Locator, locator: &Locator,
range: TextRange, range: TextRange,
settings: &LinterSettings, settings: &LinterSettings,
@ -342,25 +342,25 @@ impl Candidate {
} }
} }
fn into_diagnostic(self, context: Context, settings: &LinterSettings) -> Option<Diagnostic> { fn into_diagnostic(self, context: Context, settings: &LinterSettings) -> Option<OldDiagnostic> {
if !settings.allowed_confusables.contains(&self.confusable) { if !settings.allowed_confusables.contains(&self.confusable) {
let char_range = TextRange::at(self.offset, self.confusable.text_len()); let char_range = TextRange::at(self.offset, self.confusable.text_len());
let diagnostic = match context { let diagnostic = match context {
Context::String => Diagnostic::new( Context::String => OldDiagnostic::new(
AmbiguousUnicodeCharacterString { AmbiguousUnicodeCharacterString {
confusable: self.confusable, confusable: self.confusable,
representant: self.representant, representant: self.representant,
}, },
char_range, char_range,
), ),
Context::Docstring => Diagnostic::new( Context::Docstring => OldDiagnostic::new(
AmbiguousUnicodeCharacterDocstring { AmbiguousUnicodeCharacterDocstring {
confusable: self.confusable, confusable: self.confusable,
representant: self.representant, representant: self.representant,
}, },
char_range, char_range,
), ),
Context::Comment => Diagnostic::new( Context::Comment => OldDiagnostic::new(
AmbiguousUnicodeCharacterComment { AmbiguousUnicodeCharacterComment {
confusable: self.confusable, confusable: self.confusable,
representant: self.representant, representant: self.representant,

View File

@ -4,7 +4,7 @@ use ruff_macros::{ViolationMetadata, derive_message_formats};
use ruff_source_file::Line; use ruff_source_file::Line;
use ruff_text_size::{TextRange, TextSize}; use ruff_text_size::{TextRange, TextSize};
use crate::{Diagnostic, Violation}; use crate::{OldDiagnostic, Violation};
/// ## What it does /// ## What it does
/// Checks for form feed characters preceded by either a space or a tab. /// Checks for form feed characters preceded by either a space or a tab.
@ -49,7 +49,7 @@ const SPACE: u8 = b' ';
const TAB: u8 = b'\t'; const TAB: u8 = b'\t';
/// RUF054 /// RUF054
pub(crate) fn indented_form_feed(line: &Line) -> Option<Diagnostic> { pub(crate) fn indented_form_feed(line: &Line) -> Option<OldDiagnostic> {
let index_relative_to_line = memchr(FORM_FEED, line.as_bytes())?; let index_relative_to_line = memchr(FORM_FEED, line.as_bytes())?;
if index_relative_to_line == 0 { if index_relative_to_line == 0 {
@ -68,5 +68,5 @@ pub(crate) fn indented_form_feed(line: &Line) -> Option<Diagnostic> {
let absolute_index = line.start() + TextSize::new(relative_index); let absolute_index = line.start() + TextSize::new(relative_index);
let range = TextRange::at(absolute_index, 1.into()); let range = TextRange::at(absolute_index, 1.into());
Some(Diagnostic::new(IndentedFormFeed, range)) Some(OldDiagnostic::new(IndentedFormFeed, range))
} }

View File

@ -5,7 +5,7 @@ use crate::Locator;
use crate::noqa::{Code, Directive}; use crate::noqa::{Code, Directive};
use crate::noqa::{Codes, NoqaDirectives}; use crate::noqa::{Codes, NoqaDirectives};
use crate::registry::Rule; use crate::registry::Rule;
use crate::{AlwaysFixableViolation, Diagnostic, Edit, Fix}; use crate::{AlwaysFixableViolation, Edit, Fix, OldDiagnostic};
/// ## What it does /// ## What it does
/// Checks for `noqa` codes that are invalid. /// Checks for `noqa` codes that are invalid.
@ -48,7 +48,7 @@ impl AlwaysFixableViolation for InvalidRuleCode {
/// RUF102 for invalid noqa codes /// RUF102 for invalid noqa codes
pub(crate) fn invalid_noqa_code( pub(crate) fn invalid_noqa_code(
diagnostics: &mut Vec<Diagnostic>, diagnostics: &mut Vec<OldDiagnostic>,
noqa_directives: &NoqaDirectives, noqa_directives: &NoqaDirectives,
locator: &Locator, locator: &Locator,
external: &[String], external: &[String],
@ -86,8 +86,8 @@ fn code_is_valid(code: &Code, external: &[String]) -> bool {
fn all_codes_invalid_diagnostic( fn all_codes_invalid_diagnostic(
directive: &Codes<'_>, directive: &Codes<'_>,
invalid_codes: Vec<&Code<'_>>, invalid_codes: Vec<&Code<'_>>,
) -> Diagnostic { ) -> OldDiagnostic {
Diagnostic::new( OldDiagnostic::new(
InvalidRuleCode { InvalidRuleCode {
rule_code: invalid_codes rule_code: invalid_codes
.into_iter() .into_iter()
@ -104,8 +104,8 @@ fn some_codes_are_invalid_diagnostic(
codes: &Codes, codes: &Codes,
invalid_code: &Code, invalid_code: &Code,
locator: &Locator, locator: &Locator,
) -> Diagnostic { ) -> OldDiagnostic {
let diagnostic = Diagnostic::new( let diagnostic = OldDiagnostic::new(
InvalidRuleCode { InvalidRuleCode {
rule_code: invalid_code.to_string(), rule_code: invalid_code.to_string(),
}, },

View File

@ -3,7 +3,7 @@ use ruff_text_size::Ranged;
use crate::noqa::{Codes, Directive, FileNoqaDirectives, NoqaDirectives}; use crate::noqa::{Codes, Directive, FileNoqaDirectives, NoqaDirectives};
use crate::rule_redirects::get_redirect_target; use crate::rule_redirects::get_redirect_target;
use crate::{AlwaysFixableViolation, Diagnostic, Edit, Fix}; use crate::{AlwaysFixableViolation, Edit, Fix, OldDiagnostic};
/// ## What it does /// ## What it does
/// Checks for `noqa` directives that use redirected rule codes. /// Checks for `noqa` directives that use redirected rule codes.
@ -43,7 +43,10 @@ impl AlwaysFixableViolation for RedirectedNOQA {
} }
/// RUF101 for in-line noqa directives /// RUF101 for in-line noqa directives
pub(crate) fn redirected_noqa(diagnostics: &mut Vec<Diagnostic>, noqa_directives: &NoqaDirectives) { pub(crate) fn redirected_noqa(
diagnostics: &mut Vec<OldDiagnostic>,
noqa_directives: &NoqaDirectives,
) {
for line in noqa_directives.lines() { for line in noqa_directives.lines() {
let Directive::Codes(directive) = &line.directive else { let Directive::Codes(directive) = &line.directive else {
continue; continue;
@ -55,7 +58,7 @@ pub(crate) fn redirected_noqa(diagnostics: &mut Vec<Diagnostic>, noqa_directives
/// RUF101 for file noqa directives /// RUF101 for file noqa directives
pub(crate) fn redirected_file_noqa( pub(crate) fn redirected_file_noqa(
diagnostics: &mut Vec<Diagnostic>, diagnostics: &mut Vec<OldDiagnostic>,
noqa_directives: &FileNoqaDirectives, noqa_directives: &FileNoqaDirectives,
) { ) {
for line in noqa_directives.lines() { for line in noqa_directives.lines() {
@ -68,10 +71,10 @@ pub(crate) fn redirected_file_noqa(
} }
/// Convert a sequence of [Codes] into [Diagnostic]s and append them to `diagnostics`. /// Convert a sequence of [Codes] into [Diagnostic]s and append them to `diagnostics`.
fn build_diagnostics(diagnostics: &mut Vec<Diagnostic>, codes: &Codes<'_>) { fn build_diagnostics(diagnostics: &mut Vec<OldDiagnostic>, codes: &Codes<'_>) {
for code in codes.iter() { for code in codes.iter() {
if let Some(redirected) = get_redirect_target(code.as_str()) { if let Some(redirected) = get_redirect_target(code.as_str()) {
let mut diagnostic = Diagnostic::new( let mut diagnostic = OldDiagnostic::new(
RedirectedNOQA { RedirectedNOQA {
original: code.to_string(), original: code.to_string(),
target: redirected.to_string(), target: redirected.to_string(),

View File

@ -19,7 +19,7 @@ use ruff_text_size::TextSize;
use crate::Locator; use crate::Locator;
use crate::registry::Rule; use crate::registry::Rule;
use crate::{Diagnostic, Edit, Fix, FixAvailability, Violation}; use crate::{Edit, Fix, FixAvailability, OldDiagnostic, Violation};
/// Check if a comment exists anywhere in a given file /// Check if a comment exists anywhere in a given file
fn comment_exists(text: &str, locator: &Locator, comment_ranges: &CommentRanges) -> bool { fn comment_exists(text: &str, locator: &Locator, comment_ranges: &CommentRanges) -> bool {
@ -48,7 +48,7 @@ pub(crate) const TEST_RULES: &[Rule] = &[
]; ];
pub(crate) trait TestRule { pub(crate) trait TestRule {
fn diagnostic(locator: &Locator, comment_ranges: &CommentRanges) -> Option<Diagnostic>; fn diagnostic(locator: &Locator, comment_ranges: &CommentRanges) -> Option<OldDiagnostic>;
} }
/// ## What it does /// ## What it does
@ -79,8 +79,8 @@ impl Violation for StableTestRule {
} }
impl TestRule for StableTestRule { impl TestRule for StableTestRule {
fn diagnostic(_locator: &Locator, _comment_ranges: &CommentRanges) -> Option<Diagnostic> { fn diagnostic(_locator: &Locator, _comment_ranges: &CommentRanges) -> Option<OldDiagnostic> {
Some(Diagnostic::new( Some(OldDiagnostic::new(
StableTestRule, StableTestRule,
ruff_text_size::TextRange::default(), ruff_text_size::TextRange::default(),
)) ))
@ -115,13 +115,13 @@ impl Violation for StableTestRuleSafeFix {
} }
impl TestRule for StableTestRuleSafeFix { impl TestRule for StableTestRuleSafeFix {
fn diagnostic(locator: &Locator, comment_ranges: &CommentRanges) -> Option<Diagnostic> { fn diagnostic(locator: &Locator, comment_ranges: &CommentRanges) -> Option<OldDiagnostic> {
let comment = "# fix from stable-test-rule-safe-fix\n".to_string(); let comment = "# fix from stable-test-rule-safe-fix\n".to_string();
if comment_exists(&comment, locator, comment_ranges) { if comment_exists(&comment, locator, comment_ranges) {
None None
} else { } else {
Some( Some(
Diagnostic::new(StableTestRuleSafeFix, ruff_text_size::TextRange::default()) OldDiagnostic::new(StableTestRuleSafeFix, ruff_text_size::TextRange::default())
.with_fix(Fix::safe_edit(Edit::insertion(comment, TextSize::new(0)))), .with_fix(Fix::safe_edit(Edit::insertion(comment, TextSize::new(0)))),
) )
} }
@ -156,13 +156,13 @@ impl Violation for StableTestRuleUnsafeFix {
} }
impl TestRule for StableTestRuleUnsafeFix { impl TestRule for StableTestRuleUnsafeFix {
fn diagnostic(locator: &Locator, comment_ranges: &CommentRanges) -> Option<Diagnostic> { fn diagnostic(locator: &Locator, comment_ranges: &CommentRanges) -> Option<OldDiagnostic> {
let comment = "# fix from stable-test-rule-unsafe-fix\n".to_string(); let comment = "# fix from stable-test-rule-unsafe-fix\n".to_string();
if comment_exists(&comment, locator, comment_ranges) { if comment_exists(&comment, locator, comment_ranges) {
None None
} else { } else {
Some( Some(
Diagnostic::new( OldDiagnostic::new(
StableTestRuleUnsafeFix, StableTestRuleUnsafeFix,
ruff_text_size::TextRange::default(), ruff_text_size::TextRange::default(),
) )
@ -200,13 +200,13 @@ impl Violation for StableTestRuleDisplayOnlyFix {
} }
impl TestRule for StableTestRuleDisplayOnlyFix { impl TestRule for StableTestRuleDisplayOnlyFix {
fn diagnostic(locator: &Locator, comment_ranges: &CommentRanges) -> Option<Diagnostic> { fn diagnostic(locator: &Locator, comment_ranges: &CommentRanges) -> Option<OldDiagnostic> {
let comment = "# fix from stable-test-rule-display-only-fix\n".to_string(); let comment = "# fix from stable-test-rule-display-only-fix\n".to_string();
if comment_exists(&comment, locator, comment_ranges) { if comment_exists(&comment, locator, comment_ranges) {
None None
} else { } else {
Some( Some(
Diagnostic::new( OldDiagnostic::new(
StableTestRuleDisplayOnlyFix, StableTestRuleDisplayOnlyFix,
ruff_text_size::TextRange::default(), ruff_text_size::TextRange::default(),
) )
@ -247,8 +247,8 @@ impl Violation for PreviewTestRule {
} }
impl TestRule for PreviewTestRule { impl TestRule for PreviewTestRule {
fn diagnostic(_locator: &Locator, _comment_ranges: &CommentRanges) -> Option<Diagnostic> { fn diagnostic(_locator: &Locator, _comment_ranges: &CommentRanges) -> Option<OldDiagnostic> {
Some(Diagnostic::new( Some(OldDiagnostic::new(
PreviewTestRule, PreviewTestRule,
ruff_text_size::TextRange::default(), ruff_text_size::TextRange::default(),
)) ))
@ -283,8 +283,8 @@ impl Violation for DeprecatedTestRule {
} }
impl TestRule for DeprecatedTestRule { impl TestRule for DeprecatedTestRule {
fn diagnostic(_locator: &Locator, _comment_ranges: &CommentRanges) -> Option<Diagnostic> { fn diagnostic(_locator: &Locator, _comment_ranges: &CommentRanges) -> Option<OldDiagnostic> {
Some(Diagnostic::new( Some(OldDiagnostic::new(
DeprecatedTestRule, DeprecatedTestRule,
ruff_text_size::TextRange::default(), ruff_text_size::TextRange::default(),
)) ))
@ -319,8 +319,8 @@ impl Violation for AnotherDeprecatedTestRule {
} }
impl TestRule for AnotherDeprecatedTestRule { impl TestRule for AnotherDeprecatedTestRule {
fn diagnostic(_locator: &Locator, _comment_ranges: &CommentRanges) -> Option<Diagnostic> { fn diagnostic(_locator: &Locator, _comment_ranges: &CommentRanges) -> Option<OldDiagnostic> {
Some(Diagnostic::new( Some(OldDiagnostic::new(
AnotherDeprecatedTestRule, AnotherDeprecatedTestRule,
ruff_text_size::TextRange::default(), ruff_text_size::TextRange::default(),
)) ))
@ -355,8 +355,8 @@ impl Violation for RemovedTestRule {
} }
impl TestRule for RemovedTestRule { impl TestRule for RemovedTestRule {
fn diagnostic(_locator: &Locator, _comment_ranges: &CommentRanges) -> Option<Diagnostic> { fn diagnostic(_locator: &Locator, _comment_ranges: &CommentRanges) -> Option<OldDiagnostic> {
Some(Diagnostic::new( Some(OldDiagnostic::new(
RemovedTestRule, RemovedTestRule,
ruff_text_size::TextRange::default(), ruff_text_size::TextRange::default(),
)) ))
@ -391,8 +391,8 @@ impl Violation for AnotherRemovedTestRule {
} }
impl TestRule for AnotherRemovedTestRule { impl TestRule for AnotherRemovedTestRule {
fn diagnostic(_locator: &Locator, _comment_ranges: &CommentRanges) -> Option<Diagnostic> { fn diagnostic(_locator: &Locator, _comment_ranges: &CommentRanges) -> Option<OldDiagnostic> {
Some(Diagnostic::new( Some(OldDiagnostic::new(
AnotherRemovedTestRule, AnotherRemovedTestRule,
ruff_text_size::TextRange::default(), ruff_text_size::TextRange::default(),
)) ))
@ -427,8 +427,8 @@ impl Violation for RedirectedFromTestRule {
} }
impl TestRule for RedirectedFromTestRule { impl TestRule for RedirectedFromTestRule {
fn diagnostic(_locator: &Locator, _comment_ranges: &CommentRanges) -> Option<Diagnostic> { fn diagnostic(_locator: &Locator, _comment_ranges: &CommentRanges) -> Option<OldDiagnostic> {
Some(Diagnostic::new( Some(OldDiagnostic::new(
RedirectedFromTestRule, RedirectedFromTestRule,
ruff_text_size::TextRange::default(), ruff_text_size::TextRange::default(),
)) ))
@ -463,8 +463,8 @@ impl Violation for RedirectedToTestRule {
} }
impl TestRule for RedirectedToTestRule { impl TestRule for RedirectedToTestRule {
fn diagnostic(_locator: &Locator, _comment_ranges: &CommentRanges) -> Option<Diagnostic> { fn diagnostic(_locator: &Locator, _comment_ranges: &CommentRanges) -> Option<OldDiagnostic> {
Some(Diagnostic::new( Some(OldDiagnostic::new(
RedirectedToTestRule, RedirectedToTestRule,
ruff_text_size::TextRange::default(), ruff_text_size::TextRange::default(),
)) ))
@ -499,8 +499,8 @@ impl Violation for RedirectedFromPrefixTestRule {
} }
impl TestRule for RedirectedFromPrefixTestRule { impl TestRule for RedirectedFromPrefixTestRule {
fn diagnostic(_locator: &Locator, _comment_ranges: &CommentRanges) -> Option<Diagnostic> { fn diagnostic(_locator: &Locator, _comment_ranges: &CommentRanges) -> Option<OldDiagnostic> {
Some(Diagnostic::new( Some(OldDiagnostic::new(
RedirectedFromPrefixTestRule, RedirectedFromPrefixTestRule,
ruff_text_size::TextRange::default(), ruff_text_size::TextRange::default(),
)) ))