diff --git a/jedi/api/__init__.py b/jedi/api/__init__.py index b6f506de..666482e7 100644 --- a/jedi/api/__init__.py +++ b/jedi/api/__init__.py @@ -33,6 +33,7 @@ from jedi.evaluate import compiled from jedi.evaluate import imports from jedi.evaluate.helpers import FakeName from jedi.evaluate.finder import get_names_of_scope +from jedi.evaluate.helpers import search_call_signatures class NotFoundError(Exception): @@ -370,7 +371,7 @@ class Script(object): else: # Fetch definition of callee, if there's no path otherwise. if not goto_path: - (call, _) = helpers.func_call_and_param_index(user_stmt, self._pos) + (call, _) = search_call_signatures(user_stmt, self._pos) if call is not None: while call.next is not None: call = call.next @@ -548,7 +549,7 @@ class Script(object): :rtype: list of :class:`classes.CallSignature` """ user_stmt = self._parser.user_stmt_with_whitespace() - call, index = helpers.func_call_and_param_index(user_stmt, self._pos) + call, index = search_call_signatures(user_stmt, self._pos) if call is None: return [] diff --git a/jedi/api/helpers.py b/jedi/api/helpers.py index 9b5efede..a223c6f7 100644 --- a/jedi/api/helpers.py +++ b/jedi/api/helpers.py @@ -9,16 +9,6 @@ from jedi.evaluate import imports from jedi.parser import representation as pr -def func_call_and_param_index(user_stmt, position): - debug.speed('func_call start') - call, index = None, 0 - if call is None: - if user_stmt is not None and isinstance(user_stmt, pr.Statement): - call, index, _ = helpers.search_call_signatures(user_stmt, position) - debug.speed('func_call parsed') - return call, index - - def completion_parts(path_until_cursor): """ Returns the parts for the completion diff --git a/jedi/evaluate/helpers.py b/jedi/evaluate/helpers.py index 5a8e634f..33b5cc4d 100644 --- a/jedi/evaluate/helpers.py +++ b/jedi/evaluate/helpers.py @@ -2,6 +2,7 @@ import copy from jedi import common from jedi.parser import representation as pr +from jedi import debug def fast_parent_copy(obj): @@ -112,22 +113,28 @@ def array_for_pos(stmt, pos): return None, 0 -def search_call_signatures(stmt, pos): +def search_call_signatures(user_stmt, position): """ Returns the function Call that matches the position before. """ - # some parts will of the statement will be removed - stmt = fast_parent_copy(stmt) - arr, index = array_for_pos(stmt, pos) - if arr is not None: - 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 - return call if isinstance(call, pr.Call) else None, index, False - return None, 0, False + debug.speed('func_call start') + call, index = None, 0 + if user_stmt is not None and isinstance(user_stmt, pr.Statement): + # some parts will of the statement will be removed + user_stmt = fast_parent_copy(user_stmt) + arr, index = array_for_pos(user_stmt, position) + if arr is not None: + 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') + return call, index def scan_statement_for_calls(stmt, search_name, assignment_details=False):