From 816ce69571f01ce1a683a88ab19f4048ab01e21d Mon Sep 17 00:00:00 2001 From: jbjd Date: Wed, 17 Dec 2025 17:37:22 -0600 Subject: [PATCH 1/4] Fix importing of removed annotations --- personal_python_ast_optimizer/parser/skipper.py | 8 ++++++++ tests/parser/test_imports.py | 12 ++++++++++++ version.txt | 2 +- 3 files changed, 21 insertions(+), 1 deletion(-) diff --git a/personal_python_ast_optimizer/parser/skipper.py b/personal_python_ast_optimizer/parser/skipper.py index bc641ea..9193b44 100644 --- a/personal_python_ast_optimizer/parser/skipper.py +++ b/personal_python_ast_optimizer/parser/skipper.py @@ -334,9 +334,17 @@ def visit_AnnAssign(self, node: ast.AnnAssign) -> ast.AST | None: if self._within_class and get_node_name(node.target) == "__slots__": remove_duplicate_slots(node, self.warn_unusual_code) + annotation_name: str = get_node_name(node.annotation) + readd_annotation_to_unused_imports: bool = ( + annotation_name in self._possibly_unused_imports + ) + parsed_node: ast.AnnAssign = self.generic_visit(node) # type: ignore if self.token_types_config.skip_type_hints: + if readd_annotation_to_unused_imports: + self._possibly_unused_imports.add(annotation_name) + if ( not parsed_node.value and self._within_class diff --git a/tests/parser/test_imports.py b/tests/parser/test_imports.py index fa2690b..b607699 100644 --- a/tests/parser/test_imports.py +++ b/tests/parser/test_imports.py @@ -87,3 +87,15 @@ def test_remove_unused_imports(): "if a==b:pass\nprint(a)", ) run_minifier_and_assert_correct(before_and_after) + + +def test_remove_unused_imports_type_annotation(): + + before_and_after = BeforeAndAfter( + """ +import foo + +a: foo = bar()""", + "a=bar()", + ) + run_minifier_and_assert_correct(before_and_after) diff --git a/version.txt b/version.txt index 831446c..ac14c3d 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -5.1.0 +5.1.1 From 5ee99388882d3029de096f1e3fd96c8ac89a2b13 Mon Sep 17 00:00:00 2001 From: jbjd Date: Wed, 17 Dec 2025 17:40:38 -0600 Subject: [PATCH 2/4] More tests --- tests/parser/test_imports.py | 32 ++++++++++++++++++++++++++++---- 1 file changed, 28 insertions(+), 4 deletions(-) diff --git a/tests/parser/test_imports.py b/tests/parser/test_imports.py index b607699..07d3039 100644 --- a/tests/parser/test_imports.py +++ b/tests/parser/test_imports.py @@ -75,7 +75,7 @@ def test_import_star(): ) -def test_remove_unused_imports(): +def test_remove_unused_import(): before_and_after = BeforeAndAfter( """ @@ -89,13 +89,37 @@ def test_remove_unused_imports(): run_minifier_and_assert_correct(before_and_after) -def test_remove_unused_imports_type_annotation(): +def test_remove_unused_import_type_annotation(): before_and_after = BeforeAndAfter( """ import foo -a: foo = bar()""", - "a=bar()", +a: foo = bar() + +def asdf(a: foo) -> foo: + return a""", + """ +a=bar() +def asdf(a):return a +""".strip(), + ) + run_minifier_and_assert_correct(before_and_after) + + +def test_remove_unused_import_from_type_annotation(): + + before_and_after = BeforeAndAfter( + """ +from .typing import foo + +a: foo = bar() + +def asdf(a: foo) -> foo: + return a""", + """ +a=bar() +def asdf(a):return a +""".strip(), ) run_minifier_and_assert_correct(before_and_after) From fd05e8271732de4234eb6e6a50fa156326e806df Mon Sep 17 00:00:00 2001 From: jbjd Date: Wed, 17 Dec 2025 17:49:26 -0600 Subject: [PATCH 3/4] Fix bin op --- personal_python_ast_optimizer/parser/skipper.py | 16 +++++----------- tests/parser/test_imports.py | 2 +- 2 files changed, 6 insertions(+), 12 deletions(-) diff --git a/personal_python_ast_optimizer/parser/skipper.py b/personal_python_ast_optimizer/parser/skipper.py index 9193b44..047d26a 100644 --- a/personal_python_ast_optimizer/parser/skipper.py +++ b/personal_python_ast_optimizer/parser/skipper.py @@ -334,16 +334,9 @@ def visit_AnnAssign(self, node: ast.AnnAssign) -> ast.AST | None: if self._within_class and get_node_name(node.target) == "__slots__": remove_duplicate_slots(node, self.warn_unusual_code) - annotation_name: str = get_node_name(node.annotation) - readd_annotation_to_unused_imports: bool = ( - annotation_name in self._possibly_unused_imports - ) - - parsed_node: ast.AnnAssign = self.generic_visit(node) # type: ignore - if self.token_types_config.skip_type_hints: - if readd_annotation_to_unused_imports: - self._possibly_unused_imports.add(annotation_name) + node.annotation = None + parsed_node: ast.AnnAssign = self.generic_visit(node) # type: ignore if ( not parsed_node.value @@ -351,12 +344,13 @@ def visit_AnnAssign(self, node: ast.AnnAssign) -> ast.AST | None: and not self._within_function ): parsed_node.annotation = ast.Name("int") + return parsed_node elif parsed_node.value is None: return None else: return ast.Assign([parsed_node.target], parsed_node.value) - - return parsed_node + else: + return self.generic_visit(node) def visit_AugAssign(self, node: ast.AugAssign) -> ast.AST | None: if get_node_name(node.target) in self.tokens_config.variables_to_skip: diff --git a/tests/parser/test_imports.py b/tests/parser/test_imports.py index 07d3039..26d1a0c 100644 --- a/tests/parser/test_imports.py +++ b/tests/parser/test_imports.py @@ -113,7 +113,7 @@ def test_remove_unused_import_from_type_annotation(): """ from .typing import foo -a: foo = bar() +a: foo | None = bar() def asdf(a: foo) -> foo: return a""", From 02bcf6d79e3c8a0ede548991e2dcbdb278907033 Mon Sep 17 00:00:00 2001 From: jbjd Date: Wed, 17 Dec 2025 18:08:50 -0600 Subject: [PATCH 4/4] type ignore --- personal_python_ast_optimizer/parser/skipper.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/personal_python_ast_optimizer/parser/skipper.py b/personal_python_ast_optimizer/parser/skipper.py index 047d26a..d510f31 100644 --- a/personal_python_ast_optimizer/parser/skipper.py +++ b/personal_python_ast_optimizer/parser/skipper.py @@ -335,7 +335,7 @@ def visit_AnnAssign(self, node: ast.AnnAssign) -> ast.AST | None: remove_duplicate_slots(node, self.warn_unusual_code) if self.token_types_config.skip_type_hints: - node.annotation = None + node.annotation = None # type: ignore parsed_node: ast.AnnAssign = self.generic_visit(node) # type: ignore if (