diff --git a/python/src/com/jetbrains/python/PyNames.java b/python/src/com/jetbrains/python/PyNames.java index 1d240aa0a7ef..d13e6f90bc46 100644 --- a/python/src/com/jetbrains/python/PyNames.java +++ b/python/src/com/jetbrains/python/PyNames.java @@ -78,6 +78,7 @@ public class PyNames { public static final String GETITEM = "__getitem__"; public static final String NAME = "__name__"; + public static final String ENTER = "__enter__"; /** * Contains all known predefined names of "__foo__" form. diff --git a/python/src/com/jetbrains/python/psi/PyWithItem.java b/python/src/com/jetbrains/python/psi/PyWithItem.java index 2b6998943f0e..c9586fe95c8f 100644 --- a/python/src/com/jetbrains/python/psi/PyWithItem.java +++ b/python/src/com/jetbrains/python/psi/PyWithItem.java @@ -9,5 +9,8 @@ public interface PyWithItem extends PyElement { PyWithItem[] EMPTY_ARRAY = new PyWithItem[0]; @Nullable - PyExpression getTargetExpression(); + PyExpression getExpression(); + + @Nullable + PyExpression getTarget(); } diff --git a/python/src/com/jetbrains/python/psi/impl/PyTargetExpressionImpl.java b/python/src/com/jetbrains/python/psi/impl/PyTargetExpressionImpl.java index f7cbf45107b7..ce3d0df03294 100644 --- a/python/src/com/jetbrains/python/psi/impl/PyTargetExpressionImpl.java +++ b/python/src/com/jetbrains/python/psi/impl/PyTargetExpressionImpl.java @@ -136,8 +136,9 @@ public class PyTargetExpressionImpl extends PyPresentableElementImpl result = new ArrayList(); if (items != null) { for (PyWithItem item : items) { - PyExpression targetExpression = item.getTargetExpression(); + PyExpression targetExpression = item.getTarget(); result.addAll(PyUtil.flattenedParensAndTuples(targetExpression)); } } diff --git a/python/testData/completion/withType.after.py b/python/testData/completion/withType.after.py new file mode 100644 index 000000000000..9c8bab5a705c --- /dev/null +++ b/python/testData/completion/withType.after.py @@ -0,0 +1,13 @@ +class Eggs(object): + def __enter__(self): + return u'foo' + + def __exit__(self, exc_type, exc_val, exc_tb): + pass + +class Spam(Eggs): + pass + +def f(): + with Spam() as spam: + spam.encode() diff --git a/python/testData/completion/withType.py b/python/testData/completion/withType.py new file mode 100644 index 000000000000..0734fea58af9 --- /dev/null +++ b/python/testData/completion/withType.py @@ -0,0 +1,13 @@ +class Eggs(object): + def __enter__(self): + return u'foo' + + def __exit__(self, exc_type, exc_val, exc_tb): + pass + +class Spam(Eggs): + pass + +def f(): + with Spam() as spam: + spam.enc diff --git a/python/testSrc/com/jetbrains/python/PythonCompletionTest.java b/python/testSrc/com/jetbrains/python/PythonCompletionTest.java index 5d295e23d52e..cb324f96d7da 100644 --- a/python/testSrc/com/jetbrains/python/PythonCompletionTest.java +++ b/python/testSrc/com/jetbrains/python/PythonCompletionTest.java @@ -177,7 +177,12 @@ public class PythonCompletionTest extends PyLightFixtureTestCase { doTest(); } - public void testReturnType() { + public void testReturnType() { + doTest(); + } + + public void testWithType() { // PY-4198 + setLanguageLevel(LanguageLevel.PYTHON26); doTest(); }