mirror of
https://github.com/davidhalter/jedi.git
synced 2025-12-06 05:54:25 +08:00
Fix filters for classes and functions
This commit is contained in:
@@ -64,9 +64,10 @@ class FunctionMixin(object):
|
|||||||
origin_scope=origin_scope
|
origin_scope=origin_scope
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
scope = self.py__class__()
|
cls = self.py__class__()
|
||||||
for filter in scope.get_filters(search_global=False, origin_scope=origin_scope):
|
for instance in cls.execute_evaluated():
|
||||||
yield filter
|
for filter in instance.get_filters(search_global=False, origin_scope=origin_scope):
|
||||||
|
yield filter
|
||||||
|
|
||||||
def py__get__(self, instance, class_context):
|
def py__get__(self, instance, class_context):
|
||||||
from jedi.evaluate.context.instance import BoundMethod
|
from jedi.evaluate.context.instance import BoundMethod
|
||||||
|
|||||||
@@ -45,7 +45,7 @@ from jedi.evaluate import compiled
|
|||||||
from jedi.evaluate.lazy_context import LazyKnownContexts
|
from jedi.evaluate.lazy_context import LazyKnownContexts
|
||||||
from jedi.evaluate.filters import ParserTreeFilter
|
from jedi.evaluate.filters import ParserTreeFilter
|
||||||
from jedi.evaluate.names import TreeNameDefinition, ContextName
|
from jedi.evaluate.names import TreeNameDefinition, ContextName
|
||||||
from jedi.evaluate.arguments import unpack_arglist
|
from jedi.evaluate.arguments import unpack_arglist, ValuesArguments
|
||||||
from jedi.evaluate.base_context import ContextSet, iterator_to_context_set, \
|
from jedi.evaluate.base_context import ContextSet, iterator_to_context_set, \
|
||||||
NO_CONTEXTS
|
NO_CONTEXTS
|
||||||
from jedi.evaluate.context.function import FunctionAndClassBase
|
from jedi.evaluate.context.function import FunctionAndClassBase
|
||||||
@@ -214,7 +214,12 @@ class ClassMixin(object):
|
|||||||
type_ = builtin_from_name(self.evaluator, u'type')
|
type_ = builtin_from_name(self.evaluator, u'type')
|
||||||
assert isinstance(type_, ClassContext)
|
assert isinstance(type_, ClassContext)
|
||||||
if type_ != self:
|
if type_ != self:
|
||||||
yield next(type_.get_filters())
|
for instance in type_.py__call__(ValuesArguments([])):
|
||||||
|
instance_filters = instance.get_filters()
|
||||||
|
# Filter out self filters
|
||||||
|
next(instance_filters)
|
||||||
|
next(instance_filters)
|
||||||
|
yield next(instance_filters)
|
||||||
|
|
||||||
|
|
||||||
class ClassContext(use_metaclass(CachedMetaClass, ClassMixin, FunctionAndClassBase)):
|
class ClassContext(use_metaclass(CachedMetaClass, ClassMixin, FunctionAndClassBase)):
|
||||||
|
|||||||
@@ -397,43 +397,3 @@ def cast_tests():
|
|||||||
|
|
||||||
#? str()
|
#? str()
|
||||||
cast_tests()
|
cast_tests()
|
||||||
|
|
||||||
# -------------------------
|
|
||||||
# instance/class vars
|
|
||||||
# -------------------------
|
|
||||||
|
|
||||||
# python >= 3.6
|
|
||||||
|
|
||||||
class VarClass:
|
|
||||||
var_instance1: int = 1
|
|
||||||
var_instance2: float
|
|
||||||
var_class1: typing.ClassVar[str] = 1
|
|
||||||
var_class2: typing.ClassVar[bytes]
|
|
||||||
|
|
||||||
|
|
||||||
#? ['var_class1', 'var_class2']
|
|
||||||
VarClass.var_
|
|
||||||
#?
|
|
||||||
VarClass.var_instance1
|
|
||||||
#?
|
|
||||||
VarClass.var_instance2
|
|
||||||
#? str()
|
|
||||||
VarClass.var_class1
|
|
||||||
#? bytes()
|
|
||||||
VarClass.var_class2
|
|
||||||
#? []
|
|
||||||
VarClass.int
|
|
||||||
|
|
||||||
d = VarClass()
|
|
||||||
#? ['var_class1', 'var_class2', 'var_instance1', 'var_instance2']
|
|
||||||
d.var_
|
|
||||||
#? int()
|
|
||||||
d.var_instance1
|
|
||||||
#? float()
|
|
||||||
d.var_instance2
|
|
||||||
#? str()
|
|
||||||
d.var_class1
|
|
||||||
#? bytes()
|
|
||||||
d.var_class2
|
|
||||||
#? []
|
|
||||||
d.int
|
|
||||||
|
|||||||
@@ -38,12 +38,16 @@ for char in NOT_DEFINED:
|
|||||||
char
|
char
|
||||||
|
|
||||||
|
|
||||||
|
# -------------------------
|
||||||
|
# instance/class vars
|
||||||
|
# -------------------------
|
||||||
|
|
||||||
class Foo():
|
class Foo():
|
||||||
bar: int
|
bar: int
|
||||||
baz: typing.ClassVar[str]
|
baz: typing.ClassVar[str]
|
||||||
|
|
||||||
|
|
||||||
#? int()
|
#?
|
||||||
Foo.bar
|
Foo.bar
|
||||||
#? int()
|
#? int()
|
||||||
Foo().bar
|
Foo().bar
|
||||||
@@ -51,3 +55,37 @@ Foo().bar
|
|||||||
Foo.baz
|
Foo.baz
|
||||||
#? str()
|
#? str()
|
||||||
Foo().baz
|
Foo().baz
|
||||||
|
|
||||||
|
class VarClass:
|
||||||
|
var_instance1: int = 1
|
||||||
|
var_instance2: float
|
||||||
|
var_class1: typing.ClassVar[str] = 1
|
||||||
|
var_class2: typing.ClassVar[bytes]
|
||||||
|
|
||||||
|
|
||||||
|
#? ['var_class1', 'var_class2']
|
||||||
|
VarClass.var_
|
||||||
|
#?
|
||||||
|
VarClass.var_instance1
|
||||||
|
#?
|
||||||
|
VarClass.var_instance2
|
||||||
|
#? str()
|
||||||
|
VarClass.var_class1
|
||||||
|
#? bytes()
|
||||||
|
VarClass.var_class2
|
||||||
|
#? []
|
||||||
|
VarClass.int
|
||||||
|
|
||||||
|
d = VarClass()
|
||||||
|
#? ['var_class1', 'var_class2', 'var_instance1', 'var_instance2']
|
||||||
|
d.var_
|
||||||
|
#? int()
|
||||||
|
d.var_instance1
|
||||||
|
#? float()
|
||||||
|
d.var_instance2
|
||||||
|
#? str()
|
||||||
|
d.var_class1
|
||||||
|
#? bytes()
|
||||||
|
d.var_class2
|
||||||
|
#? []
|
||||||
|
d.int
|
||||||
|
|||||||
Reference in New Issue
Block a user