diff --git a/jedi/evaluate/__init__.py b/jedi/evaluate/__init__.py index e5c54ea8..2b162abf 100644 --- a/jedi/evaluate/__init__.py +++ b/jedi/evaluate/__init__.py @@ -303,6 +303,8 @@ class Evaluator(object): except stdlib.NotInStdLib: pass + if isinstance(obj, iterable.GeneratorMethod): + return obj.execute() if obj.isinstance(compiled.CompiledObject): if obj.is_executable_class(): return [er.Instance(self, obj, params)] @@ -311,8 +313,6 @@ class Evaluator(object): elif obj.isinstance(er.Class): # There maybe executions of executions. return [er.Instance(self, obj, params)] - elif isinstance(obj, iterable.Generator): - return obj.iter_content() else: stmts = [] if obj.isinstance(er.Function): diff --git a/jedi/evaluate/iterable.py b/jedi/evaluate/iterable.py index 53e2bdd4..c2c58e94 100644 --- a/jedi/evaluate/iterable.py +++ b/jedi/evaluate/iterable.py @@ -28,10 +28,7 @@ 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) + parent = GeneratorMethod(self, name.parent) yield helpers.FakeName(name.name, parent) else: yield name @@ -56,6 +53,19 @@ class Generator(use_metaclass(CachedMetaClass, pr.Base)): return "<%s of %s>" % (type(self).__name__, self.func) +class GeneratorMethod(object): + """``__next__`` and ``send`` methods.""" + def __init__(self, generator, builtin_func): + self._builtin_func = builtin_func + self._generator = generator + + def execute(self): + return self._generator.iter_content() + + def __getattr__(self, name): + return getattr(self._builtin_func, name) + + class Array(use_metaclass(CachedMetaClass, pr.Base)): """ Used as a mirror to pr.Array, if needed. It defines some getter diff --git a/test/completion/generators.py b/test/completion/generators.py index 7a714f28..c5677877 100644 --- a/test/completion/generators.py +++ b/test/completion/generators.py @@ -118,8 +118,21 @@ b #? ['__call__'] gen().close.__call__ +#? +gen().throw() + #? ['co_consts'] gen().gi_code.co_consts #? [] gen.gi_code.co_consts + +# `send` is also a method wrapper. +#? ['__call__'] +gen().send.__call__ + +#? tuple() +gen().send() + +#? +gen()()