From c79faa6b10077baab776610a87b59a0e3b5cbfe0 Mon Sep 17 00:00:00 2001 From: Dave Halter Date: Tue, 3 Sep 2019 14:53:40 +0200 Subject: [PATCH] Implement super() properly --- jedi/inference/value/instance.py | 12 +++++++++--- jedi/plugins/stdlib.py | 27 +++++++++++---------------- 2 files changed, 20 insertions(+), 19 deletions(-) diff --git a/jedi/inference/value/instance.py b/jedi/inference/value/instance.py index 779bd0fc..b44875fa 100644 --- a/jedi/inference/value/instance.py +++ b/jedi/inference/value/instance.py @@ -15,7 +15,7 @@ from jedi.inference.arguments import AnonymousArguments, \ ValuesArguments, TreeArgumentsWrapper from jedi.inference.value.function import \ FunctionValue, FunctionMixin, OverloadedFunctionValue, \ - BaseFunctionExecutionContext + BaseFunctionExecutionContext, FunctionExecutionContext from jedi.inference.value.klass import ClassValue, apply_py__get__, \ ClassFilter from jedi.inference.value.dynamic_arrays import get_dynamic_array_instance @@ -94,6 +94,12 @@ class AnonymousMethodExecutionContext(BaseFunctionExecutionContext): return param_names +class MethodExecutionContext(FunctionExecutionContext): + def __init__(self, instance, *args, **kwargs): + super(MethodExecutionContext, self).__init__(*args, **kwargs) + self.instance = instance + + class AbstractInstanceValue(Value): api_type = u'instance' @@ -472,12 +478,12 @@ class BoundMethod(FunctionMixin, ValueWrapper): return InstanceArguments(self.instance, arguments) - def as_context(self, arguments=None): + def _as_context(self, arguments=None): if arguments is None: return AnonymousMethodExecutionContext(self.instance, self) arguments = self._get_arguments(arguments) - return super(BoundMethod, self).as_context(arguments) + return MethodExecutionContext(self.instance, self, arguments) def py__call__(self, arguments): if isinstance(self._wrapped_value, OverloadedFunctionValue): diff --git a/jedi/plugins/stdlib.py b/jedi/plugins/stdlib.py index 4f1876aa..33c71991 100644 --- a/jedi/plugins/stdlib.py +++ b/jedi/plugins/stdlib.py @@ -20,13 +20,13 @@ from jedi.inference.arguments import ValuesArguments, \ repack_with_argument_clinic, AbstractArguments, TreeArgumentsWrapper from jedi.inference import analysis from jedi.inference import compiled -from jedi.inference.value.instance import BoundMethod, InstanceArguments, \ - AnonymousMethodExecutionContext +from jedi.inference.value.instance import BoundMethod, \ + AnonymousMethodExecutionContext, MethodExecutionContext from jedi.inference.base_value import ContextualizedNode, \ NO_VALUES, ValueSet, ValueWrapper, LazyValueWrapper from jedi.inference.value import ClassValue, ModuleValue from jedi.inference.value.klass import ClassMixin -from jedi.inference.value.function import FunctionMixin, BaseFunctionExecutionContext +from jedi.inference.value.function import FunctionMixin from jedi.inference.value import iterable from jedi.inference.lazy_value import LazyTreeValue, LazyKnownValue, \ LazyKnownValues @@ -269,19 +269,14 @@ class SuperInstance(LazyValueWrapper): @argument_clinic('[type[, obj]], /', want_context=True) def builtins_super(types, objects, context): - if isinstance(context, BaseFunctionExecutionContext): - instance = None - if isinstance(context, AnonymousMethodExecutionContext): - instance = context.instance - # TODO _arguments should be private. make this different. - elif isinstance(getattr(context, '_arguments', None), InstanceArguments): - instance = context._arguments.instance - # TODO if a class is given it doesn't have to be the direct super - # class, it can be an anecestor from long ago. - if instance is not None: - return ValueSet({SuperInstance(instance.inference_state, instance)}) - - return NO_VALUES + instance = None + if isinstance(context, AnonymousMethodExecutionContext): + instance = context.instance + elif isinstance(context, MethodExecutionContext): + instance = context.instance + if instance is None: + return NO_VALUES + return ValueSet({SuperInstance(instance.inference_state, instance)}) class ReversedObject(AttributeOverwrite):