Avoid removing whitespace for walrus operators within subscripts (#3823)
Co-authored-by: hauntsaninja <hauntsaninja@gmail.com> Co-authored-by: Jelle Zijlstra <jelle.zijlstra@gmail.com>
This commit is contained in:
parent
74d3009ba4
commit
a20338cf10
@ -80,6 +80,7 @@
|
||||
(#3740)
|
||||
- Fix error in AST validation when _Black_ removes trailing whitespace in a type comment
|
||||
(#3773)
|
||||
- Fix a bug whereby spaces were removed from walrus operators within subscript (#3823)
|
||||
|
||||
### Preview style
|
||||
|
||||
|
@ -81,7 +81,9 @@ def append(
|
||||
# Note: at this point leaf.prefix should be empty except for
|
||||
# imports, for which we only preserve newlines.
|
||||
leaf.prefix += whitespace(
|
||||
leaf, complex_subscript=self.is_complex_subscript(leaf)
|
||||
leaf,
|
||||
complex_subscript=self.is_complex_subscript(leaf),
|
||||
mode=self.mode,
|
||||
)
|
||||
if self.inside_brackets or not preformatted or track_bracket:
|
||||
self.bracket_tracker.mark(leaf)
|
||||
|
@ -183,6 +183,7 @@ class Preview(Enum):
|
||||
wrap_long_dict_values_in_parens = auto()
|
||||
wrap_multiple_context_managers_in_parens = auto()
|
||||
dummy_implementations = auto()
|
||||
walrus_subscript = auto()
|
||||
|
||||
|
||||
class Deprecated(UserWarning):
|
||||
|
@ -13,6 +13,7 @@
|
||||
from mypy_extensions import mypyc_attr
|
||||
|
||||
from black.cache import CACHE_DIR
|
||||
from black.mode import Mode, Preview
|
||||
from black.strings import has_triple_quotes
|
||||
from blib2to3 import pygram
|
||||
from blib2to3.pgen2 import token
|
||||
@ -171,7 +172,7 @@ def visit_default(self, node: LN) -> Iterator[T]:
|
||||
yield from self.visit(child)
|
||||
|
||||
|
||||
def whitespace(leaf: Leaf, *, complex_subscript: bool) -> str: # noqa: C901
|
||||
def whitespace(leaf: Leaf, *, complex_subscript: bool, mode: Mode) -> str: # noqa: C901
|
||||
"""Return whitespace prefix if needed for the given `leaf`.
|
||||
|
||||
`complex_subscript` signals whether the given leaf is part of a subscription
|
||||
@ -345,6 +346,11 @@ def whitespace(leaf: Leaf, *, complex_subscript: bool) -> str: # noqa: C901
|
||||
|
||||
return NO
|
||||
|
||||
elif Preview.walrus_subscript in mode and (
|
||||
t == token.COLONEQUAL or prev.type == token.COLONEQUAL
|
||||
):
|
||||
return SPACE
|
||||
|
||||
elif not complex_subscript:
|
||||
return NO
|
||||
|
||||
|
6
tests/data/preview/pep_572.py
Normal file
6
tests/data/preview/pep_572.py
Normal file
@ -0,0 +1,6 @@
|
||||
x[(a:=0):]
|
||||
x[:(a:=0)]
|
||||
|
||||
# output
|
||||
x[(a := 0):]
|
||||
x[:(a := 0)]
|
12
tests/data/preview_py_310/pep_572.py
Normal file
12
tests/data/preview_py_310/pep_572.py
Normal file
@ -0,0 +1,12 @@
|
||||
x[a:=0]
|
||||
x[a := 0]
|
||||
x[a := 0, b := 1]
|
||||
x[5, b := 0]
|
||||
x[a:=0,b:=1]
|
||||
|
||||
# output
|
||||
x[a := 0]
|
||||
x[a := 0]
|
||||
x[a := 0, b := 1]
|
||||
x[5, b := 0]
|
||||
x[a := 0, b := 1]
|
@ -56,6 +56,13 @@ def test_preview_context_managers_targeting_py39() -> None:
|
||||
assert_format(source, expected, mode, minimum_version=(3, 9))
|
||||
|
||||
|
||||
@pytest.mark.parametrize("filename", all_data_cases("preview_py_310"))
|
||||
def test_preview_python_310(filename: str) -> None:
|
||||
source, expected = read_data("preview_py_310", filename)
|
||||
mode = black.Mode(target_versions={black.TargetVersion.PY310}, preview=True)
|
||||
assert_format(source, expected, mode, minimum_version=(3, 10))
|
||||
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
"filename", all_data_cases("preview_context_managers/auto_detect")
|
||||
)
|
||||
|
Loading…
Reference in New Issue
Block a user