include empty statement list in PSI if colon is missing (EA-31846 - RE: PyBaseElementImpl.childToPsiNotNull)

This commit is contained in:
Dmitry Jemerov
2011-11-21 18:41:38 +01:00
parent 13dcd27170
commit b670fc8c7f
5 changed files with 32 additions and 44 deletions
@@ -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);
}
+2
View File
@@ -22,6 +22,8 @@ PyFile:IncompleteFor.py
PsiElement(Py:IDENTIFIER)('ba')
PsiErrorElement:colon expected
<empty list>
PyStatementList
<empty list>
PsiWhiteSpace('\n\n')
PyFunction('bar')
PsiElement(Py:DEF_KEYWORD)('def')
@@ -17,6 +17,8 @@ PyFile:IncompleteStatementList.py
PsiElement(Py:IDENTIFIER)('ba')
PsiErrorElement:colon expected
<empty list>
PyStatementList
<empty list>
PsiWhiteSpace('\n\n')
PyFunction('bar')
PsiElement(Py:DEF_KEYWORD)('def')
+3 -1
View File
@@ -28,7 +28,9 @@ PyFile:MissingParenInCall.py
<empty list>
PsiErrorElement:colon expected
<empty list>
PsiWhiteSpace('\n\n')
PsiWhiteSpace('\n\n')
PyStatementList
<empty list>
PyFunction('clean')
PsiElement(Py:DEF_KEYWORD)('def')
PsiWhiteSpace(' ')
+2
View File
@@ -74,6 +74,8 @@ PyFile:WithStatement2.py
<empty list>
PsiErrorElement:colon expected
<empty list>
PyStatementList
<empty list>
PsiElement(Py:EQ)('=')
PsiErrorElement:statement expected, found Py:EQ
<empty list>