Fix incorrect space before colon in if/while stmts (#1655)

* Fix incorrect space before colon in if/while stmts

Previously Black would format this code

```
if (foo := True):
	print(foo)
```

as

```
if (foo := True) :
	print(foo)
```

adding an incorrect space after the RPAR. Buggy code in the
normalize_invisible_parens function caused the colon to be wrapped in
invisible parentheses. The LPAR of that pair was then prefixed with a
single space at the request of the whitespace function.

This commit fixes the accidental skipping of a pre-condition check
which must return True before parenthesis normalization of a specific
child Leaf or Node can happen. The pre-condition check being skipped
was why the colon was wrapped in invisible parentheses.

* Add an entry in CHANGES.md
This commit is contained in:
Richard Si 2020-08-31 17:20:05 -04:00 committed by GitHub
parent 573b8de544
commit 1d2d7264ec
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 14 additions and 2 deletions

View File

@ -7,6 +7,9 @@
- `Black` now respects `--skip-string-normalization` when normalizing multiline
docstring quotes (#1637)
- `Black` no longer adds an incorrect space after a parenthesized assignment expression
in if/while statements (#1655)
- fixed a crash when PWD=/ on POSIX (#1631)
### 20.8b1

View File

@ -9,6 +9,11 @@
- `Black` now respects `--skip-string-normalization` when normalizing multiline
docstring quotes (#1637)
- `Black` no longer adds an incorrect space after a parenthesized assignment expression
in if/while statements (#1655)
- fixed a crash when PWD=/ on POSIX (#1631)
### 20.8b1
#### _Packaging_

View File

@ -5190,9 +5190,9 @@ def normalize_invisible_parens(node: Node, parens_after: Set[str]) -> None:
if check_lpar:
if is_walrus_assignment(child):
continue
pass
if child.type == syms.atom:
elif child.type == syms.atom:
if maybe_make_parens_invisible_in_atom(child, parent=node):
wrap_in_parentheses(node, child, visible=False)
elif is_one_tuple(child):

View File

@ -2,6 +2,8 @@
(a := a)
if (match := pattern.search(data)) is None:
pass
if (match := pattern.search(data)):
pass
[y := f(x), y ** 2, y ** 3]
filtered_data = [y for x in data if (y := f(x)) is None]
(y := f(x))
@ -41,3 +43,5 @@ def foo(answer: (p := 42) = 5):
while x := f(x):
pass
while (x := f(x)):
pass