Implement super() properly

This commit is contained in:
Dave Halter
2019-09-03 14:53:40 +02:00
parent 4b10644100
commit c79faa6b10
2 changed files with 20 additions and 19 deletions

View File

@@ -15,7 +15,7 @@ from jedi.inference.arguments import AnonymousArguments, \
ValuesArguments, TreeArgumentsWrapper ValuesArguments, TreeArgumentsWrapper
from jedi.inference.value.function import \ from jedi.inference.value.function import \
FunctionValue, FunctionMixin, OverloadedFunctionValue, \ FunctionValue, FunctionMixin, OverloadedFunctionValue, \
BaseFunctionExecutionContext BaseFunctionExecutionContext, FunctionExecutionContext
from jedi.inference.value.klass import ClassValue, apply_py__get__, \ from jedi.inference.value.klass import ClassValue, apply_py__get__, \
ClassFilter ClassFilter
from jedi.inference.value.dynamic_arrays import get_dynamic_array_instance from jedi.inference.value.dynamic_arrays import get_dynamic_array_instance
@@ -94,6 +94,12 @@ class AnonymousMethodExecutionContext(BaseFunctionExecutionContext):
return param_names return param_names
class MethodExecutionContext(FunctionExecutionContext):
def __init__(self, instance, *args, **kwargs):
super(MethodExecutionContext, self).__init__(*args, **kwargs)
self.instance = instance
class AbstractInstanceValue(Value): class AbstractInstanceValue(Value):
api_type = u'instance' api_type = u'instance'
@@ -472,12 +478,12 @@ class BoundMethod(FunctionMixin, ValueWrapper):
return InstanceArguments(self.instance, arguments) return InstanceArguments(self.instance, arguments)
def as_context(self, arguments=None): def _as_context(self, arguments=None):
if arguments is None: if arguments is None:
return AnonymousMethodExecutionContext(self.instance, self) return AnonymousMethodExecutionContext(self.instance, self)
arguments = self._get_arguments(arguments) arguments = self._get_arguments(arguments)
return super(BoundMethod, self).as_context(arguments) return MethodExecutionContext(self.instance, self, arguments)
def py__call__(self, arguments): def py__call__(self, arguments):
if isinstance(self._wrapped_value, OverloadedFunctionValue): if isinstance(self._wrapped_value, OverloadedFunctionValue):

View File

@@ -20,13 +20,13 @@ from jedi.inference.arguments import ValuesArguments, \
repack_with_argument_clinic, AbstractArguments, TreeArgumentsWrapper repack_with_argument_clinic, AbstractArguments, TreeArgumentsWrapper
from jedi.inference import analysis from jedi.inference import analysis
from jedi.inference import compiled from jedi.inference import compiled
from jedi.inference.value.instance import BoundMethod, InstanceArguments, \ from jedi.inference.value.instance import BoundMethod, \
AnonymousMethodExecutionContext AnonymousMethodExecutionContext, MethodExecutionContext
from jedi.inference.base_value import ContextualizedNode, \ from jedi.inference.base_value import ContextualizedNode, \
NO_VALUES, ValueSet, ValueWrapper, LazyValueWrapper NO_VALUES, ValueSet, ValueWrapper, LazyValueWrapper
from jedi.inference.value import ClassValue, ModuleValue from jedi.inference.value import ClassValue, ModuleValue
from jedi.inference.value.klass import ClassMixin 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.value import iterable
from jedi.inference.lazy_value import LazyTreeValue, LazyKnownValue, \ from jedi.inference.lazy_value import LazyTreeValue, LazyKnownValue, \
LazyKnownValues LazyKnownValues
@@ -269,19 +269,14 @@ class SuperInstance(LazyValueWrapper):
@argument_clinic('[type[, obj]], /', want_context=True) @argument_clinic('[type[, obj]], /', want_context=True)
def builtins_super(types, objects, context): def builtins_super(types, objects, context):
if isinstance(context, BaseFunctionExecutionContext): instance = None
instance = None if isinstance(context, AnonymousMethodExecutionContext):
if isinstance(context, AnonymousMethodExecutionContext): instance = context.instance
instance = context.instance elif isinstance(context, MethodExecutionContext):
# TODO _arguments should be private. make this different. instance = context.instance
elif isinstance(getattr(context, '_arguments', None), InstanceArguments): if instance is None:
instance = context._arguments.instance return NO_VALUES
# TODO if a class is given it doesn't have to be the direct super return ValueSet({SuperInstance(instance.inference_state, instance)})
# class, it can be an anecestor from long ago.
if instance is not None:
return ValueSet({SuperInstance(instance.inference_state, instance)})
return NO_VALUES
class ReversedObject(AttributeOverwrite): class ReversedObject(AttributeOverwrite):