From 8b6d7b5ef1685dfe70780cec4516bdfb743ed6bc Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Thu, 15 Dec 2011 18:21:36 +0100 Subject: [PATCH] "resolve to attribute assigned nearby" logic should also work when qualifier type is unknown; provide test --- .../python/psi/impl/PyQualifiedReference.java | 23 ++++++++++--------- .../resolve/AttributeAssignedNearby.py | 4 ++++ .../com/jetbrains/python/PyResolveTest.java | 6 ++++- 3 files changed, 21 insertions(+), 12 deletions(-) create mode 100644 python/testData/resolve/AttributeAssignedNearby.py diff --git a/python/src/com/jetbrains/python/psi/impl/PyQualifiedReference.java b/python/src/com/jetbrains/python/psi/impl/PyQualifiedReference.java index c0be37ce5362..b3e4171cbe79 100644 --- a/python/src/com/jetbrains/python/psi/impl/PyQualifiedReference.java +++ b/python/src/com/jetbrains/python/psi/impl/PyQualifiedReference.java @@ -69,13 +69,17 @@ public class PyQualifiedReference extends PyReferenceImpl { return ret; // qualifier is positive that such name cannot exist in it } ret.addAll(membersOfQualifier); + } - // enrich the type info with any fields assigned nearby - if (qualifier instanceof PyQualifiedExpression && ret.isEmpty()) { - if (addAssignedAttributes(ret, referencedName, (PyQualifiedExpression)qualifier)) return ret; + // look for assignment of this attribute in containing function + if (qualifier instanceof PyQualifiedExpression && ret.isEmpty()) { + if (addAssignedAttributes(ret, referencedName, (PyQualifiedExpression)qualifier)) { + return ret; } } - else if (myContext.allowImplicits() && canQualifyAnImplicitName(qualifier, qualifierType)) { + + if ((qualifierType == null || qualifierType instanceof PyTypeReference) && + myContext.allowImplicits() && canQualifyAnImplicitName(qualifier, qualifierType)) { addImplicitResolveResults(referencedName, ret); } @@ -196,13 +200,10 @@ public class PyQualifiedReference extends PyReferenceImpl { } private static boolean addAssignedAttributes(ResolveResultList ret, String referencedName, PyQualifiedExpression qualifier) { - List qualifier_path = PyResolveUtil.unwindQualifiers(qualifier); - if (qualifier_path != null) { - for (PyExpression ex : collectAssignedAttributes(qualifier)) { - if (referencedName.equals(ex.getName())) { - ret.poke(ex, RatedResolveResult.RATE_NORMAL); - return true; - } + for (PyExpression ex : collectAssignedAttributes(qualifier)) { + if (referencedName.equals(ex.getName())) { + ret.poke(ex, RatedResolveResult.RATE_NORMAL); + return true; } } return false; diff --git a/python/testData/resolve/AttributeAssignedNearby.py b/python/testData/resolve/AttributeAssignedNearby.py new file mode 100644 index 000000000000..b46acc13952c --- /dev/null +++ b/python/testData/resolve/AttributeAssignedNearby.py @@ -0,0 +1,4 @@ +def foo(bar): + bar.xyzzy = 1 + print bar.xyzzy +# \ 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 05045408bb78..3976630f40e9 100644 --- a/python/testSrc/com/jetbrains/python/PyResolveTest.java +++ b/python/testSrc/com/jetbrains/python/PyResolveTest.java @@ -432,4 +432,8 @@ public class PyResolveTest extends PyResolveTestCase { final PsiElement psiElement = resolveResults[0].getElement(); assertTrue(psiElement instanceof PyTargetExpression && "xyzzy".equals(((PyTargetExpression)psiElement).getName())); } -} \ No newline at end of file + + public void testAttributeAssignedNearby() { + assertResolvesTo(PyTargetExpression.class, "xyzzy"); + } +}