diff --git a/jedi/api/classes.py b/jedi/api/classes.py index a38b9f6e..f409e040 100644 --- a/jedi/api/classes.py +++ b/jedi/api/classes.py @@ -9,7 +9,6 @@ import re from jedi._compatibility import u from jedi import settings from jedi import common -from jedi.parser import tree from jedi.parser.utils import load_parser from jedi.cache import memoize_method from jedi.evaluate import representation as er @@ -324,8 +323,14 @@ class BaseDefinition(object): if self._name.tree_name is None: return self - defs = self._evaluator.goto(self._name.parent_context, self._name.tree_name) - return [Definition(self._evaluator, d) for d in defs] + names = self._evaluator.goto(self._name.parent_context, self._name.tree_name) + return [Definition(self._evaluator, n) for n in names] + + def _goto_definitions(self): + # TODO make this function public. + print(self._name.infer(), self._name.parent_context) + x = self._name.parent_context + return [Definition(self._evaluator, d.name) for d in self._name.infer()] @property @memoize_method diff --git a/jedi/evaluate/__init__.py b/jedi/evaluate/__init__.py index f7641511..30510e8c 100644 --- a/jedi/evaluate/__init__.py +++ b/jedi/evaluate/__init__.py @@ -77,7 +77,7 @@ from jedi.evaluate import compiled from jedi.evaluate import precedence from jedi.evaluate import param from jedi.evaluate import helpers -from jedi.evaluate.filters import TreeNameDefinition +from jedi.evaluate.filters import TreeNameDefinition, ParamName from jedi.evaluate.instance import AnonymousInstance, BoundMethod @@ -483,6 +483,8 @@ class Evaluator(object): # Only take the parent, because if it's more complicated than just # a name it's something you can "goto" again. return [TreeNameDefinition(context, name)] + elif par.type == 'param' and par.name: + return [ParamName(context, name)] elif isinstance(par, (tree.Param, tree.Function, tree.Class)) and par.name is name: return [TreeNameDefinition(context, name)] elif isinstance(stmt, tree.Import): diff --git a/test/completion/goto.py b/test/completion/goto.py index adff012d..33ca4103 100644 --- a/test/completion/goto.py +++ b/test/completion/goto.py @@ -184,7 +184,7 @@ param = ClassDef def ab1(param): pass #! 9 ['param param'] def ab2(param): pass -#! 11 ['param = ClassDef'] +#! 11 ['param a=param'] def ab3(a=param): pass ab1(ClassDef);ab2(ClassDef);ab3(ClassDef) diff --git a/test/test_api/test_api.py b/test/test_api/test_api.py index a106f0f3..6b66dcc8 100644 --- a/test/test_api/test_api.py +++ b/test/test_api/test_api.py @@ -177,3 +177,20 @@ def test_goto_assignments_follow_imports(): definition, = api.Script(code).goto_assignments(follow_imports=True) assert 'inspect.py' in definition.module_path assert definition.start_pos > (1, 0) + + code = '''def param(p): pass\nparam(1)''' + start_pos = 1, len('def param(') + + script = api.Script(code, *start_pos) + definition, = script.goto_assignments(follow_imports=True) + assert definition.start_pos == start_pos + assert definition.name == 'p' + result, = definition.goto_assignments() + assert result.name == 'p' + result, = definition._goto_definitions() + assert result.name == 'int' + result, = result._goto_definitions() + assert result.name == 'int' + + definition, = script.goto_assignments() + assert definition.start_pos == start_pos