Fix PLE251 rules with f-string escaping (#7741)

**Summary** The `value` of the `FStringMiddle` for `f"""}}ab"""` is
`}ab`, i.e. the curly brace escaping is decoded. If we iterate over
string this gives us false indices causing exploding fixes for PLE251
rules (PLE2510, PLE2512, PLE2513, PLE2514, PLE2515). Instead, we now use
the source range.

Handles
https://github.com/astral-sh/ruff/issues/7455#issuecomment-1741998106
Handles
https://github.com/astral-sh/ruff/issues/7455#issuecomment-1741998256

**Test Plan** Minimized fuzzing cases as fixtures.
This commit is contained in:
konsti 2023-10-02 10:43:39 +02:00 committed by GitHub
parent 1df8101b9e
commit f70e8a7524
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 55 additions and 2 deletions

View file

@ -179,8 +179,9 @@ pub(crate) fn invalid_string_characters(
locator: &Locator, locator: &Locator,
) { ) {
let text = match tok { let text = match tok {
Tok::String { .. } => locator.slice(range), // We can't use the `value` field since it's decoded and e.g. for f-strings removed a curly
Tok::FStringMiddle { value, .. } => value.as_str(), // brace that escaped another curly brace, which would gives us wrong column information.
Tok::String { .. } | Tok::FStringMiddle { .. } => locator.slice(range),
_ => return, _ => return,
}; };

View file

@ -48,6 +48,8 @@ invalid_characters.py:55:21: PLE2510 [*] Invalid unescaped character backspace,
54 | 54 |
55 | nested_fstrings = f'{f'{f''}'}' 55 | nested_fstrings = f'{f'{f''}'}'
| PLE2510 | PLE2510
56 |
57 | # https://github.com/astral-sh/ruff/issues/7455#issuecomment-1741998106
| |
= help: Replace with escape sequence = help: Replace with escape sequence
@ -57,5 +59,8 @@ invalid_characters.py:55:21: PLE2510 [*] Invalid unescaped character backspace,
54 54 | 54 54 |
55 |-nested_fstrings = f'{f'{f''}'}' 55 |-nested_fstrings = f'{f'{f''}'}'
55 |+nested_fstrings = f'\b{f'{f''}'}' 55 |+nested_fstrings = f'\b{f'{f''}'}'
56 56 |
57 57 | # https://github.com/astral-sh/ruff/issues/7455#issuecomment-1741998106
58 58 | x = f"""}}ab"""

View file

@ -47,6 +47,8 @@ invalid_characters.py:55:25: PLE2512 [*] Invalid unescaped character SUB, use "\
54 | 54 |
55 | nested_fstrings = f'{f'{f''}'}' 55 | nested_fstrings = f'{f'{f''}'}'
| PLE2512 | PLE2512
56 |
57 | # https://github.com/astral-sh/ruff/issues/7455#issuecomment-1741998106
| |
= help: Replace with escape sequence = help: Replace with escape sequence
@ -56,5 +58,27 @@ invalid_characters.py:55:25: PLE2512 [*] Invalid unescaped character SUB, use "\
54 54 | 54 54 |
55 |-nested_fstrings = f'{f'{f''}'}' 55 |-nested_fstrings = f'{f'{f''}'}'
55 |+nested_fstrings = f'{f'\x1A{f''}'}' 55 |+nested_fstrings = f'{f'\x1A{f''}'}'
56 56 |
57 57 | # https://github.com/astral-sh/ruff/issues/7455#issuecomment-1741998106
58 58 | x = f"""}}ab"""
invalid_characters.py:58:12: PLE2512 [*] Invalid unescaped character SUB, use "\x1A" instead
|
57 | # https://github.com/astral-sh/ruff/issues/7455#issuecomment-1741998106
58 | x = f"""}}ab"""
| PLE2512
59 | # https://github.com/astral-sh/ruff/issues/7455#issuecomment-1741998256
60 | x = f"""}}ab"""
|
= help: Replace with escape sequence
Fix
55 55 | nested_fstrings = f'{f'{f''}'}'
56 56 |
57 57 | # https://github.com/astral-sh/ruff/issues/7455#issuecomment-1741998106
58 |-x = f"""}}ab"""
58 |+x = f"""}}a\x1Ab"""
59 59 | # https://github.com/astral-sh/ruff/issues/7455#issuecomment-1741998256
60 60 | x = f"""}}ab"""

View file

@ -47,6 +47,8 @@ invalid_characters.py:55:29: PLE2513 [*] Invalid unescaped character ESC, use "\
54 | 54 |
55 | nested_fstrings = f'{f'{f''}'}' 55 | nested_fstrings = f'{f'{f''}'}'
| PLE2513 | PLE2513
56 |
57 | # https://github.com/astral-sh/ruff/issues/7455#issuecomment-1741998106
| |
= help: Replace with escape sequence = help: Replace with escape sequence
@ -56,5 +58,24 @@ invalid_characters.py:55:29: PLE2513 [*] Invalid unescaped character ESC, use "\
54 54 | 54 54 |
55 |-nested_fstrings = f'{f'{f''}'}' 55 |-nested_fstrings = f'{f'{f''}'}'
55 |+nested_fstrings = f'{f'{f'\x1B'}'}' 55 |+nested_fstrings = f'{f'{f'\x1B'}'}'
56 56 |
57 57 | # https://github.com/astral-sh/ruff/issues/7455#issuecomment-1741998106
58 58 | x = f"""}}ab"""
invalid_characters.py:60:12: PLE2513 [*] Invalid unescaped character ESC, use "\x1B" instead
|
58 | x = f"""}}ab"""
59 | # https://github.com/astral-sh/ruff/issues/7455#issuecomment-1741998256
60 | x = f"""}}ab"""
| PLE2513
|
= help: Replace with escape sequence
Fix
57 57 | # https://github.com/astral-sh/ruff/issues/7455#issuecomment-1741998106
58 58 | x = f"""}}ab"""
59 59 | # https://github.com/astral-sh/ruff/issues/7455#issuecomment-1741998256
60 |-x = f"""}}ab"""
60 |+x = f"""}}a\x1Bb"""

View file

@ -141,6 +141,7 @@ invalid_characters.py:53:61: PLE2515 [*] Invalid unescaped character zero-width-
53 |+zwsp_after_multicharacter_grapheme_cluster = f"ಫ್ರಾನ್ಸಿಸ್ಕೊ \u200b" 53 |+zwsp_after_multicharacter_grapheme_cluster = f"ಫ್ರಾನ್ಸಿಸ್ಕೊ \u200b"
54 54 | 54 54 |
55 55 | nested_fstrings = f'{f'{f''}'}' 55 55 | nested_fstrings = f'{f'{f''}'}'
56 56 |
invalid_characters.py:53:62: PLE2515 [*] Invalid unescaped character zero-width-space, use "\u200B" instead invalid_characters.py:53:62: PLE2515 [*] Invalid unescaped character zero-width-space, use "\u200B" instead
| |
@ -161,5 +162,6 @@ invalid_characters.py:53:62: PLE2515 [*] Invalid unescaped character zero-width-
53 |+zwsp_after_multicharacter_grapheme_cluster = f"ಫ್ರಾನ್ಸಿಸ್ಕೊ \u200b" 53 |+zwsp_after_multicharacter_grapheme_cluster = f"ಫ್ರಾನ್ಸಿಸ್ಕೊ \u200b"
54 54 | 54 54 |
55 55 | nested_fstrings = f'{f'{f''}'}' 55 55 | nested_fstrings = f'{f'{f''}'}'
56 56 |