mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
LHS of assignment expression can be any sequence, not just a tuple (PY-1419)
This commit is contained in:
@@ -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<Pair<PyExpression, PyExpression>> 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<PyExpression, PyExpression>(tuple_elt, rhs_one));
|
||||
map.addAll(FP.zipList(lhs_tuple, new RepeatIterable<PyExpression>(rhs_one)));
|
||||
map.addAll(FP.zipList(Arrays.asList(lhs_tuple.getElements()), new RepeatIterable<PyExpression>(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));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,3 @@
|
||||
[foo, bar] = (1, 2)
|
||||
print(foo)
|
||||
# <ref>
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user