From 50ceef6e09faa53ead6c4017b057dae5ad33841b Mon Sep 17 00:00:00 2001 From: Dave Halter Date: Tue, 22 Jul 2014 10:44:56 +0200 Subject: [PATCH] 1 + '1' TypeErrors are now detected, but not shown in the right place --- jedi/evaluate/analysis.py | 3 ++- jedi/evaluate/precedence.py | 10 +++++++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/jedi/evaluate/analysis.py b/jedi/evaluate/analysis.py index b750bc77..e036e9a3 100644 --- a/jedi/evaluate/analysis.py +++ b/jedi/evaluate/analysis.py @@ -17,7 +17,8 @@ CODES = { 'type-error-keyword-argument': (7, TypeError, None), 'type-error-multiple-values': (8, TypeError, None), 'type-error-star-star': (9, TypeError, None), - 'type-error-star': (9, TypeError, None), + 'type-error-star': (10, TypeError, None), + 'type-error-operation': (11, TypeError, None), } diff --git a/jedi/evaluate/precedence.py b/jedi/evaluate/precedence.py index 6375c13e..c081506e 100644 --- a/jedi/evaluate/precedence.py +++ b/jedi/evaluate/precedence.py @@ -7,6 +7,7 @@ from jedi.parser import representation as pr from jedi import debug from jedi.common import PushBackIterator from jedi.evaluate.compiled import CompiledObject, create, builtin +from jedi.evaluate import analysis class PythonGrammar(object): @@ -253,10 +254,17 @@ def _element_calculate(evaluator, left, operator, right): elif isinstance(right, iterable.Array) or _is_string(right): return [right] elif operator == '+': - if _is_number(left) and _is_number(right) or _is_string(left) and _is_string(right): + l_is_num = _is_number(left) + r_is_num = _is_number(right) + if l_is_num and r_is_num or _is_string(left) and _is_string(right): return [create(evaluator, left.obj + right.obj)] elif _is_tuple(left) and _is_tuple(right) or _is_list(left) and _is_list(right): return [iterable.MergedArray(evaluator, (left, right))] + # Static analysis, one is a number, the other one is not. + elif l_is_num != r_is_num: + message = "TypeError: unsupported operand type(s) for +: %s and %s" + analysis.add(evaluator, 'type-error-operation', right, + message % (left, right)) elif operator == '-': if _is_number(left) and _is_number(right): return [create(evaluator, left.obj - right.obj)]