diff --git a/jedi/evaluate/context/instance.py b/jedi/evaluate/context/instance.py index 51d935ea..49ad3e9f 100644 --- a/jedi/evaluate/context/instance.py +++ b/jedi/evaluate/context/instance.py @@ -15,23 +15,27 @@ from jedi.evaluate.context import iterable from jedi.parser_utils import get_parent_scope - -class InstanceFunctionExecution(FunctionExecutionContext): - def __init__(self, instance, parent_context, function_context, var_args): +class BaseInstanceFunctionExecution(FunctionExecutionContext): + def __init__(self, instance, *args, **kwargs): self.instance = instance + super(BaseInstanceFunctionExecution, self).__init__( + instance.evaluator, *args, **kwargs) + + +class InstanceFunctionExecution(BaseInstanceFunctionExecution): + def __init__(self, instance, parent_context, function_context, var_args): var_args = InstanceVarArgs(self, var_args) super(InstanceFunctionExecution, self).__init__( - instance.evaluator, parent_context, function_context, var_args) + instance, parent_context, function_context, var_args) -class AnonymousInstanceFunctionExecution(FunctionExecutionContext): +class AnonymousInstanceFunctionExecution(BaseInstanceFunctionExecution): function_execution_filter = filters.AnonymousInstanceFunctionExecutionFilter def __init__(self, instance, parent_context, function_context, var_args): - self.instance = instance super(AnonymousInstanceFunctionExecution, self).__init__( - instance.evaluator, parent_context, function_context, var_args) + instance, parent_context, function_context, var_args) class AbstractInstanceContext(Context): diff --git a/jedi/evaluate/pep0484.py b/jedi/evaluate/pep0484.py index 10edcb8e..b0bc0413 100644 --- a/jedi/evaluate/pep0484.py +++ b/jedi/evaluate/pep0484.py @@ -140,11 +140,19 @@ def infer_param(execution_context, param): # If the number of parameters doesn't match length of type comment, # ignore first parameter (assume it's self). if len(params_comments) != len(all_params): + debug.warning( + "Comments length != Params length %s %s", + params_comments, all_params + ) + from jedi.evaluate.context.instance import BaseInstanceFunctionExecution + if isinstance(execution_context, BaseInstanceFunctionExecution): if index == 0: # Assume it's self, which is already handled return NO_CONTEXTS - else: - index -= 1 + index -= 1 + if index >= len(params_comments): + return NO_CONTEXTS + param_comment = params_comments[index] # Construct annotation from type comment annotation = tree.String(repr(param_comment), node.start_pos) diff --git a/test/completion/pep0484_comments.py b/test/completion/pep0484_comments.py index 816cc736..9f0661ec 100644 --- a/test/completion/pep0484_comments.py +++ b/test/completion/pep0484_comments.py @@ -178,3 +178,9 @@ def x(a, b): # type: (1) -> a #? a +def x(a, b, c): + # type: (str) -> a + #? + b + #? + c