mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
Fixed find usages for reassigned class and instance attributes (PY-4338).
This commit is contained in:
@@ -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());
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user