mirror of
https://github.com/davidhalter/jedi.git
synced 2025-12-08 06:44:46 +08:00
Fix signatures when used for Generic classes, fixes #1468
This commit is contained in:
@@ -133,8 +133,6 @@ class ClassMixin(object):
|
|||||||
|
|
||||||
def py__call__(self, arguments=None):
|
def py__call__(self, arguments=None):
|
||||||
from jedi.inference.value import TreeInstance
|
from jedi.inference.value import TreeInstance
|
||||||
if arguments is None:
|
|
||||||
arguments = ValuesArguments([])
|
|
||||||
return ValueSet([TreeInstance(self.inference_state, self.parent_context, self, arguments)])
|
return ValueSet([TreeInstance(self.inference_state, self.parent_context, self, arguments)])
|
||||||
|
|
||||||
def py__class__(self):
|
def py__class__(self):
|
||||||
@@ -207,7 +205,11 @@ class ClassMixin(object):
|
|||||||
type_ = builtin_from_name(self.inference_state, u'type')
|
type_ = builtin_from_name(self.inference_state, u'type')
|
||||||
assert isinstance(type_, ClassValue)
|
assert isinstance(type_, ClassValue)
|
||||||
if type_ != self:
|
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()
|
instance_filters = instance.get_filters()
|
||||||
# Filter out self filters
|
# Filter out self filters
|
||||||
next(instance_filters)
|
next(instance_filters)
|
||||||
@@ -215,7 +217,11 @@ class ClassMixin(object):
|
|||||||
yield next(instance_filters)
|
yield next(instance_filters)
|
||||||
|
|
||||||
def get_signatures(self):
|
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()]
|
return [sig.bind(self) for sig in init_funcs.get_signatures()]
|
||||||
|
|
||||||
def _as_context(self):
|
def _as_context(self):
|
||||||
|
|||||||
@@ -113,6 +113,8 @@ def test_tree_signature(Script, environment, code, expected):
|
|||||||
# Classes / inheritance
|
# Classes / inheritance
|
||||||
('full_redirect(C)', 'z, *, c'),
|
('full_redirect(C)', 'z, *, c'),
|
||||||
('full_redirect(C())', 'y'),
|
('full_redirect(C())', 'y'),
|
||||||
|
('full_redirect(G)', 't: T'),
|
||||||
|
('full_redirect(G[str])', 't: T'),
|
||||||
('D', 'D(a, z, /)'),
|
('D', 'D(a, z, /)'),
|
||||||
('D()', 'D(x, y)'),
|
('D()', 'D(x, y)'),
|
||||||
('D().foo', 'foo(a, *, bar, z, **kwargs)'),
|
('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):
|
def foo(self, a, **kwargs):
|
||||||
super().foo(**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('
|
code += 'z = ' + combination + '\nz('
|
||||||
sig, = Script(code).find_signatures()
|
sig, = Script(code).find_signatures()
|
||||||
|
|||||||
Reference in New Issue
Block a user