From 70efe3108fcaef982b37476e5d0cc87e6c045f7d Mon Sep 17 00:00:00 2001 From: Mikhail Golubev Date: Mon, 31 May 2021 13:59:50 +0300 Subject: [PATCH] PY-48008 Report missing subject expression in match statements GitOrigin-RevId: 2c49ea19ac0fb5bdda966e4077c45321c397df8a --- .../python/parsing/StatementParsing.java | 2 +- ...tternMatchingRecoveryNoSubjectAfterMatch.py | 3 +++ ...ternMatchingRecoveryNoSubjectAfterMatch.txt | 18 ++++++++++++++++++ .../python/parsing/PythonParsingTest.java | 4 ++++ 4 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 python/testData/psi/PatternMatchingRecoveryNoSubjectAfterMatch.py create mode 100644 python/testData/psi/PatternMatchingRecoveryNoSubjectAfterMatch.txt diff --git a/python/python-psi-impl/src/com/jetbrains/python/parsing/StatementParsing.java b/python/python-psi-impl/src/com/jetbrains/python/parsing/StatementParsing.java index 120b534083c3..a14e031f41af 100644 --- a/python/python-psi-impl/src/com/jetbrains/python/parsing/StatementParsing.java +++ b/python/python-psi-impl/src/com/jetbrains/python/parsing/StatementParsing.java @@ -147,7 +147,7 @@ public class StatementParsing extends Parsing implements ITokenTypeRemapper { SyntaxTreeBuilder.Marker mark = myBuilder.mark(); myBuilder.remapCurrentToken(PyTokenTypes.MATCH_KEYWORD); myBuilder.advanceLexer(); - myContext.getExpressionParser().parseTupleExpression(true, false, false); + myContext.getExpressionParser().parseExpression(); if (!matchToken(PyTokenTypes.COLON)) { mark.rollbackTo(); myBuilder.remapCurrentToken(PyTokenTypes.IDENTIFIER); diff --git a/python/testData/psi/PatternMatchingRecoveryNoSubjectAfterMatch.py b/python/testData/psi/PatternMatchingRecoveryNoSubjectAfterMatch.py new file mode 100644 index 000000000000..fd9962e971c2 --- /dev/null +++ b/python/testData/psi/PatternMatchingRecoveryNoSubjectAfterMatch.py @@ -0,0 +1,3 @@ +match: + case 1: + pass \ No newline at end of file diff --git a/python/testData/psi/PatternMatchingRecoveryNoSubjectAfterMatch.txt b/python/testData/psi/PatternMatchingRecoveryNoSubjectAfterMatch.txt new file mode 100644 index 000000000000..ba84b7f6d0b5 --- /dev/null +++ b/python/testData/psi/PatternMatchingRecoveryNoSubjectAfterMatch.txt @@ -0,0 +1,18 @@ +PyFile:PatternMatchingRecoveryNoSubjectAfterMatch.py + PyMatchStatement + PsiElement(Py:MATCH_KEYWORD)('match') + PsiErrorElement:Expression expected + + PsiElement(Py:COLON)(':') + PsiWhiteSpace('\n ') + PyCaseClause + PsiElement(Py:CASE_KEYWORD)('case') + PsiWhiteSpace(' ') + PyLiteralPattern + PyNumericLiteralExpression + PsiElement(Py:INTEGER_LITERAL)('1') + PsiElement(Py:COLON)(':') + PsiWhiteSpace('\n ') + PyStatementList + PyPassStatement + PsiElement(Py:PASS_KEYWORD)('pass') \ No newline at end of file diff --git a/python/testSrc/com/jetbrains/python/parsing/PythonParsingTest.java b/python/testSrc/com/jetbrains/python/parsing/PythonParsingTest.java index a6ff4d308f99..f7c59d6d8922 100644 --- a/python/testSrc/com/jetbrains/python/parsing/PythonParsingTest.java +++ b/python/testSrc/com/jetbrains/python/parsing/PythonParsingTest.java @@ -986,6 +986,10 @@ public class PythonParsingTest extends ParsingTestCase { doTest(LanguageLevel.PYTHON310); } + public void testPatternMatchingRecoveryNoSubjectAfterMatch() { + doTest(LanguageLevel.PYTHON310); + } + public void testPatternMatchingRecoveryNoPatternAfterCase() { doTest(LanguageLevel.PYTHON310); }