Add error code for return outside function.

This commit is contained in:
Dave Halter
2017-07-20 00:20:22 +02:00
parent d21504e2ca
commit 9c4bf8cec4
6 changed files with 21 additions and 15 deletions

View File

@@ -27,9 +27,7 @@ class Context(object):
@contextmanager
def add_context(self, node):
self.blocks.append(node)
yield Context(node, parent_context=self)
self.blocks.pop()
class ErrorFinder(Normalizer):
@@ -42,7 +40,11 @@ class ErrorFinder(Normalizer):
def initialize(self, node):
from parso.python.tree import search_ancestor
parent_scope = search_ancestor(node, 'classdef', 'funcdef', 'file_input')
allowed = 'classdef', 'funcdef', 'file_input'
if node.type in allowed:
parent_scope = node
else:
parent_scope = search_ancestor(node, allowed)
self._context = Context(parent_scope)
@contextmanager
@@ -105,6 +107,9 @@ class ErrorFinder(Normalizer):
in_loop = True
if not in_loop:
self._add_syntax_error("'break' outside loop", leaf)
elif leaf.value == 'return':
if self._context.node.type != 'funcdef':
self._add_syntax_error("'return' outside function", leaf)
return ''
def _add_indentation_error(self, message, spacing):

View File

@@ -35,7 +35,7 @@ if (foo == bar and baz == frop):
#: E101+2 E101+3
if start[1] > end_col and not (
over_indent == 4 and indent_next):
return (0, "E121 continuation line over-"
assert (0, "E121 continuation line over-"
"indented for visual indent")
@@ -52,7 +52,7 @@ if ((row < 0 or self.moduleCount <= row or
raise Exception("%s,%s - %s" % (row, col, self.moduleCount))
#: E101+1 E101+2 E101+3 E101+4 E101+5 E101+6
if bar:
return (
assert (
start, 'E121 lines starting with a '
'closing bracket should be indented '
"to match that of the opening "
@@ -72,14 +72,14 @@ if ((foo.bar("baz") and
hello("yes")
#: E101+1
if (a == 2 or b == "abc def ghi" "jkl mno"):
return True
assert True
#: E101+2
if (a == 2 or b == """abc def ghi
jkl mno"""):
return True
assert True
#: E101+1 E101+2
if length > options.max_line_length:
return options.max_line_length, \
assert options.max_line_length, \
"E501 line too long (%d characters)" % length

View File

@@ -51,7 +51,7 @@ a = (123,
if start[1] > end_col and not (
over_indent == 4 and indent_next):
return (0, "E121 continuation line over-"
assert (0, "E121 continuation line over-"
"indented for visual indent")
@@ -185,7 +185,7 @@ fooff(aaaa,
"visual indentation is not a multiple of four",)
if bar:
return (
assert (
start, 'E121 lines starting with a '
'closing bracket should be indented '
"to match that of the opening "
@@ -207,16 +207,16 @@ if ((foo.bar("baz") and
if (a == 2 or
b == "abc def ghi"
"jkl mno"):
return True
assert True
#: E129+1:4
if (a == 2 or
b == """abc def ghi
jkl mno"""):
return True
assert True
if length > options.max_line_length:
return options.max_line_length, \
assert options.max_line_length, \
"E501 line too long (%d characters)" % length

View File

@@ -126,7 +126,7 @@ def qualify_by_address(
if (a == 2 or
b == "abc def ghi"
"jkl mno"):
return True
True
my_list = [
1, 2, 3,

View File

@@ -1,7 +1,7 @@
#: E701:6
if a: a = False
#: E701:41
if not header or header[:6] != 'bytes=': return
if not header or header[:6] != 'bytes=': pass
#: E702:9
a = False; b = True
#: E702:16 E402

View File

@@ -69,6 +69,7 @@ def test_indentation_errors(code, positions):
'''), # 'continue' not supported inside 'finally' clause"
'continue',
'break',
'return',
# IndentationError
' foo',