diff --git a/jedi/evaluate/analysis.py b/jedi/evaluate/analysis.py index f521c5bf..1e986c3b 100644 --- a/jedi/evaluate/analysis.py +++ b/jedi/evaluate/analysis.py @@ -12,6 +12,7 @@ CODES = { 'name-error': (2, NameError, 'Potential NameError.'), 'import-error': (3, ImportError, 'Potential ImportError.'), 'type-error-generator': (4, TypeError, "TypeError: 'generator' object is not subscriptable."), + 'type-error-too-many-params': (4, TypeError, "TypeError: 'generator' object is not subscriptable."), } diff --git a/jedi/evaluate/param.py b/jedi/evaluate/param.py index 32463bfd..66cc2a3f 100644 --- a/jedi/evaluate/param.py +++ b/jedi/evaluate/param.py @@ -4,6 +4,7 @@ from jedi.parser import representation as pr from jedi.evaluate import iterable from jedi import common from jedi.evaluate import helpers +from jedi.evaluate import analysis def get_params(evaluator, func, var_args): @@ -110,6 +111,8 @@ def get_params(evaluator, func, var_args): # assignment, just the result. Therefore nothing has to be # returned. values = [] + if isinstance(var_args, pr.Array): + print var_args, var_args.start_pos # Just ignore all the params that are without a key, after one keyword # argument was set. @@ -123,6 +126,14 @@ def get_params(evaluator, func, var_args): # create an Exception, but we have to handle that). for k in set(param_dict) - keys_used: result.append(gen_param_name_copy(param_dict[k])) + + remaining_params = list(var_arg_iterator) + if remaining_params: + param_count = len(func.params) + message = 'TypeError: %s() takes exactly %s arguments (%s given).' \ + % (func.name, param_count, param_count + len(remaining_params)) + analysis.add(evaluator, 'type-error-too-many-params', + remaining_params[0][1], message=message) return result diff --git a/test/static_analysis/arguments.py b/test/static_analysis/arguments.py new file mode 100644 index 00000000..760fbe51 --- /dev/null +++ b/test/static_analysis/arguments.py @@ -0,0 +1,16 @@ +def simple(a): + return a + +simple(1) +simple() +#! 10 type-error-too-many-params +simple(1, 2) + + +def nested(*args): + return simple(*args) + +nested(1) +nested() +#! 10 type-error-too-many-params +simple(1, 2, 3)