From 6c3f8181854160f3db354f6f6ef3315ef05db8e7 Mon Sep 17 00:00:00 2001 From: Bryan Bugyi Date: Sat, 31 Oct 2020 13:42:36 -0400 Subject: [PATCH] Fix bug where black tries to split string on escaped space (#1799) Closes #1505. --- src/black/__init__.py | 17 ++++++++++-- tests/data/long_strings__regression.py | 37 ++++++++++++++++++++++++++ 2 files changed, 52 insertions(+), 2 deletions(-) diff --git a/src/black/__init__.py b/src/black/__init__.py index 24e9d4e..e09838d 100644 --- a/src/black/__init__.py +++ b/src/black/__init__.py @@ -3590,7 +3590,8 @@ class StringSplitter(CustomSplitMapMixin, BaseStringSplitter): MIN_SUBSTR_SIZE characters. The string will ONLY be split on spaces (i.e. each new substring should - start with a space). + start with a space). Note that the string will NOT be split on a space + which is escaped with a backslash. If the string is an f-string, it will NOT be split in the middle of an f-expression (e.g. in f"FooBar: {foo() if x else bar()}", {foo() if x @@ -3930,11 +3931,23 @@ class StringSplitter(CustomSplitMapMixin, BaseStringSplitter): section of this classes' docstring would be be met by returning @i. """ is_space = string[i] == " " + + is_not_escaped = True + j = i - 1 + while is_valid_index(j) and string[j] == "\\": + is_not_escaped = not is_not_escaped + j -= 1 + is_big_enough = ( len(string[i:]) >= self.MIN_SUBSTR_SIZE and len(string[:i]) >= self.MIN_SUBSTR_SIZE ) - return is_space and is_big_enough and not breaks_fstring_expression(i) + return ( + is_space + and is_not_escaped + and is_big_enough + and not breaks_fstring_expression(i) + ) # First, we check all indices BELOW @max_break_idx. break_idx = max_break_idx diff --git a/tests/data/long_strings__regression.py b/tests/data/long_strings__regression.py index 8290a4c..9bfb1ee 100644 --- a/tests/data/long_strings__regression.py +++ b/tests/data/long_strings__regression.py @@ -353,6 +353,24 @@ value.__dict__[ key ] = "test" # set some Thrift field to non-None in the struct aa bb cc dd ee +RE_ONE_BACKSLASH = { + "asdf_hjkl_jkl": re.compile( + r"(?