mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
better parser error recovery for keyword as default argument value (PY-3713)
This commit is contained in:
@@ -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();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user