forked from VimPlug/jedi
Fixes towards better MergedArray and partial functions.
This commit is contained in:
@@ -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'):
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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):
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user