diff --git a/python/src/com/jetbrains/python/parsing/StatementParsing.java b/python/src/com/jetbrains/python/parsing/StatementParsing.java index f39f098014d3..d6bf62606e93 100644 --- a/python/src/com/jetbrains/python/parsing/StatementParsing.java +++ b/python/src/com/jetbrains/python/parsing/StatementParsing.java @@ -551,17 +551,13 @@ public class StatementParsing extends Parsing implements ITokenTypeRemapper { final PsiBuilder.Marker ifPart = myBuilder.mark(); myBuilder.advanceLexer(); getExpressionParser().parseExpression(); - if (expectColon()) { - parseSuite(scope); - } + parseColonAndSuite(scope); ifPart.done(PyElementTypes.IF_PART_IF); PsiBuilder.Marker elifPart = myBuilder.mark(); while (myBuilder.getTokenType() == elifKeyword) { myBuilder.advanceLexer(); getExpressionParser().parseExpression(); - if (expectColon()) { - parseSuite(scope); - } + parseColonAndSuite(scope); elifPart.done(PyElementTypes.IF_PART_ELIF); elifPart = myBuilder.mark(); } @@ -569,9 +565,7 @@ public class StatementParsing extends Parsing implements ITokenTypeRemapper { final PsiBuilder.Marker elsePart = myBuilder.mark(); if (myBuilder.getTokenType() == elseKeyword) { myBuilder.advanceLexer(); - if (expectColon()) { - parseSuite(scope); - } + parseColonAndSuite(scope); elsePart.done(PyElementTypes.ELSE_PART); } else elsePart.drop(); @@ -598,9 +592,7 @@ public class StatementParsing extends Parsing implements ITokenTypeRemapper { final PsiBuilder.Marker elsePart = myBuilder.mark(); if (myBuilder.getTokenType() == PyTokenTypes.ELSE_KEYWORD) { myBuilder.advanceLexer(); - if (expectColon()) { - parseSuite(scope); - } + parseColonAndSuite(scope); elsePart.done(PyElementTypes.ELSE_PART); } else elsePart.drop(); @@ -613,9 +605,7 @@ public class StatementParsing extends Parsing implements ITokenTypeRemapper { getExpressionParser().parseExpression(true, true); checkMatches(PyTokenTypes.IN_KEYWORD, "'in' expected"); getExpressionParser().parseExpression(); - if (expectColon()) { - parseSuite(scope); - } + parseColonAndSuite(scope); forPart.done(PyElementTypes.FOR_PART); } @@ -627,16 +617,12 @@ public class StatementParsing extends Parsing implements ITokenTypeRemapper { if (!getExpressionParser().parseSingleExpression(false)) { myBuilder.error("expression expected"); } - if (expectColon()) { - parseSuite(scope); - } + parseColonAndSuite(scope); whilePart.done(PyElementTypes.WHILE_PART); final PsiBuilder.Marker elsePart = myBuilder.mark(); if (myBuilder.getTokenType() == PyTokenTypes.ELSE_KEYWORD) { myBuilder.advanceLexer(); - if (expectColon()) { - parseSuite(scope); - } + parseColonAndSuite(scope); elsePart.done(PyElementTypes.ELSE_PART); } else elsePart.drop(); @@ -648,9 +634,7 @@ public class StatementParsing extends Parsing implements ITokenTypeRemapper { final PsiBuilder.Marker statement = myBuilder.mark(); final PsiBuilder.Marker tryPart = myBuilder.mark(); myBuilder.advanceLexer(); - if (expectColon()) { - parseSuite(scope); - } + parseColonAndSuite(scope); tryPart.done(PyElementTypes.TRY_PART); boolean haveExceptClause = false; if (myBuilder.getTokenType() == PyTokenTypes.EXCEPT_KEYWORD) { @@ -670,17 +654,13 @@ public class StatementParsing extends Parsing implements ITokenTypeRemapper { } } } - if (expectColon()) { - parseSuite(scope); - } + parseColonAndSuite(scope); exceptBlock.done(PyElementTypes.EXCEPT_PART); } final PsiBuilder.Marker elsePart = myBuilder.mark(); if (myBuilder.getTokenType() == PyTokenTypes.ELSE_KEYWORD) { myBuilder.advanceLexer(); - if (expectColon()) { - parseSuite(scope); - } + parseColonAndSuite(scope); elsePart.done(PyElementTypes.ELSE_PART); } else elsePart.drop(); @@ -688,9 +668,7 @@ public class StatementParsing extends Parsing implements ITokenTypeRemapper { final PsiBuilder.Marker finallyPart = myBuilder.mark(); if (myBuilder.getTokenType() == PyTokenTypes.FINALLY_KEYWORD) { myBuilder.advanceLexer(); - if (expectColon()) { - parseSuite(scope); - } + parseColonAndSuite(scope); finallyPart.done(PyElementTypes.FINALLY_PART); } else { @@ -704,6 +682,16 @@ public class StatementParsing extends Parsing implements ITokenTypeRemapper { statement.done(PyElementTypes.TRY_EXCEPT_STATEMENT); } + private void parseColonAndSuite(ParsingScope scope) { + if (expectColon()) { + parseSuite(scope); + } + else { + final PsiBuilder.Marker mark = myBuilder.mark(); + mark.done(PyElementTypes.STATEMENT_LIST); + } + } + private void parseWithStatement(ParsingScope scope) { assertCurrentToken(PyTokenTypes.WITH_KEYWORD); final PsiBuilder.Marker statement = myBuilder.mark(); @@ -721,9 +709,7 @@ public class StatementParsing extends Parsing implements ITokenTypeRemapper { break; } } - if (expectColon()) { - parseSuite(scope); - } + parseColonAndSuite(scope); statement.done(PyElementTypes.WITH_STATEMENT); } @@ -743,13 +729,7 @@ public class StatementParsing extends Parsing implements ITokenTypeRemapper { final PsiBuilder.Marker inheritMarker = myBuilder.mark(); inheritMarker.done(PyElementTypes.ARGUMENT_LIST); } - if (expectColon()) { - parseSuite(scope.withClass(true)); - } - else { - final PsiBuilder.Marker mark = myBuilder.mark(); - mark.done(PyElementTypes.STATEMENT_LIST); - } + parseColonAndSuite(scope.withClass(true)); classMarker.done(PyElementTypes.CLASS_DECLARATION); } diff --git a/python/testData/psi/IncompleteFor.txt b/python/testData/psi/IncompleteFor.txt index 8f7cfead6965..f785bb5d0cc0 100644 --- a/python/testData/psi/IncompleteFor.txt +++ b/python/testData/psi/IncompleteFor.txt @@ -22,6 +22,8 @@ PyFile:IncompleteFor.py PsiElement(Py:IDENTIFIER)('ba') PsiErrorElement:colon expected + PyStatementList + PsiWhiteSpace('\n\n') PyFunction('bar') PsiElement(Py:DEF_KEYWORD)('def') diff --git a/python/testData/psi/IncompleteStatementList.txt b/python/testData/psi/IncompleteStatementList.txt index b0dd35773fe8..89aa12e134d4 100644 --- a/python/testData/psi/IncompleteStatementList.txt +++ b/python/testData/psi/IncompleteStatementList.txt @@ -17,6 +17,8 @@ PyFile:IncompleteStatementList.py PsiElement(Py:IDENTIFIER)('ba') PsiErrorElement:colon expected + PyStatementList + PsiWhiteSpace('\n\n') PyFunction('bar') PsiElement(Py:DEF_KEYWORD)('def') diff --git a/python/testData/psi/MissingParenInCall.txt b/python/testData/psi/MissingParenInCall.txt index 097c88c84de4..01190ffc3dc4 100644 --- a/python/testData/psi/MissingParenInCall.txt +++ b/python/testData/psi/MissingParenInCall.txt @@ -28,7 +28,9 @@ PyFile:MissingParenInCall.py PsiErrorElement:colon expected - PsiWhiteSpace('\n\n') + PsiWhiteSpace('\n\n') + PyStatementList + PyFunction('clean') PsiElement(Py:DEF_KEYWORD)('def') PsiWhiteSpace(' ') diff --git a/python/testData/psi/WithStatement2.txt b/python/testData/psi/WithStatement2.txt index baed0b3d3bb4..e40654dfa532 100644 --- a/python/testData/psi/WithStatement2.txt +++ b/python/testData/psi/WithStatement2.txt @@ -74,6 +74,8 @@ PyFile:WithStatement2.py PsiErrorElement:colon expected + PyStatementList + PsiElement(Py:EQ)('=') PsiErrorElement:statement expected, found Py:EQ