diff --git a/src/registry.rs b/src/registry.rs index f54ab1a594..54b3c09e8a 100644 --- a/src/registry.rs +++ b/src/registry.rs @@ -170,10 +170,10 @@ ruff_macros::define_rule_mapping!( T201 => violations::PrintFound, T203 => violations::PPrintFound, // flake8-quotes - Q000 => violations::BadQuotesInlineString, - Q001 => violations::BadQuotesMultilineString, - Q002 => violations::BadQuotesDocstring, - Q003 => violations::AvoidQuoteEscape, + Q000 => rules::flake8_quotes::rules::BadQuotesInlineString, + Q001 => rules::flake8_quotes::rules::BadQuotesMultilineString, + Q002 => rules::flake8_quotes::rules::BadQuotesDocstring, + Q003 => rules::flake8_quotes::rules::AvoidQuoteEscape, // flake8-annotations ANN001 => violations::MissingTypeFunctionArgument, ANN002 => violations::MissingTypeArgs, diff --git a/src/rules/flake8_quotes/rules.rs b/src/rules/flake8_quotes/rules.rs index 9ace32f242..a05c0802be 100644 --- a/src/rules/flake8_quotes/rules.rs +++ b/src/rules/flake8_quotes/rules.rs @@ -1,15 +1,102 @@ -use rustpython_ast::Location; -use rustpython_parser::lexer::{LexResult, Tok}; - +use super::settings::Quote; use crate::ast::types::Range; +use crate::define_violation; use crate::fix::Fix; use crate::lex::docstring_detection::StateMachine; use crate::registry::{Diagnostic, Rule}; use crate::settings::{flags, Settings}; use crate::source_code::Locator; -use crate::violations; +use crate::violation::AlwaysAutofixableViolation; -use super::settings::Quote; +use ruff_macros::derive_message_formats; +use rustpython_ast::Location; +use rustpython_parser::lexer::{LexResult, Tok}; + +define_violation!( + pub struct BadQuotesInlineString { + pub quote: Quote, + } +); +impl AlwaysAutofixableViolation for BadQuotesInlineString { + #[derive_message_formats] + fn message(&self) -> String { + let BadQuotesInlineString { quote } = self; + match quote { + Quote::Single => format!("Double quotes found but single quotes preferred"), + Quote::Double => format!("Single quotes found but double quotes preferred"), + } + } + + fn autofix_title(&self) -> String { + let BadQuotesInlineString { quote } = self; + match quote { + Quote::Single => "Replace double quotes with single quotes".to_string(), + Quote::Double => "Replace single quotes with double quotes".to_string(), + } + } +} + +define_violation!( + pub struct BadQuotesMultilineString { + pub quote: Quote, + } +); +impl AlwaysAutofixableViolation for BadQuotesMultilineString { + #[derive_message_formats] + fn message(&self) -> String { + let BadQuotesMultilineString { quote } = self; + match quote { + Quote::Single => format!("Double quote multiline found but single quotes preferred"), + Quote::Double => format!("Single quote multiline found but double quotes preferred"), + } + } + + fn autofix_title(&self) -> String { + let BadQuotesMultilineString { quote } = self; + match quote { + Quote::Single => "Replace double multiline quotes with single quotes".to_string(), + Quote::Double => "Replace single multiline quotes with double quotes".to_string(), + } + } +} + +define_violation!( + pub struct BadQuotesDocstring { + pub quote: Quote, + } +); +impl AlwaysAutofixableViolation for BadQuotesDocstring { + #[derive_message_formats] + fn message(&self) -> String { + let BadQuotesDocstring { quote } = self; + match quote { + Quote::Single => format!("Double quote docstring found but single quotes preferred"), + Quote::Double => format!("Single quote docstring found but double quotes preferred"), + } + } + + fn autofix_title(&self) -> String { + let BadQuotesDocstring { quote } = self; + match quote { + Quote::Single => "Replace double quotes docstring with single quotes".to_string(), + Quote::Double => "Replace single quotes docstring with double quotes".to_string(), + } + } +} + +define_violation!( + pub struct AvoidQuoteEscape; +); +impl AlwaysAutofixableViolation for AvoidQuoteEscape { + #[derive_message_formats] + fn message(&self) -> String { + format!("Change outer quotes to avoid escaping inner quotes") + } + + fn autofix_title(&self) -> String { + "Change outer quotes to avoid escaping inner quotes".to_string() + } +} fn good_single(quote: &Quote) -> char { match quote { @@ -102,7 +189,7 @@ fn docstring( } let mut diagnostic = Diagnostic::new( - violations::BadQuotesDocstring { + BadQuotesDocstring { quote: quotes_settings.docstring_quotes.clone(), }, Range::new(start, end), @@ -178,7 +265,7 @@ fn strings( } let mut diagnostic = Diagnostic::new( - violations::BadQuotesMultilineString { + BadQuotesMultilineString { quote: quotes_settings.multiline_quotes.clone(), }, Range::new(*start, *end), @@ -215,7 +302,7 @@ fn strings( && !string_contents.contains(bad_single("es_settings.inline_quotes)) { let mut diagnostic = - Diagnostic::new(violations::AvoidQuoteEscape, Range::new(*start, *end)); + Diagnostic::new(AvoidQuoteEscape, Range::new(*start, *end)); if matches!(autofix, flags::Autofix::Enabled) && settings.rules.should_fix(&Rule::AvoidQuoteEscape) { @@ -272,7 +359,7 @@ fn strings( // If we're not using the preferred type, only allow use to avoid escapes. if !relax_quote { let mut diagnostic = Diagnostic::new( - violations::BadQuotesInlineString { + BadQuotesInlineString { quote: quotes_settings.inline_quotes.clone(), }, Range::new(*start, *end), diff --git a/src/violations.rs b/src/violations.rs index a55260e1a3..158af1c6f3 100644 --- a/src/violations.rs +++ b/src/violations.rs @@ -11,7 +11,6 @@ use crate::rules::flake8_debugger::types::DebuggerUsingType; use crate::rules::flake8_pytest_style::types::{ ParametrizeNameType, ParametrizeValuesRowType, ParametrizeValuesType, }; -use crate::rules::flake8_quotes::settings::Quote; use crate::rules::pyupgrade::types::Primitive; use crate::violation::{AlwaysAutofixableViolation, AutofixKind, Availability, Violation}; @@ -1181,94 +1180,6 @@ impl AlwaysAutofixableViolation for PPrintFound { } } -// flake8-quotes - -define_violation!( - pub struct BadQuotesInlineString { - pub quote: Quote, - } -); -impl AlwaysAutofixableViolation for BadQuotesInlineString { - #[derive_message_formats] - fn message(&self) -> String { - let BadQuotesInlineString { quote } = self; - match quote { - Quote::Single => format!("Double quotes found but single quotes preferred"), - Quote::Double => format!("Single quotes found but double quotes preferred"), - } - } - - fn autofix_title(&self) -> String { - let BadQuotesInlineString { quote } = self; - match quote { - Quote::Single => "Replace double quotes with single quotes".to_string(), - Quote::Double => "Replace single quotes with double quotes".to_string(), - } - } -} - -define_violation!( - pub struct BadQuotesMultilineString { - pub quote: Quote, - } -); -impl AlwaysAutofixableViolation for BadQuotesMultilineString { - #[derive_message_formats] - fn message(&self) -> String { - let BadQuotesMultilineString { quote } = self; - match quote { - Quote::Single => format!("Double quote multiline found but single quotes preferred"), - Quote::Double => format!("Single quote multiline found but double quotes preferred"), - } - } - - fn autofix_title(&self) -> String { - let BadQuotesMultilineString { quote } = self; - match quote { - Quote::Single => "Replace double multiline quotes with single quotes".to_string(), - Quote::Double => "Replace single multiline quotes with double quotes".to_string(), - } - } -} - -define_violation!( - pub struct BadQuotesDocstring { - pub quote: Quote, - } -); -impl AlwaysAutofixableViolation for BadQuotesDocstring { - #[derive_message_formats] - fn message(&self) -> String { - let BadQuotesDocstring { quote } = self; - match quote { - Quote::Single => format!("Double quote docstring found but single quotes preferred"), - Quote::Double => format!("Single quote docstring found but double quotes preferred"), - } - } - - fn autofix_title(&self) -> String { - let BadQuotesDocstring { quote } = self; - match quote { - Quote::Single => "Replace double quotes docstring with single quotes".to_string(), - Quote::Double => "Replace single quotes docstring with double quotes".to_string(), - } - } -} - -define_violation!( - pub struct AvoidQuoteEscape; -); -impl AlwaysAutofixableViolation for AvoidQuoteEscape { - #[derive_message_formats] - fn message(&self) -> String { - format!("Change outer quotes to avoid escaping inner quotes") - } - - fn autofix_title(&self) -> String { - "Change outer quotes to avoid escaping inner quotes".to_string() - } -} - // flake8-annotations define_violation!(