From cc465364d39140eef183b651d3b6edce1ec6e227 Mon Sep 17 00:00:00 2001 From: Dave Halter Date: Thu, 20 Nov 2014 13:33:05 +0100 Subject: [PATCH] Fixes towards better MergedArray and partial functions. --- jedi/evaluate/__init__.py | 2 ++ jedi/evaluate/compiled/fake/_functools.pym | 3 +-- jedi/evaluate/iterable.py | 17 +++++++++++++---- jedi/evaluate/param.py | 8 ++++---- 4 files changed, 20 insertions(+), 10 deletions(-) diff --git a/jedi/evaluate/__init__.py b/jedi/evaluate/__init__.py index ea75bbbe..07e7eb3b 100644 --- a/jedi/evaluate/__init__.py +++ b/jedi/evaluate/__init__.py @@ -168,6 +168,8 @@ class Evaluator(object): def eval_element(self, element): if isinstance(element, iterable.AlreadyEvaluated): return element + elif isinstance(element, iterable.MergedNodes): + return iterable.unite(self.eval_element(e) for e in element) debug.dbg('eval_element %s@%s', element, element.start_pos) if isinstance(element, (pr.Name, pr.Literal)) or pr.is_node(element, 'atom'): diff --git a/jedi/evaluate/compiled/fake/_functools.pym b/jedi/evaluate/compiled/fake/_functools.pym index 3879d406..a4b1ebb1 100644 --- a/jedi/evaluate/compiled/fake/_functools.pym +++ b/jedi/evaluate/compiled/fake/_functools.pym @@ -5,5 +5,4 @@ class partial(): self.__keywords = keywords def __call__(self, *args, **kwargs): - # I know this doesn't work in Python, but in Jedi it does ;-) - return self.__func(*self.__args, *args, **self.__keywords, **kwargs) + return self.__func(*(self.__args + args), **dict(self.__keywords, **kwargs)) diff --git a/jedi/evaluate/iterable.py b/jedi/evaluate/iterable.py index f7218531..8cae1e57 100644 --- a/jedi/evaluate/iterable.py +++ b/jedi/evaluate/iterable.py @@ -35,6 +35,11 @@ from jedi.cache import underscore_memoization from jedi.evaluate import analysis +def unite(iterable): + """Turns a two dimensional array into a one dimensional.""" + return list(chain.from_iterable(iterable)) + + class IterableWrapper(pr.Base): def is_class(self): return False @@ -212,8 +217,7 @@ class Array(IterableWrapper): @memoize_default(NO_DEFAULT) def values(self): - result = list(chain.from_iterable(self._evaluator.eval_element(v) - for v in self._values())) + result = unite(self._evaluator.eval_element(v) for v in self._values()) # TODO reenable #result += check_array_additions(self._evaluator, self) return result @@ -260,6 +264,7 @@ class Array(IterableWrapper): return getattr(self._atom, name) def _values(self): + """Returns a list of a list of node.""" if self.type == pr.Array.DICT: return list(chain.from_iterable(v for k, v in self._items())) else: @@ -330,6 +335,10 @@ class AlreadyEvaluated(frozenset): pass +class MergedNodes(frozenset): + pass + + class FakeDict(_FakeArray): def __init__(self, evaluator, dct): super(FakeDict, self).__init__(evaluator, dct, pr.Array.DICT) @@ -343,9 +352,9 @@ class FakeDict(_FakeArray): return self._dct.items() -class MergedArray(Array): +class MergedArray(_FakeArray): def __init__(self, evaluator, arrays): - super(MergedArray, self).__init__(evaluator, arrays[-1]._atom) + super(MergedArray, self).__init__(evaluator, arrays, arrays[-1].type) self._arrays = arrays def get_index_types(self, evaluator, mixed_index): diff --git a/jedi/evaluate/param.py b/jedi/evaluate/param.py index 4a03b7c8..9a1ff3f4 100644 --- a/jedi/evaluate/param.py +++ b/jedi/evaluate/param.py @@ -246,15 +246,15 @@ def get_params(evaluator, func, var_args): if param.stars == 1: # *args param array_type = pr.Array.TUPLE - lst_values = [va_values] if va_values else [] + lst_values = [iterable.MergedNodes(va_values)] if va_values else [] for key, va_values in var_arg_iterator: # Iterate until a key argument is found. if key: var_arg_iterator.push_back((key, va_values)) break - lst_values.append(va_values) + lst_values.append(iterable.MergedNodes(va_values)) if lst_values: - values = [iterable.FakeSequence(evaluator, tuple(lst_values), + values = [iterable.FakeSequence(evaluator, lst_values, pr.Array.TUPLE)] #values = [helpers.stmts_to_stmt(v) for v in lst_values] elif param.stars == 2: @@ -448,7 +448,7 @@ def _gen_param_name_copy(evaluator, func, var_args, param, keys=(), values=(), a start_pos = 0, 0 # create an Array (-> needed for *args/**kwargs tuples/dicts) - arr = iterable.FakeSequence(evaluator, tuple(values), array_type) + arr = iterable.FakeSequence(evaluator, values, array_type) # TODO change?! """ arr = pr.Array(helpers.FakeSubModule, start_pos, array_type, parent)