From 65f182ff0daeea828959be7e23403acca2f8cbfd Mon Sep 17 00:00:00 2001 From: Dave Halter Date: Wed, 12 Nov 2014 13:28:31 +0100 Subject: [PATCH] Separate class for Generator and List Comprehensions. --- jedi/evaluate/__init__.py | 6 +++--- jedi/evaluate/iterable.py | 31 +++++++++++++++++++------------ 2 files changed, 22 insertions(+), 15 deletions(-) diff --git a/jedi/evaluate/__init__.py b/jedi/evaluate/__init__.py index 1458cb3f..0bb98433 100644 --- a/jedi/evaluate/__init__.py +++ b/jedi/evaluate/__init__.py @@ -212,8 +212,8 @@ class Evaluator(object): else: c = atom.children # Parentheses without commas are not tuples. - if c[0] == '(' and (not pr.is_node(c[1], 'testlist_comp') - or c[1].children[1] != ','): + if c[0] == '(' and not (pr.is_node(c[1], 'testlist_comp') + and len(c[1].children) > 1): return self.eval_element(c[1]) try: comp_for = c[1].children[1] @@ -221,7 +221,7 @@ class Evaluator(object): pass else: if isinstance(comp_for, pr.CompFor): - return [iterable.Comprehension(self, atom)] + return [iterable.Comprehension.from_atom(self, atom)] return [iterable.Array(self, atom)] def _eval_trailer(self, types, trailer): diff --git a/jedi/evaluate/iterable.py b/jedi/evaluate/iterable.py index 983ad0a5..56faf1c4 100644 --- a/jedi/evaluate/iterable.py +++ b/jedi/evaluate/iterable.py @@ -110,23 +110,19 @@ class GeneratorMethod(IterableWrapper): return getattr(self._builtin_func, name) -class GeneratorComprehension(Generator): - def __init__(self, evaluator, comprehension): - super(GeneratorComprehension, self).__init__(evaluator, comprehension, None) - self.comprehension = comprehension - - def iter_content(self): - return self._evaluator.eval_statement_element(self.comprehension) - - class Comprehension(IterableWrapper): + @staticmethod + def from_atom(evaluator, atom): + mapping = { + '(': GeneratorComprehension, + '[': ListComprehension + } + return mapping[atom.children[0]](evaluator, atom) + def __init__(self, evaluator, atom): self._evaluator = evaluator self._atom = atom - def get_index_types(self, evaluator, index): - return self._evaluator.eval_element(self.eval_node()) - @memoize_default() def eval_node(self): """ @@ -151,6 +147,17 @@ class Comprehension(IterableWrapper): return "" % (type(self).__name__, self._atom) +class ListComprehension(Comprehension): + def get_index_types(self, evaluator, index): + return self._evaluator.eval_element(self.eval_node()) + + + +class GeneratorComprehension(Comprehension): + def iter_content(self): + return self._evaluator.eval_statement_element(self.comprehension) + + class Array(IterableWrapper): """ Used as a mirror to pr.Array, if needed. It defines some getter