All patches and comments are welcome. Please squash your changes to logical
commits before using git-format-patch and git-send-email to
patches@git.madduck.net.
If you'd read over the Git project's submission guidelines and adhered to them,
I'd be especially grateful.
The bug is in the `get_leaves_inside_matching_brackets` on the third line below:
```python
assert xxxxxxxxx.xxxxxxxxx.xxxxxxxxx(
xxxxxxxxx
).xxxxxxxxxxxxxxxxxx(), (
"xxx {xxxxxxxxx} xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
)
```
Including the invisible paren, third line is `).xxxxxxxxxxxxxxxxxx()), (`, that it has a matched pair then an unmatched closing paren afterwards. This PR ensures the returned leaves are actually matched.
Fixes #3414.
<!-- Changes that affect Black's preview style -->
<!-- Changes that affect Black's preview style -->
+- Fix a crash in preview style with assert + parenthesized string (#3415)
+
### Configuration
<!-- Changes to how Black can be configured -->
### Configuration
<!-- Changes to how Black can be configured -->
Matching brackets are included.
"""
try:
Matching brackets are included.
"""
try:
- # Only track brackets from the first opening bracket to the last closing
- # bracket.
+ # Start with the first opening bracket and ignore closing brackets before.
start_index = next(
i for i, l in enumerate(leaves) if l.type in OPENING_BRACKETS
)
start_index = next(
i for i, l in enumerate(leaves) if l.type in OPENING_BRACKETS
)
- end_index = next(
- len(leaves) - i
- for i, l in enumerate(reversed(leaves))
- if l.type in CLOSING_BRACKETS
- )
except StopIteration:
return set()
except StopIteration:
return set()
- depth = 0
- for i in range(end_index, start_index - 1, -1):
+ for i in range(start_index, len(leaves)):
- if leaf.type in CLOSING_BRACKETS:
- depth += 1
- if depth > 0:
- ids.add(id(leaf))
if leaf.type in OPENING_BRACKETS:
if leaf.type in OPENING_BRACKETS:
+ bracket_stack.append((BRACKET[leaf.type], i))
+ if leaf.type in CLOSING_BRACKETS:
+ if bracket_stack and leaf.type == bracket_stack[-1][0]:
+ _, start = bracket_stack.pop()
+ for j in range(start, i + 1):
+ ids.add(id(leaves[j]))
+ else:
+ break
== long_module.long_class.long_func()["some_key"].another_func(arg1)
)
== long_module.long_class.long_func()["some_key"].another_func(arg1)
)
+# Regression test for https://github.com/psf/black/issues/3414.
+assert xxxxxxxxx.xxxxxxxxx.xxxxxxxxx(
+ xxxxxxxxx
+).xxxxxxxxxxxxxxxxxx(), (
+ "xxx {xxxxxxxxx} xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
+)
+
long_module.long_class.long_func().another_func()
== long_module.long_class.long_func()["some_key"].another_func(arg1)
)
long_module.long_class.long_func().another_func()
== long_module.long_class.long_func()["some_key"].another_func(arg1)
)
+
+# Regression test for https://github.com/psf/black/issues/3414.
+assert xxxxxxxxx.xxxxxxxxx.xxxxxxxxx(
+ xxxxxxxxx
+).xxxxxxxxxxxxxxxxxx(), (
+ "xxx {xxxxxxxxx} xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
+)