diff --git a/jedi/inference/value/instance.py b/jedi/inference/value/instance.py index 98469d1c..2e97482b 100644 --- a/jedi/inference/value/instance.py +++ b/jedi/inference/value/instance.py @@ -131,7 +131,7 @@ class AbstractInstanceValue(Value): # In this case we're excluding compiled objects that are # not fake objects. It doesn't make sense for normal # compiled objects to search for self variables. - yield SelfAttributeFilter(self, cls, origin_scope) + yield SelfAttributeFilter(self, class_value, cls, origin_scope) class_filters = class_value.get_filters( origin_scope=origin_scope, @@ -483,14 +483,14 @@ class SelfAttributeFilter(ClassFilter): """ name_class = SelfName - def __init__(self, instance, class_value, origin_scope): + def __init__(self, instance, instance_class, class_value, origin_scope): super(SelfAttributeFilter, self).__init__( - parent_context=instance.parent_context, + class_value=instance_class, node_context=class_value.as_context(), origin_scope=origin_scope, is_instance=True, ) - self._class_value = class_value + self._specific_class_value = class_value self._instance = instance def _filter(self, names): @@ -509,7 +509,7 @@ class SelfAttributeFilter(ClassFilter): yield name def _convert_names(self, names): - return [self.name_class(self._instance, self._class_value, name) for name in names] + return [self.name_class(self._instance, self._specific_class_value, name) for name in names] def _check_flows(self, names): return names diff --git a/jedi/inference/value/klass.py b/jedi/inference/value/klass.py index 26267692..a6129817 100644 --- a/jedi/inference/value/klass.py +++ b/jedi/inference/value/klass.py @@ -64,10 +64,11 @@ def apply_py__get__(value, instance, class_value): class ClassName(TreeNameDefinition): - def __init__(self, parent_context, tree_name, name_context, apply_decorators): + def __init__(self, parent_context, class_value, tree_name, name_context, apply_decorators): super(ClassName, self).__init__(parent_context, tree_name) self._name_context = name_context self._apply_decorators = apply_decorators + self._class_value = class_value @iterator_to_value_set def infer(self): @@ -80,8 +81,7 @@ class ClassName(TreeNameDefinition): if self._apply_decorators: for c in apply_py__get__(result_value, instance=None, - # TODO private access! - class_value=self.parent_context._value): + class_value=self._class_value): yield c else: yield result_value @@ -90,14 +90,21 @@ class ClassName(TreeNameDefinition): class ClassFilter(ParserTreeFilter): name_class = ClassName - def __init__(self, *args, **kwargs): - self._is_instance = kwargs.pop('is_instance') # Python 2 :/ - super(ClassFilter, self).__init__(*args, **kwargs) + def __init__(self, class_value, node_context=None, until_position=None, + origin_scope=None, is_instance=False): + super(ClassFilter, self).__init__( + class_value.as_context(), node_context, + until_position=until_position, + origin_scope=origin_scope, + ) + self._class_value = class_value + self._is_instance = is_instance def _convert_names(self, names): return [ self.name_class( parent_context=self.parent_context, + class_value=self._class_value, tree_name=name, name_context=self._node_context, apply_decorators=not self._is_instance, @@ -206,7 +213,7 @@ class ClassMixin(object): yield filter else: yield ClassFilter( - self.as_context(), node_context=cls.as_context(), + self, node_context=cls.as_context(), origin_scope=origin_scope, is_instance=is_instance )