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
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):

View File

@@ -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):