From 9663e343c2eed5a2a9b55ca3e51298443de1ea6b Mon Sep 17 00:00:00 2001 From: Dave Halter Date: Sat, 2 Sep 2017 22:42:01 +0200 Subject: [PATCH] Almost the last switch to _get_definition. --- jedi/api/__init__.py | 8 ++++++-- jedi/evaluate/__init__.py | 37 +++++++++++++++++++++---------------- 2 files changed, 27 insertions(+), 18 deletions(-) diff --git a/jedi/api/__init__.py b/jedi/api/__init__.py index 29637dc1..fe6bb631 100644 --- a/jedi/api/__init__.py +++ b/jedi/api/__init__.py @@ -31,7 +31,7 @@ from jedi.evaluate import Evaluator from jedi.evaluate import representation as er from jedi.evaluate import imports from jedi.evaluate.param import try_iter_content -from jedi.evaluate.helpers import get_module_names +from jedi.evaluate.helpers import get_module_names, evaluate_call_of_leaf from jedi.evaluate.sys_path import get_venv_path from jedi.evaluate.iterable import unpack_tuple_to_dict from jedi.evaluate.filters import TreeNameDefinition @@ -355,7 +355,11 @@ class Script(object): # Iterate tuples. unpack_tuple_to_dict(context, types, testlist) else: - try_iter_content(self._evaluator.goto_definitions(context, node)) + if node.type == 'name': + defs = self._evaluator.goto_definitions(context, node) + else: + defs = evaluate_call_of_leaf(context, node) + try_iter_content(defs) self._evaluator.reset_recursion_limitations() ana = [a for a in self._evaluator.analysis if self.path == a.path] diff --git a/jedi/evaluate/__init__.py b/jedi/evaluate/__init__.py index 0c378484..61249236 100644 --- a/jedi/evaluate/__init__.py +++ b/jedi/evaluate/__init__.py @@ -446,25 +446,30 @@ class Evaluator(object): return types def goto_definitions(self, context, name): - def_ = name.get_definition() is_simple_name = name.parent.type not in ('power', 'trailer') if is_simple_name: - if name.parent.type == 'classdef' and name.parent.name == name: - return [er.ClassContext(self, name.parent, context)] - elif name.parent.type == 'funcdef' and name.parent.name == name: - return [er.FunctionContext(self, context, name.parent)] + def_ = name._get_definition() + if def_ is not None: + type_ = def_.type + if type_ == 'classdef': + return [er.ClassContext(self, name.parent, context)] + elif type_ == 'funcdef': + return [er.FunctionContext(self, context, name.parent)] - if def_.type == 'expr_stmt' and name in def_.get_defined_names(): - return self.eval_statement(context, def_, name) - elif def_.type == 'for_stmt' and \ - name.start_pos < def_.children[1].end_pos: - container_types = self.eval_element(context, def_.children[3]) - cn = ContextualizedNode(context, def_.children[3]) - for_types = iterable.py__iter__types(self, container_types, cn) - c_node = ContextualizedName(context, name) - return finder.check_tuple_assignments(self, c_node, for_types) - elif def_.type in ('import_from', 'import_name'): - return imports.infer_import(context, name) + if type_ == 'expr_stmt': + return self.eval_statement(context, def_, name) + if type_ == 'for_stmt': + container_types = self.eval_element(context, def_.children[3]) + cn = ContextualizedNode(context, def_.children[3]) + for_types = iterable.py__iter__types(self, container_types, cn) + c_node = ContextualizedName(context, name) + return finder.check_tuple_assignments(self, c_node, for_types) + if type_ in ('import_from', 'import_name'): + return imports.infer_import(context, name) + else: + imp = tree.search_ancestor(name, 'import_from', 'import_name') + if imp is not None: + return imports.infer_import(context, name) return helpers.evaluate_call_of_leaf(context, name)