forked from VimPlug/jedi
Fix a recursion issue with nested for loops.
This commit is contained in:
@@ -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
|
||||||
|
|||||||
@@ -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):
|
||||||
|
|||||||
@@ -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]
|
||||||
|
|||||||
Reference in New Issue
Block a user