better parser error recovery for keyword as default argument value (PY-3713)

This commit is contained in:
Dmitry Jemerov
2011-06-28 21:26:20 +02:00
parent 10c5c2a792
commit eaffdced8e
5 changed files with 41 additions and 1 deletions
@@ -150,7 +150,11 @@ public class FunctionParsing extends Parsing {
}
if (!isStarParameter && matchToken(PyTokenTypes.EQ)) {
if (!getExpressionParser().parseSingleExpression(false)) {
myBuilder.error(message("PARSE.expected.expression"));
PsiBuilder.Marker invalidElements = myBuilder.mark();
while(!atAnyOfTokens(endToken, PyTokenTypes.LINE_BREAK, PyTokenTypes.COMMA, null)) {
nextToken();
}
invalidElements.error(message("PARSE.expected.expression"));
}
}
parameter.done(PyElementTypes.NAMED_PARAMETER);
@@ -62,6 +62,14 @@ public class Parsing {
return myBuilder.getTokenType() == tokenType;
}
protected boolean atAnyOfTokens(final IElementType... tokenTypes) {
IElementType currentTokenType = myBuilder.getTokenType();
for (IElementType tokenType : tokenTypes) {
if (currentTokenType == tokenType) return true;
}
return false;
}
protected boolean matchToken(final IElementType tokenType) {
if (myBuilder.getTokenType() == tokenType) {
myBuilder.advanceLexer();
@@ -0,0 +1,2 @@
def select2(self, fields=from):
pass
@@ -0,0 +1,22 @@
PyFile:KeywordAsDefaultParameterValue.py
PyFunction('select2')
PsiElement(Py:DEF_KEYWORD)('def')
PsiWhiteSpace(' ')
PsiElement(Py:IDENTIFIER)('select2')
PyParameterList
PsiElement(Py:LPAR)('(')
PyNamedParameter('self')
PsiElement(Py:IDENTIFIER)('self')
PsiElement(Py:COMMA)(',')
PsiWhiteSpace(' ')
PyNamedParameter('fields')
PsiElement(Py:IDENTIFIER)('fields')
PsiElement(Py:EQ)('=')
PsiErrorElement:expression expected
PsiElement(Py:FROM_KEYWORD)('from')
PsiElement(Py:RPAR)(')')
PsiElement(Py:COLON)(':')
PsiWhiteSpace('\n ')
PyStatementList
PyPassStatement
PsiElement(Py:PASS_KEYWORD)('pass')
@@ -271,6 +271,10 @@ public class PythonParsingTest extends ParsingTestCase {
doTest();
}
public void testKeywordAsDefaultParameterValue() { // PY-3713
doTest();
}
public void testTrailingCommaInArgList() { // PY-4016
doTest();
}