1
0
forked from VimPlug/jedi

Fixes towards better MergedArray and partial functions.

This commit is contained in:
Dave Halter
2014-11-20 13:33:05 +01:00
parent a6e1348757
commit cc465364d3
4 changed files with 20 additions and 10 deletions

View File

@@ -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'):

View File

@@ -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)

View File

@@ -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):

View File

@@ -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)