From 33ebe6d7ee797fa22a80b1cf6f800cba82bd9b63 Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Tue, 27 Jul 2010 20:50:25 +0400 Subject: [PATCH] LHS of assignment expression can be any sequence, not just a tuple (PY-1419) --- .../psi/impl/PyAssignmentStatementImpl.java | 19 +++++++++---------- python/testData/resolve/ListAssignment.py | 3 +++ .../com/jetbrains/python/PyResolveTest.java | 9 +++++++-- 3 files changed, 19 insertions(+), 12 deletions(-) create mode 100644 python/testData/resolve/ListAssignment.py diff --git a/python/src/com/jetbrains/python/psi/impl/PyAssignmentStatementImpl.java b/python/src/com/jetbrains/python/psi/impl/PyAssignmentStatementImpl.java index 94df95b61115..670c6f856e59 100644 --- a/python/src/com/jetbrains/python/psi/impl/PyAssignmentStatementImpl.java +++ b/python/src/com/jetbrains/python/psi/impl/PyAssignmentStatementImpl.java @@ -4,8 +4,6 @@ import com.intellij.lang.ASTNode; import com.intellij.openapi.util.Pair; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiErrorElement; -import com.intellij.psi.ResolveState; -import com.intellij.psi.scope.PsiScopeProcessor; import com.intellij.psi.tree.TokenSet; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.util.SmartList; @@ -17,6 +15,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; /** @@ -72,8 +71,8 @@ public class PyAssignmentStatementImpl extends PyElementImpl implements PyAssign if (psi instanceof PyParenthesizedExpression) { addCandidate(candidates, ((PyParenthesizedExpression)psi).getContainedExpression()); } - else if (psi instanceof PyTupleExpression) { - final PyExpression[] pyExpressions = ((PyTupleExpression)psi).getElements(); + else if (psi instanceof PySequenceExpression) { + final PyExpression[] pyExpressions = ((PySequenceExpression)psi).getElements(); for (PyExpression pyExpression : pyExpressions) { addCandidate(candidates, pyExpression); } @@ -123,14 +122,14 @@ public class PyAssignmentStatementImpl extends PyElementImpl implements PyAssign private static void mapToValues(PyExpression lhs, PyExpression rhs, List> map) { // cast for convenience - PyTupleExpression lhs_tuple = null; + PySequenceExpression lhs_tuple = null; PyExpression lhs_one = null; - if (lhs instanceof PyTupleExpression) lhs_tuple = (PyTupleExpression)lhs; + if (lhs instanceof PySequenceExpression) lhs_tuple = (PySequenceExpression)lhs; else if (lhs != null) lhs_one = lhs; - PyTupleExpression rhs_tuple = null; + PySequenceExpression rhs_tuple = null; PyExpression rhs_one = null; - if (rhs instanceof PyTupleExpression) rhs_tuple = (PyTupleExpression)rhs; + 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) @@ -138,10 +137,10 @@ public class PyAssignmentStatementImpl extends PyElementImpl implements PyAssign } else if (lhs_tuple != null && rhs_one != null) { // multiple LHS, single RHS: unpacking //for (PyExpression tuple_elt : lhs_tuple.getElements()) map.add(new Pair(tuple_elt, rhs_one)); - map.addAll(FP.zipList(lhs_tuple, new RepeatIterable(rhs_one))); + map.addAll(FP.zipList(Arrays.asList(lhs_tuple.getElements()), new RepeatIterable(rhs_one))); } else if (lhs_tuple != null && rhs_tuple != null) { // multiple both sides: piecewise mapping - map.addAll(FP.zipList(lhs_tuple, rhs_tuple, null, null)); + map.addAll(FP.zipList(Arrays.asList(lhs_tuple.getElements()), Arrays.asList(rhs_tuple.getElements()), null, null)); } } diff --git a/python/testData/resolve/ListAssignment.py b/python/testData/resolve/ListAssignment.py new file mode 100644 index 000000000000..d05f2909be25 --- /dev/null +++ b/python/testData/resolve/ListAssignment.py @@ -0,0 +1,3 @@ +[foo, bar] = (1, 2) +print(foo) +# diff --git a/python/testSrc/com/jetbrains/python/PyResolveTest.java b/python/testSrc/com/jetbrains/python/PyResolveTest.java index dbc2b8e74fd2..9b9a0357110d 100644 --- a/python/testSrc/com/jetbrains/python/PyResolveTest.java +++ b/python/testSrc/com/jetbrains/python/PyResolveTest.java @@ -14,7 +14,7 @@ import com.jetbrains.python.psi.resolve.ImportedResolveResult; public class PyResolveTest extends PyResolveTestCase { @Override - protected PsiElement doResolve() throws Exception { + protected PsiElement doResolve() { myFixture.configureByFile("resolve/" + getTestName(false) + ".py"); final Project project = myFixture.getProject(); project.putUserData(PyBuiltinCache.TEST_SDK, PythonMockSdk.findOrCreate()); @@ -349,9 +349,14 @@ public class PyResolveTest extends PyResolveTestCase { assertResolvesTo(PyFunction.class, "foo"); } - public void testLambdaDefaultParameter() throws Exception { + public void testLambdaDefaultParameter() { final PsiElement element = doResolve(); assertInstanceOf(element, PyTargetExpression.class); assertTrue(element.getParent() instanceof PySetCompExpression); } + + public void testListAssignment() { + final PsiElement element = doResolve(); + assertInstanceOf(element, PyTargetExpression.class); + } } \ No newline at end of file