mirror of
https://github.com/davidhalter/parso.git
synced 2025-12-07 21:34:32 +08:00
Diff parser: Prepare for indent error leaf insertion
This commit is contained in:
@@ -429,7 +429,7 @@ class DiffParser(object):
|
|||||||
class _NodesTreeNode(object):
|
class _NodesTreeNode(object):
|
||||||
_ChildrenGroup = namedtuple(
|
_ChildrenGroup = namedtuple(
|
||||||
'_ChildrenGroup',
|
'_ChildrenGroup',
|
||||||
'prefix children line_offset last_line_offset_leaf add_error_dedent')
|
'prefix children line_offset last_line_offset_leaf add_error_leaf')
|
||||||
|
|
||||||
def __init__(self, tree_node, parent=None):
|
def __init__(self, tree_node, parent=None):
|
||||||
self.tree_node = tree_node
|
self.tree_node = tree_node
|
||||||
@@ -439,7 +439,7 @@ class _NodesTreeNode(object):
|
|||||||
|
|
||||||
def finish(self):
|
def finish(self):
|
||||||
children = []
|
children = []
|
||||||
for prefix, children_part, line_offset, last_line_offset_leaf, add_error_dedent \
|
for prefix, children_part, line_offset, last_line_offset_leaf, add_error_leaf \
|
||||||
in self._children_groups:
|
in self._children_groups:
|
||||||
first_leaf = _get_next_leaf_if_indentation(
|
first_leaf = _get_next_leaf_if_indentation(
|
||||||
children_part[0].get_first_leaf()
|
children_part[0].get_first_leaf()
|
||||||
@@ -452,8 +452,8 @@ class _NodesTreeNode(object):
|
|||||||
children_part, line_offset, last_line_offset_leaf)
|
children_part, line_offset, last_line_offset_leaf)
|
||||||
except _PositionUpdatingFinished:
|
except _PositionUpdatingFinished:
|
||||||
pass
|
pass
|
||||||
if add_error_dedent:
|
if add_error_leaf is not None:
|
||||||
children.append(PythonErrorLeaf('ERROR_DEDENT', '', children[-1].end_pos))
|
children.append(PythonErrorLeaf(add_error_leaf, '', children[-1].end_pos))
|
||||||
children += children_part
|
children += children_part
|
||||||
self.tree_node.children = children
|
self.tree_node.children = children
|
||||||
# Reset the parents
|
# Reset the parents
|
||||||
@@ -467,11 +467,11 @@ class _NodesTreeNode(object):
|
|||||||
self._node_children.append(child_node)
|
self._node_children.append(child_node)
|
||||||
|
|
||||||
def add_tree_nodes(self, prefix, children, line_offset=0,
|
def add_tree_nodes(self, prefix, children, line_offset=0,
|
||||||
last_line_offset_leaf=None, add_error_dedent=False):
|
last_line_offset_leaf=None, add_error_leaf=None):
|
||||||
if last_line_offset_leaf is None:
|
if last_line_offset_leaf is None:
|
||||||
last_line_offset_leaf = children[-1].get_last_leaf()
|
last_line_offset_leaf = children[-1].get_last_leaf()
|
||||||
group = self._ChildrenGroup(
|
group = self._ChildrenGroup(
|
||||||
prefix, children, line_offset, last_line_offset_leaf, add_error_dedent
|
prefix, children, line_offset, last_line_offset_leaf, add_error_leaf
|
||||||
)
|
)
|
||||||
self._children_groups.append(group)
|
self._children_groups.append(group)
|
||||||
|
|
||||||
@@ -514,7 +514,7 @@ class _NodesTree(object):
|
|||||||
|
|
||||||
def _get_insertion_node(self, indentation_node):
|
def _get_insertion_node(self, indentation_node):
|
||||||
indentation = indentation_node.start_pos[1]
|
indentation = indentation_node.start_pos[1]
|
||||||
need_error_dedent = False
|
add_error_leaf = None
|
||||||
|
|
||||||
previous_node = None
|
previous_node = None
|
||||||
# find insertion node
|
# find insertion node
|
||||||
@@ -527,7 +527,7 @@ class _NodesTree(object):
|
|||||||
if indentation > node_indentation and previous_node is not None:
|
if indentation > node_indentation and previous_node is not None:
|
||||||
# This means that it was not dedented enough.
|
# This means that it was not dedented enough.
|
||||||
node = previous_node
|
node = previous_node
|
||||||
need_error_dedent = True
|
add_error_leaf = 'ERROR_DEDENT'
|
||||||
break
|
break
|
||||||
if indentation >= node_indentation: # Not a Dedent
|
if indentation >= node_indentation: # Not a Dedent
|
||||||
# We might be at the most outer layer: modules. We
|
# We might be at the most outer layer: modules. We
|
||||||
@@ -537,13 +537,13 @@ class _NodesTree(object):
|
|||||||
elif tree_node.type == 'file_input':
|
elif tree_node.type == 'file_input':
|
||||||
if indentation > 0 and previous_node is not None:
|
if indentation > 0 and previous_node is not None:
|
||||||
node = previous_node
|
node = previous_node
|
||||||
need_error_dedent = True
|
add_error_leaf = 'ERROR_DEDENT'
|
||||||
break
|
break
|
||||||
previous_node = node
|
previous_node = node
|
||||||
|
|
||||||
while True:
|
while True:
|
||||||
if node == self._working_stack[-1]:
|
if node == self._working_stack[-1]:
|
||||||
return need_error_dedent, node
|
return add_error_leaf, node
|
||||||
self._working_stack.pop()
|
self._working_stack.pop()
|
||||||
|
|
||||||
def add_parsed_nodes(self, tree_nodes):
|
def add_parsed_nodes(self, tree_nodes):
|
||||||
@@ -555,9 +555,9 @@ class _NodesTree(object):
|
|||||||
|
|
||||||
assert tree_nodes[0].type != 'newline'
|
assert tree_nodes[0].type != 'newline'
|
||||||
|
|
||||||
need_error_dedent, node = self._get_insertion_node(tree_nodes[0])
|
add_error_leaf, node = self._get_insertion_node(tree_nodes[0])
|
||||||
assert node.tree_node.type in ('suite', 'file_input')
|
assert node.tree_node.type in ('suite', 'file_input')
|
||||||
node.add_tree_nodes(old_prefix, tree_nodes, add_error_dedent=need_error_dedent)
|
node.add_tree_nodes(old_prefix, tree_nodes, add_error_leaf=add_error_leaf)
|
||||||
# tos = Top of stack
|
# tos = Top of stack
|
||||||
self._update_tos(tree_nodes[-1])
|
self._update_tos(tree_nodes[-1])
|
||||||
|
|
||||||
|
|||||||
@@ -45,6 +45,9 @@ def _assert_modules_are_equal(node1, node2):
|
|||||||
except AttributeError:
|
except AttributeError:
|
||||||
assert not hasattr(node2, 'children'), (node1, node2)
|
assert not hasattr(node2, 'children'), (node1, node2)
|
||||||
assert node1.value == node2.value
|
assert node1.value == node2.value
|
||||||
|
assert node1.type == node2.type
|
||||||
|
assert node1.prefix == node2.prefix
|
||||||
|
assert node1.start_pos == node2.start_pos
|
||||||
return
|
return
|
||||||
else:
|
else:
|
||||||
try:
|
try:
|
||||||
@@ -1122,7 +1125,7 @@ def test_all_sorts_of_indentation(differ):
|
|||||||
''')
|
''')
|
||||||
differ.initialize(code1)
|
differ.initialize(code1)
|
||||||
differ.parse(code2, copies=1, parsers=4, expect_error_leaves=True)
|
differ.parse(code2, copies=1, parsers=4, expect_error_leaves=True)
|
||||||
differ.parse(code1, copies=1, parsers=3)
|
differ.parse(code1, copies=1, parsers=3, expect_error_leaves=True)
|
||||||
|
|
||||||
code3 = dedent('''\
|
code3 = dedent('''\
|
||||||
if 1:
|
if 1:
|
||||||
|
|||||||
Reference in New Issue
Block a user