mirror of
https://github.com/davidhalter/jedi.git
synced 2025-12-06 22:14:27 +08:00
Fix static analysis' argument tests.
This commit is contained in:
@@ -136,6 +136,13 @@ class Arguments(pr.Base):
|
|||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
return '<%s: %s>' % (type(self).__name__, self.argument_node)
|
return '<%s: %s>' % (type(self).__name__, self.argument_node)
|
||||||
|
|
||||||
|
def get_calling_var_args(self):
|
||||||
|
if pr.is_node(self.argument_node, 'arglist', 'argument') \
|
||||||
|
or self.argument_node == () and self.trailer is not None:
|
||||||
|
return _get_calling_var_args(self._evaluator, self)
|
||||||
|
else:
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
class ExecutedParam(pr.Param):
|
class ExecutedParam(pr.Param):
|
||||||
def __init__(self, values):
|
def __init__(self, values):
|
||||||
@@ -192,7 +199,7 @@ def _get_calling_var_args(evaluator, var_args):
|
|||||||
# now, we can change it later, if we need to.
|
# now, we can change it later, if we need to.
|
||||||
if isinstance(param.var_args, pr.Array):
|
if isinstance(param.var_args, pr.Array):
|
||||||
var_args = param.var_args
|
var_args = param.var_args
|
||||||
return var_args
|
return var_args.argument_node or var_args.trailer
|
||||||
|
|
||||||
|
|
||||||
def get_params(evaluator, func, var_args):
|
def get_params(evaluator, func, var_args):
|
||||||
@@ -238,7 +245,7 @@ def get_params(evaluator, func, var_args):
|
|||||||
calling_va = _get_calling_var_args(evaluator, var_args)
|
calling_va = _get_calling_var_args(evaluator, var_args)
|
||||||
if calling_va is not None:
|
if calling_va is not None:
|
||||||
analysis.add(evaluator, 'type-error-multiple-values',
|
analysis.add(evaluator, 'type-error-multiple-values',
|
||||||
calling_va.argument_node, message=m)
|
calling_va, message=m)
|
||||||
else:
|
else:
|
||||||
keys_used.add(k)
|
keys_used.add(k)
|
||||||
key, va_values = next(var_arg_iterator, (None, ()))
|
key, va_values = next(var_arg_iterator, (None, ()))
|
||||||
@@ -271,8 +278,8 @@ def get_params(evaluator, func, var_args):
|
|||||||
else:
|
else:
|
||||||
# No value: Return an empty container
|
# No value: Return an empty container
|
||||||
values = []
|
values = []
|
||||||
if not keys_only and isinstance(var_args, pr.Array):
|
if not keys_only:
|
||||||
calling_va = _get_calling_var_args(evaluator, var_args)
|
calling_va = var_args.get_calling_var_args()
|
||||||
if calling_va is not None:
|
if calling_va is not None:
|
||||||
m = _error_argument_count(func, len(unpacked_va))
|
m = _error_argument_count(func, len(unpacked_va))
|
||||||
analysis.add(evaluator, 'type-error-too-few-arguments',
|
analysis.add(evaluator, 'type-error-too-few-arguments',
|
||||||
@@ -295,7 +302,6 @@ def get_params(evaluator, func, var_args):
|
|||||||
result.append(_gen_param_name_copy(evaluator, func, var_args,
|
result.append(_gen_param_name_copy(evaluator, func, var_args,
|
||||||
param, [], values))
|
param, [], values))
|
||||||
|
|
||||||
|
|
||||||
if not (non_matching_keys or had_multiple_value_error
|
if not (non_matching_keys or had_multiple_value_error
|
||||||
or param.stars or param.default):
|
or param.stars or param.default):
|
||||||
# add a warning only if there's not another one.
|
# add a warning only if there's not another one.
|
||||||
@@ -309,14 +315,21 @@ def get_params(evaluator, func, var_args):
|
|||||||
m = "TypeError: %s() got an unexpected keyword argument '%s'." \
|
m = "TypeError: %s() got an unexpected keyword argument '%s'." \
|
||||||
% (func.name, key)
|
% (func.name, key)
|
||||||
for value in va_values:
|
for value in va_values:
|
||||||
analysis.add(evaluator, 'type-error-keyword-argument', value, message=m)
|
analysis.add(evaluator, 'type-error-keyword-argument', value.parent, message=m)
|
||||||
|
|
||||||
remaining_params = list(var_arg_iterator)
|
remaining_params = list(var_arg_iterator)
|
||||||
if remaining_params:
|
if remaining_params:
|
||||||
m = _error_argument_count(func, len(unpacked_va))
|
m = _error_argument_count(func, len(unpacked_va))
|
||||||
for p in remaining_params[0][1]:
|
# Just report an error for the first param that is not needed (like
|
||||||
|
# cPython).
|
||||||
|
first_key, first_values = remaining_params[0]
|
||||||
|
for v in first_values:
|
||||||
|
if first_key is not None:
|
||||||
|
# Is a keyword argument, return the whole thing instead of just
|
||||||
|
# the value node.
|
||||||
|
v = v.parent
|
||||||
analysis.add(evaluator, 'type-error-too-many-arguments',
|
analysis.add(evaluator, 'type-error-too-many-arguments',
|
||||||
p, message=m)
|
v, message=m)
|
||||||
return result
|
return result
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -34,7 +34,7 @@ def two_params(x, y):
|
|||||||
two_params(y=2, x=1)
|
two_params(y=2, x=1)
|
||||||
two_params(1, y=2)
|
two_params(1, y=2)
|
||||||
|
|
||||||
#! 10 type-error-multiple-values
|
#! 11 type-error-multiple-values
|
||||||
two_params(1, x=2)
|
two_params(1, x=2)
|
||||||
#! 17 type-error-too-many-arguments
|
#! 17 type-error-too-many-arguments
|
||||||
two_params(1, 2, y=3)
|
two_params(1, 2, y=3)
|
||||||
|
|||||||
Reference in New Issue
Block a user