diff --git a/python/src/com/jetbrains/python/psi/impl/PyAssignmentStatementImpl.java b/python/src/com/jetbrains/python/psi/impl/PyAssignmentStatementImpl.java index 93c431612cf0..a91cb53cc5a7 100644 --- a/python/src/com/jetbrains/python/psi/impl/PyAssignmentStatementImpl.java +++ b/python/src/com/jetbrains/python/psi/impl/PyAssignmentStatementImpl.java @@ -148,7 +148,14 @@ public class PyAssignmentStatementImpl extends PyElementImpl implements PyAssign PySequenceExpression rhs_tuple = null; PyExpression rhs_one = null; - if (rhs instanceof PySequenceExpression) rhs_tuple = (PySequenceExpression)rhs; + if (rhs instanceof PyParenthesizedExpression) { + PyExpression exp = ((PyParenthesizedExpression)rhs).getContainedExpression(); + if (exp instanceof PyTupleExpression) + rhs_tuple = (PySequenceExpression)exp; + else + rhs_one = rhs; + } + else if (rhs instanceof PySequenceExpression) rhs_tuple = (PySequenceExpression)rhs; else if (rhs != null) rhs_one = rhs; // if (lhs_one != null) { // single LHS, single RHS (direct mapping) or multiple RHS (packing) diff --git a/python/testData/psi/assignment/ParenthesizedTuple.py b/python/testData/psi/assignment/ParenthesizedTuple.py new file mode 100644 index 000000000000..36a8ea4c10a0 --- /dev/null +++ b/python/testData/psi/assignment/ParenthesizedTuple.py @@ -0,0 +1 @@ +a, b = (1, 2) \ No newline at end of file diff --git a/python/testSrc/com/jetbrains/python/PyAssignmentMappingTest.java b/python/testSrc/com/jetbrains/python/PyAssignmentMappingTest.java index ec48f8d0dc6f..9020777e8d45 100644 --- a/python/testSrc/com/jetbrains/python/PyAssignmentMappingTest.java +++ b/python/testSrc/com/jetbrains/python/PyAssignmentMappingTest.java @@ -112,6 +112,30 @@ public class PyAssignmentMappingTest extends LightMarkedTestCase { } } + public void testParenthesizedTuple() throws Exception { //PY-2648 + Map marks = loadTest(); + final int PAIR_NUM = 2; + assertEquals(PAIR_NUM*2, marks.size()); + PsiElement[] srcs = new PsiElement[PAIR_NUM]; + PsiElement[] dsts = new PsiElement[PAIR_NUM]; + for (int i=0; i").getParent(); // ident -> target expr + assertTrue(dst instanceof PyTargetExpression); + dsts[i] = dst; + PsiElement src = marks.get("").getParent(); // ident -> target expr + assertTrue(src instanceof PyExpression); + srcs[i] = src; + } + PyAssignmentStatement stmt = (PyAssignmentStatement)srcs[0].getParent().getParent().getParent(); // tuple expr -> assignment + List> mapping = stmt.getTargetsToValuesMapping(); + assertEquals(PAIR_NUM, mapping.size()); + for (int i=0; i pair = mapping.get(i); + assertEquals(dsts[i], pair.getFirst()); + assertEquals(srcs[i], pair.getSecond()); + } + } + public void testTuplePack() throws Exception { Map marks = loadTest(); final int SRC_NUM = 2;