From 8f80611a9cd38c88423d4941034d9eae689328d9 Mon Sep 17 00:00:00 2001 From: Dmitry Cheryasov Date: Sat, 19 Dec 2009 06:32:10 +0200 Subject: [PATCH] Fixes PY-253: foo[1]=2 now has foo as reference, not target --- .../python/parsing/ExpressionParsing.java | 6 ++++++ python/testData/psi/SubscribedAssignmentLHS.py | 1 + python/testData/psi/SubscribedAssignmentLHS.txt | 14 ++++++++++++++ .../com/jetbrains/python/PythonParsingTest.java | 4 ++++ 4 files changed, 25 insertions(+) create mode 100644 python/testData/psi/SubscribedAssignmentLHS.py create mode 100644 python/testData/psi/SubscribedAssignmentLHS.txt diff --git a/python/src/com/jetbrains/python/parsing/ExpressionParsing.java b/python/src/com/jetbrains/python/parsing/ExpressionParsing.java index 0c60f8be21f6..dc41d743c04f 100644 --- a/python/src/com/jetbrains/python/parsing/ExpressionParsing.java +++ b/python/src/com/jetbrains/python/parsing/ExpressionParsing.java @@ -257,6 +257,11 @@ public class ExpressionParsing extends Parsing { else { checkMatches(PyTokenTypes.RBRACKET, message("PARSE.expected.rbracket")); expr.done(PyElementTypes.SUBSCRIPTION_EXPRESSION); + if (first_identifier_is_target) { + recast_first_identifier = true; // subscription is always a reference + expr.rollbackTo(); + break; + } } } expr = expr.precede(); @@ -265,6 +270,7 @@ public class ExpressionParsing extends Parsing { expr.drop(); break; } + recast_first_identifier = false; // it is true only after a break; normal flow always unsets it. } } while (recast_first_identifier); diff --git a/python/testData/psi/SubscribedAssignmentLHS.py b/python/testData/psi/SubscribedAssignmentLHS.py new file mode 100644 index 000000000000..9d9d6c15e721 --- /dev/null +++ b/python/testData/psi/SubscribedAssignmentLHS.py @@ -0,0 +1 @@ +a[1] = 2 diff --git a/python/testData/psi/SubscribedAssignmentLHS.txt b/python/testData/psi/SubscribedAssignmentLHS.txt new file mode 100644 index 000000000000..cb659f951426 --- /dev/null +++ b/python/testData/psi/SubscribedAssignmentLHS.txt @@ -0,0 +1,14 @@ +PyFile:SubscribedAssignmentLHS.py(0,8) + PyAssignmentStatement(0,8) + PySubscriptionExpression(0,4) + PyReferenceExpression: a(0,1) + PsiElement(Py:IDENTIFIER)('a')(0,1) + PsiElement(Py:LBRACKET)('[')(1,2) + PyNumericLiteralExpression(2,3) + PsiElement(Py:INTEGER_LITERAL)('1')(2,3) + PsiElement(Py:RBRACKET)(']')(3,4) + PsiWhiteSpace(' ')(4,5) + PsiElement(Py:EQ)('=')(5,6) + PsiWhiteSpace(' ')(6,7) + PyNumericLiteralExpression(7,8) + PsiElement(Py:INTEGER_LITERAL)('2')(7,8) diff --git a/python/testSrc/com/jetbrains/python/PythonParsingTest.java b/python/testSrc/com/jetbrains/python/PythonParsingTest.java index 89d740046de6..7bfe9abdafe6 100644 --- a/python/testSrc/com/jetbrains/python/PythonParsingTest.java +++ b/python/testSrc/com/jetbrains/python/PythonParsingTest.java @@ -26,6 +26,10 @@ public class PythonParsingTest extends ParsingTestCase { doTest(true); } + public void testSubscribedAssignmentLHS() throws Exception { + doTest(true); + } + public void testConditionalParenLambda() throws Exception { doTest(true); }