From d211e7cf3764596fff98b1a237a14eea1a501624 Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Thu, 20 Mar 2008 16:41:26 +0300 Subject: [PATCH] correctly resolve assignment to multiple instance fields as a tuple --- .../psi/impl/PyAssignmentStatementImpl.java | 17 +++++++++-------- python/testData/resolve/MultipleFields.py | 6 ++++++ .../com/jetbrains/python/PyResolveTest.java | 5 +++++ 3 files changed, 20 insertions(+), 8 deletions(-) create mode 100644 python/testData/resolve/MultipleFields.py diff --git a/python/src/com/jetbrains/python/psi/impl/PyAssignmentStatementImpl.java b/python/src/com/jetbrains/python/psi/impl/PyAssignmentStatementImpl.java index 28bb24e2e71f..304bf11f3951 100644 --- a/python/src/com/jetbrains/python/psi/impl/PyAssignmentStatementImpl.java +++ b/python/src/com/jetbrains/python/psi/impl/PyAssignmentStatementImpl.java @@ -43,19 +43,20 @@ public class PyAssignmentStatementImpl extends PyElementImpl implements PyAssign pyVisitor.visitPyAssignmentStatement(this); } - @PsiCached public PyExpression[] getTargets() { - //TODO: this is incomplete. it should look for the = sign final ASTNode[] nodes = getNode().getChildren(PyElementTypes.EXPRESSIONS); - ASTNode[] targets = new ASTNode[nodes.length - 1]; - System.arraycopy(nodes, 0, targets, 0, nodes.length - 1); - return PyPsiUtils.nodesToPsi(targets, PyExpression.EMPTY_ARRAY); + if (nodes.length > 0) { + final PyExpression target = (PyExpression) nodes [0].getPsi(); + if (target instanceof PyTupleExpression) { + return ((PyTupleExpression) target).getElements(); + } + return new PyExpression[] { target }; + } + return PyExpression.EMPTY_ARRAY; } - @PsiCached - public @Nullable - PyExpression getAssignedValue() { + public PyExpression getAssignedValue() { PsiElement child = getLastChild(); while (child != null && !(child instanceof PyExpression)) { child = child.getPrevSibling(); diff --git a/python/testData/resolve/MultipleFields.py b/python/testData/resolve/MultipleFields.py new file mode 100644 index 000000000000..8a35698456c8 --- /dev/null +++ b/python/testData/resolve/MultipleFields.py @@ -0,0 +1,6 @@ +class A: + def __init__(self, aa, bb): + self.aa, self.bb = aa, bb + + def f(self): + print self.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 16cedc02d5d6..45c75e8e27f8 100644 --- a/python/testSrc/com/jetbrains/python/PyResolveTest.java +++ b/python/testSrc/com/jetbrains/python/PyResolveTest.java @@ -82,6 +82,11 @@ public class PyResolveTest extends ResolveTestCase { assertTrue(targetElement instanceof PyTargetExpression); } + public void testMultipleFields() throws Exception { + PsiElement targetElement = resolve(); + assertTrue(targetElement instanceof PyTargetExpression); + } + @Override protected String getTestDataPath() { return PathManager.getHomePath() + "/plugins/python/testData/resolve/";