diff --git a/jedi/evaluate/analysis.py b/jedi/evaluate/analysis.py index 4c112396..26a5149d 100644 --- a/jedi/evaluate/analysis.py +++ b/jedi/evaluate/analysis.py @@ -74,6 +74,13 @@ class Warning(Error): def add(evaluator, name, jedi_obj, message=None, typ=Error, payload=None): + from jedi.evaluate.iterable import MergedNodes + while isinstance(jedi_obj, MergedNodes): + if len(jedi_obj) != 1: + # TODO is this kosher? + return + jedi_obj = list(jedi_obj)[0] + exception = CODES[name][1] if _check_for_exception_catch(evaluator, jedi_obj, exception, payload): return diff --git a/jedi/evaluate/param.py b/jedi/evaluate/param.py index 0ae58306..f1007380 100644 --- a/jedi/evaluate/param.py +++ b/jedi/evaluate/param.py @@ -197,7 +197,7 @@ def _get_calling_var_args(evaluator, var_args): break # We never want var_args to be a tuple. This should be enough for # now, we can change it later, if we need to. - if isinstance(param.var_args, pr.Array): + if isinstance(param.var_args, Arguments): var_args = param.var_args return var_args.argument_node or var_args.trailer @@ -256,13 +256,14 @@ def get_params(evaluator, func, var_args): if param.stars == 1: # *args param array_type = pr.Array.TUPLE - lst_values = [iterable.MergedNodes(va_values)] + lst_values = [iterable.MergedNodes(va_values)] if va_values else [] for key, va_values in var_arg_iterator: # Iterate until a key argument is found. if key: var_arg_iterator.push_back((key, va_values)) break - lst_values.append(iterable.MergedNodes(va_values)) + if va_values: + lst_values.append(iterable.MergedNodes(va_values)) seq = iterable.FakeSequence(evaluator, lst_values, pr.Array.TUPLE) values = [iterable.AlreadyEvaluated([seq])] elif param.stars == 2: @@ -306,10 +307,10 @@ def get_params(evaluator, func, var_args): or param.stars or param.default): # add a warning only if there's not another one. calling_va = _get_calling_var_args(evaluator, var_args) - if calling_va.argument_node is not None: + if calling_va is not None: m = _error_argument_count(func, len(unpacked_va)) analysis.add(evaluator, 'type-error-too-few-arguments', - calling_va.argument_node, message=m) + calling_va, message=m) for key, va_values in non_matching_keys.items(): m = "TypeError: %s() got an unexpected keyword argument '%s'." \ diff --git a/test/static_analysis/star_arguments.py b/test/static_analysis/star_arguments.py index e7989d26..1fb5f06b 100644 --- a/test/static_analysis/star_arguments.py +++ b/test/static_analysis/star_arguments.py @@ -27,7 +27,7 @@ def nested_twice(*args1): return nested(*args1) nested_twice(2, 3) -#! 12 type-error-too-few-arguments +#! 13 type-error-too-few-arguments nested_twice(2) #! 19 type-error-too-many-arguments nested_twice(2, 3, 4) @@ -47,13 +47,13 @@ def kwargs_test(**kwargs): return simple2(1, **kwargs) kwargs_test(c=3, b=2) -#! 11 type-error-too-few-arguments +#! 12 type-error-too-few-arguments kwargs_test(c=3) -#! 11 type-error-too-few-arguments +#! 12 type-error-too-few-arguments kwargs_test(b=2) #! 22 type-error-keyword-argument kwargs_test(b=2, c=3, d=4) -##! 11 type-error-multiple-values +##! 13 type-error-multiple-values kwargs_test(b=2, c=3, a=4) @@ -65,9 +65,9 @@ kwargs_nested(c=3) kwargs_nested() #! 19 type-error-keyword-argument kwargs_nested(c=2, d=4) -##! 13 type-error-multiple-values +##! 14 type-error-multiple-values kwargs_nested(c=2, a=4) -#! 13 type-error-multiple-values +#! 14 type-error-multiple-values kwargs_nested(b=3, c=2) # ----------------- @@ -91,15 +91,15 @@ def mixed2(*args, **kwargs): return simple_mixed(1, *args, **kwargs) -#! 6 type-error-too-few-arguments +#! 7 type-error-too-few-arguments mixed2(c=2) -#! 6 type-error-too-few-arguments +#! 7 type-error-too-few-arguments mixed2(3) #! 13 type-error-too-many-arguments mixed2(3, 4, 5) #! 13 type-error-too-many-arguments mixed2(3, 4, c=5) -#! 6 type-error-multiple-values +#! 7 type-error-multiple-values mixed2(3, b=5) # -----------------