diff --git a/jedi/evaluate/__init__.py b/jedi/evaluate/__init__.py index 5db940b7..d098f25f 100644 --- a/jedi/evaluate/__init__.py +++ b/jedi/evaluate/__init__.py @@ -142,13 +142,27 @@ class Evaluator(object): """ debug.dbg('eval_expression_list: %s', expression_list) result = [] + p = precedence.create_precedence(expression_list) + return self._process_precedence_element(p) calls_iterator = iter(expression_list) for each in calls_iterator: result += self.eval_element(each) return set(result) - def _eval_precedence(evaluator, precedence): - evaluator + def _process_precedence_element(self, el): + if el is None: + return None + else: + if isinstance(el, precedence.Precedence): + return self._eval_precedence(el) + else: + # normal element, no operators + return self.eval_element(el) + + def _eval_precedence(self, _precedence): + left = self._process_precedence_element(_precedence.left) + right = self._process_precedence_element(_precedence.right) + return precedence.calculate(left, _precedence.operator, right) def eval_element(self, element): if pr.Array.is_type(element, pr.Array.NOARRAY): diff --git a/jedi/evaluate/precedence.py b/jedi/evaluate/precedence.py index aa67a2d2..e08812ae 100644 --- a/jedi/evaluate/precedence.py +++ b/jedi/evaluate/precedence.py @@ -73,7 +73,7 @@ class Precedence(object): def create_precedence(expression_list): - iterator = PushBackIterator(expression_list) + iterator = PushBackIterator(iter(expression_list)) return _check_operator(iterator) @@ -149,3 +149,7 @@ def _check_operator(iterator, priority=PythonGrammar.LOWEST_PRIORITY): else: left = Precedence(left, str(operator), right) return left + + +def calculate(left, operator, right): + return left + right diff --git a/test/test_evaluate/test_precedence.py b/test/test_evaluate/test_precedence.py index 5faaad5c..467cc7df 100644 --- a/test/test_evaluate/test_precedence.py +++ b/test/test_evaluate/test_precedence.py @@ -8,7 +8,7 @@ def parse_tree(statement_string, is_slice=False): if is_slice: # get the part of the execution that is the slice stmt = stmt.expression_list()[0].execution[0] - iterable = iter(stmt.expression_list()) + iterable = stmt.expression_list() pr = precedence.create_precedence(iterable) if isinstance(pr, precedence.Precedence): return pr.parse_tree(strip_literals=True)