diff --git a/jedi/evaluate/compiled/fake/builtins.pym b/jedi/evaluate/compiled/fake/builtins.pym index 88436fdd..1225929c 100644 --- a/jedi/evaluate/compiled/fake/builtins.pym +++ b/jedi/evaluate/compiled/fake/builtins.pym @@ -39,6 +39,9 @@ class file(): def readlines(self): return [''] + def __enter__(self): + return self + class xrange(): # Attention: this function doesn't exist in Py3k (there it is range). diff --git a/jedi/evaluate/compiled/fake/io.pym b/jedi/evaluate/compiled/fake/io.pym index e115ea9a..c1f4fc01 100644 --- a/jedi/evaluate/compiled/fake/io.pym +++ b/jedi/evaluate/compiled/fake/io.pym @@ -7,3 +7,6 @@ class TextIOWrapper(): def readlines(self): return [''] + + def __enter__(self): + return self diff --git a/jedi/evaluate/finder.py b/jedi/evaluate/finder.py index 18e69348..aba190e1 100644 --- a/jedi/evaluate/finder.py +++ b/jedi/evaluate/finder.py @@ -221,7 +221,12 @@ def _name_to_types(evaluator, context, tree_name): elif typ == 'expr_stmt': types = _remove_statements(evaluator, context, node, tree_name) elif typ == 'with_stmt': - types = context.eval_node(node.get_test_node_from_name(tree_name)) + context_managers = context.eval_node(node.get_test_node_from_name(tree_name)) + enter_methods = unite( + context_manager.py__getattribute__('__enter__') + for context_manager in context_managers + ) + types = unite(method.execute_evaluated() for method in enter_methods) elif typ in ('import_from', 'import_name'): types = imports.infer_import(context, tree_name) elif typ in ('funcdef', 'classdef'): diff --git a/test/completion/stdlib.py b/test/completion/stdlib.py index c320b3f0..09eeb061 100644 --- a/test/completion/stdlib.py +++ b/test/completion/stdlib.py @@ -227,3 +227,12 @@ z = zipfile.ZipFile("foo") # It's too slow. So we don't run it at the moment. ##? ['upper'] z.read('name').upper + +# ----------------- +# contextlib +# ----------------- + +import contextlib +with contextlib.closing('asd') as string: + #? str() + string