mirror of
https://github.com/davidhalter/jedi.git
synced 2025-12-08 14:54:47 +08:00
Implement super() properly
This commit is contained in:
@@ -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):
|
||||||
|
|||||||
@@ -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):
|
||||||
|
|||||||
Reference in New Issue
Block a user