forked from VimPlug/jedi
Remove legacy code from param. However, this there's still work needed on params.
This commit is contained in:
@@ -26,8 +26,7 @@ def defined_names(evaluator, scope):
|
|||||||
:type scope: Scope
|
:type scope: Scope
|
||||||
:rtype: list of Definition
|
:rtype: list of Definition
|
||||||
"""
|
"""
|
||||||
# Calling get_names_of_scope doesn't make sense always. It might include
|
# It might include inherited stuff. Wanted?
|
||||||
# star imports or inherited stuff. Wanted?
|
|
||||||
# TODO discuss!
|
# TODO discuss!
|
||||||
if isinstance(scope, pr.Module):
|
if isinstance(scope, pr.Module):
|
||||||
pair = scope, scope.get_defined_names()
|
pair = scope, scope.get_defined_names()
|
||||||
|
|||||||
@@ -6,9 +6,7 @@ from jedi._compatibility import unicode, zip_longest
|
|||||||
from jedi import debug
|
from jedi import debug
|
||||||
from jedi import common
|
from jedi import common
|
||||||
from jedi.parser import tree as pr
|
from jedi.parser import tree as pr
|
||||||
from jedi.evaluate.cache import memoize_default
|
|
||||||
from jedi.evaluate import iterable
|
from jedi.evaluate import iterable
|
||||||
from jedi.evaluate import helpers
|
|
||||||
from jedi.evaluate import analysis
|
from jedi.evaluate import analysis
|
||||||
from jedi.evaluate import precedence
|
from jedi.evaluate import precedence
|
||||||
|
|
||||||
@@ -83,7 +81,6 @@ class Arguments(pr.Base):
|
|||||||
# Reordering var_args is necessary, because star args sometimes appear
|
# Reordering var_args is necessary, because star args sometimes appear
|
||||||
# after named argument, but in the actual order it's prepended.
|
# 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?
|
|
||||||
yield key_arg
|
yield key_arg
|
||||||
|
|
||||||
def _reorder_var_args(var_args):
|
def _reorder_var_args(var_args):
|
||||||
@@ -208,8 +205,6 @@ def get_params(evaluator, func, var_args):
|
|||||||
param_dict = {}
|
param_dict = {}
|
||||||
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.
|
|
||||||
#unpacked_va = _unpack_var_args(evaluator, var_args, func)
|
|
||||||
unpacked_va = list(var_args.unpack(func))
|
unpacked_va = list(var_args.unpack(func))
|
||||||
from jedi.evaluate.representation import InstanceElement
|
from jedi.evaluate.representation import InstanceElement
|
||||||
if isinstance(func, InstanceElement):
|
if isinstance(func, InstanceElement):
|
||||||
@@ -350,82 +345,6 @@ def get_params(evaluator, func, var_args):
|
|||||||
return result
|
return result
|
||||||
|
|
||||||
|
|
||||||
def _unpack_var_args(evaluator, var_args, func):
|
|
||||||
"""
|
|
||||||
Yields a key/value pair, the key is None, if its not a named arg.
|
|
||||||
"""
|
|
||||||
argument_list = []
|
|
||||||
from jedi.evaluate.representation import InstanceElement
|
|
||||||
if isinstance(func, InstanceElement):
|
|
||||||
# Include self at this place.
|
|
||||||
argument_list.append((None, [helpers.FakeStatement([func.instance])]))
|
|
||||||
|
|
||||||
# `var_args` is typically an Array, and not a list.
|
|
||||||
for stmt in _reorder_var_args(var_args.iterate()):
|
|
||||||
if not isinstance(stmt, pr.ExprStmt):
|
|
||||||
if stmt is None:
|
|
||||||
argument_list.append((None, []))
|
|
||||||
# TODO generate warning?
|
|
||||||
continue
|
|
||||||
old = stmt
|
|
||||||
# generate a statement if it's not already one.
|
|
||||||
stmt = helpers.FakeStatement([old])
|
|
||||||
|
|
||||||
expression_list = stmt.expression_list()
|
|
||||||
if not len(expression_list):
|
|
||||||
continue
|
|
||||||
# *args
|
|
||||||
if expression_list[0] == '*':
|
|
||||||
arrays = evaluator.eval_expression_list(expression_list[1:])
|
|
||||||
iterators = [_iterate_star_args(evaluator, a, func)
|
|
||||||
for a in arrays]
|
|
||||||
for values in list(zip_longest(*iterators)):
|
|
||||||
argument_list.append((None, [v for v in values if v is not None]))
|
|
||||||
# **kwargs
|
|
||||||
elif expression_list[0] == '**':
|
|
||||||
dct = {}
|
|
||||||
for array in evaluator.eval_expression_list(expression_list[1:]):
|
|
||||||
# Merge multiple kwargs dictionaries, if used with dynamic
|
|
||||||
# parameters.
|
|
||||||
s = _star_star_dict(evaluator, array, expression_list[1:], func)
|
|
||||||
for name, (key, value) in s.items():
|
|
||||||
try:
|
|
||||||
dct[name][1].add(value)
|
|
||||||
except KeyError:
|
|
||||||
dct[name] = key, set([value])
|
|
||||||
|
|
||||||
for key, values in dct.values():
|
|
||||||
# merge **kwargs/*args also for dynamic parameters
|
|
||||||
for i, p in enumerate(func.params):
|
|
||||||
if str(p.get_name()) == str(key) and not p.stars:
|
|
||||||
try:
|
|
||||||
k, vs = argument_list[i]
|
|
||||||
except IndexError:
|
|
||||||
pass
|
|
||||||
else:
|
|
||||||
if k is None: # k would imply a named argument
|
|
||||||
# Don't merge if they orginate at the same
|
|
||||||
# place. -> type-error-multiple-values
|
|
||||||
if [v.parent for v in values] != [v.parent for v in vs]:
|
|
||||||
vs.extend(values)
|
|
||||||
break
|
|
||||||
else:
|
|
||||||
# default is to merge
|
|
||||||
argument_list.append((key, values))
|
|
||||||
# Normal arguments (including key arguments).
|
|
||||||
else:
|
|
||||||
if stmt.assignment_details:
|
|
||||||
key_arr, op = stmt.assignment_details[0]
|
|
||||||
# Filter error tokens
|
|
||||||
key_arr = [x for x in key_arr if isinstance(x, pr.Call)]
|
|
||||||
# named parameter
|
|
||||||
if key_arr and isinstance(key_arr[0], pr.Call):
|
|
||||||
argument_list.append((key_arr[0].name, [stmt]))
|
|
||||||
else:
|
|
||||||
argument_list.append((None, [stmt]))
|
|
||||||
return argument_list
|
|
||||||
|
|
||||||
|
|
||||||
def _iterate_star_args(evaluator, array, input_node, func=None):
|
def _iterate_star_args(evaluator, array, input_node, func=None):
|
||||||
from jedi.evaluate.representation import Instance
|
from jedi.evaluate.representation import Instance
|
||||||
if isinstance(array, iterable.Array):
|
if isinstance(array, iterable.Array):
|
||||||
@@ -472,28 +391,7 @@ def _gen_param_name_copy(evaluator, func, var_args, param, keys=(), values=(), a
|
|||||||
"""
|
"""
|
||||||
Create a param with the original scope (of varargs) as parent.
|
Create a param with the original scope (of varargs) as parent.
|
||||||
"""
|
"""
|
||||||
if isinstance(var_args, pr.Array):
|
new_param = ExecutedParam.from_param(values, param, func, var_args)
|
||||||
parent = var_args.parent
|
|
||||||
start_pos = var_args.start_pos
|
|
||||||
else:
|
|
||||||
parent = func
|
|
||||||
start_pos = 0, 0
|
|
||||||
|
|
||||||
"""
|
|
||||||
# create an Array (-> needed for *args/**kwargs tuples/dicts)
|
|
||||||
arr = iterable.FakeSequence(evaluator, values, array_type)
|
|
||||||
# TODO change?!
|
|
||||||
arr = pr.Array(helpers.FakeSubModule, start_pos, array_type, parent)
|
|
||||||
key_stmts = []
|
|
||||||
for key in keys:
|
|
||||||
key_stmts.append(helpers.FakeStatement([key], start_pos))
|
|
||||||
arr.keys = key_stmts
|
|
||||||
arr.type = array_type
|
|
||||||
"""
|
|
||||||
|
|
||||||
new_param = ExecutedParam.from_param(values, param, parent, var_args)
|
|
||||||
|
|
||||||
|
|
||||||
name = copy.copy(param.get_name())
|
name = copy.copy(param.get_name())
|
||||||
name.parent = new_param
|
name.parent = new_param
|
||||||
return name
|
return name
|
||||||
|
|||||||
Reference in New Issue
Block a user