1
0
forked from VimPlug/jedi

Prepare instance for AnonymousMethodExecutionContext

This commit is contained in:
Dave Halter
2019-09-03 14:19:56 +02:00
parent efa51a1d70
commit 274f8dbb02
3 changed files with 42 additions and 9 deletions

View File

@@ -159,8 +159,11 @@ class _FunctionExecutionFilter(ParserTreeFilter):
def _convert_names(self, names): def _convert_names(self, names):
for name in names: for name in names:
param = search_ancestor(name, 'param') param = search_ancestor(name, 'param')
# Here we don't need to check if the param is a default/annotation,
# because those are not definitions and never make it to this
# point.
if param: if param:
yield self._convert_param(name) yield self._convert_param(param, name)
else: else:
yield TreeNameDefinition(self.parent_context, name) yield TreeNameDefinition(self.parent_context, name)
@@ -170,12 +173,12 @@ class FunctionExecutionFilter(_FunctionExecutionFilter):
self._arguments = kwargs.pop('arguments') # Python 2 self._arguments = kwargs.pop('arguments') # Python 2
super(FunctionExecutionFilter, self).__init__(*args, **kwargs) super(FunctionExecutionFilter, self).__init__(*args, **kwargs)
def _convert_param(self, name): def _convert_param(self, param, name):
return ParamName(self._function_value, name, self._arguments) return ParamName(self._function_value, name, self._arguments)
class AnonymousFunctionExecutionFilter(_FunctionExecutionFilter): class AnonymousFunctionExecutionFilter(_FunctionExecutionFilter):
def _convert_param(self, name): def _convert_param(self, param, name):
return SimpleParamName(self._function_value, name) return SimpleParamName(self._function_value, name)

View File

@@ -8,7 +8,6 @@ from jedi.inference import recursion
from jedi.inference import docstrings from jedi.inference import docstrings
from jedi.inference import flow_analysis from jedi.inference import flow_analysis
from jedi.inference.signature import TreeSignature from jedi.inference.signature import TreeSignature
from jedi.inference.arguments import AnonymousArguments
from jedi.inference.filters import ParserTreeFilter, FunctionExecutionFilter, \ from jedi.inference.filters import ParserTreeFilter, FunctionExecutionFilter, \
AnonymousFunctionExecutionFilter AnonymousFunctionExecutionFilter
from jedi.inference.names import ValueName, AbstractNameDefinition, \ from jedi.inference.names import ValueName, AbstractNameDefinition, \

View File

@@ -5,7 +5,7 @@ from jedi import settings
from jedi.inference import compiled from jedi.inference import compiled
from jedi.inference.compiled.value import CompiledObjectFilter from jedi.inference.compiled.value import CompiledObjectFilter
from jedi.inference.helpers import values_from_qualified_names from jedi.inference.helpers import values_from_qualified_names
from jedi.inference.filters import AbstractFilter from jedi.inference.filters import AbstractFilter, AnonymousFunctionExecutionFilter
from jedi.inference.names import ValueName, TreeNameDefinition, ParamName from jedi.inference.names import ValueName, TreeNameDefinition, ParamName
from jedi.inference.base_value import Value, NO_VALUES, ValueSet, \ from jedi.inference.base_value import Value, NO_VALUES, ValueSet, \
iterator_to_value_set, ValueWrapper iterator_to_value_set, ValueWrapper
@@ -14,7 +14,8 @@ from jedi.inference.cache import inference_state_method_cache
from jedi.inference.arguments import AnonymousArguments, \ 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
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
@@ -22,9 +23,9 @@ from jedi.parser_utils import get_parent_scope
class InstanceExecutedParamName(ParamName): class InstanceExecutedParamName(ParamName):
def __init__(self, instance, function_value, tree_param): def __init__(self, instance, function_value, tree_name):
super(InstanceExecutedParamName, self).__init__( super(InstanceExecutedParamName, self).__init__(
function_value, tree_param.name, arguments=None) function_value, tree_name, arguments=None)
self._instance = instance self._instance = instance
def infer(self): def infer(self):
@@ -45,7 +46,7 @@ class AnonymousInstanceArguments(AnonymousArguments):
return [], [] return [], []
self_param = InstanceExecutedParamName( self_param = InstanceExecutedParamName(
self._instance, function_value, tree_params[0]) self._instance, function_value, tree_params[0].name)
if len(tree_params) == 1: if len(tree_params) == 1:
# If the only param is self, we don't need to try to find # If the only param is self, we don't need to try to find
# executions of this function, we have all the params already. # executions of this function, we have all the params already.
@@ -59,6 +60,36 @@ class AnonymousInstanceArguments(AnonymousArguments):
return executed_param_names, [] return executed_param_names, []
class AnonymousMethodExecutionFilter(AnonymousFunctionExecutionFilter):
def __init__(self, instance, *args, **kwargs):
super(AnonymousMethodExecutionFilter, self).__init__(*args, **kwargs)
self._instance = instance
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)
class AnonymousMethodExecutionContext(BaseFunctionExecutionContext):
def get_filters(self, until_position=None, origin_scope=None):
yield AnonymousFunctionExecutionFilter(
self, self._value,
until_position=until_position,
origin_scope=origin_scope,
)
def get_param_names(self):
param_names = list(self._value.get_param_names())
# set the self name
param_names[0] = InstanceExecutedParamName(
self._instance,
self._function_value,
param_names[0].tree_name
)
return param_names
class AbstractInstanceValue(Value): class AbstractInstanceValue(Value):
api_type = u'instance' api_type = u'instance'