Skip to content

Commit

Permalink
Fix line generation for match match: / case case: (GH-2661)
Browse files Browse the repository at this point in the history
  • Loading branch information
isidentical committed Nov 30, 2021
1 parent ebd3e39 commit b336b39
Show file tree
Hide file tree
Showing 3 changed files with 44 additions and 7 deletions.
2 changes: 2 additions & 0 deletions CHANGES.md
Expand Up @@ -10,6 +10,8 @@
- Fixed Python 3.10 support on platforms without ProcessPoolExecutor (#2631)
- Fixed `match` statements with open sequence subjects, like `match a, b:` or
`match a, *b:` (#2639) (#2659)
- Fixed `match`/`case` statements that contain `match`/`case` soft keywords multiple
times, like `match re.match()` (#2661)
- Fixed assignment to environment variables in Jupyter Notebooks (#2642)
- Add `flake8-simplify` and `flake8-comprehensions` plugins (#2653)

Expand Down
14 changes: 11 additions & 3 deletions src/black/linegen.py
Expand Up @@ -127,7 +127,7 @@ def visit_stmt(
"""Visit a statement.
This implementation is shared for `if`, `while`, `for`, `try`, `except`,
`def`, `with`, `class`, `assert`, `match`, `case` and assignments.
`def`, `with`, `class`, `assert`, and assignments.
The relevant Python language `keywords` for a given statement will be
NAME leaves within it. This methods puts those on a separate line.
Expand All @@ -142,6 +142,14 @@ def visit_stmt(

yield from self.visit(child)

def visit_match_case(self, node: Node) -> Iterator[Line]:
"""Visit either a match or case statement."""
normalize_invisible_parens(node, parens_after=set())

yield from self.line()
for child in node.children:
yield from self.visit(child)

def visit_suite(self, node: Node) -> Iterator[Line]:
"""Visit a suite."""
if self.mode.is_pyi and is_stub_suite(node):
Expand Down Expand Up @@ -294,8 +302,8 @@ def __post_init__(self) -> None:
self.visit_decorated = self.visit_decorators

# PEP 634
self.visit_match_stmt = partial(v, keywords={"match"}, parens=Ø)
self.visit_case_block = partial(v, keywords={"case"}, parens=Ø)
self.visit_match_stmt = self.visit_match_case
self.visit_case_block = self.visit_match_case


def transform_line(
Expand Down
35 changes: 31 additions & 4 deletions tests/data/pattern_matching_extras.py
Expand Up @@ -23,10 +23,10 @@

def func(match: case, case: match) -> case:
match Something():
case another:
...
case func(match, case):
...
case another:
...


match maybe, multiple:
Expand All @@ -47,6 +47,33 @@ def func(match: case, case: match) -> case:

match a, *b, c:
case [*_]:
return "seq"
assert "seq" == _
case {}:
return "map"
assert "map" == b


match match(
case,
match(
match, case, match, looooooooooooooooooooooooooooooooooooong, match, case, match
),
case,
):
case case(
match=case,
case=re.match(
loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong
),
):
pass

case [a as match]:
pass

case case:
pass


match match:
case case:
pass

0 comments on commit b336b39

Please sign in to comment.