diff --git a/docs/changelog.rst b/docs/changelog.rst index 7ad71327..9a4e78f9 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -4,6 +4,10 @@ Changelog `CalVer, YY.month.patch `_ +24.9.5 +====== +- Fix crash when analyzing code with infinite loop inside context manager. + 24.9.4 ====== - Add :ref:`ASYNC122 ` delayed-entry-of-relative-cancelscope. diff --git a/flake8_async/__init__.py b/flake8_async/__init__.py index af042280..82fdf434 100644 --- a/flake8_async/__init__.py +++ b/flake8_async/__init__.py @@ -38,7 +38,7 @@ # CalVer: YY.month.patch, e.g. first release of July 2022 == "22.7.1" -__version__ = "24.9.4" +__version__ = "24.9.5" # taken from https://github.com/Zac-HD/shed diff --git a/flake8_async/visitors/visitor91x.py b/flake8_async/visitors/visitor91x.py index 2c9a9f81..539fcee6 100644 --- a/flake8_async/visitors/visitor91x.py +++ b/flake8_async/visitors/visitor91x.py @@ -452,7 +452,7 @@ def error_91x( node: cst.Return | cst.FunctionDef | cst.Yield, statement: Statement, ) -> bool: - assert not isinstance(statement, ArtificialStatement) + assert not isinstance(statement, ArtificialStatement), statement if isinstance(node, cst.FunctionDef): msg = "exit" @@ -768,7 +768,7 @@ def leave_While_body(self, node: cst.For | cst.While): | self.uncheckpointed_statements | self.loop_state.uncheckpointed_before_continue ): - if stmt == ARTIFICIAL_STATEMENT: + if isinstance(stmt, ArtificialStatement): continue any_error |= self.error_91x(err_node, stmt) diff --git a/tests/autofix_files/async100.py b/tests/autofix_files/async100.py index bd3d2809..524e320f 100644 --- a/tests/autofix_files/async100.py +++ b/tests/autofix_files/async100.py @@ -121,3 +121,12 @@ async def more_nested_tests(): async def foo(): with trio.fail_after(1): yield + + +# This previously caused an AssertionError, see issue #295 +async def fn(timeout): + with trio.fail_after(timeout): + while True: + if condition(): + return + await trio.sleep(1) diff --git a/tests/eval_files/async100.py b/tests/eval_files/async100.py index 226e34d1..1460a545 100644 --- a/tests/eval_files/async100.py +++ b/tests/eval_files/async100.py @@ -121,3 +121,12 @@ async def more_nested_tests(): async def foo(): with trio.fail_after(1): yield + + +# This previously caused an AssertionError, see issue #295 +async def fn(timeout): + with trio.fail_after(timeout): + while True: + if condition(): + return + await trio.sleep(1)