diff --git a/jedi/api/classes.py b/jedi/api/classes.py index ade9f6d8..c620a123 100644 --- a/jedi/api/classes.py +++ b/jedi/api/classes.py @@ -698,9 +698,17 @@ class CallSignature(Definition): for i, param in enumerate(self.params): if self._key_name == param.name: return i - return None + if self.params and self.params[-1]._definition.stars == 2: + return i + else: + return None if self._index >= len(self.params): + + for i, param in enumerate(self.params): + # *args case + if param._definition.stars == 1: + return i return None return self._index diff --git a/test/test_api/test_call_signatures.py b/test/test_api/test_call_signatures.py index 91584982..bb049a9d 100644 --- a/test/test_api/test_call_signatures.py +++ b/test/test_api/test_call_signatures.py @@ -243,3 +243,17 @@ def test_signature_index(): return Script(source).call_signatures()[0] assert get('sorted([], key=a').index == 2 + assert get('sorted([], no_key=a').index is None + + args_func = 'def foo(*kwargs): pass\n' + assert get(args_func + 'foo(a').index == 0 + assert get(args_func + 'foo(a, b').index == 0 + + kwargs_func = 'def foo(**kwargs): pass\n' + assert get(kwargs_func + 'foo(a=2').index == 0 + assert get(kwargs_func + 'foo(a=2, b=2').index == 0 + + both = 'def foo(*args, **kwargs): pass\n' + assert get(both + 'foo(a=2').index == 1 + assert get(both + 'foo(a=2, b=2').index == 1 + assert get(both + 'foo(a, b, c').index == 0