From 5ceb04003e0d17cccfe5428aa42ea41182fa57d6 Mon Sep 17 00:00:00 2001 From: jbjd Date: Sat, 17 Jan 2026 20:02:31 -0600 Subject: [PATCH 1/2] Change While true to While 1 --- .../parser/skipper.py | 22 +++++++++++++++++++ tests/parser/test_assert.py | 16 ++++++++++++++ tests/parser/test_while.py | 19 ++++++++++++++++ 3 files changed, 57 insertions(+) create mode 100644 tests/parser/test_while.py diff --git a/personal_python_ast_optimizer/parser/skipper.py b/personal_python_ast_optimizer/parser/skipper.py index ab9f5d7..1d79336 100644 --- a/personal_python_ast_optimizer/parser/skipper.py +++ b/personal_python_ast_optimizer/parser/skipper.py @@ -517,6 +517,22 @@ def visit_IfExp(self, node: ast.IfExp) -> ast.AST | None: return parsed_node + def visit_While(self, node: ast.While) -> ast.AST | None: + parsed_node = self.generic_visit(node) + + if isinstance(parsed_node, ast.While) and isinstance( + parsed_node.test, ast.Constant + ): + if not parsed_node.test.value: + return None + + # 1 is faster in python 2, same in 3 + # but less size + if parsed_node.test.value is True: + parsed_node.test.value = 1 + + return parsed_node + def visit_Return(self, node: ast.Return) -> ast.AST: if is_return_none(node): node.value = None @@ -553,6 +569,9 @@ def visit_Call(self, node: ast.Call) -> ast.AST | None: return self.generic_visit(node) + def visit_Constant(self, node: ast.Constant) -> ast.Constant: + return node + def visit_Expr(self, node: ast.Expr) -> ast.AST | None: if ( isinstance(node.value, ast.Call) @@ -811,3 +830,6 @@ def visit_Break(self, node: ast.Break) -> ast.Break: def visit_Continue(self, node: ast.Continue) -> ast.Continue: return node + + def visit_Constant(self, node: ast.Constant) -> ast.Constant: + return node diff --git a/tests/parser/test_assert.py b/tests/parser/test_assert.py index df1397f..39d7b3e 100644 --- a/tests/parser/test_assert.py +++ b/tests/parser/test_assert.py @@ -1,3 +1,4 @@ +from personal_python_ast_optimizer.parser.config import TokenTypesConfig from tests.utils import BeforeAndAfter, run_minifier_and_assert_correct @@ -13,3 +14,18 @@ def test_foo(): ) run_minifier_and_assert_correct(before_and_after) + + +def test_skip_assert(): + before_and_after = BeforeAndAfter( + """ +while 1: + assert val + foo() +""", + "while 1:foo()", + ) + + run_minifier_and_assert_correct( + before_and_after, token_types_config=TokenTypesConfig(skip_asserts=True) + ) diff --git a/tests/parser/test_while.py b/tests/parser/test_while.py new file mode 100644 index 0000000..f108045 --- /dev/null +++ b/tests/parser/test_while.py @@ -0,0 +1,19 @@ +from tests.utils import BeforeAndAfter, run_minifier_and_assert_correct + + +def test_useless_while(): + before_and_after = BeforeAndAfter( + "while 0:\n\tfoo()", + "", + ) + + run_minifier_and_assert_correct(before_and_after) + + +def test_while_true(): + before_and_after = BeforeAndAfter( + "while True:\n\tfoo()", + "while 1:foo()", + ) + + run_minifier_and_assert_correct(before_and_after) From c979607da0466db275e24ab22c93fc98e82c4231 Mon Sep 17 00:00:00 2001 From: jbjd Date: Sat, 17 Jan 2026 20:04:22 -0600 Subject: [PATCH 2/2] Simpler condition --- personal_python_ast_optimizer/parser/skipper.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/personal_python_ast_optimizer/parser/skipper.py b/personal_python_ast_optimizer/parser/skipper.py index 1d79336..af09ee5 100644 --- a/personal_python_ast_optimizer/parser/skipper.py +++ b/personal_python_ast_optimizer/parser/skipper.py @@ -526,10 +526,9 @@ def visit_While(self, node: ast.While) -> ast.AST | None: if not parsed_node.test.value: return None - # 1 is faster in python 2, same in 3 - # but less size - if parsed_node.test.value is True: - parsed_node.test.value = 1 + # 1 is faster than True in python 2 + # They are the same in python 3, but less size + parsed_node.test.value = 1 return parsed_node