From 194b5fc016e980461a9ef47a16752d0de9c6dc6a Mon Sep 17 00:00:00 2001 From: Daniel Flook Date: Fri, 9 Aug 2024 17:12:35 +0100 Subject: [PATCH] Place Names bindings in load context within a ClassDef in non-local namespace --- src/python_minifier/rename/bind_names.py | 9 ++++----- src/python_minifier/rename/mapper.py | 7 +++++++ 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/src/python_minifier/rename/bind_names.py b/src/python_minifier/rename/bind_names.py index f4808cf7..1a2f586a 100644 --- a/src/python_minifier/rename/bind_names.py +++ b/src/python_minifier/rename/bind_names.py @@ -24,11 +24,6 @@ def get_binding(self, name, namespace): # nonlocal names should not create a binding in any context assert name not in namespace.nonlocal_names - if isinstance(namespace, ast.ClassDef): - binding = self.get_binding(name, get_nonlocal_namespace(namespace)) - binding.disallow_rename() - return binding - for binding in namespace.bindings: if binding.name == name: break @@ -43,6 +38,10 @@ def get_binding(self, name, namespace): # This is actually a syntax error - but we want the same syntax error after minifying! binding.disallow_rename() + if isinstance(namespace, ast.ClassDef): + # This name will become an attribute of the class, so it can't be renamed + binding.disallow_rename() + return binding def visit_Name(self, node): diff --git a/src/python_minifier/rename/mapper.py b/src/python_minifier/rename/mapper.py index f2a98321..d21a1908 100644 --- a/src/python_minifier/rename/mapper.py +++ b/src/python_minifier/rename/mapper.py @@ -160,6 +160,13 @@ def add_parent(node, parent=None, namespace=None): if is_ast_node(node, 'Nonlocal'): namespace.nonlocal_names.update(node.names) + if isinstance(node, ast.Name): + if isinstance(namespace, ast.ClassDef): + if isinstance(node.ctx, ast.Load): + namespace.nonlocal_names.add(node.id) + elif isinstance(node.ctx, ast.Store) and isinstance(node.parent, ast.AugAssign): + namespace.nonlocal_names.add(node.id) + for child in ast.iter_child_nodes(node): add_parent(child, parent=node, namespace=namespace)