diff --git a/python/src/com/jetbrains/python/parsing/ExpressionParsing.java b/python/src/com/jetbrains/python/parsing/ExpressionParsing.java index ccb3b3e14a0e..3f5d29ce0336 100644 --- a/python/src/com/jetbrains/python/parsing/ExpressionParsing.java +++ b/python/src/com/jetbrains/python/parsing/ExpressionParsing.java @@ -972,12 +972,21 @@ public class ExpressionParsing extends Parsing { private boolean parseAwaitExpression(boolean isTargetExpression) { if (atToken(PyTokenTypes.AWAIT_KEYWORD)) { - PsiBuilder.Marker expr = myBuilder.mark(); + final PsiBuilder.Marker expr = myBuilder.mark(); myBuilder.advanceLexer(); + if (!parseMemberExpression(isTargetExpression)) { myBuilder.error(message("PARSE.expected.expression")); + expr.done(PyElementTypes.PREFIX_EXPRESSION); } - expr.done(PyElementTypes.PREFIX_EXPRESSION); + else { + if (isTargetExpression) { + expr.error("can't assign to await expression"); + } else { + expr.done(PyElementTypes.PREFIX_EXPRESSION); + } + } + return true; } else { diff --git a/python/testData/psi/Await.py b/python/testData/psi/Await.py index 58bfdcaaa1dd..d9424579cea1 100644 --- a/python/testData/psi/Await.py +++ b/python/testData/psi/Await.py @@ -2,4 +2,9 @@ async def f(x): await x +async def g(y): + await x = 5 + await y + + await = 1 diff --git a/python/testData/psi/Await.txt b/python/testData/psi/Await.txt index 9b5ee093ceb9..931213f93258 100644 --- a/python/testData/psi/Await.txt +++ b/python/testData/psi/Await.txt @@ -20,6 +20,39 @@ PyFile:Await.py PyReferenceExpression: x PsiElement(Py:IDENTIFIER)('x') PsiWhiteSpace('\n\n\n') + PyFunction('g') + PsiElement(Py:ASYNC_KEYWORD)('async') + PsiWhiteSpace(' ') + PsiElement(Py:DEF_KEYWORD)('def') + PsiWhiteSpace(' ') + PsiElement(Py:IDENTIFIER)('g') + PyParameterList + PsiElement(Py:LPAR)('(') + PyNamedParameter('y') + PsiElement(Py:IDENTIFIER)('y') + PsiElement(Py:RPAR)(')') + PsiElement(Py:COLON)(':') + PsiWhiteSpace('\n ') + PyStatementList + PyAssignmentStatement + PsiErrorElement:can't assign to await expression + PsiElement(Py:AWAIT_KEYWORD)('await') + PsiWhiteSpace(' ') + PyTargetExpression: x + PsiElement(Py:IDENTIFIER)('x') + PsiWhiteSpace(' ') + PsiElement(Py:EQ)('=') + PsiWhiteSpace(' ') + PyNumericLiteralExpression + PsiElement(Py:INTEGER_LITERAL)('5') + PsiWhiteSpace('\n ') + PyExpressionStatement + PyPrefixExpression + PsiElement(Py:AWAIT_KEYWORD)('await') + PsiWhiteSpace(' ') + PyReferenceExpression: y + PsiElement(Py:IDENTIFIER)('y') + PsiWhiteSpace('\n\n\n') PyAssignmentStatement PyTargetExpression: await PsiElement(Py:IDENTIFIER)('await')