diff --git a/python/src/com/jetbrains/python/psi/impl/PyAssignmentStatementImpl.java b/python/src/com/jetbrains/python/psi/impl/PyAssignmentStatementImpl.java index effccff332b8..0a3c91cae5ab 100644 --- a/python/src/com/jetbrains/python/psi/impl/PyAssignmentStatementImpl.java +++ b/python/src/com/jetbrains/python/psi/impl/PyAssignmentStatementImpl.java @@ -27,6 +27,9 @@ import com.jetbrains.python.psi.*; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.util.ArrayList; +import java.util.List; + /** * Created by IntelliJ IDEA. * User: yole @@ -46,14 +49,16 @@ public class PyAssignmentStatementImpl extends PyElementImpl implements PyAssign public PyExpression[] getTargets() { final ASTNode[] nodes = getNode().getChildren(PyElementTypes.EXPRESSIONS); - if (nodes.length > 0) { - final PyExpression target = (PyExpression) nodes [0].getPsi(); - if (target instanceof PyTupleExpression) { - return ((PyTupleExpression) target).getElements(); + PyExpression[] psi_nodes = new PyExpression[nodes.length]; + for (int i = 0; i < nodes.length; i += 1) psi_nodes[i] = (PyExpression)nodes[i].getPsi(); + List candidates = PyUtil.flattenedParens(psi_nodes); // put all possible tuples to one level + List targets = new ArrayList(); + for (PyExpression expr : candidates) { // only filter out targets + if (expr instanceof PyTargetExpression) { + targets.add(expr); } - return new PyExpression[] { target }; } - return PyExpression.EMPTY_ARRAY; + return targets.toArray(new PyExpression[targets.size()]); } /** diff --git a/python/testData/resolve/MultiTarget.py b/python/testData/resolve/MultiTarget.py new file mode 100644 index 000000000000..f1e5ade71b16 --- /dev/null +++ b/python/testData/resolve/MultiTarget.py @@ -0,0 +1,2 @@ +aa = bb = cc = 1 +bb \ No newline at end of file diff --git a/python/testData/resolve/MultiTargetTuple.py b/python/testData/resolve/MultiTargetTuple.py new file mode 100644 index 000000000000..18a85ea7d1d3 --- /dev/null +++ b/python/testData/resolve/MultiTargetTuple.py @@ -0,0 +1,2 @@ +(aa, (bb, cc)) = (1, (2, 3)) +bb \ No newline at end of file diff --git a/python/testSrc/com/jetbrains/python/PyResolveTest.java b/python/testSrc/com/jetbrains/python/PyResolveTest.java index 2f92f4f29c09..cdd87dc77459 100644 --- a/python/testSrc/com/jetbrains/python/PyResolveTest.java +++ b/python/testSrc/com/jetbrains/python/PyResolveTest.java @@ -7,6 +7,7 @@ package com.jetbrains.python; import com.intellij.openapi.application.PathManager; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiReference; +import com.intellij.psi.util.PsiTreeUtil; import com.intellij.testFramework.ResolveTestCase; import com.jetbrains.python.psi.*; @@ -117,6 +118,20 @@ public class PyResolveTest extends ResolveTestCase { assertTrue(targetElement.getParent() instanceof PyAssignmentStatement); } + public void testMultiTarget() throws Exception { + PsiElement targetElement = resolve(); + assertTrue(targetElement instanceof PyTargetExpression); + assertTrue(targetElement.getParent() instanceof PyAssignmentStatement); + } + + public void testMultiTargetTuple() throws Exception { + PsiElement targetElement = resolve(); + assertTrue(targetElement instanceof PyTargetExpression); + assertNotNull(PsiTreeUtil.getParentOfType(targetElement, PyAssignmentStatement.class)); // it's deep in a tuple + } + + + @Override protected String getTestDataPath() { return PathManager.getHomePath() + "/plugins/python/testData/resolve/";