From a93b768eeafcc155b62d58e0b62264cf39eb386a Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Thu, 23 Aug 2018 20:53:55 +0300 Subject: [PATCH] unused class when used through import only should not be treated as used (IDEA-99444) --- .../daemon/impl/analysis/RefCountHolder.java | 21 ++++++++++++++++--- ...rClassImportShouldNotLeadToClassUsage.java | 8 +++++++ .../daemon/LightAdvHighlightingJdk6Test.java | 4 ++++ 3 files changed, 30 insertions(+), 3 deletions(-) create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting6/InnerClassImportShouldNotLeadToClassUsage.java diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/RefCountHolder.java b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/RefCountHolder.java index 7fd16c8e05b9..c061b8e6f162 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/RefCountHolder.java +++ b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/RefCountHolder.java @@ -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); } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting6/InnerClassImportShouldNotLeadToClassUsage.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting6/InnerClassImportShouldNotLeadToClassUsage.java new file mode 100644 index 000000000000..86b9ed647e1d --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting6/InnerClassImportShouldNotLeadToClassUsage.java @@ -0,0 +1,8 @@ +package p; + +import static p.Outer.Inner; +import java.util.*; + +abstract class Outer implements List { + public static class Inner {} +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/LightAdvHighlightingJdk6Test.java b/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/LightAdvHighlightingJdk6Test.java index 0e8d79415d19..2329b0b7af0b 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/LightAdvHighlightingJdk6Test.java +++ b/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/LightAdvHighlightingJdk6Test.java @@ -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); } }