diff --git a/jedi/evaluate/docstrings.py b/jedi/evaluate/docstrings.py index 4b98fa73..1b7db0da 100644 --- a/jedi/evaluate/docstrings.py +++ b/jedi/evaluate/docstrings.py @@ -23,10 +23,8 @@ from jedi.common import unite from jedi.evaluate import context from jedi.evaluate.cache import memoize_default from jedi.parser.python import parse -from jedi.parser.python.tree import search_ancestor from jedi.common import indent_block from jedi.evaluate.iterable import SequenceLiteralContext, FakeSequence -from jedi.parser_utils import clean_scope_docstring DOCSTRING_PARAM_PATTERNS = [ @@ -186,22 +184,25 @@ def _execute_array_values(evaluator, array): @memoize_default() -def infer_param(module_context, param): +def infer_param(execution_context, param): + from jedi.evaluate.instance import InstanceFunctionExecution + def eval_docstring(docstring): return set( p for param_str in _search_param_in_docstr(docstring, param.name.value) for p in _evaluate_for_statement_string(module_context, param_str) ) + module_context = execution_context.get_root_context() func = param.get_parent_function() if func.type == 'lambdef': return set() - types = eval_docstring(clean_scope_docstring(func)) - if func.name.value == '__init__': - cls = search_ancestor(func, 'classdef') - if cls is not None: - types |= eval_docstring(clean_scope_docstring(cls)) + types = eval_docstring(execution_context.py__doc__()) + if isinstance(execution_context, InstanceFunctionExecution) and \ + execution_context.function_context.name.string_name == '__init__': + class_context = execution_context.instance.class_context + types |= eval_docstring(class_context.py__doc__()) return types diff --git a/jedi/evaluate/param.py b/jedi/evaluate/param.py index ef1bcf79..a2c09b5f 100644 --- a/jedi/evaluate/param.py +++ b/jedi/evaluate/param.py @@ -215,9 +215,8 @@ class ExecutedParam(object): self.string_name = param_node.name.value def infer(self): - root_context = self._execution_context.get_root_context() - pep0484_hints = pep0484.infer_param(root_context, self._param_node) - doc_params = docstrings.infer_param(root_context, self._param_node) + pep0484_hints = pep0484.infer_param(self._execution_context, self._param_node) + doc_params = docstrings.infer_param(self._execution_context, self._param_node) if pep0484_hints or doc_params: return list(set(pep0484_hints) | set(doc_params)) diff --git a/jedi/evaluate/pep0484.py b/jedi/evaluate/pep0484.py index f44e88b3..be784007 100644 --- a/jedi/evaluate/pep0484.py +++ b/jedi/evaluate/pep0484.py @@ -80,9 +80,10 @@ def _fix_forward_reference(context, node): @memoize_default() -def infer_param(context, param): +def infer_param(execution_context, param): annotation = param.annotation - return _evaluate_for_annotation(context, annotation) + module_context = execution_context.get_root_context() + return _evaluate_for_annotation(module_context, annotation) def py__annotations__(funcdef):