From 817eaa2ffba6f0e17218fe8503d34aa02138b2ec Mon Sep 17 00:00:00 2001 From: Kavi Gupta Date: Mon, 23 Jun 2025 19:02:55 -0400 Subject: [PATCH] support bare exceptions --- ast_scope/annotator.py | 6 +++--- ast_scope/pull_scope.py | 5 +++-- setup.py | 2 +- tests/exception_test.py | 33 ++++++++++++++++++++++++++++++--- 4 files changed, 37 insertions(+), 9 deletions(-) diff --git a/ast_scope/annotator.py b/ast_scope/annotator.py index 1c1ec66..13da86b 100644 --- a/ast_scope/annotator.py +++ b/ast_scope/annotator.py @@ -190,9 +190,9 @@ def visit_Name(self, node: ast.Name): GrabVariable(self.scope, node, self.annotation_dict).generic_visit(node) def visit_ExceptHandler(self, node: ast.ExceptHandler): - assert node.name - self.annotate_intermediate_scope(node, node.name, True) - self.scope.modify(node.name) + if node.name is not None: + self.annotate_intermediate_scope(node, node.name, True) + self.scope.modify(node.name) visit_all(self, node.type, node.body) def visit_alias(self, node: ast.alias): diff --git a/ast_scope/pull_scope.py b/ast_scope/pull_scope.py index 4f3c060..9ebeb9e 100644 --- a/ast_scope/pull_scope.py +++ b/ast_scope/pull_scope.py @@ -85,8 +85,9 @@ def visit_Lambda(self, node: ast.Lambda): super().generic_visit(node) def visit_ExceptHandler(self, node: ast.ExceptHandler): - scope = self.pull_scope(node) - scope.add_exception(node) + if node.name is not None: + scope = self.pull_scope(node) + scope.add_exception(node) super().generic_visit(node) def visit_comprehension_generic( diff --git a/setup.py b/setup.py index c925740..f611fe9 100644 --- a/setup.py +++ b/setup.py @@ -5,7 +5,7 @@ setuptools.setup( name="ast_scope", # Replace with your own username - version="0.5.1", + version="0.5.2", author="Kavi Gupta", author_email="ast_scope@kavigupta.org", description="Annotates a Python AST with the scope of symbols.", diff --git a/tests/exception_test.py b/tests/exception_test.py index 560ba25..820fe4e 100644 --- a/tests/exception_test.py +++ b/tests/exception_test.py @@ -2,13 +2,40 @@ class ExceptionTests(DisplayAnnotatedTestCase): - def test_multiple_arguments(self): + + def test_basic_named(self): + self.assertAnnotationWorks( + """ + {g}def f(): + try: + {~f@1:0}z = 1 + {~f@1:0}except {g}Exception as e: + {~f@1:0}x = {~f@1:0}e + finally: + {~f@1:0}y = 1 + """ + ) + + def test_no_name(self): + self.assertAnnotationWorks( + """ + {g}def f(): + try: + {~f@1:0}z = 1 + except {g}Exception: + {~f@1:0}x = 1 + """ + ) + + def test_multiple_exceptions(self): self.assertAnnotationWorks( """ {g}def f(): try: - pass + {~f@1:0}z = 1 {~f@1:0}except {g}Exception as e: - pass + {~f@1:0}x = {~f@1:0}e + {~f@1:0}except {g}ValueError as e2: + {~f@1:0}y = {~f@1:0}e2 """ )