diff --git a/jedi/evaluate/context/function.py b/jedi/evaluate/context/function.py index b5bdd99c..d784a8bd 100644 --- a/jedi/evaluate/context/function.py +++ b/jedi/evaluate/context/function.py @@ -64,9 +64,10 @@ 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): - yield filter + 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): from jedi.evaluate.context.instance import BoundMethod diff --git a/jedi/evaluate/context/klass.py b/jedi/evaluate/context/klass.py index ae89f8c4..2e4245f4 100644 --- a/jedi/evaluate/context/klass.py +++ b/jedi/evaluate/context/klass.py @@ -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)): diff --git a/test/completion/pep0484_typing.py b/test/completion/pep0484_typing.py index fbade3af..c12a8f35 100644 --- a/test/completion/pep0484_typing.py +++ b/test/completion/pep0484_typing.py @@ -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 diff --git a/test/completion/pep0526_variables.py b/test/completion/pep0526_variables.py index 867fa54e..2c5effab 100644 --- a/test/completion/pep0526_variables.py +++ b/test/completion/pep0526_variables.py @@ -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