diff --git a/jedi/parser/__init__.py b/jedi/parser/__init__.py index d11b31a2..74222628 100644 --- a/jedi/parser/__init__.py +++ b/jedi/parser/__init__.py @@ -216,6 +216,7 @@ class Parser(object): # No success finding a transition print('err', tokenize.tok_name[typ], repr(value), start_pos, len(stack), index) self._stack_removal(grammar, stack, index + 1, value, start_pos) + return value not in ('def', 'class') def _stack_removal(self, grammar, stack, start_index, value, start_pos): def clear_names(children): diff --git a/jedi/parser/pgen2/parse.py b/jedi/parser/pgen2/parse.py index b8343184..f530d57c 100644 --- a/jedi/parser/pgen2/parse.py +++ b/jedi/parser/pgen2/parse.py @@ -166,8 +166,9 @@ class Parser(object): # Done parsing, but another token is input raise ParseError("too much input", type, value, start_pos) else: - self.error_recovery(self.grammar, self.stack, type, value, start_pos) - break + if self.error_recovery(self.grammar, self.stack, type, + value, start_pos): + break def classify(self, type, value, start_pos): """Turn a token into a label. (Internal)""" diff --git a/jedi/parser/tokenize.py b/jedi/parser/tokenize.py index c938e1ad..abbf62a3 100644 --- a/jedi/parser/tokenize.py +++ b/jedi/parser/tokenize.py @@ -211,6 +211,9 @@ del _compile tabsize = 8 +ALWAYS_BREAK_TOKEN = (';', 'import', 'from', 'class', 'def', 'try', 'except', + 'finally', 'while', 'return') + def source_tokens(source, line_offset=0): """Generate tokens from a the source code (string).""" @@ -318,6 +321,8 @@ def generate_tokens(readline, line_offset=0): yield Token(STRING, token, spos, prefix) elif initial in namechars: # ordinary name yield Token(NAME, token, spos, prefix) + if token in ALWAYS_BREAK_TOKEN: + paren_level = 0 elif initial == '\\' and line[start:] == '\\\n': # continued stmt continue else: