mirror of
				https://github.com/astral-sh/ruff.git
				synced 2025-10-30 11:36:57 +00:00 
			
		
		
		
	[ruff] Fix syntax error introduced for an empty string followed by a u-prefixed string (UP025) (#18899)
				
					
				
			## Summary /closes #18895 ## Test Plan --------- Co-authored-by: Brent Westbrook <36778786+ntBre@users.noreply.github.com>
This commit is contained in:
		
							parent
							
								
									dac4e356eb
								
							
						
					
					
						commit
						667dc62038
					
				
					 3 changed files with 111 additions and 5 deletions
				
			
		|  | @ -26,3 +26,9 @@ def hello(): | ||||||
| 
 | 
 | ||||||
| f"foo"u"bar"  # OK | f"foo"u"bar"  # OK | ||||||
| f"foo" u"bar"  # OK | f"foo" u"bar"  # OK | ||||||
|  | 
 | ||||||
|  | # https://github.com/astral-sh/ruff/issues/18895 | ||||||
|  | ""u"" | ||||||
|  | ""u"hi" | ||||||
|  | """"""""""""""""""""u"hi" | ||||||
|  | ""U"helloooo" | ||||||
|  | @ -42,9 +42,28 @@ impl AlwaysFixableViolation for UnicodeKindPrefix { | ||||||
| pub(crate) fn unicode_kind_prefix(checker: &Checker, string: &StringLiteral) { | pub(crate) fn unicode_kind_prefix(checker: &Checker, string: &StringLiteral) { | ||||||
|     if string.flags.prefix().is_unicode() { |     if string.flags.prefix().is_unicode() { | ||||||
|         let mut diagnostic = checker.report_diagnostic(UnicodeKindPrefix, string.range); |         let mut diagnostic = checker.report_diagnostic(UnicodeKindPrefix, string.range); | ||||||
|         diagnostic.set_fix(Fix::safe_edit(Edit::range_deletion(TextRange::at( | 
 | ||||||
|             string.start(), |         let prefix_range = TextRange::at(string.start(), TextSize::new(1)); | ||||||
|             TextSize::from(1), |         let locator = checker.locator(); | ||||||
|         )))); |         let content = locator | ||||||
|  |             .slice(TextRange::new(prefix_range.end(), string.end())) | ||||||
|  |             .to_owned(); | ||||||
|  | 
 | ||||||
|  |         // If the preceding character is equivalent to the quote character, insert a space to avoid a
 | ||||||
|  |         // syntax error. For example, when removing the `u` prefix in `""u""`, rewrite to `"" ""`
 | ||||||
|  |         // instead of `""""`.
 | ||||||
|  |         // see https://github.com/astral-sh/ruff/issues/18895
 | ||||||
|  |         let edit = if locator | ||||||
|  |             .slice(TextRange::up_to(prefix_range.start())) | ||||||
|  |             .chars() | ||||||
|  |             .last() | ||||||
|  |             .is_some_and(|char| content.starts_with(char)) | ||||||
|  |         { | ||||||
|  |             Edit::range_replacement(" ".to_string(), prefix_range) | ||||||
|  |         } else { | ||||||
|  |             Edit::range_deletion(prefix_range) | ||||||
|  |         }; | ||||||
|  | 
 | ||||||
|  |         diagnostic.set_fix(Fix::safe_edit(edit)); | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -281,14 +281,18 @@ UP025.py:27:7: UP025 [*] Remove unicode literals from strings | ||||||
| 25 25 |     return"Hello"  # OK | 25 25 |     return"Hello"  # OK | ||||||
| 26 26 |  | 26 26 |  | ||||||
| 27    |-f"foo"u"bar"  # OK | 27    |-f"foo"u"bar"  # OK | ||||||
|    27 |+f"foo""bar"  # OK |    27 |+f"foo" "bar"  # OK | ||||||
| 28 28 | f"foo" u"bar"  # OK | 28 28 | f"foo" u"bar"  # OK | ||||||
|  | 29 29 |  | ||||||
|  | 30 30 | # https://github.com/astral-sh/ruff/issues/18895 | ||||||
| 
 | 
 | ||||||
| UP025.py:28:8: UP025 [*] Remove unicode literals from strings | UP025.py:28:8: UP025 [*] Remove unicode literals from strings | ||||||
|    | |    | | ||||||
| 27 | f"foo"u"bar"  # OK | 27 | f"foo"u"bar"  # OK | ||||||
| 28 | f"foo" u"bar"  # OK | 28 | f"foo" u"bar"  # OK | ||||||
|    |        ^^^^^^ UP025 |    |        ^^^^^^ UP025 | ||||||
|  | 29 | | ||||||
|  | 30 | # https://github.com/astral-sh/ruff/issues/18895 | ||||||
|    | |    | | ||||||
|    = help: Remove unicode prefix |    = help: Remove unicode prefix | ||||||
| 
 | 
 | ||||||
|  | @ -298,3 +302,80 @@ UP025.py:28:8: UP025 [*] Remove unicode literals from strings | ||||||
| 27 27 | f"foo"u"bar"  # OK | 27 27 | f"foo"u"bar"  # OK | ||||||
| 28    |-f"foo" u"bar"  # OK | 28    |-f"foo" u"bar"  # OK | ||||||
|    28 |+f"foo" "bar"  # OK |    28 |+f"foo" "bar"  # OK | ||||||
|  | 29 29 |  | ||||||
|  | 30 30 | # https://github.com/astral-sh/ruff/issues/18895 | ||||||
|  | 31 31 | ""u"" | ||||||
|  | 
 | ||||||
|  | UP025.py:31:3: UP025 [*] Remove unicode literals from strings | ||||||
|  |    | | ||||||
|  | 30 | # https://github.com/astral-sh/ruff/issues/18895 | ||||||
|  | 31 | ""u"" | ||||||
|  |    |   ^^^ UP025 | ||||||
|  | 32 | ""u"hi" | ||||||
|  | 33 | """"""""""""""""""""u"hi" | ||||||
|  |    | | ||||||
|  |    = help: Remove unicode prefix | ||||||
|  | 
 | ||||||
|  | ℹ Safe fix | ||||||
|  | 28 28 | f"foo" u"bar"  # OK | ||||||
|  | 29 29 |  | ||||||
|  | 30 30 | # https://github.com/astral-sh/ruff/issues/18895 | ||||||
|  | 31    |-""u"" | ||||||
|  |    31 |+"" "" | ||||||
|  | 32 32 | ""u"hi" | ||||||
|  | 33 33 | """"""""""""""""""""u"hi" | ||||||
|  | 34 34 | ""U"helloooo" | ||||||
|  | 
 | ||||||
|  | UP025.py:32:3: UP025 [*] Remove unicode literals from strings | ||||||
|  |    | | ||||||
|  | 30 | # https://github.com/astral-sh/ruff/issues/18895 | ||||||
|  | 31 | ""u"" | ||||||
|  | 32 | ""u"hi" | ||||||
|  |    |   ^^^^^ UP025 | ||||||
|  | 33 | """"""""""""""""""""u"hi" | ||||||
|  | 34 | ""U"helloooo" | ||||||
|  |    | | ||||||
|  |    = help: Remove unicode prefix | ||||||
|  | 
 | ||||||
|  | ℹ Safe fix | ||||||
|  | 29 29 |  | ||||||
|  | 30 30 | # https://github.com/astral-sh/ruff/issues/18895 | ||||||
|  | 31 31 | ""u"" | ||||||
|  | 32    |-""u"hi" | ||||||
|  |    32 |+"" "hi" | ||||||
|  | 33 33 | """"""""""""""""""""u"hi" | ||||||
|  | 34 34 | ""U"helloooo" | ||||||
|  | 
 | ||||||
|  | UP025.py:33:21: UP025 [*] Remove unicode literals from strings | ||||||
|  |    | | ||||||
|  | 31 | ""u"" | ||||||
|  | 32 | ""u"hi" | ||||||
|  | 33 | """"""""""""""""""""u"hi" | ||||||
|  |    |                     ^^^^^ UP025 | ||||||
|  | 34 | ""U"helloooo" | ||||||
|  |    | | ||||||
|  |    = help: Remove unicode prefix | ||||||
|  | 
 | ||||||
|  | ℹ Safe fix | ||||||
|  | 30 30 | # https://github.com/astral-sh/ruff/issues/18895 | ||||||
|  | 31 31 | ""u"" | ||||||
|  | 32 32 | ""u"hi" | ||||||
|  | 33    |-""""""""""""""""""""u"hi" | ||||||
|  |    33 |+"""""""""""""""""""" "hi" | ||||||
|  | 34 34 | ""U"helloooo" | ||||||
|  | 
 | ||||||
|  | UP025.py:34:3: UP025 [*] Remove unicode literals from strings | ||||||
|  |    | | ||||||
|  | 32 | ""u"hi" | ||||||
|  | 33 | """"""""""""""""""""u"hi" | ||||||
|  | 34 | ""U"helloooo" | ||||||
|  |    |   ^^^^^^^^^^^ UP025 | ||||||
|  |    | | ||||||
|  |    = help: Remove unicode prefix | ||||||
|  | 
 | ||||||
|  | ℹ Safe fix | ||||||
|  | 31 31 | ""u"" | ||||||
|  | 32 32 | ""u"hi" | ||||||
|  | 33 33 | """"""""""""""""""""u"hi" | ||||||
|  | 34    |-""U"helloooo" | ||||||
|  |    34 |+"" "helloooo" | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Илья Любавский
						Илья Любавский