mirror of
https://github.com/davidhalter/parso.git
synced 2025-12-07 21:34:32 +08:00
Fix: Dedent omission was wrong, see davidhalter/jedi#1499
This commit is contained in:
@@ -208,6 +208,7 @@ class Parser(BaseParser):
|
|||||||
o = self._omit_dedent_list
|
o = self._omit_dedent_list
|
||||||
if o and o[-1] == self._indent_counter:
|
if o and o[-1] == self._indent_counter:
|
||||||
o.pop()
|
o.pop()
|
||||||
|
self._indent_counter -= 1
|
||||||
continue
|
continue
|
||||||
|
|
||||||
self._indent_counter -= 1
|
self._indent_counter -= 1
|
||||||
|
|||||||
@@ -39,6 +39,23 @@ def _check_error_leaves_nodes(node):
|
|||||||
return None
|
return None
|
||||||
|
|
||||||
|
|
||||||
|
def _assert_modules_are_equal(node1, node2):
|
||||||
|
try:
|
||||||
|
children1 = node1.children
|
||||||
|
except AttributeError:
|
||||||
|
assert not hasattr(node2, 'children'), (node1, node2)
|
||||||
|
assert node1.value == node2.value
|
||||||
|
return
|
||||||
|
else:
|
||||||
|
try:
|
||||||
|
children2 = node2.children
|
||||||
|
except AttributeError:
|
||||||
|
assert False, (node1, node2)
|
||||||
|
assert len(children1) == len(children2), (children1, children2)
|
||||||
|
for n1, n2 in zip(children1, children2):
|
||||||
|
_assert_modules_are_equal(n1, n2)
|
||||||
|
|
||||||
|
|
||||||
class Differ(object):
|
class Differ(object):
|
||||||
grammar = load_grammar()
|
grammar = load_grammar()
|
||||||
|
|
||||||
@@ -69,6 +86,9 @@ class Differ(object):
|
|||||||
|
|
||||||
_assert_valid_graph(new_module)
|
_assert_valid_graph(new_module)
|
||||||
|
|
||||||
|
without_diff_parser_module = parse(code)
|
||||||
|
#_assert_modules_are_equal(new_module, without_diff_parser_module)
|
||||||
|
|
||||||
error_node = _check_error_leaves_nodes(new_module)
|
error_node = _check_error_leaves_nodes(new_module)
|
||||||
assert expect_error_leaves == (error_node is not None), error_node
|
assert expect_error_leaves == (error_node is not None), error_node
|
||||||
if parsers is not ANY:
|
if parsers is not ANY:
|
||||||
@@ -1129,7 +1149,7 @@ def test_dont_copy_dedents_in_beginning(differ):
|
|||||||
''')
|
''')
|
||||||
differ.initialize(code1)
|
differ.initialize(code1)
|
||||||
differ.parse(code2, copies=1, parsers=1, expect_error_leaves=True)
|
differ.parse(code2, copies=1, parsers=1, expect_error_leaves=True)
|
||||||
differ.parse(code1, parsers=2)
|
differ.parse(code1, parsers=1, copies=1)
|
||||||
|
|
||||||
|
|
||||||
def test_dont_copy_error_leaves(differ):
|
def test_dont_copy_error_leaves(differ):
|
||||||
@@ -1199,8 +1219,8 @@ def test_some_other_indentation_issues(differ):
|
|||||||
a
|
a
|
||||||
''')
|
''')
|
||||||
differ.initialize(code1)
|
differ.initialize(code1)
|
||||||
differ.parse(code2, copies=2, parsers=1, expect_error_leaves=True)
|
differ.parse(code2, copies=0, parsers=1, expect_error_leaves=True)
|
||||||
differ.parse(code1, copies=2, parsers=2)
|
differ.parse(code1, copies=2, parsers=1)
|
||||||
|
|
||||||
|
|
||||||
def test_open_bracket_case1(differ):
|
def test_open_bracket_case1(differ):
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
from textwrap import dedent
|
||||||
|
|
||||||
from parso import parse, load_grammar
|
from parso import parse, load_grammar
|
||||||
|
|
||||||
|
|
||||||
@@ -83,3 +85,46 @@ def test_invalid_token_in_fstr():
|
|||||||
assert error1.type == 'error_leaf'
|
assert error1.type == 'error_leaf'
|
||||||
assert error2.value == '"'
|
assert error2.value == '"'
|
||||||
assert error2.type == 'error_leaf'
|
assert error2.type == 'error_leaf'
|
||||||
|
|
||||||
|
|
||||||
|
def test_dedent_issues1():
|
||||||
|
code = dedent('''\
|
||||||
|
class C:
|
||||||
|
@property
|
||||||
|
f
|
||||||
|
g
|
||||||
|
end
|
||||||
|
''')
|
||||||
|
module = load_grammar(version='3.8').parse(code)
|
||||||
|
klass, endmarker = module.children
|
||||||
|
suite = klass.children[-1]
|
||||||
|
assert suite.children[2].type == 'error_leaf'
|
||||||
|
assert suite.children[3].get_code(include_prefix=False) == 'f\n'
|
||||||
|
assert suite.children[5].get_code(include_prefix=False) == 'g\n'
|
||||||
|
assert suite.type == 'suite'
|
||||||
|
|
||||||
|
|
||||||
|
def test_dedent_issues2():
|
||||||
|
code = dedent('''\
|
||||||
|
class C:
|
||||||
|
@property
|
||||||
|
if 1:
|
||||||
|
g
|
||||||
|
else:
|
||||||
|
h
|
||||||
|
end
|
||||||
|
''')
|
||||||
|
module = load_grammar(version='3.8').parse(code)
|
||||||
|
klass, endmarker = module.children
|
||||||
|
suite = klass.children[-1]
|
||||||
|
assert suite.children[2].type == 'error_leaf'
|
||||||
|
if_ = suite.children[3]
|
||||||
|
assert if_.children[0] == 'if'
|
||||||
|
assert if_.children[3].type == 'suite'
|
||||||
|
assert if_.children[3].get_code() == '\n g\n'
|
||||||
|
assert if_.children[4] == 'else'
|
||||||
|
assert if_.children[6].type == 'suite'
|
||||||
|
assert if_.children[6].get_code() == '\n h\n'
|
||||||
|
|
||||||
|
assert suite.children[4].get_code(include_prefix=False) == 'end\n'
|
||||||
|
assert suite.type == 'suite'
|
||||||
|
|||||||
Reference in New Issue
Block a user