Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Remove redundant parentheses in case statement if guards #4214

Merged
merged 3 commits into from Feb 7, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGES.md
Expand Up @@ -20,6 +20,7 @@
expression (#4154)
- Checking for newline before adding one on docstring that is almost at the line limit
(#4185)
- Remove redundant parentheses in `case` statement `if` guards (#4214).

### Configuration

Expand Down
2 changes: 2 additions & 0 deletions docs/the_black_code_style/future_style.md
Expand Up @@ -32,6 +32,8 @@ Currently, the following features are included in the preview style:
expressions that involve the power operator
- `docstring_check_for_newline`: checks if there is a newline before the terminating
quotes of a docstring
- `remove_redundant_guard_parens`: Removes redundant parentheses in `if` guards for
`case` blocks.

(labels/unstable-features)=

Expand Down
2 changes: 2 additions & 0 deletions src/black/linegen.py
Expand Up @@ -529,6 +529,8 @@ def __post_init__(self) -> None:
# PEP 634
self.visit_match_stmt = self.visit_match_case
self.visit_case_block = self.visit_match_case
if Preview.remove_redundant_guard_parens in self.mode:
self.visit_guard = partial(v, keywords=Ø, parens={"if"})


def _hugging_power_ops_line_to_string(
Expand Down
1 change: 1 addition & 0 deletions src/black/mode.py
Expand Up @@ -179,6 +179,7 @@ class Preview(Enum):
typed_params_trailing_comma = auto()
is_simple_lookup_for_doublestar_expression = auto()
docstring_check_for_newline = auto()
remove_redundant_guard_parens = auto()


UNSTABLE_FEATURES: Set[Preview] = {
Expand Down
3 changes: 2 additions & 1 deletion src/black/resources/black.schema.json
Expand Up @@ -87,7 +87,8 @@
"multiline_string_handling",
"typed_params_trailing_comma",
"is_simple_lookup_for_doublestar_expression",
"docstring_check_for_newline"
"docstring_check_for_newline",
"remove_redundant_guard_parens"
]
},
"description": "Enable specific features included in the `--unstable` style. Requires `--preview`. No compatibility guarantees are provided on the behavior or existence of any unstable features."
Expand Down
114 changes: 114 additions & 0 deletions tests/data/cases/remove_redundant_parens_in_case_guard.py
@@ -0,0 +1,114 @@
# flags: --minimum-version=3.10 --preview --line-length=79

match 1:
case _ if (True):
pass


match 1:
case _ if (
True
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Add tests with a comment inside the parentheses in various places

):
pass


match 1:
case _ if (
# this is a comment
True
):
pass


match 1:
case _ if (
True
# this is a comment
):
pass


match 1:
case _ if (
True # this is a comment
):
pass


match 1:
case _ if ( # this is a comment
True
):
pass


match 1:
case _ if (
True
): # this is a comment
pass


match 1:
case _ if (True): # comment over the line limit unless parens are removed x
pass


match 1:
case _ if (True): # comment over the line limit and parens should go to next line
pass


# output

match 1:
case _ if True:
pass


match 1:
case _ if True:
pass


match 1:
case _ if (
# this is a comment
True
):
pass


match 1:
case _ if (
True
# this is a comment
):
pass


match 1:
case _ if True: # this is a comment
pass


match 1:
case _ if True: # this is a comment
pass


match 1:
case _ if True: # this is a comment
pass


match 1:
case _ if True: # comment over the line limit unless parens are removed x
pass


match 1:
case (
_
) if True: # comment over the line limit and parens should go to next line
pass