unused class when used through import only should not be treated as used (IDEA-99444)

This commit is contained in:
Anna Kozlova
2018-08-23 20:55:49 +03:00
parent f98943abf9
commit a93b768eea
3 changed files with 30 additions and 3 deletions
@@ -43,7 +43,10 @@ import org.jetbrains.annotations.Nullable;
import java.lang.ref.Reference;
import java.lang.ref.SoftReference;
import java.util.*;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.concurrent.atomic.AtomicReference;
class RefCountHolder {
@@ -172,8 +175,20 @@ class RefCountHolder {
}
private void registerLocalRef(@NotNull PsiReference ref, PsiElement refElement) {
if (refElement instanceof PsiMethod && PsiTreeUtil.isAncestor(refElement, ref.getElement(), true)) return; // filter self-recursive calls
if (refElement instanceof PsiClass && PsiTreeUtil.isAncestor(refElement, ref.getElement(), true)) return; // filter inner use of itself
PsiElement element = ref.getElement();
if (refElement instanceof PsiMethod && PsiTreeUtil.isAncestor(refElement, element, true)) return; // filter self-recursive calls
if (refElement instanceof PsiClass) {
if (PsiTreeUtil.isAncestor(refElement, element, true)) {
return; // filter inner use of itself
}
PsiImportStatementBase importStmt = PsiTreeUtil.getParentOfType(element, PsiImportStatementBase.class);
if (importStmt != null) {
PsiElement resolve = importStmt.resolve();
if (resolve != null && PsiTreeUtil.isAncestor(refElement, resolve, false)) {
return;//filter refs on inner members in imports
}
}
}
synchronized (myLocalRefsMap) {
myLocalRefsMap.putValue(refElement, ref);
}
@@ -0,0 +1,8 @@
package p;
import static p.Outer.Inner;
import java.util.*;
abstract class <warning descr="Class 'Outer' is never used">Outer</warning> implements List<Inner> {
public static class Inner {}
}
@@ -107,4 +107,8 @@ public class LightAdvHighlightingJdk6Test extends LightDaemonAnalyzerTestCase {
public void testPrivateClassReferencedInAnnotationOnSibling() {
doTest(false, false);
}
public void testInnerClassImportShouldNotLeadToClassUsage() {
enableInspectionTool(new UnusedDeclarationInspection(true));
doTest(true, false); }
}