forked from VimPlug/jedi
Separate class for Generator and List Comprehensions.
This commit is contained in:
@@ -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):
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user