diff --git a/jedi/common.py b/jedi/common.py index cf45dc88..fc3151af 100644 --- a/jedi/common.py +++ b/jedi/common.py @@ -157,4 +157,4 @@ def splitlines(string): def unite(iterable): """Turns a two dimensional array into a one dimensional.""" - return list(chain.from_iterable(iterable)) + return set(chain.from_iterable(iterable)) diff --git a/jedi/evaluate/__init__.py b/jedi/evaluate/__init__.py index bf8fbe3f..6c65ddf8 100644 --- a/jedi/evaluate/__init__.py +++ b/jedi/evaluate/__init__.py @@ -187,7 +187,7 @@ class Evaluator(object): if isinstance(element, iterable.AlreadyEvaluated): return set(element) elif isinstance(element, iterable.MergedNodes): - return set(iterable.unite(self.eval_element(e) for e in element)) + return iterable.unite(self.eval_element(e) for e in element) if_stmt = element.get_parent_until((tree.IfStmt, tree.ForStmt, tree.IsScope)) predefined_if_name_dict = self.predefined_if_name_dict_dict.get(if_stmt) diff --git a/jedi/evaluate/helpers.py b/jedi/evaluate/helpers.py index 91958659..fd33e5c1 100644 --- a/jedi/evaluate/helpers.py +++ b/jedi/evaluate/helpers.py @@ -2,7 +2,6 @@ import copy from itertools import chain from jedi.parser import tree -from jedi import common def deep_ast_copy(obj, parent=None, new_elements=None): @@ -121,7 +120,7 @@ def get_names_of_node(node): else: return [] else: - return common.unite(get_names_of_node(c) for c in children) + return list(chain.from_iterable(get_names_of_node(c) for c in children)) def get_module_names(module, all_scopes): diff --git a/jedi/evaluate/iterable.py b/jedi/evaluate/iterable.py index fe419fdf..c31a4897 100644 --- a/jedi/evaluate/iterable.py +++ b/jedi/evaluate/iterable.py @@ -265,7 +265,7 @@ class Array(IterableWrapper, ArrayMixin): @memoize_default() def values(self): - result = set(unite(self._evaluator.eval_element(v) for v in self._values())) + result = unite(self._evaluator.eval_element(v) for v in self._values()) result |= check_array_additions(self._evaluator, self) return result @@ -400,7 +400,7 @@ class FakeDict(_FakeArray): self._dct = dct def get_exact_index_types(self, index): - return set(unite(self._evaluator.eval_element(v) for v in self._dct[index])) + return unite(self._evaluator.eval_element(v) for v in self._dct[index]) def _items(self): return self._dct.items() @@ -415,7 +415,7 @@ class MergedArray(_FakeArray): raise IndexError def values(self): - return set(unite((a.values() for a in self._arrays))) + return unite((a.values() for a in self._arrays)) def __iter__(self): for array in self._arrays: @@ -562,10 +562,10 @@ def _check_array_additions(evaluator, compare_array, module, is_list): params = params[1:] if add_name in ['append', 'add', 'insert']: for key, nodes in params: - result |= set(unite(evaluator.eval_element(node) for node in nodes)) + result |= unite(evaluator.eval_element(node) for node in nodes) elif add_name in ['extend', 'update']: for key, nodes in params: - result |= set(unite(get_iterator_types(evaluator, node) for node in nodes)) + result |= unite(get_iterator_types(evaluator, node) for node in nodes) return result from jedi.evaluate import representation as er, param diff --git a/jedi/evaluate/stdlib.py b/jedi/evaluate/stdlib.py index 5988ca23..c5de9ea7 100644 --- a/jedi/evaluate/stdlib.py +++ b/jedi/evaluate/stdlib.py @@ -10,6 +10,7 @@ import collections import re from jedi._compatibility import unicode +from jedi.common import unite from jedi.evaluate import compiled from jedi.evaluate import representation as er from jedi.evaluate import iterable @@ -49,9 +50,9 @@ def _follow_param(evaluator, arguments, index): try: key, values = list(arguments.unpack())[index] except IndexError: - return [] + return set() else: - return iterable.unite(evaluator.eval_element(v) for v in values) + return unite(evaluator.eval_element(v) for v in values) def argument_clinic(string, want_obj=False, want_scope=False, want_arguments=False): @@ -152,8 +153,7 @@ def builtins_super(evaluator, types, objects, scope): def get_iterable_content(evaluator, arguments, argument_index): nodes = list(arguments.unpack())[argument_index][1] - return set(iterable.unite(iterable.get_iterator_types(evaluator, node) - for node in nodes)) + return unite(iterable.get_iterator_types(evaluator, node) for node in nodes) @argument_clinic('sequence, /', want_obj=True, want_arguments=True) @@ -216,8 +216,9 @@ def collections_namedtuple(evaluator, obj, arguments): return set() # Process arguments - name = _follow_param(evaluator, arguments, 0)[0].obj - _fields = _follow_param(evaluator, arguments, 1)[0] + # TODO here we only use one of the types, we should use all. + name = list(_follow_param(evaluator, arguments, 0))[0].obj + _fields = list(_follow_param(evaluator, arguments, 1))[0] if isinstance(_fields, compiled.CompiledObject): fields = _fields.obj.replace(',', ' ').split() elif isinstance(_fields, iterable.Array):