parentheses checks in the fast parser (tokenizer) have been improved to really cover all cases. real fix for davidhalter/jedi-vim#288

This commit is contained in:
Dave Halter
2014-07-18 10:59:28 +02:00
parent 03226783dd
commit 3be5220bf1
2 changed files with 27 additions and 8 deletions

View File

@@ -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

View File

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