mirror of
https://github.com/davidhalter/jedi.git
synced 2025-12-08 23:04:48 +08:00
Fix issues with flows.
This commit is contained in:
@@ -502,7 +502,7 @@ class FastTokenizer(object):
|
|||||||
self._closed = False
|
self._closed = False
|
||||||
|
|
||||||
# fast parser options
|
# fast parser options
|
||||||
self.current = self.previous = None, '', (0, 0)
|
self.current = self.previous = NEWLINE, '', (0, 0)
|
||||||
self._in_flow = False
|
self._in_flow = False
|
||||||
self._new_indent = False
|
self._new_indent = False
|
||||||
self._parser_indent = self._old_parser_indent = 0
|
self._parser_indent = self._old_parser_indent = 0
|
||||||
@@ -510,6 +510,7 @@ class FastTokenizer(object):
|
|||||||
self._first_stmt = True
|
self._first_stmt = True
|
||||||
self._parentheses_level = 0
|
self._parentheses_level = 0
|
||||||
self._indent_counter = 0
|
self._indent_counter = 0
|
||||||
|
self._flow_indent_counter = 0
|
||||||
self._returned_endmarker = False
|
self._returned_endmarker = False
|
||||||
|
|
||||||
def __iter__(self):
|
def __iter__(self):
|
||||||
@@ -540,20 +541,23 @@ class FastTokenizer(object):
|
|||||||
self._indent_counter += 1
|
self._indent_counter += 1
|
||||||
elif typ == DEDENT:
|
elif typ == DEDENT:
|
||||||
self._indent_counter -= 1
|
self._indent_counter -= 1
|
||||||
|
if self._in_flow and self._indent_counter == self._flow_indent_counter:
|
||||||
|
self._in_flow = False
|
||||||
return current
|
return current
|
||||||
|
|
||||||
if self.previous[0] == DEDENT and not self._in_flow:
|
if self.previous[0] == DEDENT and self._indent_counter == 0:
|
||||||
self._first_stmt = False
|
self._first_stmt = False
|
||||||
return self._close()
|
return self._close()
|
||||||
elif self.previous[0] in (None, NEWLINE, INDENT):
|
elif self.previous[0] in (NEWLINE, INDENT):
|
||||||
# Check for NEWLINE, which symbolizes the indent.
|
# Check for NEWLINE, which symbolizes the indent.
|
||||||
#print('X', repr(value), tokenize.tok_name[typ])
|
#print('X', repr(value), tokenize.tok_name[typ])
|
||||||
indent = start_pos[1]
|
indent = start_pos[1]
|
||||||
#print(indent, self._parser_indent)
|
#print(indent, self._parser_indent)
|
||||||
if self._parentheses_level:
|
if self._parentheses_level:
|
||||||
# parentheses ignore the indentation rules.
|
# Parentheses ignore the indentation rules.
|
||||||
pass
|
pass
|
||||||
elif indent < self._parser_indent: # -> dedent
|
elif indent < self._parser_indent: # -> dedent
|
||||||
|
raise NotImplementedError
|
||||||
self._parser_indent = indent
|
self._parser_indent = indent
|
||||||
self._new_indent = False
|
self._new_indent = False
|
||||||
print(self._in_flow, indent, self._old_parser_indent)
|
print(self._in_flow, indent, self._old_parser_indent)
|
||||||
@@ -566,9 +570,15 @@ class FastTokenizer(object):
|
|||||||
self._new_indent = False
|
self._new_indent = False
|
||||||
|
|
||||||
if not self._in_flow:
|
if not self._in_flow:
|
||||||
if value in FLOWS or value in breaks:
|
self._in_flow = value in FLOWS
|
||||||
self._in_flow = value in FLOWS
|
if self._in_flow:
|
||||||
if not self._is_decorator and not self._in_flow:
|
print('INFLOW', self._indent_counter)
|
||||||
|
self._flow_indent_counter = self._indent_counter
|
||||||
|
self._old_parser_indent = self._parser_indent
|
||||||
|
self._parser_indent += 1 # new scope: must be higher
|
||||||
|
self._new_indent = True
|
||||||
|
elif value in breaks:
|
||||||
|
if not self._is_decorator:
|
||||||
return self._close()
|
return self._close()
|
||||||
|
|
||||||
self._is_decorator = '@' == value
|
self._is_decorator = '@' == value
|
||||||
@@ -609,6 +619,8 @@ class FastTokenizer(object):
|
|||||||
return tokenize.DEDENT, '', start_pos, ''
|
return tokenize.DEDENT, '', start_pos, ''
|
||||||
elif not self._returned_endmarker:
|
elif not self._returned_endmarker:
|
||||||
self._returned_endmarker = True
|
self._returned_endmarker = True
|
||||||
return ENDMARKER, '', start_pos, ''
|
# We're using the current prefix for the endmarker to not loose any
|
||||||
|
# information.
|
||||||
|
return ENDMARKER, '', start_pos, self.current[3]
|
||||||
else:
|
else:
|
||||||
raise StopIteration
|
raise StopIteration
|
||||||
|
|||||||
@@ -120,7 +120,7 @@ def test_if():
|
|||||||
''')
|
''')
|
||||||
|
|
||||||
# Two parsers needed, one for pass and one for the function.
|
# Two parsers needed, one for pass and one for the function.
|
||||||
m = check_fp(src, 2)
|
check_fp(src, 2)
|
||||||
|
|
||||||
|
|
||||||
def test_incomplete_function():
|
def test_incomplete_function():
|
||||||
|
|||||||
Reference in New Issue
Block a user