From 4919eccf00293400cde4bfc00a535537f135fed4 Mon Sep 17 00:00:00 2001 From: Dave Halter Date: Wed, 19 Jul 2017 23:33:16 +0200 Subject: [PATCH] Add 'continue' not supported inside 'finally' clause. --- parso/python/normalizer.py | 8 +++++++- parso/python/pep8.py | 4 +++- test/test_python_errors.py | 12 ++++++++++-- 3 files changed, 20 insertions(+), 4 deletions(-) diff --git a/parso/python/normalizer.py b/parso/python/normalizer.py index 5b84009..9b5f74a 100644 --- a/parso/python/normalizer.py +++ b/parso/python/normalizer.py @@ -76,7 +76,6 @@ class ErrorFinder(Normalizer): # Indents/Dedents itself never have a prefix. They are just # "pseudo" tokens that get removed by the syntax tree later. # Therefore in case of an error we also have to check for this. - print(repr(leaf.prefix), leaf.get_next_leaf()) spacing = list(leaf.get_next_leaf()._split_prefix())[-1] if leaf.original_type == 'indent': message = 'unexpected indent' @@ -85,6 +84,13 @@ class ErrorFinder(Normalizer): self._add_indentation_error(message, spacing) else: self._add_syntax_error('invalid syntax', leaf) + elif leaf.value == 'continue': + for block in self._context.blocks: + if block.type == 'try_stmt': + last_block = block.children[-3] + if last_block == 'finally' and leaf.start_pos > last_block.start_pos: + message = "'continue' not supported inside 'finally' clause" + self._add_syntax_error(message, leaf) return '' diff --git a/parso/python/pep8.py b/parso/python/pep8.py index 4bf652e..c08243e 100644 --- a/parso/python/pep8.py +++ b/parso/python/pep8.py @@ -174,8 +174,10 @@ class PEP8Normalizer(ErrorFinder): @contextmanager def visit_node(self, node): with super(PEP8Normalizer, self).visit_node(node): - return self._visit_node(node) + with self._visit_node(node): + yield + @contextmanager def _visit_node(self, node): typ = node.type diff --git a/test/test_python_errors.py b/test/test_python_errors.py index 5dd2d66..8b118fb 100644 --- a/test/test_python_errors.py +++ b/test/test_python_errors.py @@ -3,7 +3,7 @@ Testing if parso finds syntax errors and indentation errors. """ import pytest -import ast +from textwrap import dedent import parso from parso.python.normalizer import ErrorFinderConfig @@ -60,6 +60,14 @@ def test_indentation_errors(code, positions): # SyntaxError '1 +', '?', + dedent('''\ + for a in [1]: + try: + pass + finally: + continue + '''), # 'continue' not supported inside 'finally' clause" + # IndentationError ' foo', 'def x():\n 1\n 2', @@ -70,7 +78,7 @@ def test_indentation_errors(code, positions): def test_python_exception_matches(code): error, = _get_error_list(code) try: - ast.parse(code) + compile(code, '', 'exec') except (SyntaxError, IndentationError) as e: wanted = e.__class__.__name__ + ': ' + e.msg else: