PY-31442 In recovery phase of the parser treat FSTRING_END as STATEMENT_BREAK

This token shouldn't get under PsiError node and must be propagated further up
to properly terminate containing f-string.
This commit is contained in:
Mikhail Golubev
2018-10-01 12:46:47 +03:00
parent 16dea81d1a
commit c5f0bde323
4 changed files with 43 additions and 1 deletions
@@ -422,7 +422,8 @@ public class ExpressionParsing extends Parsing {
while (!myBuilder.eof() &&
myBuilder.getTokenType() != PyTokenTypes.RPAR &&
myBuilder.getTokenType() != PyTokenTypes.LINE_BREAK &&
myBuilder.getTokenType() != PyTokenTypes.STATEMENT_BREAK) {
myBuilder.getTokenType() != PyTokenTypes.STATEMENT_BREAK &&
myBuilder.getTokenType() != PyTokenTypes.FSTRING_END) {
myBuilder.advanceLexer();
empty = false;
}
@@ -0,0 +1 @@
s = f'{ (lambda x: 'foo') }'
@@ -0,0 +1,36 @@
PyFile:MultilineFStringTerminatedByQuotesInsideParenthesizedExpression.py
PyAssignmentStatement
PyTargetExpression: s
PsiElement(Py:IDENTIFIER)('s')
PsiWhiteSpace(' ')
PsiElement(Py:EQ)('=')
PsiWhiteSpace(' ')
PyStringLiteralExpression: { (lambda x:
PyFormattedStringNode
PsiElement(Py:FSTRING_START)('f'')
PyFStringFragment
PsiElement(Py:FSTRING_FRAGMENT_START)('{')
PsiWhiteSpace(' ')
PyParenthesizedExpression
PsiElement(Py:LPAR)('(')
PyLambdaExpression
PsiElement(Py:LAMBDA_KEYWORD)('lambda')
PsiWhiteSpace(' ')
PyParameterList
PyNamedParameter('x')
PsiElement(Py:IDENTIFIER)('x')
PsiElement(Py:COLON)(':')
PsiErrorElement:expression expected
<empty list>
PsiWhiteSpace(' ')
PsiElement(Py:FSTRING_END)(''')
PsiErrorElement:End of statement expected
<empty list>
PyExpressionStatement
PyReferenceExpression: foo
PsiElement(Py:IDENTIFIER)('foo')
PsiErrorElement:End of statement expected
<empty list>
PyExpressionStatement
PyStringLiteralExpression: ) }
PsiElement(Py:SINGLE_QUOTED_STRING)('') }'')
@@ -725,6 +725,10 @@ public class PythonParsingTest extends ParsingTestCase {
doTest(LanguageLevel.PYTHON36);
}
public void testMultilineFStringTerminatedByQuotesInsideParenthesizedExpression() {
doTest(LanguageLevel.PYTHON36);
}
public void testMultilineFStringContainingMultilineExpression() {
doTest(LanguageLevel.PYTHON36);
}