forked from VimPlug/jedi
make generator comprehensions work
This commit is contained in:
@@ -170,15 +170,22 @@ class Evaluator(object):
|
|||||||
return self._eval_precedence(el)
|
return self._eval_precedence(el)
|
||||||
else:
|
else:
|
||||||
# normal element, no operators
|
# normal element, no operators
|
||||||
return self._eval_statement_element(el)
|
return self.eval_statement_element(el)
|
||||||
|
|
||||||
def _eval_precedence(self, _precedence):
|
def _eval_precedence(self, _precedence):
|
||||||
left = self.process_precedence_element(_precedence.left)
|
left = self.process_precedence_element(_precedence.left)
|
||||||
right = self.process_precedence_element(_precedence.right)
|
right = self.process_precedence_element(_precedence.right)
|
||||||
return precedence.calculate(self, left, _precedence.operator, right)
|
return precedence.calculate(self, left, _precedence.operator, right)
|
||||||
|
|
||||||
def _eval_statement_element(self, element):
|
def eval_statement_element(self, element):
|
||||||
if pr.Array.is_type(element, pr.Array.NOARRAY):
|
if pr.Array.is_type(element, pr.Array.NOARRAY):
|
||||||
|
try:
|
||||||
|
lst_cmp = element[0].expression_list()[0]
|
||||||
|
except IndexError:
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
if isinstance(lst_cmp, pr.ListComprehension):
|
||||||
|
return [iterable.GeneratorComprehension(self, lst_cmp)]
|
||||||
r = list(itertools.chain.from_iterable(self.eval_statement(s)
|
r = list(itertools.chain.from_iterable(self.eval_statement(s)
|
||||||
for s in element))
|
for s in element))
|
||||||
call_path = element.generate_call_path()
|
call_path = element.generate_call_path()
|
||||||
|
|||||||
@@ -471,6 +471,7 @@ def get_names_of_scope(evaluator, scope, position=None, star_search=True, includ
|
|||||||
"""
|
"""
|
||||||
if isinstance(scope, iterable.ListComprehensionFlow):
|
if isinstance(scope, iterable.ListComprehensionFlow):
|
||||||
position = scope.list_comprehension.parent.start_pos
|
position = scope.list_comprehension.parent.start_pos
|
||||||
|
|
||||||
in_func_scope = scope
|
in_func_scope = scope
|
||||||
non_flow = scope.get_parent_until(pr.Flow, reverse=True)
|
non_flow = scope.get_parent_until(pr.Flow, reverse=True)
|
||||||
while scope:
|
while scope:
|
||||||
|
|||||||
@@ -66,6 +66,13 @@ class Generator(use_metaclass(CachedMetaClass, pr.Base)):
|
|||||||
analysis.add(self._evaluator, 'type-error-generator', index_array)
|
analysis.add(self._evaluator, 'type-error-generator', index_array)
|
||||||
return []
|
return []
|
||||||
|
|
||||||
|
def get_exact_index_types(self, index):
|
||||||
|
"""
|
||||||
|
Exact lookups are used for tuple lookups, which are perfectly fine if
|
||||||
|
used with generators.
|
||||||
|
"""
|
||||||
|
return [self.iter_content()[index]]
|
||||||
|
|
||||||
def __getattr__(self, name):
|
def __getattr__(self, name):
|
||||||
if name not in ['start_pos', 'end_pos', 'parent', 'get_imports',
|
if name not in ['start_pos', 'end_pos', 'parent', 'get_imports',
|
||||||
'asserts', 'doc', 'docstr', 'get_parent_until',
|
'asserts', 'doc', 'docstr', 'get_parent_until',
|
||||||
@@ -91,6 +98,15 @@ class GeneratorMethod(object):
|
|||||||
return getattr(self._builtin_func, name)
|
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 Array(use_metaclass(CachedMetaClass, pr.Base)):
|
class Array(use_metaclass(CachedMetaClass, pr.Base)):
|
||||||
"""
|
"""
|
||||||
Used as a mirror to pr.Array, if needed. It defines some getter
|
Used as a mirror to pr.Array, if needed. It defines some getter
|
||||||
|
|||||||
@@ -168,6 +168,15 @@ a[0]
|
|||||||
#? int()
|
#? int()
|
||||||
a[0][0]
|
a[0][0]
|
||||||
|
|
||||||
|
# -----------------
|
||||||
|
# generator comprehensions
|
||||||
|
# -----------------
|
||||||
|
|
||||||
|
left, right = (i for i in (1, ''))
|
||||||
|
|
||||||
|
#? int()
|
||||||
|
left
|
||||||
|
|
||||||
# -----------------
|
# -----------------
|
||||||
# ternary operator
|
# ternary operator
|
||||||
# -----------------
|
# -----------------
|
||||||
|
|||||||
Reference in New Issue
Block a user