diff --git a/jedi/inference/filters.py b/jedi/inference/filters.py index c91140d6..76f4b35b 100644 --- a/jedi/inference/filters.py +++ b/jedi/inference/filters.py @@ -152,7 +152,7 @@ class _FunctionExecutionFilter(ParserTreeFilter): ) self._function_value = function_value - def _convert_param(self, name): + def _convert_param(self, param, name): raise NotImplementedError @to_list diff --git a/jedi/inference/value/__init__.py b/jedi/inference/value/__init__.py index 1e9ecf50..2e17ba26 100644 --- a/jedi/inference/value/__init__.py +++ b/jedi/inference/value/__init__.py @@ -1,6 +1,6 @@ from jedi.inference.value.module import ModuleValue from jedi.inference.value.klass import ClassValue from jedi.inference.value.function import FunctionValue, \ - MethodValue, FunctionExecutionContext + MethodValue from jedi.inference.value.instance import AnonymousInstance, BoundMethod, \ CompiledInstance, AbstractInstanceValue, TreeInstance diff --git a/jedi/inference/value/instance.py b/jedi/inference/value/instance.py index 6a6eeee0..779bd0fc 100644 --- a/jedi/inference/value/instance.py +++ b/jedi/inference/value/instance.py @@ -68,13 +68,17 @@ class AnonymousMethodExecutionFilter(AnonymousFunctionExecutionFilter): def _convert_param(self, param, name): if param.position_index == 0: return InstanceExecutedParamName(self._instance, self._function_value, name) - return super(AnonymousFunctionExecutionFilter, self)._convert_param(param, name) + return super(AnonymousMethodExecutionFilter, self)._convert_param(param, name) class AnonymousMethodExecutionContext(BaseFunctionExecutionContext): + def __init__(self, instance, value): + super(AnonymousMethodExecutionContext, self).__init__(value) + self.instance = instance + def get_filters(self, until_position=None, origin_scope=None): - yield AnonymousFunctionExecutionFilter( - self, self._value, + yield AnonymousMethodExecutionFilter( + self.instance, self, self._value, until_position=until_position, origin_scope=origin_scope, ) @@ -83,7 +87,7 @@ class AnonymousMethodExecutionContext(BaseFunctionExecutionContext): param_names = list(self._value.get_param_names()) # set the self name param_names[0] = InstanceExecutedParamName( - self._instance, + self.instance, self._function_value, param_names[0].tree_name ) @@ -469,6 +473,9 @@ class BoundMethod(FunctionMixin, ValueWrapper): return InstanceArguments(self.instance, arguments) 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) diff --git a/jedi/plugins/stdlib.py b/jedi/plugins/stdlib.py index 4e238a13..4f1876aa 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 +from jedi.inference.value.instance import BoundMethod, InstanceArguments, \ + AnonymousMethodExecutionContext from jedi.inference.base_value import ContextualizedNode, \ NO_VALUES, ValueSet, ValueWrapper, LazyValueWrapper -from jedi.inference.value import ClassValue, ModuleValue, \ - FunctionExecutionContext +from jedi.inference.value import ClassValue, ModuleValue from jedi.inference.value.klass import ClassMixin -from jedi.inference.value.function import FunctionMixin +from jedi.inference.value.function import FunctionMixin, BaseFunctionExecutionContext from jedi.inference.value import iterable from jedi.inference.lazy_value import LazyTreeValue, LazyKnownValue, \ LazyKnownValues @@ -269,12 +269,16 @@ class SuperInstance(LazyValueWrapper): @argument_clinic('[type[, obj]], /', want_context=True) def builtins_super(types, objects, context): - if isinstance(context, FunctionExecutionContext): + if isinstance(context, BaseFunctionExecutionContext): + instance = None + if isinstance(context, AnonymousMethodExecutionContext): + instance = context.instance # TODO _arguments should be private. make this different. - if isinstance(context._arguments, InstanceArguments): + 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