From 87aa76678a6dd2b6a96b3461179e8eb7746ede64 Mon Sep 17 00:00:00 2001 From: Dave Halter Date: Tue, 9 Sep 2014 16:48:53 +0200 Subject: [PATCH] Goto should work on named params, too. --- jedi/evaluate/__init__.py | 17 ++++++++++++++++- test/test_api/test_api_classes.py | 4 ++-- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/jedi/evaluate/__init__.py b/jedi/evaluate/__init__.py index 948d085d..bc449d77 100644 --- a/jedi/evaluate/__init__.py +++ b/jedi/evaluate/__init__.py @@ -85,7 +85,7 @@ from jedi.evaluate import stdlib from jedi.evaluate import finder from jedi.evaluate import compiled from jedi.evaluate import precedence -from jedi.evaluate.helpers import FakeStatement +from jedi.evaluate.helpers import FakeStatement, deep_ast_copy class Evaluator(object): @@ -326,6 +326,21 @@ class Evaluator(object): # reference. In this case it's just a definition. So we stay on it. if len(call_path) == 1 and isinstance(call_path[0], pr.NamePart) \ and call_path[0] in [d.names[-1] for d in stmt.get_defined_names()]: + # Named params should get resolved to their param defintions. + if pr.Array.is_type(stmt.parent, pr.Array.TUPLE, pr.Array.NOARRAY) \ + and stmt.parent.previous: + call = deep_ast_copy(stmt.parent.previous) + # We have made a copy, so we're fine to change it. + call.next = None + while call.previous is not None: + call = call.previous + param_names = [] + named_param_name = stmt.get_defined_names()[0] + for typ in self.eval_call(call): + for param in typ.params: + if unicode(param.get_name()) == unicode(named_param_name): + param_names.append(param.get_name()) + return param_names return [call_path[0]] scope = stmt.get_parent_scope() diff --git a/test/test_api/test_api_classes.py b/test/test_api/test_api_classes.py index 6e211cea..1c89d9d2 100644 --- a/test/test_api/test_api_classes.py +++ b/test/test_api/test_api_classes.py @@ -211,11 +211,11 @@ class TestGotoAssignments(TestCase): def test_named_params(self): src = """\ - def foo(bar): + def foo(a=1, bar=2): pass foo(bar=1) """ bar = names(dedent(src), references=True)[-1] param = bar.goto_assignments()[0] - assert param.start_pos == (1, 9) + assert param.start_pos == (1, 13) assert param.type == 'param'