Fix backslash cr nl bug (#4673)
* Update tokenize.py * Update CHANGES.md * Update test_black.py * Update test_black.py * Update test_black.py
This commit is contained in:
parent
e7bf7b4619
commit
24e4cb20ab
@ -16,6 +16,7 @@
|
|||||||
- Handle `# fmt: skip` followed by a comment at the end of file (#4635)
|
- Handle `# fmt: skip` followed by a comment at the end of file (#4635)
|
||||||
- Fix crash when a tuple appears in the `as` clause of a `with` statement (#4634)
|
- Fix crash when a tuple appears in the `as` clause of a `with` statement (#4634)
|
||||||
- Fix crash when tuple is used as a context manager inside a `with` statement (#4646)
|
- Fix crash when tuple is used as a context manager inside a `with` statement (#4646)
|
||||||
|
- Fix crash on a `\\r\n` (#4673)
|
||||||
|
|
||||||
### Preview style
|
### Preview style
|
||||||
|
|
||||||
|
@ -113,7 +113,17 @@ def transform_whitespace(
|
|||||||
and prev_token.type not in (TokenType.nl, TokenType.newline)
|
and prev_token.type not in (TokenType.nl, TokenType.newline)
|
||||||
):
|
):
|
||||||
token_str = source[token.start_index : token.end_index]
|
token_str = source[token.start_index : token.end_index]
|
||||||
if token_str.startswith("\\\n"):
|
if token_str.startswith("\\\r\n"):
|
||||||
|
return pytokens.Token(
|
||||||
|
TokenType.nl,
|
||||||
|
token.start_index,
|
||||||
|
token.start_index + 3,
|
||||||
|
token.start_line,
|
||||||
|
token.start_col,
|
||||||
|
token.start_line,
|
||||||
|
token.start_col + 3,
|
||||||
|
)
|
||||||
|
elif token_str.startswith("\\\n") or token_str.startswith("\\\r"):
|
||||||
return pytokens.Token(
|
return pytokens.Token(
|
||||||
TokenType.nl,
|
TokenType.nl,
|
||||||
token.start_index,
|
token.start_index,
|
||||||
|
@ -2065,6 +2065,26 @@ def test_lines_with_leading_tabs_expanded(self) -> None:
|
|||||||
assert lines_with_leading_tabs_expanded("\t\tx") == [f"{tab}{tab}x"]
|
assert lines_with_leading_tabs_expanded("\t\tx") == [f"{tab}{tab}x"]
|
||||||
assert lines_with_leading_tabs_expanded("\tx\n y") == [f"{tab}x", " y"]
|
assert lines_with_leading_tabs_expanded("\tx\n y") == [f"{tab}x", " y"]
|
||||||
|
|
||||||
|
def test_backslash_carriage_return(self) -> None:
|
||||||
|
# These tests are here instead of in the normal cases because
|
||||||
|
# of git's newline normalization and because it's hard to
|
||||||
|
# get `\r` vs `\r\n` vs `\n` to display properly in editors
|
||||||
|
assert black.format_str("x=\\\r\n1", mode=black.FileMode()) == "x = 1\n"
|
||||||
|
assert black.format_str("x=\\\n1", mode=black.FileMode()) == "x = 1\n"
|
||||||
|
assert black.format_str("x=\\\r1", mode=black.FileMode()) == "x = 1\n"
|
||||||
|
assert (
|
||||||
|
black.format_str("class A\\\r\n:...", mode=black.FileMode())
|
||||||
|
== "class A: ...\n"
|
||||||
|
)
|
||||||
|
assert (
|
||||||
|
black.format_str("class A\\\n:...", mode=black.FileMode())
|
||||||
|
== "class A: ...\n"
|
||||||
|
)
|
||||||
|
assert (
|
||||||
|
black.format_str("class A\\\r:...", mode=black.FileMode())
|
||||||
|
== "class A: ...\n"
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
class TestCaching:
|
class TestCaching:
|
||||||
def test_get_cache_dir(
|
def test_get_cache_dir(
|
||||||
|
Loading…
Reference in New Issue
Block a user