diff --git a/jedi/cache.py b/jedi/cache.py index a5dbb922..6e5020de 100644 --- a/jedi/cache.py +++ b/jedi/cache.py @@ -19,11 +19,12 @@ import sys import json import hashlib import gc +import inspect +import shutil try: import cPickle as pickle except ImportError: import pickle -import shutil from jedi import settings from jedi import common @@ -119,12 +120,15 @@ def underscore_memoization(func): A now has an attribute ``_x`` written by this decorator. """ + name = '_' + func.__name__ + def wrapper(self): - name = '_' + func.__name__ try: return getattr(self, name) except AttributeError: result = func(self) + if inspect.isgenerator(result): + result = list(result) setattr(self, name, result) return result diff --git a/jedi/evaluate/iterable.py b/jedi/evaluate/iterable.py index 9617aa31..53e2bdd4 100644 --- a/jedi/evaluate/iterable.py +++ b/jedi/evaluate/iterable.py @@ -12,7 +12,7 @@ from jedi.cache import underscore_memoization class Generator(use_metaclass(CachedMetaClass, pr.Base)): - """ Cares for `yield` statements. """ + """Handling of `yield` functions.""" def __init__(self, evaluator, func, var_args): super(Generator, self).__init__() self._evaluator = evaluator @@ -28,10 +28,11 @@ class Generator(use_metaclass(CachedMetaClass, pr.Base)): executes_generator = '__next__', 'send', 'next' for name in compiled.generator_obj.get_defined_names(): if name.name in executes_generator: + print(name) parent = self # TODO parents are fucked up #pr.Function(module, name, [], (0, 0), None) - yield helpers.FakeName(name, parent) + yield helpers.FakeName(name.name, parent) else: yield name