1
0
forked from VimPlug/jedi

Separate class for Generator and List Comprehensions.

This commit is contained in:
Dave Halter
2014-11-12 13:28:31 +01:00
parent f760a7755d
commit 65f182ff0d
2 changed files with 22 additions and 15 deletions

View File

@@ -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):

View File

@@ -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 "<e%s of %s>" % (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