Fix filters for classes and functions

This commit is contained in:
Dave Halter
2019-07-01 22:24:29 -07:00
parent 3829ef4785
commit 1e3b6a201d
4 changed files with 50 additions and 46 deletions

View File

@@ -64,8 +64,9 @@ class FunctionMixin(object):
origin_scope=origin_scope
)
else:
scope = self.py__class__()
for filter in scope.get_filters(search_global=False, origin_scope=origin_scope):
cls = self.py__class__()
for instance in cls.execute_evaluated():
for filter in instance.get_filters(search_global=False, origin_scope=origin_scope):
yield filter
def py__get__(self, instance, class_context):

View File

@@ -45,7 +45,7 @@ from jedi.evaluate import compiled
from jedi.evaluate.lazy_context import LazyKnownContexts
from jedi.evaluate.filters import ParserTreeFilter
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, \
NO_CONTEXTS
from jedi.evaluate.context.function import FunctionAndClassBase
@@ -214,7 +214,12 @@ class ClassMixin(object):
type_ = builtin_from_name(self.evaluator, u'type')
assert isinstance(type_, ClassContext)
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)):

View File

@@ -397,43 +397,3 @@ def cast_tests():
#? str()
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

View File

@@ -38,12 +38,16 @@ for char in NOT_DEFINED:
char
# -------------------------
# instance/class vars
# -------------------------
class Foo():
bar: int
baz: typing.ClassVar[str]
#? int()
#?
Foo.bar
#? int()
Foo().bar
@@ -51,3 +55,37 @@ Foo().bar
Foo.baz
#? str()
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