Skip to content
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.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 24 additions & 6 deletions personal_python_ast_optimizer/parser/skipper.py
Original file line number Diff line number Diff line change
Expand Up @@ -501,12 +501,30 @@ def visit_If(self, node: ast.If) -> ast.AST | list[ast.stmt] | None:
)
return if_body or None

if not parsed_node.orelse and self._body_is_only_pass(parsed_node.body):
call_finder = _DanglingExprCallFinder(
self.optimizations_config.functions_safe_to_exclude_in_test_expr
)
call_finder.visit(parsed_node.test)
return [ast.Expr(expr) for expr in call_finder.calls]
if not parsed_node.orelse:
if self._body_is_only_pass(parsed_node.body):
call_finder = _DanglingExprCallFinder(
self.optimizations_config.functions_safe_to_exclude_in_test_expr
)
call_finder.visit(parsed_node.test)
return [ast.Expr(expr) for expr in call_finder.calls]

if (
len(parsed_node.body) == 1
and isinstance(parsed_node.body[0], ast.If)
and not parsed_node.body[0].orelse
):
# These if conditions can be combine into one if
if isinstance(parsed_node.test, ast.BoolOp) and isinstance(
parsed_node.test.op, ast.And
):
parsed_node.test.values.append(parsed_node.body[0].test)
else:
parsed_node.test = ast.BoolOp(
ast.And(), [parsed_node.test, parsed_node.body[0].test]
)

parsed_node.body = parsed_node.body[0].body

return parsed_node

Expand Down
60 changes: 60 additions & 0 deletions tests/parser/test_if.py
Original file line number Diff line number Diff line change
Expand Up @@ -85,3 +85,63 @@
@pytest.mark.parametrize("before_and_after", _if_cases)
def test_if(before_and_after: BeforeAndAfter):
run_minifier_and_assert_correct(before_and_after)


_nested_if_cases = [
BeforeAndAfter(
"""
if a < b and foo() or bar():
if b < c:
print()
""",
"if(a<b and foo()or bar())and b<c:print()",
),
BeforeAndAfter(
"""
if foo():
if bar():
print()
""",
"if foo()and bar():print()",
),
BeforeAndAfter(
"""
if a < b:
if b < c:
print()
something_else()
""",
"""if a<b:
\tif b<c:print()
\tsomething_else()""",
),
BeforeAndAfter(
"""
if a < b:
if b < c:
print()
else:
something_else()
""",
"""if a<b:
\tif b<c:print()
else:something_else()""",
),
BeforeAndAfter(
"""
if a < b:
if b < c:
print()
else:
something_else()
""",
"""if a<b:
\tif b<c:print()
\telse:something_else()""",
),
]


@pytest.mark.parametrize("before_and_after", _nested_if_cases)
def test_nested_if(before_and_after: BeforeAndAfter):
run_minifier_and_assert_correct(before_and_after)
2 changes: 1 addition & 1 deletion version.txt
Original file line number Diff line number Diff line change
@@ -1 +1 @@
6.1.2
6.1.3