Fix tokenizer: Form feeds and multiline docstrings didn't work together

This commit is contained in:
Dave Halter
2019-01-13 23:16:09 +01:00
parent 01dba7f8ce
commit 7ae1efe5c7
3 changed files with 25 additions and 16 deletions

View File

@@ -487,14 +487,15 @@ def tokenize_lines(lines, version_info, start_pos=(1, 0)):
new_line = False
if paren_level == 0 and not fstring_stack:
i = 0
indent_start = start
while line[i] == '\f':
i += 1
# TODO don't we need to change spos as well?
start -= 1
if start > indents[-1]:
indent_start -= 1
if indent_start > indents[-1]:
yield PythonToken(INDENT, '', spos, '')
indents.append(start)
for t in dedent_if_necessary(start):
indents.append(indent_start)
for t in dedent_if_necessary(indent_start):
yield t
if fstring_stack:

View File

@@ -1016,20 +1016,20 @@ def test_special_no_newline_ending(differ):
def test_random_character_insertion(differ):
code1 = dedent('''\
def create(self):
1
if self.path is not None:
return
# 3
# 4
def create(self):
1
if self.path is not None:
return
# 3
# 4
''')
code2 = dedent('''\
def create(self):
1
if 2:
x return
# 3
# 4
def create(self):
1
if 2:
x return
# 3
# 4
''')
differ.initialize(code1)
differ.parse(code2, copies=1, parsers=3, expect_error_leaves=True)

View File

@@ -299,3 +299,11 @@ def test_brackets_no_indentation():
""")
lst = _get_token_list(code)
assert [t.type for t in lst] == [OP, NEWLINE, OP, OP, NEWLINE, ENDMARKER]
def test_form_feed():
error_token, endmarker = _get_token_list(dedent('''\
\f"""'''))
assert error_token.prefix == '\f'
assert error_token.string == '"""'
assert endmarker.prefix == ''