1
0
forked from VimPlug/jedi

unpacking arguments.

This commit is contained in:
Dave Halter
2014-10-24 21:46:42 +02:00
parent c58975807c
commit 9f1336095b

View File

@@ -36,7 +36,46 @@ class Arguments(object):
else: else:
yield 0, child yield 0, child
def iterate(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 = []
for stars, el in self._split():
if stars == 1:
raise NotImplementedError
elif stars == 2:
raise NotImplementedError
else:
if pr.is_node(el, 'argument'):
named_args.append(el.children[::2])
else:
yield None, [el]
for key_arg in named_args:
# TODO its always only one value?
yield key_arg[0], [key_arg[1]]
def _reorder_var_args(var_args):
named_index = None
new_args = []
for i, stmt in enumerate(var_args):
if isinstance(stmt, pr.Statement):
if named_index is None and stmt.assignment_details:
named_index = i
if named_index is not None:
expression_list = stmt.expression_list()
if expression_list and expression_list[0] == '*':
new_args.insert(named_index, stmt)
named_index += 1
continue
new_args.append(stmt)
return new_args
def _unpack_temp(self):
"""Returns key/value tuples, as statements.""" """Returns key/value tuples, as statements."""
for stars, el in self._split(): for stars, el in self._split():
if stars == 1: if stars == 1:
@@ -86,6 +125,9 @@ class ExecutedParam(pr.Param):
instance.var_args = var_args instance.var_args = var_args
return instance return instance
def get_parent_until(self, *args, **kwargs):
return self.parent.get_parent_until(*args, **kwargs)
def _get_calling_var_args(evaluator, var_args): def _get_calling_var_args(evaluator, var_args):
old_var_args = None old_var_args = None
@@ -121,8 +163,8 @@ def get_params(evaluator, func, var_args):
for param in func.params: for param in func.params:
param_dict[str(param.get_name())] = param param_dict[str(param.get_name())] = param
# There may be calls, which don't fit all the params, this just ignores it. # There may be calls, which don't fit all the params, this just ignores it.
unpacked_va = _unpack_var_args(evaluator, var_args, func) #unpacked_va = _unpack_var_args(evaluator, var_args, func)
var_arg_iterator = common.PushBackIterator(iter(unpacked_va)) var_arg_iterator = common.PushBackIterator(iter(var_args.unpack()))
non_matching_keys = [] non_matching_keys = []
keys_used = set() keys_used = set()
@@ -251,8 +293,10 @@ def _unpack_var_args(evaluator, var_args, func):
# Include self at this place. # Include self at this place.
argument_list.append((None, [helpers.FakeStatement([func.instance])])) argument_list.append((None, [helpers.FakeStatement([func.instance])]))
print(var_args)
# `var_args` is typically an Array, and not a list. # `var_args` is typically an Array, and not a list.
for stmt in _reorder_var_args(var_args.iterate()): for stmt in _reorder_var_args(var_args.iterate()):
print(stmt)
if not isinstance(stmt, pr.Statement): if not isinstance(stmt, pr.Statement):
if stmt is None: if stmt is None:
argument_list.append((None, [])) argument_list.append((None, []))
@@ -317,29 +361,6 @@ def _unpack_var_args(evaluator, var_args, func):
return argument_list return argument_list
def _reorder_var_args(var_args):
"""
Reordering var_args is necessary, because star args sometimes appear after
named argument, but in the actual order it's prepended.
"""
named_index = None
new_args = []
for i, stmt in enumerate(var_args):
if isinstance(stmt, pr.Statement):
if named_index is None and stmt.assignment_details:
named_index = i
if named_index is not None:
expression_list = stmt.expression_list()
if expression_list and expression_list[0] == '*':
new_args.insert(named_index, stmt)
named_index += 1
continue
new_args.append(stmt)
return new_args
def _iterate_star_args(evaluator, array, expression_list, func): def _iterate_star_args(evaluator, array, expression_list, func):
from jedi.evaluate.representation import Instance from jedi.evaluate.representation import Instance
if isinstance(array, iterable.Array): if isinstance(array, iterable.Array):