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:
@@ -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()
|
||||||
except IndexError:
|
if leaf is None:
|
||||||
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()
|
||||||
except IndexError:
|
if leaf is None:
|
||||||
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()
|
||||||
except IndexError:
|
if leaf is None:
|
||||||
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))
|
||||||
|
|
||||||
|
|||||||
@@ -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()
|
||||||
except IndexError:
|
if newline is None:
|
||||||
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')
|
||||||
|
|||||||
@@ -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):
|
||||||
|
|||||||
Reference in New Issue
Block a user