forked from VimPlug/jedi
fix the CallSignature.index attribute
This commit is contained in:
@@ -557,14 +557,33 @@ class Script(object):
|
|||||||
if call is None:
|
if call is None:
|
||||||
return []
|
return []
|
||||||
|
|
||||||
|
stmt_el = call
|
||||||
|
while isinstance(stmt_el.parent, pr.StatementElement):
|
||||||
|
# Go to parent literal/variable until not possible anymore. This
|
||||||
|
# makes it possible to return the whole expression.
|
||||||
|
stmt_el = stmt_el.parent
|
||||||
|
# We can reset the execution since it's a new object
|
||||||
|
# (fast_parent_copy).
|
||||||
|
execution_arr, call.execution = call.execution, None
|
||||||
|
|
||||||
with common.scale_speed_settings(settings.scale_call_signatures):
|
with common.scale_speed_settings(settings.scale_call_signatures):
|
||||||
_callable = lambda: self._evaluator.eval_call(call)
|
_callable = lambda: self._evaluator.eval_call(stmt_el)
|
||||||
origins = cache.cache_call_signatures(_callable, self.source,
|
origins = cache.cache_call_signatures(_callable, self.source,
|
||||||
self._pos, user_stmt)
|
self._pos, user_stmt)
|
||||||
origins = self._evaluator.eval_call(call)
|
origins = self._evaluator.eval_call(stmt_el)
|
||||||
debug.speed('func_call followed')
|
debug.speed('func_call followed')
|
||||||
|
|
||||||
return [classes.CallSignature(self._evaluator, o, call, index)
|
key_name = None
|
||||||
|
try:
|
||||||
|
detail = execution_arr[index].assignment_details[0]
|
||||||
|
except IndexError:
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
try:
|
||||||
|
key_name = unicode(detail[0][0].name)
|
||||||
|
except (IndexError, AttributeError):
|
||||||
|
pass
|
||||||
|
return [classes.CallSignature(self._evaluator, o, call, index, key_name)
|
||||||
for o in origins if o.is_callable()]
|
for o in origins if o.is_callable()]
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -682,12 +682,28 @@ class CallSignature(Definition):
|
|||||||
It knows what functions you are currently in. e.g. `isinstance(` would
|
It knows what functions you are currently in. e.g. `isinstance(` would
|
||||||
return the `isinstance` function. without `(` it would return nothing.
|
return the `isinstance` function. without `(` it would return nothing.
|
||||||
"""
|
"""
|
||||||
def __init__(self, evaluator, executable, call, index):
|
def __init__(self, evaluator, executable, call, index, key_name):
|
||||||
super(CallSignature, self).__init__(evaluator, executable)
|
super(CallSignature, self).__init__(evaluator, executable)
|
||||||
self.index = index
|
self._index = index
|
||||||
""" The param index of the current call. """
|
self._key_name = key_name
|
||||||
self._call = call
|
self._call = call
|
||||||
|
|
||||||
|
@property
|
||||||
|
def index(self):
|
||||||
|
"""
|
||||||
|
The Param index of the current call.
|
||||||
|
Returns None if the index doesn't is not defined.
|
||||||
|
"""
|
||||||
|
if self._key_name is not None:
|
||||||
|
for i, param in enumerate(self.params):
|
||||||
|
if self._key_name == param.name:
|
||||||
|
return i
|
||||||
|
return None
|
||||||
|
|
||||||
|
if self._index >= len(self.params):
|
||||||
|
return None
|
||||||
|
return self._index
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def bracket_start(self):
|
def bracket_start(self):
|
||||||
"""
|
"""
|
||||||
|
|||||||
@@ -123,13 +123,6 @@ def search_call_signatures(user_stmt, position):
|
|||||||
arr, index = call_signature_array_for_pos(user_stmt, position)
|
arr, index = call_signature_array_for_pos(user_stmt, position)
|
||||||
if arr is not None:
|
if arr is not None:
|
||||||
call = arr.parent
|
call = arr.parent
|
||||||
while isinstance(call.parent, pr.StatementElement):
|
|
||||||
# Go to parent literal/variable until not possible anymore. This
|
|
||||||
# makes it possible to return the whole expression.
|
|
||||||
call = call.parent
|
|
||||||
arr.parent.execution = None
|
|
||||||
if not isinstance(call, pr.Call):
|
|
||||||
call = None
|
|
||||||
|
|
||||||
debug.speed('func_call parsed')
|
debug.speed('func_call parsed')
|
||||||
return call, index
|
return call, index
|
||||||
|
|||||||
@@ -26,12 +26,12 @@ class TestCallSignatures(TestCase):
|
|||||||
run = self._run_simple
|
run = self._run_simple
|
||||||
|
|
||||||
# simple
|
# simple
|
||||||
s1 = "abs(a, str("
|
s1 = "sorted(a, str("
|
||||||
run(s1, 'abs', 0, 4)
|
run(s1, 'sorted', 0, 7)
|
||||||
run(s1, 'abs', 1, 6)
|
run(s1, 'sorted', 1, 9)
|
||||||
run(s1, 'abs', 1, 7)
|
run(s1, 'sorted', 1, 10)
|
||||||
run(s1, 'abs', 1, 8)
|
run(s1, 'sorted', 1, 11)
|
||||||
run(s1, 'str', 0, 11)
|
run(s1, 'str', 0, 14)
|
||||||
|
|
||||||
s2 = "abs(), "
|
s2 = "abs(), "
|
||||||
run(s2, 'abs', 0, 4)
|
run(s2, 'abs', 0, 4)
|
||||||
@@ -50,9 +50,9 @@ class TestCallSignatures(TestCase):
|
|||||||
run(s4, 'abs', 0, 9)
|
run(s4, 'abs', 0, 9)
|
||||||
#run(s4, 'abs', 1, 10)
|
#run(s4, 'abs', 1, 10)
|
||||||
|
|
||||||
s5 = "abs(1,\nif 2:\n def a():"
|
s5 = "sorted(1,\nif 2:\n def a():"
|
||||||
run(s5, 'abs', 0, 4)
|
run(s5, 'sorted', 0, 7)
|
||||||
run(s5, 'abs', 1, 6)
|
run(s5, 'sorted', 1, 9)
|
||||||
|
|
||||||
s6 = "str().center("
|
s6 = "str().center("
|
||||||
run(s6, 'center', 0)
|
run(s6, 'center', 0)
|
||||||
@@ -236,3 +236,10 @@ def test_completion_interference():
|
|||||||
assert Script('from datetime import ').completions()
|
assert Script('from datetime import ').completions()
|
||||||
|
|
||||||
assert Script('open(').call_signatures()
|
assert Script('open(').call_signatures()
|
||||||
|
|
||||||
|
|
||||||
|
def test_signature_index():
|
||||||
|
def get(source):
|
||||||
|
return Script(source).call_signatures()[0]
|
||||||
|
|
||||||
|
assert get('sorted([], key=a').index == 2
|
||||||
|
|||||||
Reference in New Issue
Block a user