1
0
forked from VimPlug/jedi

Fix a recursion issue with nested for loops.

This commit is contained in:
Dave Halter
2016-07-27 23:36:44 +02:00
parent 01e577be8b
commit 092299f537
3 changed files with 46 additions and 25 deletions

View File

@@ -158,3 +158,9 @@ def splitlines(string):
def unite(iterable): def unite(iterable):
"""Turns a two dimensional array into a one dimensional.""" """Turns a two dimensional array into a one dimensional."""
return set(chain.from_iterable(iterable)) return set(chain.from_iterable(iterable))
def to_list(func):
def wrapper(*args, **kwargs):
return list(func(*args, **kwargs))
return wrapper

View File

@@ -30,6 +30,7 @@ from jedi.evaluate import helpers
from jedi.evaluate.cache import CachedMetaClass, memoize_default from jedi.evaluate.cache import CachedMetaClass, memoize_default
from jedi.evaluate import analysis from jedi.evaluate import analysis
from jedi.evaluate import pep0484 from jedi.evaluate import pep0484
from jedi import common
class IterableWrapper(tree.Base): class IterableWrapper(tree.Base):
@@ -183,19 +184,19 @@ class Comprehension(IterableWrapper):
last_comp = list(comp_for.get_comp_fors())[-1] last_comp = list(comp_for.get_comp_fors())[-1]
return helpers.deep_ast_copy(self._get_comprehension().children[index], parent=last_comp) return helpers.deep_ast_copy(self._get_comprehension().children[index], parent=last_comp)
def _iterate(self): def _nested(self, comp_fors):
def nested(comp_fors): evaluator = self._evaluator
comp_for = comp_fors[0] comp_for = comp_fors[0]
input_node = comp_for.children[3] input_node = comp_for.children[3]
input_types = evaluator.eval_element(input_node) input_types = evaluator.eval_element(input_node)
iterated = py__iter__(evaluator, input_types, input_node) iterated = py__iter__(evaluator, input_types, input_node)
exprlist = comp_for.children[1] exprlist = comp_for.children[1]
for types in iterated: for i, types in enumerate(iterated):
evaluator.predefined_if_name_dict_dict[comp_for] = \ evaluator.predefined_if_name_dict_dict[comp_for] = \
unpack_tuple_to_dict(evaluator, types, exprlist) unpack_tuple_to_dict(evaluator, types, exprlist)
try: try:
for result in nested(comp_fors[1:]): for result in self._nested(comp_fors[1:]):
yield result yield result
except IndexError: except IndexError:
iterated = evaluator.eval_element(self._eval_node()) iterated = evaluator.eval_element(self._eval_node())
@@ -206,9 +207,11 @@ class Comprehension(IterableWrapper):
finally: finally:
del evaluator.predefined_if_name_dict_dict[comp_for] del evaluator.predefined_if_name_dict_dict[comp_for]
evaluator = self._evaluator @memoize_default(default=[])
comp_fors = list(self._get_comp_for().get_comp_fors()) @common.to_list
for result in nested(comp_fors): def _iterate(self):
comp_fors = tuple(self._get_comp_for().get_comp_fors())
for result in self._nested(comp_fors):
yield result yield result
def py__iter__(self): def py__iter__(self):

View File

@@ -37,3 +37,15 @@ def recursion1(foo):
#? int() #? int()
recursion1([1,2])[0] recursion1([1,2])[0]
class FooListComp():
def __init__(self):
self.recursive = [1]
def annoying(self):
self.recursive = [x for x in self.recursive]
#? int()
FooListComp().recursive[0]