Fix issues with flows.

This commit is contained in:
Dave Halter
2015-01-28 13:03:57 +01:00
parent 5e8f8f7a8d
commit 6ec89e6785
2 changed files with 21 additions and 9 deletions

View File

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

View File

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