diff --git a/python/src/com/jetbrains/python/psi/impl/references/PyReferenceImpl.java b/python/src/com/jetbrains/python/psi/impl/references/PyReferenceImpl.java index 30088c1af90a..2f272076c709 100644 --- a/python/src/com/jetbrains/python/psi/impl/references/PyReferenceImpl.java +++ b/python/src/com/jetbrains/python/psi/impl/references/PyReferenceImpl.java @@ -446,6 +446,12 @@ public class PyReferenceImpl implements PsiReferenceEx, PsiPolyVariantReference return true; } + // we shadow their name or they shadow ours (PY-6241) + if (resolveResult instanceof PsiNamedElement && resolveResult instanceof ScopeOwner && element instanceof ScopeOwner && + ourScopeOwner == PsiTreeUtil.getParentOfType(resolveResult, ScopeOwner.class)) { + return true; + } + if (!haveQualifiers(element) && ourScopeOwner != null && theirScopeOwner != null) { if (resolvesToSameGlobal(element, elementName, ourScopeOwner, theirScopeOwner, resolveResult)) return true; } diff --git a/python/testData/findUsages/NameShadowing.py b/python/testData/findUsages/NameShadowing.py new file mode 100644 index 000000000000..fa06cb85b844 --- /dev/null +++ b/python/testData/findUsages/NameShadowing.py @@ -0,0 +1,16 @@ +class C(object): + def __init__(self): + self._x = None + + @property + def x(self): + """I'm the 'x' property.""" + return self._x + + @x.setter + def x(self, value): + self._x = value + + @x.deleter + def x(self): + del self._x \ No newline at end of file diff --git a/python/testSrc/com/jetbrains/python/PyFindUsagesTest.java b/python/testSrc/com/jetbrains/python/PyFindUsagesTest.java index 956b7867b150..436b3860bd6d 100644 --- a/python/testSrc/com/jetbrains/python/PyFindUsagesTest.java +++ b/python/testSrc/com/jetbrains/python/PyFindUsagesTest.java @@ -127,6 +127,11 @@ public class PyFindUsagesTest extends PyTestCase { } } + public void testNameShadowing() { // PY-6241 + final Collection usages = myFixture.testFindUsages("findUsages/NameShadowing.py"); + assertEquals(2, usages.size()); + } + private Collection findMultiFileUsages(String filename) { final String testName = getTestName(false); myFixture.copyDirectoryToProject("findUsages/" + testName, "");