diff --git a/python/src/com/jetbrains/python/parsing/StatementParsing.java b/python/src/com/jetbrains/python/parsing/StatementParsing.java index 87c0b7d750a3..cd741c68a2d7 100644 --- a/python/src/com/jetbrains/python/parsing/StatementParsing.java +++ b/python/src/com/jetbrains/python/parsing/StatementParsing.java @@ -598,13 +598,17 @@ public class StatementParsing extends Parsing implements ITokenTypeRemapper { final PsiBuilder.Marker ifStatement = myBuilder.mark(); final PsiBuilder.Marker ifPart = myBuilder.mark(); myBuilder.advanceLexer(); - getExpressionParser().parseExpression(); + if (!getExpressionParser().parseSingleExpression(false)) { + myBuilder.error("expression expected"); + } parseColonAndSuite(scope); ifPart.done(PyElementTypes.IF_PART_IF); PsiBuilder.Marker elifPart = myBuilder.mark(); while (myBuilder.getTokenType() == elifKeyword) { myBuilder.advanceLexer(); - getExpressionParser().parseExpression(); + if (!getExpressionParser().parseSingleExpression(false)) { + myBuilder.error("expression expected"); + } parseColonAndSuite(scope); elifPart.done(PyElementTypes.IF_PART_ELIF); elifPart = myBuilder.mark(); @@ -628,11 +632,15 @@ public class StatementParsing extends Parsing implements ITokenTypeRemapper { return true; } final PsiBuilder.Marker marker = myBuilder.mark(); - if (myBuilder.getTokenType() == PyTokenTypes.STATEMENT_BREAK) { + while (!atAnyOfTokens(null, PyTokenTypes.DEDENT, PyTokenTypes.STATEMENT_BREAK, PyTokenTypes.COLON)) { + myBuilder.advanceLexer(); + } + boolean result = matchToken(PyTokenTypes.COLON); + if (!result && atToken(PyTokenTypes.STATEMENT_BREAK)) { myBuilder.advanceLexer(); } marker.error("Colon expected"); - return false; + return result; } private void parseForStatement(ParsingScope scope) { diff --git a/python/testData/psi/IfInList.py b/python/testData/psi/IfInList.py new file mode 100644 index 000000000000..ddf663c4144f --- /dev/null +++ b/python/testData/psi/IfInList.py @@ -0,0 +1,2 @@ +if "string" in "string", "string2": + pass \ No newline at end of file diff --git a/python/testData/psi/IfInList.txt b/python/testData/psi/IfInList.txt new file mode 100644 index 000000000000..a1c3cf5abb55 --- /dev/null +++ b/python/testData/psi/IfInList.txt @@ -0,0 +1,22 @@ +PyFile:IfInList.py + PyIfStatement + PyIfPartIf + PsiElement(Py:IF_KEYWORD)('if') + PsiWhiteSpace(' ') + PyBinaryExpression + PyStringLiteralExpression: string + PsiElement(Py:SINGLE_QUOTED_STRING)('"string"') + PsiWhiteSpace(' ') + PsiElement(Py:IN_KEYWORD)('in') + PsiWhiteSpace(' ') + PyStringLiteralExpression: string + PsiElement(Py:SINGLE_QUOTED_STRING)('"string"') + PsiErrorElement:Colon expected + PsiElement(Py:COMMA)(',') + PsiWhiteSpace(' ') + PsiElement(Py:SINGLE_QUOTED_STRING)('"string2"') + PsiElement(Py:COLON)(':') + PsiWhiteSpace('\n ') + PyStatementList + PyPassStatement + PsiElement(Py:PASS_KEYWORD)('pass') \ No newline at end of file diff --git a/python/testData/psi/WithStatement2.txt b/python/testData/psi/WithStatement2.txt index b5a8e6236750..eb9c941de5c3 100644 --- a/python/testData/psi/WithStatement2.txt +++ b/python/testData/psi/WithStatement2.txt @@ -73,13 +73,8 @@ PyFile:WithStatement2.py PsiErrorElement:expression expected PsiErrorElement:Colon expected - + PsiElement(Py:EQ)('=') + PsiWhiteSpace(' ') + PsiElement(Py:INTEGER_LITERAL)('1') PyStatementList - - PsiElement(Py:EQ)('=') - PsiErrorElement:Statement expected, found Py:EQ - - PsiWhiteSpace(' ') - PyExpressionStatement - PyNumericLiteralExpression - PsiElement(Py:INTEGER_LITERAL)('1') \ No newline at end of file + \ 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 9bd47d4b3065..967cfa13bfc9 100644 --- a/python/testSrc/com/jetbrains/python/PythonParsingTest.java +++ b/python/testSrc/com/jetbrains/python/PythonParsingTest.java @@ -418,6 +418,10 @@ public class PythonParsingTest extends ParsingTestCase { doTest(); } + public void testIfInList() { // PY-9561 + doTest(); + } + public void doTest(LanguageLevel languageLevel) { LanguageLevel prev = myLanguageLevel; myLanguageLevel = languageLevel;