diff --git a/python/src/com/jetbrains/python/console/PyConsoleEnterHandler.kt b/python/src/com/jetbrains/python/console/PyConsoleEnterHandler.kt index 75dce0ce2116..0c3ae06730e9 100644 --- a/python/src/com/jetbrains/python/console/PyConsoleEnterHandler.kt +++ b/python/src/com/jetbrains/python/console/PyConsoleEnterHandler.kt @@ -32,6 +32,7 @@ import com.intellij.util.DocumentUtil import com.jetbrains.python.PyTokenTypes import com.jetbrains.python.psi.PyStatementListContainer import com.jetbrains.python.psi.PyStringLiteralExpression +import com.jetbrains.python.psi.PyTryPart import com.jetbrains.python.psi.impl.PyPsiUtils import com.jetbrains.python.psi.impl.PyStringLiteralExpressionImpl @@ -82,11 +83,11 @@ class PyConsoleEnterHandler { } private fun checkComplete(el: PsiElement): Boolean { + if (!el.isValid) return false val compoundStatement = PsiTreeUtil.getParentOfType(el, PyStatementListContainer::class.java) - if (compoundStatement != null) { + if (compoundStatement != null && compoundStatement !is PyTryPart) { return compoundStatement.statementList.statements.size != 0 } - if (el.parent == null) return false val topLevel = PyPsiUtils.getParentRightBefore(el, el.containingFile) return topLevel != null && !PsiTreeUtil.hasErrorElements(topLevel) } diff --git a/python/testSrc/com/jetbrains/python/PyConsoleEnterHandlerTest.kt b/python/testSrc/com/jetbrains/python/PyConsoleEnterHandlerTest.kt index dfb851f2738d..188374afef53 100644 --- a/python/testSrc/com/jetbrains/python/PyConsoleEnterHandlerTest.kt +++ b/python/testSrc/com/jetbrains/python/PyConsoleEnterHandlerTest.kt @@ -121,6 +121,57 @@ class PyConsoleEnterHandlerTest : PyTestCase() { assertTrue(push("")) } + fun testTryExcept() { + assertFalse(push("try:")) + assertFalse(push("")) + assertFalse(push("")) + assertFalse(push("\ta = 1")) + assertFalse(push("")) + assertFalse(push("")) + assertFalse(push("except:")) + assertFalse(push("")) + assertFalse(push("")) + assertFalse(push("\tprint('hi!')")) + assertTrue(push("")) + } + + fun testBackSlash() { + assertFalse(push("if True and \\")) + assertFalse(push("\tTrue:")) + assertFalse(push("\ta = 1")) + assertTrue(push("")) + } + + fun testMultipleBackSlash() { + assertFalse(push("if\\")) + assertFalse(push("\tTrue\\")) + assertFalse(push("\t:\\")) + assertFalse(push("")) + assertFalse(push("\ta = \\")) + assertFalse(push("\t1")) + assertTrue(push("")) + } + + fun testDocstringDouble() { + assertFalse(push("a = \"\"\"test")) + assertFalse(push("second")) + assertTrue(push("third\"\"\"")) + } + + fun testDocstring() { + assertFalse(push("a = '''test")) + assertFalse(push("second")) + assertTrue(push("third'''")) + } + + fun testFunction() { + assertFalse(push("def foo():")) + assertFalse(push("")) + assertFalse(push("\ta = 1")) + assertFalse(push("\treturn 'hi!'")) + assertTrue(push("")) + } + override fun tearDown() { Disposer.dispose(testRootDisposable) super.tearDown()