Fixed find usages for reassigned class and instance attributes (PY-4338).

This commit is contained in:
Dmitry Trofimov
2011-08-22 20:01:22 +04:00
parent 49ba12d800
commit 8b50464420
4 changed files with 55 additions and 6 deletions
@@ -348,8 +348,8 @@ public class PyQualifiedReferenceImpl extends PyReferenceImpl {
}
}
}
if (resolveResult instanceof PyTargetExpression && PyUtil.isInstanceAttribute((PyTargetExpression)resolveResult) &&
element instanceof PyTargetExpression && PyUtil.isInstanceAttribute((PyTargetExpression)element)) {
if (resolveResult instanceof PyTargetExpression && isInstanceOrClassAttribute((PyTargetExpression)resolveResult) &&
element instanceof PyTargetExpression && isInstanceOrClassAttribute((PyTargetExpression)element)) {
PyClass aClass = PsiTreeUtil.getParentOfType(resolveResult, PyClass.class);
PyClass bClass = PsiTreeUtil.getParentOfType(element, PyClass.class);
@@ -362,11 +362,15 @@ public class PyQualifiedReferenceImpl extends PyReferenceImpl {
return false;
}
private boolean isSubclass(@Nullable PyClass init, @Nullable PyClass usage) {
if (init == null || usage == null) {
private static boolean isInstanceOrClassAttribute(PyTargetExpression ex) {
return PyUtil.isInstanceAttribute(ex) || PyUtil.isClassAttribute(ex);
}
private static boolean isSubclass(@Nullable PyClass aClass, @Nullable PyClass bClass) {
if (aClass == null || bClass == null) {
return false;
}
return usage.isSubclass(init);
return bClass.isSubclass(aClass);
}
private static boolean isLocalScope(PsiElement element) {
@@ -0,0 +1,17 @@
class A(object):
bacaba = 0
def __init__(self):
self.bacaba = 1
def foo(self, x):
self.bacaba = x
class B(A):
bacaba = 2
def __init__(self):
super(B, self).__init__()
self.bacaba = 3
def foo2(self):
print self.bac<caret>aba
@@ -0,0 +1,18 @@
class A(object):
def __init__(self):
self.bacaba = 1
def foo(self, x):
self.bacaba = x
class B(A):
def __init__(self):
super(B, self).__init__()
self.bacaba = 2
def foo2(self):
self.ba<caret>caba = 3
def foo3(self):
print self.bacaba
@@ -83,7 +83,7 @@ public class PyFindUsagesTest extends PyLightFixtureTestCase {
}
});
for (int i = 0; i < usageTexts.length; i++) {
assertSameUsage(usageTexts [i], sortedUsages.get(i));
assertSameUsage(usageTexts[i], sortedUsages.get(i));
}
}
@@ -94,4 +94,14 @@ public class PyFindUsagesTest extends PyLightFixtureTestCase {
final int startIndex = usageInfo.getElement().getTextOffset() + usageInfo.getRangeInElement().getStartOffset() - pos;
assertEquals(usageText, myFixture.getFile().getText().substring(startIndex, startIndex + usageText.length()));
}
public void testReassignedInstanceAttribute() { // PY-4338
final Collection<UsageInfo> usages = myFixture.testFindUsages("findUsages/ReassignedInstanceAttribute.py");
assertEquals(5, usages.size());
}
public void testReassignedClassAttribute() { // PY-4338
final Collection<UsageInfo> usages = myFixture.testFindUsages("findUsages/ReassignedClassAttribute.py");
assertEquals(5, usages.size());
}
}