From 609f59ce4152a1cfec4361f72a316d1a177728c4 Mon Sep 17 00:00:00 2001 From: Dave Halter Date: Thu, 18 Jan 2018 09:54:19 +0100 Subject: [PATCH] Fix issues with random tuples in TreeArgument. Thanks @micbou for noticing it. https://github.com/davidhalter/jedi/commit/b92c7d3351a34052237df4a292ec81ef97647e7f --- jedi/evaluate/arguments.py | 43 ++++++++++++++++++------------------ jedi/evaluate/dynamic.py | 2 +- jedi/evaluate/syntax_tree.py | 2 +- 3 files changed, 23 insertions(+), 24 deletions(-) diff --git a/jedi/evaluate/arguments.py b/jedi/evaluate/arguments.py index 55f1f837..48c0d5e6 100644 --- a/jedi/evaluate/arguments.py +++ b/jedi/evaluate/arguments.py @@ -98,29 +98,28 @@ class TreeArguments(AbstractArguments): self.trailer = trailer # Can be None, e.g. in a class definition. def _split(self): - if isinstance(self.argument_node, (tuple, list)): - for el in self.argument_node: - yield 0, el - else: - if not (self.argument_node.type == 'arglist' or ( - # in python 3.5 **arg is an argument, not arglist - (self.argument_node.type == 'argument') and - self.argument_node.children[0] in ('*', '**'))): - yield 0, self.argument_node - return + if self.argument_node is None: + return - iterator = iter(self.argument_node.children) - for child in iterator: - if child == ',': - continue - elif child in ('*', '**'): - yield len(child.value), next(iterator) - elif child.type == 'argument' and \ - child.children[0] in ('*', '**'): - assert len(child.children) == 2 - yield len(child.children[0].value), child.children[1] - else: - yield 0, child + if not (self.argument_node.type == 'arglist' or ( + # in python 3.5 **arg is an argument, not arglist + (self.argument_node.type == 'argument') and + self.argument_node.children[0] in ('*', '**'))): + yield 0, self.argument_node + return + + iterator = iter(self.argument_node.children) + for child in iterator: + if child == ',': + continue + elif child in ('*', '**'): + yield len(child.value), next(iterator) + elif child.type == 'argument' and \ + child.children[0] in ('*', '**'): + assert len(child.children) == 2 + yield len(child.children[0].value), child.children[1] + else: + yield 0, child def unpack(self, funcdef=None): named_args = [] diff --git a/jedi/evaluate/dynamic.py b/jedi/evaluate/dynamic.py index 7d05000d..ff38fc80 100644 --- a/jedi/evaluate/dynamic.py +++ b/jedi/evaluate/dynamic.py @@ -156,7 +156,7 @@ def _check_name_for_execution(evaluator, context, compare_node, name, trailer): def create_func_excs(): arglist = trailer.children[1] if arglist == ')': - arglist = () + arglist = None args = TreeArguments(evaluator, context, arglist, trailer) if value_node.type == 'funcdef': yield value.get_function_execution(args) diff --git a/jedi/evaluate/syntax_tree.py b/jedi/evaluate/syntax_tree.py index 123617da..984434fc 100644 --- a/jedi/evaluate/syntax_tree.py +++ b/jedi/evaluate/syntax_tree.py @@ -119,7 +119,7 @@ def eval_node(context, element): def eval_trailer(context, base_contexts, trailer): trailer_op, node = trailer.children[:2] if node == ')': # `arglist` is optional. - node = () + node = None if trailer_op == '[': trailer_op, node, _ = trailer.children