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):
|
def eval_element(self, element):
|
||||||
if isinstance(element, iterable.AlreadyEvaluated):
|
if isinstance(element, iterable.AlreadyEvaluated):
|
||||||
return element
|
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)
|
debug.dbg('eval_element %s@%s', element, element.start_pos)
|
||||||
if isinstance(element, (pr.Name, pr.Literal)) or pr.is_node(element, 'atom'):
|
if isinstance(element, (pr.Name, pr.Literal)) or pr.is_node(element, 'atom'):
|
||||||
|
|||||||
@@ -5,5 +5,4 @@ class partial():
|
|||||||
self.__keywords = keywords
|
self.__keywords = keywords
|
||||||
|
|
||||||
def __call__(self, *args, **kwargs):
|
def __call__(self, *args, **kwargs):
|
||||||
# I know this doesn't work in Python, but in Jedi it does ;-)
|
return self.__func(*(self.__args + args), **dict(self.__keywords, **kwargs))
|
||||||
return self.__func(*self.__args, *args, **self.__keywords, **kwargs)
|
|
||||||
|
|||||||
@@ -35,6 +35,11 @@ from jedi.cache import underscore_memoization
|
|||||||
from jedi.evaluate import analysis
|
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):
|
class IterableWrapper(pr.Base):
|
||||||
def is_class(self):
|
def is_class(self):
|
||||||
return False
|
return False
|
||||||
@@ -212,8 +217,7 @@ class Array(IterableWrapper):
|
|||||||
|
|
||||||
@memoize_default(NO_DEFAULT)
|
@memoize_default(NO_DEFAULT)
|
||||||
def values(self):
|
def values(self):
|
||||||
result = list(chain.from_iterable(self._evaluator.eval_element(v)
|
result = unite(self._evaluator.eval_element(v) for v in self._values())
|
||||||
for v in self._values()))
|
|
||||||
# TODO reenable
|
# TODO reenable
|
||||||
#result += check_array_additions(self._evaluator, self)
|
#result += check_array_additions(self._evaluator, self)
|
||||||
return result
|
return result
|
||||||
@@ -260,6 +264,7 @@ class Array(IterableWrapper):
|
|||||||
return getattr(self._atom, name)
|
return getattr(self._atom, name)
|
||||||
|
|
||||||
def _values(self):
|
def _values(self):
|
||||||
|
"""Returns a list of a list of node."""
|
||||||
if self.type == pr.Array.DICT:
|
if self.type == pr.Array.DICT:
|
||||||
return list(chain.from_iterable(v for k, v in self._items()))
|
return list(chain.from_iterable(v for k, v in self._items()))
|
||||||
else:
|
else:
|
||||||
@@ -330,6 +335,10 @@ class AlreadyEvaluated(frozenset):
|
|||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class MergedNodes(frozenset):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
class FakeDict(_FakeArray):
|
class FakeDict(_FakeArray):
|
||||||
def __init__(self, evaluator, dct):
|
def __init__(self, evaluator, dct):
|
||||||
super(FakeDict, self).__init__(evaluator, dct, pr.Array.DICT)
|
super(FakeDict, self).__init__(evaluator, dct, pr.Array.DICT)
|
||||||
@@ -343,9 +352,9 @@ class FakeDict(_FakeArray):
|
|||||||
return self._dct.items()
|
return self._dct.items()
|
||||||
|
|
||||||
|
|
||||||
class MergedArray(Array):
|
class MergedArray(_FakeArray):
|
||||||
def __init__(self, evaluator, arrays):
|
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
|
self._arrays = arrays
|
||||||
|
|
||||||
def get_index_types(self, evaluator, mixed_index):
|
def get_index_types(self, evaluator, mixed_index):
|
||||||
|
|||||||
@@ -246,15 +246,15 @@ def get_params(evaluator, func, var_args):
|
|||||||
if param.stars == 1:
|
if param.stars == 1:
|
||||||
# *args param
|
# *args param
|
||||||
array_type = pr.Array.TUPLE
|
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:
|
for key, va_values in var_arg_iterator:
|
||||||
# Iterate until a key argument is found.
|
# Iterate until a key argument is found.
|
||||||
if key:
|
if key:
|
||||||
var_arg_iterator.push_back((key, va_values))
|
var_arg_iterator.push_back((key, va_values))
|
||||||
break
|
break
|
||||||
lst_values.append(va_values)
|
lst_values.append(iterable.MergedNodes(va_values))
|
||||||
if lst_values:
|
if lst_values:
|
||||||
values = [iterable.FakeSequence(evaluator, tuple(lst_values),
|
values = [iterable.FakeSequence(evaluator, lst_values,
|
||||||
pr.Array.TUPLE)]
|
pr.Array.TUPLE)]
|
||||||
#values = [helpers.stmts_to_stmt(v) for v in lst_values]
|
#values = [helpers.stmts_to_stmt(v) for v in lst_values]
|
||||||
elif param.stars == 2:
|
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
|
start_pos = 0, 0
|
||||||
|
|
||||||
# create an Array (-> needed for *args/**kwargs tuples/dicts)
|
# 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?!
|
# TODO change?!
|
||||||
"""
|
"""
|
||||||
arr = pr.Array(helpers.FakeSubModule, start_pos, array_type, parent)
|
arr = pr.Array(helpers.FakeSubModule, start_pos, array_type, parent)
|
||||||
|
|||||||
Reference in New Issue
Block a user