From 0289260cb78008d33a8580dfffe6d1d1292d0594 Mon Sep 17 00:00:00 2001 From: jbjd Date: Thu, 22 Jan 2026 22:10:26 -0600 Subject: [PATCH 1/2] Improvement: Remove useless else after if-return --- .../parser/skipper.py | 7 +++++++ tests/parser/test_if.py | 18 ++++++++++++++++++ version.txt | 2 +- 3 files changed, 26 insertions(+), 1 deletion(-) diff --git a/personal_python_ast_optimizer/parser/skipper.py b/personal_python_ast_optimizer/parser/skipper.py index 0313857..0d66cd0 100644 --- a/personal_python_ast_optimizer/parser/skipper.py +++ b/personal_python_ast_optimizer/parser/skipper.py @@ -526,6 +526,13 @@ def visit_If(self, node: ast.If) -> ast.AST | list[ast.stmt] | None: parsed_node.body = parsed_node.body[0].body + # Remove useless else after if-return + elif isinstance(parsed_node.body[-1], ast.Return): + denested_else: list[ast.stmt] = parsed_node.orelse + parsed_node.orelse = [] + denested_else.insert(0, parsed_node) + return denested_else + return parsed_node def visit_IfExp(self, node: ast.IfExp) -> ast.AST | None: diff --git a/tests/parser/test_if.py b/tests/parser/test_if.py index 632de68..4c048d8 100644 --- a/tests/parser/test_if.py +++ b/tests/parser/test_if.py @@ -145,3 +145,21 @@ def test_if(before_and_after: BeforeAndAfter): @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) + + +def test_if_return(): + before_and_after = BeforeAndAfter( + """ +def a(foo): + if foo > 5: + return 5 + elif foo < 9: + return 6 + else: + return 7""", + """def a(foo): +\tif foo>5:return 5 +\tif foo<9:return 6 +\treturn 7""", + ) + run_minifier_and_assert_correct(before_and_after) diff --git a/version.txt b/version.txt index ae9a76b..cd1d2e9 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -8.0.0 +8.0.1 From 84a69875ee6e2dea0d029456e44a5a716536fad0 Mon Sep 17 00:00:00 2001 From: jbjd Date: Thu, 22 Jan 2026 22:22:02 -0600 Subject: [PATCH 2/2] Add config --- personal_python_ast_optimizer/parser/config.py | 3 +++ personal_python_ast_optimizer/parser/skipper.py | 5 +++-- tests/parser/test_if.py | 4 ++-- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/personal_python_ast_optimizer/parser/config.py b/personal_python_ast_optimizer/parser/config.py index 24a7235..eb960c7 100644 --- a/personal_python_ast_optimizer/parser/config.py +++ b/personal_python_ast_optimizer/parser/config.py @@ -138,6 +138,7 @@ class OptimizationsConfig(_Config): "functions_safe_to_exclude_in_test_expr", "remove_typing_cast", "remove_unused_imports", + "remove_useless_else", "simplify_named_tuples", "vars_to_fold", ) @@ -152,6 +153,7 @@ def __init__( # noqa: PLR0913 enums_to_fold: Iterable[EnumType] | None = None, functions_safe_to_exclude_in_test_expr: set[str] | None = None, remove_unused_imports: bool = True, + remove_useless_else: bool = True, remove_typing_cast: bool = True, collection_concat_to_unpack: bool = False, fold_constants: bool = False, @@ -171,6 +173,7 @@ def __init__( # noqa: PLR0913 or default_functions_safe_to_exclude_in_test_expr ) self.remove_unused_imports: bool = remove_unused_imports + self.remove_useless_else: bool = remove_useless_else self.remove_typing_cast: bool = remove_typing_cast self.collection_concat_to_unpack: bool = collection_concat_to_unpack self.assume_this_machine: bool = assume_this_machine diff --git a/personal_python_ast_optimizer/parser/skipper.py b/personal_python_ast_optimizer/parser/skipper.py index 0d66cd0..aff7a1b 100644 --- a/personal_python_ast_optimizer/parser/skipper.py +++ b/personal_python_ast_optimizer/parser/skipper.py @@ -526,8 +526,9 @@ def visit_If(self, node: ast.If) -> ast.AST | list[ast.stmt] | None: parsed_node.body = parsed_node.body[0].body - # Remove useless else after if-return - elif isinstance(parsed_node.body[-1], ast.Return): + elif self.optimizations_config.remove_useless_else and isinstance( + parsed_node.body[-1], (ast.Raise, ast.Return) + ): denested_else: list[ast.stmt] = parsed_node.orelse parsed_node.orelse = [] denested_else.insert(0, parsed_node) diff --git a/tests/parser/test_if.py b/tests/parser/test_if.py index 4c048d8..26ee269 100644 --- a/tests/parser/test_if.py +++ b/tests/parser/test_if.py @@ -152,13 +152,13 @@ def test_if_return(): """ def a(foo): if foo > 5: - return 5 + raise ValueError elif foo < 9: return 6 else: return 7""", """def a(foo): -\tif foo>5:return 5 +\tif foo>5:raise ValueError \tif foo<9:return 6 \treturn 7""", )