From 037a069dddd75aa44207922f27110148d89b90ce Mon Sep 17 00:00:00 2001 From: Dave Halter Date: Wed, 8 May 2019 09:30:39 +0200 Subject: [PATCH] Made TreeArguments methods a bit more understandable --- jedi/api/__init__.py | 8 +------- jedi/evaluate/arguments.py | 19 ++++++++++++------- 2 files changed, 13 insertions(+), 14 deletions(-) diff --git a/jedi/api/__init__.py b/jedi/api/__init__.py index c0142f78..00b29b7c 100644 --- a/jedi/api/__init__.py +++ b/jedi/api/__init__.py @@ -301,13 +301,7 @@ class Script(object): names = list(self._evaluator.goto(context, tree_name)) if follow_imports: - def check(name): - return name.is_import() - else: - def check(name): - return False - - names = filter_follow_imports(names, check) + names = filter_follow_imports(names, lambda name: name.is_import()) names = try_stub_to_actual_names(names, prefer_stub_to_compiled=True) defs = [classes.Definition(self._evaluator, d) for d in set(names)] diff --git a/jedi/evaluate/arguments.py b/jedi/evaluate/arguments.py index 9a701375..2642f487 100644 --- a/jedi/evaluate/arguments.py +++ b/jedi/evaluate/arguments.py @@ -8,7 +8,7 @@ from jedi.evaluate.utils import PushBackIterator from jedi.evaluate import analysis from jedi.evaluate.lazy_context import LazyKnownContext, LazyKnownContexts, \ LazyTreeContext, get_merged_lazy_context -from jedi.evaluate.names import ParamName +from jedi.evaluate.names import ParamName, TreeNameDefinition from jedi.evaluate.base_context import NO_CONTEXTS, ContextSet, ContextualizedNode from jedi.evaluate.context import iterable from jedi.evaluate.param import get_executed_params_and_issues, ExecutedParam @@ -244,7 +244,7 @@ class TreeArguments(AbstractArguments): for named_arg in named_args: yield named_arg - def as_tree_tuple_objects(self): + def _as_tree_tuple_objects(self): for star_count, argument in unpack_arglist(self.argument_node): if argument.type == 'argument': argument, default = argument.children[::2] @@ -252,6 +252,14 @@ class TreeArguments(AbstractArguments): default = None yield argument, default, star_count + def iter_calling_names_with_star(self): + for name, default, star_count in self._as_tree_tuple_objects(): + # TODO this function is a bit strange. probably refactor? + if not star_count or not isinstance(name, tree.Name): + continue + + yield TreeNameDefinition(self.context, name) + def __repr__(self): return '<%s: %s>' % (self.__class__.__name__, self.argument_node) @@ -265,11 +273,8 @@ class TreeArguments(AbstractArguments): break old_arguments_list.append(arguments) - for name, default, star_count in reversed(list(arguments.as_tree_tuple_objects())): - if not star_count or not isinstance(name, tree.Name): - continue - - names = self._evaluator.goto(arguments.context, name) + for calling_name in reversed(list(arguments.iter_calling_names_with_star())): + names = calling_name.goto() if len(names) != 1: break if not isinstance(names[0], ParamName):