From a93dff2673f352f9bc243159aee241a2531ebbf6 Mon Sep 17 00:00:00 2001 From: Dave Halter Date: Fri, 26 Oct 2018 00:17:28 +0200 Subject: [PATCH] Fix star_expr unpacking issues. For now star_expr is not supported --- jedi/evaluate/base_context.py | 14 +++++++++++++- jedi/evaluate/syntax_tree.py | 3 +++ test/completion/arrays.py | 8 +++++--- 3 files changed, 21 insertions(+), 4 deletions(-) diff --git a/jedi/evaluate/base_context.py b/jedi/evaluate/base_context.py index 9bd751c8..cec5182b 100644 --- a/jedi/evaluate/base_context.py +++ b/jedi/evaluate/base_context.py @@ -247,18 +247,30 @@ class ContextualizedName(ContextualizedNode): x, (y, z) = 2, '' would result in ``[(1, xyz_node), (0, yz_node)]``. + + When searching for b in the case ``a, *b, c = [...]`` it will return:: + + [(slice(1, -1), abc_node)] """ indexes = [] + is_star_expr = False node = self.node.parent compare = self.node while node is not None: if node.type in ('testlist', 'testlist_comp', 'testlist_star_expr', 'exprlist'): for i, child in enumerate(node.children): if child == compare: - indexes.insert(0, (int(i / 2), node)) + index = int(i / 2) + if is_star_expr: + from_end = int((len(node.children) - i) / 2) + index = slice(index, -from_end) + indexes.insert(0, (index, node)) break else: raise LookupError("Couldn't find the assignment.") + is_star_expr = False + elif node.type == 'star_expr': + is_star_expr = True elif isinstance(node, (ExprStmt, CompFor)): break diff --git a/jedi/evaluate/syntax_tree.py b/jedi/evaluate/syntax_tree.py index 99f71202..98f60635 100644 --- a/jedi/evaluate/syntax_tree.py +++ b/jedi/evaluate/syntax_tree.py @@ -636,6 +636,9 @@ def check_tuple_assignments(evaluator, contextualized_name, context_set): for index, node in contextualized_name.assignment_indexes(): cn = ContextualizedNode(contextualized_name.context, node) iterated = context_set.iterate(cn) + if isinstance(index, slice): + # For no star unpacking is not possible. + return NO_CONTEXTS for _ in range(index + 1): try: lazy_context = next(iterated) diff --git a/test/completion/arrays.py b/test/completion/arrays.py index 3b4f3725..a103942a 100644 --- a/test/completion/arrays.py +++ b/test/completion/arrays.py @@ -448,7 +448,7 @@ tuple({1})[0] a, *b, c = [1, 'b', list, dict] #? int() a -#? str() +#? b #? list c @@ -457,12 +457,14 @@ c a, *b, *c = [1, 'd', list] #? int() a -#? str() +#? b -#? list +#? c lc = [x for a, *x in [(1, '', 1.0)]] #? lc[0][0] +#? +lc[0][1]