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('')