From f7c8c43fbc0a47865fc29605572617461c235b7c Mon Sep 17 00:00:00 2001 From: Dave Halter Date: Tue, 22 Jul 2014 16:18:57 +0200 Subject: [PATCH] check not only - but also + for numbers. --- jedi/evaluate/precedence.py | 18 ++++++++++-------- test/static_analysis/operations.py | 4 ++++ 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/jedi/evaluate/precedence.py b/jedi/evaluate/precedence.py index 4cc075b3..9736e7a6 100644 --- a/jedi/evaluate/precedence.py +++ b/jedi/evaluate/precedence.py @@ -262,6 +262,8 @@ def _is_list(obj): def _element_calculate(evaluator, left, operator, right): from jedi.evaluate import iterable + l_is_num = _is_number(left) + r_is_num = _is_number(right) if operator == '*': # for iterables, ignore * operations if isinstance(left, iterable.Array) or _is_string(left): @@ -269,22 +271,22 @@ def _element_calculate(evaluator, left, operator, right): elif isinstance(right, iterable.Array) or _is_string(right): return [right] elif operator == '+': - 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', operator, - message % (left, right)) elif operator == '-': - if _is_number(left) and _is_number(right): + if l_is_num and r_is_num: return [create(evaluator, left.obj - right.obj)] elif operator == '%': # With strings and numbers the left type typically remains. Except for # `int() % float()`. return [left] + + # Static analysis, one is a number, the other one is not. + if operator in ['+', '-'] and l_is_num != r_is_num: + message = "TypeError: unsupported operand type(s) for +: %s and %s" + analysis.add(evaluator, 'type-error-operation', operator, + message % (left, right)) + return [left, right] diff --git a/test/static_analysis/operations.py b/test/static_analysis/operations.py index 905851b4..e0827637 100644 --- a/test/static_analysis/operations.py +++ b/test/static_analysis/operations.py @@ -2,3 +2,7 @@ 1 + 1.0 #! 2 type-error-operation 1 + '1' +#! 2 type-error-operation +1 - '1' + +-1 - - 1