Add 'continue' not supported inside 'finally' clause.

This commit is contained in:
Dave Halter
2017-07-19 23:33:16 +02:00
parent 944fe5a896
commit 4919eccf00
3 changed files with 20 additions and 4 deletions

View File

@@ -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 ''

View File

@@ -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

View File

@@ -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, '<unknown>', 'exec')
except (SyntaxError, IndentationError) as e:
wanted = e.__class__.__name__ + ': ' + e.msg
else: