From 659ecba47746743e71b1bcc6752881f385996dd6 Mon Sep 17 00:00:00 2001 From: Victor Hugo Gomes Date: Mon, 23 Jun 2025 05:11:51 -0300 Subject: [PATCH] [`pylint`] Supress `PLE2510`/`2512`/`2513`/`2514`/`2515` autofix if the text contains an odd number of backslashes (#18856) Co-authored-by: Micha Reiser --- .../fixtures/pylint/invalid_characters.py | Bin 1762 -> 1868 bytes .../pylint/rules/invalid_string_characters.rs | 11 ++++++++++- ..._tests__PLE2510_invalid_characters.py.snap | Bin 2698 -> 2966 bytes ..._tests__PLE2512_invalid_characters.py.snap | Bin 3205 -> 3490 bytes ..._tests__PLE2513_invalid_characters.py.snap | Bin 3211 -> 3458 bytes ..._tests__PLE2514_invalid_characters.py.snap | Bin 1603 -> 1816 bytes ..._tests__PLE2515_invalid_characters.py.snap | Bin 7613 -> 7861 bytes crates/ruff_python_formatter/src/lib.rs | 10 +++------- 8 files changed, 13 insertions(+), 8 deletions(-) diff --git a/crates/ruff_linter/resources/test/fixtures/pylint/invalid_characters.py b/crates/ruff_linter/resources/test/fixtures/pylint/invalid_characters.py index 10c8b4202f0fdee64087d36b7fe3d45c58591d28..05cf82a535fb425503fb6db20d4c50b4bcb20d3c 100644 GIT binary patch delta 74 zcmaFFdxmerBeuzWY&v#^78Zu4TuBPH3Q92?N?gUI5T=w8S88!GSX5extE#-X0L*^W Q(5=LkSDFLnFeq^W0QmS5djJ3c delta 7 OcmX@Z_lS4HBQ^jIX9HpY diff --git a/crates/ruff_linter/src/rules/pylint/rules/invalid_string_characters.rs b/crates/ruff_linter/src/rules/pylint/rules/invalid_string_characters.rs index 25a28875cd..067387189e 100644 --- a/crates/ruff_linter/src/rules/pylint/rules/invalid_string_characters.rs +++ b/crates/ruff_linter/src/rules/pylint/rules/invalid_string_characters.rs @@ -193,6 +193,15 @@ pub(crate) fn invalid_string_characters(context: &LintContext, token: &Token, lo let location = token.start() + TextSize::try_from(column).unwrap(); let c = match_.chars().next().unwrap(); let range = TextRange::at(location, c.text_len()); + + let is_escaped = &text[..column] + .chars() + .rev() + .take_while(|c| *c == '\\') + .count() + % 2 + == 1; + let (replacement, diagnostic) = match c { '\x08' => ( "\\b", @@ -223,7 +232,7 @@ pub(crate) fn invalid_string_characters(context: &LintContext, token: &Token, lo continue; }; - if !token.unwrap_string_flags().is_raw_string() { + if !token.unwrap_string_flags().is_raw_string() && !is_escaped { let edit = Edit::range_replacement(replacement.to_string(), range); diagnostic.set_fix(Fix::safe_edit(edit)); } diff --git a/crates/ruff_linter/src/rules/pylint/snapshots/ruff_linter__rules__pylint__tests__PLE2510_invalid_characters.py.snap b/crates/ruff_linter/src/rules/pylint/snapshots/ruff_linter__rules__pylint__tests__PLE2510_invalid_characters.py.snap index 46b9cb6a3fcc51cd380e08960dd32ac972ad28c5..408e2ababfc70c70cb44b41443cc7d842f8d6feb 100644 GIT binary patch delta 108 zcmeAYohH7ai)-=}PH`4e!X delta 7 OcmbOx-X*%Biwgh>-vW^U diff --git a/crates/ruff_linter/src/rules/pylint/snapshots/ruff_linter__rules__pylint__tests__PLE2512_invalid_characters.py.snap b/crates/ruff_linter/src/rules/pylint/snapshots/ruff_linter__rules__pylint__tests__PLE2512_invalid_characters.py.snap index 88630ccb7a5a9f399caa6c67079dbf5708a872b7..2f7825c655c9c69934979d9baa81438342ad111c 100644 GIT binary patch delta 115 zcmZpbTqM1rm1lAbmpF^Lv6bcI1zgTd=7y7dS@g6FEi4R8xy+3eY7~+bY!#GZ9!=;_ z;xab|@{3C$B2r3R3JMA}lM|VQRm@F*5~;<>P^GhhN=<@+OPs~r#L9AVC#SQSxsgJRLXv{5f>O+*2^~sY=EgvNaVbPZ3dlDB y@>7eGp(w`mgaU~G diff --git a/crates/ruff_linter/src/rules/pylint/snapshots/ruff_linter__rules__pylint__tests__PLE2514_invalid_characters.py.snap b/crates/ruff_linter/src/rules/pylint/snapshots/ruff_linter__rules__pylint__tests__PLE2514_invalid_characters.py.snap index a06d6f645f0905583da6091e65bc4dbae2121ad3..f6e122931c66b6350bcc54acae575f53807dbca2 100644 GIT binary patch delta 100 zcmX@iGlOq~Guvbr7I7AHGb_u<2`rA@<|Ya?3aQ1(3bqPLF^?w9R^l=@1&UOa7Z*T; l8oGf(W2}CMnn|D8)!AahaO{`KiUpVE&^C yvw None: - if True: - some_very_long_variable_name_abcdefghijk = Foo() - some_very_long_variable_name_abcdefghijk = some_very_long_variable_name_abcdefghijk[ - some_very_long_variable_name_abcdefghijk.some_very_long_attribute_name - == "This is a very long string abcdefghijk" - ] +def hello(): ... +@lambda _, /: _ +class A: ... "#; let source_type = PySourceType::Python;