diff --git a/jedi/api/classes.py b/jedi/api/classes.py index aa4bc320..a1d3ce8a 100644 --- a/jedi/api/classes.py +++ b/jedi/api/classes.py @@ -345,12 +345,20 @@ class BaseDefinition(object): params = followed.params elif followed.isinstance(er.compiled.CompiledObject): params = followed.params - else: + elif isinstance(followed, er.Class): try: sub = followed.get_subscope_by_name('__init__') params = sub.params[1:] # ignore self except KeyError: return [] + elif isinstance(followed, er.Instance): + try: + sub = followed.get_subscope_by_name('__call__') + params = sub.params[1:] # ignore self + except KeyError: + return [] + else: + return [] return [_Param(self._evaluator, p.name) for p in params] def parent(self): diff --git a/jedi/api/helpers.py b/jedi/api/helpers.py index adb9564e..8102cc7f 100644 --- a/jedi/api/helpers.py +++ b/jedi/api/helpers.py @@ -3,12 +3,11 @@ Helpers for the API """ import re from collections import namedtuple -from textwrap import dedent from jedi._compatibility import u from jedi.evaluate.helpers import call_of_leaf from jedi import parser -from jedi.parser import tokenize, token +from jedi.parser import tokenize from jedi.cache import time_cache from jedi import common @@ -279,7 +278,7 @@ def get_call_signature_details(module, position): # makes it feel strange to have a call signature. return None - for n in node.children: + for n in node.children[::-1]: if n.start_pos < position and n.type == 'error_node': result = _get_call_signature_details_from_error_node(n, position) if result is not None: diff --git a/test/completion/named_param.py b/test/completion/named_param.py index 317c8455..b420df16 100644 --- a/test/completion/named_param.py +++ b/test/completion/named_param.py @@ -33,3 +33,16 @@ multiple(foo, bar my_lambda = lambda lambda_param: lambda_param + 1 #? 22 ['lambda_param'] my_lambda(lambda_param) + +# __call__ +class Test(object): + def __init__(self, hello_other): + pass + + def __call__(self, hello): + pass + +#? 12 ['hello'] +Test()(hello=) +#? 11 [] +Test()(self=)