Diff parser: Prepare for indent error leaf insertion

This commit is contained in:
Dave Halter
2020-03-22 22:57:58 +01:00
parent cdb791fbdb
commit afc556d809
2 changed files with 16 additions and 13 deletions

View File

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

View File

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