From 3be5220bf138d1f92737c7a808b6ec82d8e3f24d Mon Sep 17 00:00:00 2001 From: Dave Halter Date: Fri, 18 Jul 2014 10:59:28 +0200 Subject: [PATCH] parentheses checks in the fast parser (tokenizer) have been improved to really cover all cases. real fix for davidhalter/jedi-vim#288 --- jedi/parser/fast.py | 20 +++++++++++++++----- test/completion/parser.py | 15 ++++++++++++--- 2 files changed, 27 insertions(+), 8 deletions(-) diff --git a/jedi/parser/fast.py b/jedi/parser/fast.py index ac0f2aef..e8f79d98 100644 --- a/jedi/parser/fast.py +++ b/jedi/parser/fast.py @@ -392,6 +392,7 @@ class FastTokenizer(object): self.parser_indent = self.old_parser_indent = 0 self.is_decorator = False self.first_stmt = True + self.parentheses_level = 0 def next(self): """ Python 2 Compatibility """ @@ -419,14 +420,15 @@ class FastTokenizer(object): self.closed = True raise common.MultiLevelStopIteration() - # Ignore comments/newlines/closing parentheses, because they are all - # irrelevant for the indentation. + # Ignore comments/newlines, irrelevant for indentation. if self.previous.type in (None, NEWLINE) \ - and tok_type not in (COMMENT, NEWLINE) \ - and tok_str not in ')]}': + and tok_type not in (COMMENT, NEWLINE): # print c, tok_name[c[0]] indent = current.start_pos[1] - if indent < self.parser_indent: # -> dedent + if self.parentheses_level: + # parentheses ignore the indentation rules. + pass + elif indent < self.parser_indent: # -> dedent self.parser_indent = indent self.new_indent = False if not self.in_flow or indent < self.old_parser_indent: @@ -453,4 +455,12 @@ class FastTokenizer(object): if self.first_stmt and not self.new_indent: self.parser_indent = indent self.first_stmt = False + + # Ignore closing parentheses, because they are all + # irrelevant for the indentation. + + if tok_str in '([{': + self.parentheses_level += 1 + elif tok_str in ')]}': + self.parentheses_level = max(self.parentheses_level - 1, 0) return current diff --git a/test/completion/parser.py b/test/completion/parser.py index 5de5b337..d0e7e810 100644 --- a/test/completion/parser.py +++ b/test/completion/parser.py @@ -2,17 +2,26 @@ Issues with the parser not the completion engine should be here. """ -class C(): +class IndentIssues(): """ issue jedi-vim#288 Which is really a fast parser issue. It used to start a new block at the parentheses, because it had problems with the indentation. """ - def indent_issues( + def one_param( self, ): return 1 + def with_param( + self, + y): + return y + + #? int() -C().indent_issues() +IndentIssues().one_param() + +#? str() +IndentIssues().with_param('')