From 43ad4cfeb8640b0dee4fd1fa6c17a9ffb2a86264 Mon Sep 17 00:00:00 2001 From: Dave Halter Date: Thu, 7 Jan 2016 10:41:34 +0100 Subject: [PATCH 1/3] Ellipsis comparisons are working now. Ellipsis was previously ignored. --- jedi/evaluate/__init__.py | 3 ++- jedi/parser/tokenize.py | 8 +++++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/jedi/evaluate/__init__.py b/jedi/evaluate/__init__.py index a4f1397e..b69ca241 100644 --- a/jedi/evaluate/__init__.py +++ b/jedi/evaluate/__init__.py @@ -312,7 +312,8 @@ class Evaluator(object): self.eval_element(element.children[-1])) elif element.type == 'operator': # Must be an ellipsis, other operators are not evaluated. - types = set() # Ignore for now. + assert element.value == '...' + types = set([compiled.create(self, Ellipsis)]) elif element.type == 'dotted_name': types = self._eval_atom(element.children[0]) for next_name in element.children[2::2]: diff --git a/jedi/parser/tokenize.py b/jedi/parser/tokenize.py index 194a0967..fe22643f 100644 --- a/jedi/parser/tokenize.py +++ b/jedi/parser/tokenize.py @@ -285,7 +285,13 @@ def generate_tokens(readline): paren_level += 1 elif token in ')]}': paren_level -= 1 - yield OP, token, spos, prefix + if token == '...' and not is_py3: + # Ellipsis tokens were not syntax yet, in Python 2.7. + yield OP, '.', spos, prefix + yield OP, '.', (spos[0], spos[1] + 1), '' + yield OP, '.', (spos[0], spos[1] + 2), '' + else: + yield OP, token, spos, prefix if new_line: end_pos = lnum + 1, 0 From cb7ee00c75270b8c69931e880c2caee727ee5aea Mon Sep 17 00:00:00 2001 From: Dave Halter Date: Thu, 7 Jan 2016 10:43:31 +0100 Subject: [PATCH 2/3] Forgot to include precedence tests. --- test/test_evaluate/test_precedence.py | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 test/test_evaluate/test_precedence.py diff --git a/test/test_evaluate/test_precedence.py b/test/test_evaluate/test_precedence.py new file mode 100644 index 00000000..462b7d4a --- /dev/null +++ b/test/test_evaluate/test_precedence.py @@ -0,0 +1,20 @@ +from jedi.parser import load_grammar, Parser +from jedi.evaluate import Evaluator +from jedi.evaluate.compiled import CompiledObject + +import pytest + + +@pytest.mark.skipif('sys.version_info[0] < 3') # Ellipsis does not exists in 2 +@pytest.mark.parametrize('source', [ + '1 == 1', + '1.0 == 1', + '... == ...' +]) +def test_equals(source): + evaluator = Evaluator(load_grammar()) + node = Parser(load_grammar(), source, 'eval_input').get_parsed_node() + results = evaluator.eval_element(node) + assert len(results) == 1 + first = results.pop() + assert isinstance(first, CompiledObject) and first.obj is True From 438ba3e14a12077558d0460a8143edf1d3ef298c Mon Sep 17 00:00:00 2001 From: Dave Halter Date: Thu, 7 Jan 2016 11:01:00 +0100 Subject: [PATCH 3/3] Ellipsis is still be valid in 2.6/2.7 (for now). --- jedi/parser/tokenize.py | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/jedi/parser/tokenize.py b/jedi/parser/tokenize.py index fe22643f..194a0967 100644 --- a/jedi/parser/tokenize.py +++ b/jedi/parser/tokenize.py @@ -285,13 +285,7 @@ def generate_tokens(readline): paren_level += 1 elif token in ')]}': paren_level -= 1 - if token == '...' and not is_py3: - # Ellipsis tokens were not syntax yet, in Python 2.7. - yield OP, '.', spos, prefix - yield OP, '.', (spos[0], spos[1] + 1), '' - yield OP, '.', (spos[0], spos[1] + 2), '' - else: - yield OP, token, spos, prefix + yield OP, token, spos, prefix if new_line: end_pos = lnum + 1, 0