From 4e56417ea621f1d955af5711887839683daa2038 Mon Sep 17 00:00:00 2001 From: Daniel Flook Date: Wed, 8 Nov 2023 23:39:18 +0000 Subject: [PATCH] Defer bindings for nonlocal type params --- src/python_minifier/rename/bind_names.py | 9 ++++++--- src/python_minifier/rename/resolve_names.py | 9 +++++++++ 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/src/python_minifier/rename/bind_names.py b/src/python_minifier/rename/bind_names.py index 7410fd0..fff31af 100644 --- a/src/python_minifier/rename/bind_names.py +++ b/src/python_minifier/rename/bind_names.py @@ -174,13 +174,16 @@ def visit_MatchMapping(self, node): self.generic_visit(node) def visit_TypeVar(self, node): - self.get_binding(node.name, node.namespace).add_reference(node) + if node.name not in node.namespace.nonlocal_names: + self.get_binding(node.name, node.namespace).add_reference(node) def visit_TypeVarTuple(self, node): - self.get_binding(node.name, node.namespace).add_reference(node) + if node.name not in node.namespace.nonlocal_names: + self.get_binding(node.name, node.namespace).add_reference(node) def visit_ParamSpec(self, node): - self.get_binding(node.name, node.namespace).add_reference(node) + if node.name not in node.namespace.nonlocal_names: + self.get_binding(node.name, node.namespace).add_reference(node) def bind_names(module): """ diff --git a/src/python_minifier/rename/resolve_names.py b/src/python_minifier/rename/resolve_names.py index 06e003c..08ce7d2 100644 --- a/src/python_minifier/rename/resolve_names.py +++ b/src/python_minifier/rename/resolve_names.py @@ -102,5 +102,14 @@ def resolve_names(node): elif is_ast_node(node, 'Exec'): get_global_namespace(node).tainted = True + elif is_ast_node(node, 'TypeVar') and node.name in node.namespace.nonlocal_names: + get_binding(node.name, node.namespace).add_reference(node) + + elif is_ast_node(node, 'TypeVarTuple') and node.name in node.namespace.nonlocal_names: + get_binding(node.name, node.namespace).add_reference(node) + + elif is_ast_node(node, 'ParamSpec') and node.name in node.namespace.nonlocal_names: + get_binding(node.name, node.namespace).add_reference(node) + for child in ast.iter_child_nodes(node): resolve_names(child)