diff --git a/python/src/com/jetbrains/python/parsing/ExpressionParsing.java b/python/src/com/jetbrains/python/parsing/ExpressionParsing.java index 2de400cd57b6..e597bf45096e 100644 --- a/python/src/com/jetbrains/python/parsing/ExpressionParsing.java +++ b/python/src/com/jetbrains/python/parsing/ExpressionParsing.java @@ -325,7 +325,7 @@ public class ExpressionParsing extends Parsing { parseSliceEnd(expr, sliceItemStart); } else { - parseSingleExpression(false, true); + boolean hadExpression = parseSingleExpression(false, true); if (atToken(PyTokenTypes.COLON)) { sliceOrTupleStart.drop(); parseSliceEnd(expr, sliceItemStart); @@ -342,6 +342,9 @@ public class ExpressionParsing extends Parsing { } } else { + if (!hadExpression) { + myBuilder.error("expression expected"); + } sliceOrTupleStart.drop(); sliceItemStart.drop(); checkMatches(PyTokenTypes.RBRACKET, message("PARSE.expected.rbracket")); diff --git a/python/testData/inspections/PyTypeCheckerInspection/BadSubscriptExpression.py b/python/testData/inspections/PyTypeCheckerInspection/BadSubscriptExpression.py index c46bf665b27c..c332be9f7d66 100644 --- a/python/testData/inspections/PyTypeCheckerInspection/BadSubscriptExpression.py +++ b/python/testData/inspections/PyTypeCheckerInspection/BadSubscriptExpression.py @@ -1,4 +1,4 @@ def test(): x = r"""\x"" - r"""[\t\r\v]""" + r"""[\t\r\v]""" """ diff --git a/python/testData/psi/EmptySubscription.py b/python/testData/psi/EmptySubscription.py new file mode 100644 index 000000000000..6da5f0e99040 --- /dev/null +++ b/python/testData/psi/EmptySubscription.py @@ -0,0 +1 @@ +s = ''[] diff --git a/python/testData/psi/EmptySubscription.txt b/python/testData/psi/EmptySubscription.txt new file mode 100644 index 000000000000..8cdffcb9a216 --- /dev/null +++ b/python/testData/psi/EmptySubscription.txt @@ -0,0 +1,14 @@ +PyFile:EmptySubscription.py + PyAssignmentStatement + PyTargetExpression: s + PsiElement(Py:IDENTIFIER)('s') + PsiWhiteSpace(' ') + PsiElement(Py:EQ)('=') + PsiWhiteSpace(' ') + PySubscriptionExpression + PyStringLiteralExpression: + PsiElement(Py:SINGLE_QUOTED_STRING)('''') + PsiElement(Py:LBRACKET)('[') + PsiErrorElement:expression expected + + PsiElement(Py:RBRACKET)(']') \ No newline at end of file diff --git a/python/testSrc/com/jetbrains/python/PythonParsingTest.java b/python/testSrc/com/jetbrains/python/PythonParsingTest.java index 2b6f511eb655..4cdd61188e8f 100644 --- a/python/testSrc/com/jetbrains/python/PythonParsingTest.java +++ b/python/testSrc/com/jetbrains/python/PythonParsingTest.java @@ -370,6 +370,10 @@ public class PythonParsingTest extends ParsingTestCase { doTest(); } + public void testEmptySubscription() { // PY-8652 + doTest(); + } + public void doTest(LanguageLevel languageLevel) { LanguageLevel prev = myLanguageLevel; myLanguageLevel = languageLevel;