diff --git a/parso/python/normalizer.py b/parso/python/normalizer.py index 3ff3f1a..6cb45e7 100644 --- a/parso/python/normalizer.py +++ b/parso/python/normalizer.py @@ -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): diff --git a/test/normalizer_issue_files/E101.py b/test/normalizer_issue_files/E101.py index e2715ac..cc24719 100644 --- a/test/normalizer_issue_files/E101.py +++ b/test/normalizer_issue_files/E101.py @@ -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 diff --git a/test/normalizer_issue_files/E12_not_first.py b/test/normalizer_issue_files/E12_not_first.py index cb9c741..fc3b5f9 100644 --- a/test/normalizer_issue_files/E12_not_first.py +++ b/test/normalizer_issue_files/E12_not_first.py @@ -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 diff --git a/test/normalizer_issue_files/E12_second.py b/test/normalizer_issue_files/E12_second.py index 9130047..f238e12 100644 --- a/test/normalizer_issue_files/E12_second.py +++ b/test/normalizer_issue_files/E12_second.py @@ -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, diff --git a/test/normalizer_issue_files/E70.py b/test/normalizer_issue_files/E70.py index 3d88e0a..be11fb1 100644 --- a/test/normalizer_issue_files/E70.py +++ b/test/normalizer_issue_files/E70.py @@ -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 diff --git a/test/test_python_errors.py b/test/test_python_errors.py index bb7b3da..3e931fd 100644 --- a/test/test_python_errors.py +++ b/test/test_python_errors.py @@ -69,6 +69,7 @@ def test_indentation_errors(code, positions): '''), # 'continue' not supported inside 'finally' clause" 'continue', 'break', + 'return', # IndentationError ' foo',