forked from VimPlug/jedi
More dynamic *args
This commit is contained in:
@@ -238,13 +238,17 @@ class Array(use_metaclass(CachedMetaClass, IterableWrapper)):
|
|||||||
return "<e%s of %s>" % (type(self).__name__, self._array_node)
|
return "<e%s of %s>" % (type(self).__name__, self._array_node)
|
||||||
|
|
||||||
|
|
||||||
class FakeArray(Array):
|
class FakeSequence(Array):
|
||||||
def __init__(self, evaluator, values, type):
|
def __init__(self, evaluator, sequence_values, type):
|
||||||
super(FakeArray, self).__init__(evaluator, values, type)
|
super(FakeSequence, self).__init__(evaluator, None, type)
|
||||||
self._values = values
|
self._sequence_values = sequence_values
|
||||||
|
|
||||||
def _items(self):
|
def _items(self):
|
||||||
return self._values
|
return self._sequence_values
|
||||||
|
|
||||||
|
def get_exact_index_types(self, index):
|
||||||
|
return list(chain.from_iterable(self._evaluator.eval_element(v)
|
||||||
|
for v in self._sequence_values[index]))
|
||||||
|
|
||||||
|
|
||||||
class MergedArray(Array):
|
class MergedArray(Array):
|
||||||
|
|||||||
@@ -32,30 +32,32 @@ class Arguments(object):
|
|||||||
if child == ',':
|
if child == ',':
|
||||||
continue
|
continue
|
||||||
elif child in ('*', '**'):
|
elif child in ('*', '**'):
|
||||||
yield len(child), next(iterator)
|
yield len(child.value), next(iterator)
|
||||||
else:
|
else:
|
||||||
yield 0, child
|
yield 0, child
|
||||||
|
|
||||||
def unpack(self):
|
def unpack(self):
|
||||||
"""
|
|
||||||
Reordering var_args is necessary, because star args sometimes appear after
|
|
||||||
named argument, but in the actual order it's prepended.
|
|
||||||
"""
|
|
||||||
named_args = []
|
named_args = []
|
||||||
for stars, el in self._split():
|
for stars, el in self._split():
|
||||||
if stars == 1:
|
if stars == 1:
|
||||||
raise NotImplementedError
|
arrays = self._evaluator.eval_element(el)
|
||||||
|
iterators = [_iterate_star_args(self._evaluator, a, None, None)
|
||||||
|
for a in arrays]
|
||||||
|
for values in list(zip_longest(*iterators)):
|
||||||
|
yield None, tuple(v for v in values if v is not None)
|
||||||
elif stars == 2:
|
elif stars == 2:
|
||||||
raise NotImplementedError
|
raise NotImplementedError
|
||||||
else:
|
else:
|
||||||
if pr.is_node(el, 'argument'):
|
if pr.is_node(el, 'argument'):
|
||||||
named_args.append(el.children[::2])
|
named_args.append((el.children[0], (el.children[2],)))
|
||||||
else:
|
else:
|
||||||
yield None, el
|
yield None, (el,)
|
||||||
|
|
||||||
|
# Reordering var_args is necessary, because star args sometimes appear
|
||||||
|
# after named argument, but in the actual order it's prepended.
|
||||||
for key_arg in named_args:
|
for key_arg in named_args:
|
||||||
# TODO its always only one value?
|
# TODO its always only one value?
|
||||||
yield key_arg[0], key_arg[1]
|
yield key_arg[0], (key_arg[1],)
|
||||||
|
|
||||||
def _reorder_var_args(var_args):
|
def _reorder_var_args(var_args):
|
||||||
named_index = None
|
named_index = None
|
||||||
@@ -75,20 +77,6 @@ class Arguments(object):
|
|||||||
new_args.append(stmt)
|
new_args.append(stmt)
|
||||||
return new_args
|
return new_args
|
||||||
|
|
||||||
def _unpack_temp(self):
|
|
||||||
"""Returns key/value tuples, as statements."""
|
|
||||||
for stars, el in self._split():
|
|
||||||
if stars == 1:
|
|
||||||
arrays = self._evaluator.eval_element(el)
|
|
||||||
iterators = [_iterate_star_args(self._evaluator, a, expression_list[1:], func)
|
|
||||||
for a in arrays]
|
|
||||||
for values in list(zip_longest(*iterators)):
|
|
||||||
yield None, [v for v in values if v is not None]
|
|
||||||
elif stars == 2:
|
|
||||||
raise NotImplementedError
|
|
||||||
else:
|
|
||||||
yield None, [el]
|
|
||||||
|
|
||||||
def kwargs(self):
|
def kwargs(self):
|
||||||
return []
|
return []
|
||||||
|
|
||||||
@@ -135,6 +123,14 @@ class ExecutedParam(pr.Param):
|
|||||||
return types
|
return types
|
||||||
|
|
||||||
|
|
||||||
|
class Container(object):
|
||||||
|
def __init__(self, values):
|
||||||
|
self.values = values
|
||||||
|
|
||||||
|
def eval(self, evaluator):
|
||||||
|
return self.values
|
||||||
|
|
||||||
|
|
||||||
def _get_calling_var_args(evaluator, var_args):
|
def _get_calling_var_args(evaluator, var_args):
|
||||||
old_var_args = None
|
old_var_args = None
|
||||||
while var_args != old_var_args:
|
while var_args != old_var_args:
|
||||||
@@ -182,17 +178,17 @@ def get_params(evaluator, func, var_args):
|
|||||||
# args / kwargs will just be empty arrays / dicts, respectively.
|
# args / kwargs will just be empty arrays / dicts, respectively.
|
||||||
# Wrong value count is just ignored. If you try to test cases that are
|
# Wrong value count is just ignored. If you try to test cases that are
|
||||||
# not allowed in Python, Jedi will maybe not show any completions.
|
# not allowed in Python, Jedi will maybe not show any completions.
|
||||||
key, va_value = next(var_arg_iterator, (None, []))
|
key, va_values = next(var_arg_iterator, (None, ()))
|
||||||
while key:
|
while key:
|
||||||
keys_only = True
|
keys_only = True
|
||||||
k = unicode(key)
|
k = unicode(key)
|
||||||
try:
|
try:
|
||||||
key_param = param_dict[unicode(key)]
|
key_param = param_dict[unicode(key)]
|
||||||
except KeyError:
|
except KeyError:
|
||||||
non_matching_keys.append((key, va_value))
|
non_matching_keys.append((key, va_values))
|
||||||
else:
|
else:
|
||||||
result.append(_gen_param_name_copy(evaluator, func, var_args,
|
result.append(_gen_param_name_copy(evaluator, func, var_args,
|
||||||
key_param, values=[va_value]))
|
key_param, values=[va_values]))
|
||||||
|
|
||||||
if k in keys_used:
|
if k in keys_used:
|
||||||
had_multiple_value_error = True
|
had_multiple_value_error = True
|
||||||
@@ -204,7 +200,7 @@ def get_params(evaluator, func, var_args):
|
|||||||
calling_va, message=m)
|
calling_va, message=m)
|
||||||
else:
|
else:
|
||||||
keys_used.add(k)
|
keys_used.add(k)
|
||||||
key, va_value = next(var_arg_iterator, (None, None))
|
key, va_values = next(var_arg_iterator, (None, ()))
|
||||||
|
|
||||||
keys = []
|
keys = []
|
||||||
values = []
|
values = []
|
||||||
@@ -213,16 +209,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 = []
|
lst_values = [va_values] if va_values else []
|
||||||
for key, va_value 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_value))
|
var_arg_iterator.push_back((key, va_values))
|
||||||
break
|
break
|
||||||
lst_values.append(va_value)
|
lst_values.append(va_values)
|
||||||
print(lst_values)
|
|
||||||
if lst_values:
|
if lst_values:
|
||||||
values = [iterable.FakeArray(evaluator, tuple(lst_values),
|
values = [iterable.FakeSequence(evaluator, tuple(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:
|
||||||
@@ -234,8 +229,8 @@ def get_params(evaluator, func, var_args):
|
|||||||
non_matching_keys = []
|
non_matching_keys = []
|
||||||
else:
|
else:
|
||||||
# normal param
|
# normal param
|
||||||
if va_value is not None:
|
if va_values is not None:
|
||||||
values = [va_value]
|
values = va_values
|
||||||
else:
|
else:
|
||||||
if param.default is not None:
|
if param.default is not None:
|
||||||
# No value: Return the default values.
|
# No value: Return the default values.
|
||||||
@@ -320,7 +315,7 @@ def _unpack_var_args(evaluator, var_args, func):
|
|||||||
# *args
|
# *args
|
||||||
if expression_list[0] == '*':
|
if expression_list[0] == '*':
|
||||||
arrays = evaluator.eval_expression_list(expression_list[1:])
|
arrays = evaluator.eval_expression_list(expression_list[1:])
|
||||||
iterators = [_iterate_star_args(evaluator, arr, func)
|
iterators = [_iterate_star_args(evaluator, a, func)
|
||||||
for a in arrays]
|
for a in arrays]
|
||||||
for values in list(zip_longest(*iterators)):
|
for values in list(zip_longest(*iterators)):
|
||||||
argument_list.append((None, [v for v in values if v is not None]))
|
argument_list.append((None, [v for v in values if v is not None]))
|
||||||
@@ -431,7 +426,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.FakeArray(evaluator, tuple(values), array_type)
|
arr = iterable.FakeSequence(evaluator, tuple(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