diff --git a/jedi/inference/value/klass.py b/jedi/inference/value/klass.py index eca6d718..aede4222 100644 --- a/jedi/inference/value/klass.py +++ b/jedi/inference/value/klass.py @@ -133,8 +133,6 @@ class ClassMixin(object): def py__call__(self, arguments=None): from jedi.inference.value import TreeInstance - if arguments is None: - arguments = ValuesArguments([]) return ValueSet([TreeInstance(self.inference_state, self.parent_context, self, arguments)]) def py__class__(self): @@ -207,7 +205,11 @@ class ClassMixin(object): type_ = builtin_from_name(self.inference_state, u'type') assert isinstance(type_, ClassValue) if type_ != self: - for instance in type_.py__call__(): + # We are not using execute_with_values here, because the + # plugin function for type would get executed instead of an + # instance creation. + args = ValuesArguments([]) + for instance in type_.py__call__(args): instance_filters = instance.get_filters() # Filter out self filters next(instance_filters) @@ -215,7 +217,11 @@ class ClassMixin(object): yield next(instance_filters) def get_signatures(self): - init_funcs = self.py__call__().py__getattribute__('__init__') + # Since calling staticmethod without a function is illegal, the Jedi + # plugin doesn't return anything. Therefore call directly and get what + # we want: An instance of staticmethod. + args = ValuesArguments([]) + init_funcs = self.py__call__(args).py__getattribute__('__init__') return [sig.bind(self) for sig in init_funcs.get_signatures()] def _as_context(self): diff --git a/test/test_inference/test_signature.py b/test/test_inference/test_signature.py index efac00d9..ea12eddf 100644 --- a/test/test_inference/test_signature.py +++ b/test/test_inference/test_signature.py @@ -113,6 +113,8 @@ def test_tree_signature(Script, environment, code, expected): # Classes / inheritance ('full_redirect(C)', 'z, *, c'), ('full_redirect(C())', 'y'), + ('full_redirect(G)', 't: T'), + ('full_redirect(G[str])', 't: T'), ('D', 'D(a, z, /)'), ('D()', 'D(x, y)'), ('D().foo', 'foo(a, *, bar, z, **kwargs)'), @@ -189,6 +191,11 @@ def test_nested_signatures(Script, environment, combination, expected, skip_pre_ def foo(self, a, **kwargs): super().foo(**kwargs) + + from typing import Generic, TypeVar + T = TypeVar('T') + class G(Generic[T]): + def __init__(self, i, t: T): ... ''') code += 'z = ' + combination + '\nz(' sig, = Script(code).find_signatures()