From 9c0e8e9d0197b55953c3ed6376dc96ba66862bb5 Mon Sep 17 00:00:00 2001 From: Dmitry Batkovich Date: Mon, 4 Feb 2019 15:39:27 +0300 Subject: [PATCH] unused declaration: report enum consts as used if enum class object is used (IDEA-206125) --- .../reference/RefJavaUtilImpl.java | 26 ++++++++++++++----- .../deadCode/classLiteralRef2/expected.xml | 17 ++++++++++++ .../deadCode/classLiteralRef2/src/Test.java | 18 +++++++++++++ .../codeInspection/UnusedDeclarationTest.java | 7 ++--- 4 files changed, 59 insertions(+), 9 deletions(-) create mode 100644 java/java-tests/testData/inspection/deadCode/classLiteralRef2/expected.xml create mode 100644 java/java-tests/testData/inspection/deadCode/classLiteralRef2/src/Test.java diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/reference/RefJavaUtilImpl.java b/java/java-analysis-impl/src/com/intellij/codeInspection/reference/RefJavaUtilImpl.java index fe3aa3389e9b..3d333eaf7351 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/reference/RefJavaUtilImpl.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/reference/RefJavaUtilImpl.java @@ -182,7 +182,7 @@ public class RefJavaUtilImpl extends RefJavaUtil { if (reference != null) { PsiElement constructorClass = reference.resolve(); if (constructorClass instanceof PsiClass) { - processClassReference((PsiClass)constructorClass, refFrom, decl, true); + processClassReference((PsiClass)constructorClass, refFrom, decl, true, node); } } } @@ -294,15 +294,16 @@ public class RefJavaUtilImpl extends RefJavaUtil { public boolean visitClassLiteralExpression(@NotNull UClassLiteralExpression node) { final PsiType type = node.getType(); if (type instanceof PsiClassType) { - processClassReference(((PsiClassType)type).resolve(), refFrom, decl, false); + processClassReference(((PsiClassType)type).resolve(), refFrom, decl, false, node); } return false; } - private void processClassReference(final PsiClass psiClass, - final RefJavaElementImpl refFrom, - final UDeclaration from, - boolean defaultConstructorOnly) { + private void processClassReference(PsiClass psiClass, + RefJavaElementImpl refFrom, + UDeclaration from, + boolean defaultConstructorOnly, + UExpression node) { if (psiClass != null) { RefClassImpl refClass = ObjectUtils.tryCast(refFrom.getRefManager().getReference(psiClass.getNavigationElement()), RefClassImpl.class); @@ -324,6 +325,19 @@ public class RefJavaUtilImpl extends RefJavaUtil { refFrom.addOutReference(cons); hasConstructorsMarked = true; } + + UClass uClass = refClass.getUastElement(); + if (uClass != null && uClass.getJavaPsi().isEnum()) { + for (RefEntity child : refClass.getChildren()) { + if (child instanceof RefField) { + UField uField = ((RefField)child).getUastElement(); + if (uField instanceof UEnumConstant) { + ((RefFieldImpl) child).markReferenced(refFrom, false, true, node); + refFrom.addOutReference((RefElement)child); + } + } + } + } } if (!hasConstructorsMarked) { diff --git a/java/java-tests/testData/inspection/deadCode/classLiteralRef2/expected.xml b/java/java-tests/testData/inspection/deadCode/classLiteralRef2/expected.xml new file mode 100644 index 000000000000..20755482d5b6 --- /dev/null +++ b/java/java-tests/testData/inspection/deadCode/classLiteralRef2/expected.xml @@ -0,0 +1,17 @@ + + + + Test.java + 16 + + unused declaration + Method is never used. + + + Test.java + 15 + + unused declaration + Method is never used. + + \ No newline at end of file diff --git a/java/java-tests/testData/inspection/deadCode/classLiteralRef2/src/Test.java b/java/java-tests/testData/inspection/deadCode/classLiteralRef2/src/Test.java new file mode 100644 index 000000000000..ec57748f861e --- /dev/null +++ b/java/java-tests/testData/inspection/deadCode/classLiteralRef2/src/Test.java @@ -0,0 +1,18 @@ +import java.util.Arrays; + +class Test { + public static void main(String[] args) { + System.out.println(Arrays.toString(XXX.class.getEnumConstants())); + System.out.println(Arrays.toString(YYY.class.getDeclaredMethods())); + } + + enum XXX { + Foo, Bar + } + + // Don't think it's should be marked as used + class YYY { + void depeche() {} + void mode() {} + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/java/codeInspection/UnusedDeclarationTest.java b/java/java-tests/testSrc/com/intellij/java/codeInspection/UnusedDeclarationTest.java index 43be89903fda..15e35e9a3ffd 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInspection/UnusedDeclarationTest.java +++ b/java/java-tests/testSrc/com/intellij/java/codeInspection/UnusedDeclarationTest.java @@ -19,9 +19,6 @@ import com.intellij.codeInspection.ex.EntryPointsManagerBase; import com.intellij.pom.java.LanguageLevel; import com.intellij.testFramework.IdeaTestUtil; -/** - * @author max - */ public class UnusedDeclarationTest extends AbstractUnusedDeclarationTest { public void testSCR6067() { @@ -197,6 +194,10 @@ public class UnusedDeclarationTest extends AbstractUnusedDeclarationTest { doTest(); } + public void testClassLiteralRef2() { + doTest(); + } + public void testFunctionalExpressions() { doTest(); }