1
0
forked from VimPlug/jedi

Change get_previous_leaf to return None if there is no leaf anymore (at the start of the file).

This commit is contained in:
Dave Halter
2017-02-03 17:23:15 +01:00
parent 445bf6c419
commit c5071f9f49
3 changed files with 19 additions and 20 deletions

View File

@@ -74,16 +74,14 @@ def _get_code_for_stack(code_lines, module_node, position):
return u('') return u('')
# If we're not on a comment simply get the previous leaf and proceed. # If we're not on a comment simply get the previous leaf and proceed.
try: leaf = leaf.get_previous_leaf()
leaf = leaf.get_previous_leaf() if leaf is None:
except IndexError:
return u('') # At the beginning of the file. return u('') # At the beginning of the file.
is_after_newline = leaf.type == 'newline' is_after_newline = leaf.type == 'newline'
while leaf.type == 'newline': while leaf.type == 'newline':
try: leaf = leaf.get_previous_leaf()
leaf = leaf.get_previous_leaf() if leaf is None:
except IndexError:
return u('') return u('')
if leaf.type == 'error_leaf' or leaf.type == 'string': if leaf.type == 'error_leaf' or leaf.type == 'string':
@@ -244,6 +242,8 @@ def _get_call_signature_details_from_error_node(node, position):
# until the parentheses is enough. # until the parentheses is enough.
children = node.children[index:] children = node.children[index:]
name = element.get_previous_leaf() name = element.get_previous_leaf()
if name is None:
continue
if name.type == 'name' or name.parent.type in ('trailer', 'atom'): if name.type == 'name' or name.parent.type in ('trailer', 'atom'):
return CallSignatureDetails( return CallSignatureDetails(
element, element,
@@ -255,9 +255,8 @@ def get_call_signature_details(module, position):
leaf = module.get_leaf_for_position(position, include_prefixes=True) leaf = module.get_leaf_for_position(position, include_prefixes=True)
if leaf.start_pos >= position: if leaf.start_pos >= position:
# Whitespace / comments after the leaf count towards the previous leaf. # Whitespace / comments after the leaf count towards the previous leaf.
try: leaf = leaf.get_previous_leaf()
leaf = leaf.get_previous_leaf() if leaf is None:
except IndexError:
return None return None
if leaf == ')': if leaf == ')':
@@ -281,6 +280,8 @@ def get_call_signature_details(module, position):
if node.type == 'trailer' and node.children[0] == '(': if node.type == 'trailer' and node.children[0] == '(':
leaf = node.get_previous_leaf() leaf = node.get_previous_leaf()
if leaf is None:
return None
return CallSignatureDetails( return CallSignatureDetails(
node.children[0], *_get_index_and_key(node.children, position)) node.children[0], *_get_index_and_key(node.children, position))

View File

@@ -212,16 +212,14 @@ class Parser(object):
if '\n' not in prefix: if '\n' not in prefix:
# Basically if the last line doesn't end with a newline. we # Basically if the last line doesn't end with a newline. we
# have to add the previous line's end_position. # have to add the previous line's end_position.
try: previous_leaf = endmarker.get_previous_leaf()
last_end = endmarker.get_previous_leaf().end_pos[1] if previous_leaf is not None:
except IndexError: last_end = previous_leaf.end_pos[1]
pass
last_line = re.sub('.*\n', '', prefix) last_line = re.sub('.*\n', '', prefix)
endmarker.start_pos = endmarker.line - 1, last_end + len(last_line) endmarker.start_pos = endmarker.line - 1, last_end + len(last_line)
else: else:
try: newline = endmarker.get_previous_leaf()
newline = endmarker.get_previous_leaf() if newline is None:
except IndexError:
return # This means that the parser is empty. return # This means that the parser is empty.
assert newline.value.endswith('\n') assert newline.value.endswith('\n')

View File

@@ -232,7 +232,7 @@ class Base(object):
if i == 0: if i == 0:
node = node.parent node = node.parent
if node.parent is None: if node.parent is None:
raise IndexError('Cannot access the previous element of the first one.') return None
else: else:
node = c[i - 1] node = c[i - 1]
break break
@@ -286,10 +286,10 @@ class Leaf(Base):
self.indent = value[1] self.indent = value[1]
def get_start_pos_of_prefix(self): def get_start_pos_of_prefix(self):
try: previous_leaf = self.get_previous_leaf()
return self.get_previous_leaf().end_pos if previous_leaf is None:
except IndexError:
return self.line - self.prefix.count('\n'), 0 # It's the first leaf. return self.line - self.prefix.count('\n'), 0 # It's the first leaf.
return previous_leaf.end_pos
@property @property
def end_pos(self): def end_pos(self):