From ca2ab3483cbcfc99aa8223d35bbc124ba6f16827 Mon Sep 17 00:00:00 2001 From: "Olga.Klisho" Date: Wed, 17 Jun 2020 15:21:57 +0300 Subject: [PATCH] IDEA-206125 refactoring enum values highlighted as used in case its class is @EnumSource value GitOrigin-RevId: 0e7567f2a12efc80780f7a293fe0ecc30c6b7617 --- plugins/junit/src/META-INF/plugin.xml | 1 - .../JUnitImplicitUsageProvider.java | 44 +++++++++++- .../JunitEnumSourceImplicitUsageProvider.java | 67 ------------------- 3 files changed, 41 insertions(+), 71 deletions(-) delete mode 100644 plugins/junit/src/com/intellij/execution/junit2/inspection/JunitEnumSourceImplicitUsageProvider.java diff --git a/plugins/junit/src/META-INF/plugin.xml b/plugins/junit/src/META-INF/plugin.xml index 97db9713ca91..d5696bd90ccf 100644 --- a/plugins/junit/src/META-INF/plugin.xml +++ b/plugins/junit/src/META-INF/plugin.xml @@ -77,7 +77,6 @@ - diff --git a/plugins/junit/src/com/intellij/execution/junit2/inspection/JUnitImplicitUsageProvider.java b/plugins/junit/src/com/intellij/execution/junit2/inspection/JUnitImplicitUsageProvider.java index 7db8dc4d9a53..e390d70b7baa 100644 --- a/plugins/junit/src/com/intellij/execution/junit2/inspection/JUnitImplicitUsageProvider.java +++ b/plugins/junit/src/com/intellij/execution/junit2/inspection/JUnitImplicitUsageProvider.java @@ -3,9 +3,14 @@ package com.intellij.execution.junit2.inspection; import com.intellij.codeInsight.AnnotationUtil; import com.intellij.codeInsight.daemon.ImplicitUsageProvider; -import com.intellij.psi.PsiElement; -import com.intellij.psi.PsiField; -import com.intellij.psi.PsiParameter; +import com.intellij.psi.*; +import com.intellij.psi.impl.source.PsiEnumConstantImpl; +import com.intellij.psi.search.GlobalSearchScope; +import com.intellij.psi.search.LocalSearchScope; +import com.intellij.psi.search.PsiSearchHelper; +import com.intellij.psi.search.SearchScope; +import com.intellij.psi.search.searches.ReferencesSearch; +import com.intellij.psi.util.PsiTreeUtil; import org.jetbrains.annotations.NotNull; import java.util.Arrays; @@ -13,6 +18,7 @@ import java.util.List; public class JUnitImplicitUsageProvider implements ImplicitUsageProvider { private static final String MOCK = "org.mockito.Mock"; + private static final String ENUM_SOURCE = "org.junit.jupiter.params.provider.EnumSource"; private static final List INJECTED_FIELD_ANNOTATIONS = Arrays.asList( MOCK, "org.mockito.Spy", @@ -22,6 +28,38 @@ public class JUnitImplicitUsageProvider implements ImplicitUsageProvider { @Override public boolean isImplicitUsage(@NotNull PsiElement element) { + if (element instanceof PsiEnumConstantImpl) { + PsiClass psiClass = ((PsiEnumConstantImpl)element).getContainingClass(); + String className = psiClass != null ? psiClass.getName() : null; + if (className == null) return false; + SearchScope useScope = psiClass.getUseScope(); + + if (!(useScope instanceof LocalSearchScope)) { + PsiSearchHelper searchHelper = PsiSearchHelper.getInstance(psiClass.getProject()); + PsiSearchHelper.SearchCostResult cheapEnough = searchHelper.isCheapEnoughToSearch(className, (GlobalSearchScope)useScope, null, + null); + if (cheapEnough == PsiSearchHelper.SearchCostResult.ZERO_OCCURRENCES || + cheapEnough == PsiSearchHelper.SearchCostResult.TOO_MANY_OCCURRENCES) { + return false; + } + } + return ReferencesSearch.search(psiClass, useScope, false) + .anyMatch(reference -> { + PsiElement referenceElement = reference.getElement(); + return isReferencedInsideEnumSourceAnnotation(referenceElement); + }); + } + return false; + } + + private static boolean isReferencedInsideEnumSourceAnnotation(PsiElement referenceElement) { + PsiAnnotation annotation = PsiTreeUtil.getParentOfType(referenceElement, PsiAnnotation.class); + if (annotation != null) { + String annotationName = annotation.getQualifiedName(); + if (ENUM_SOURCE.equals(annotationName) && annotation.getAttributes().size() == 1) { + return true; + } + } return false; } diff --git a/plugins/junit/src/com/intellij/execution/junit2/inspection/JunitEnumSourceImplicitUsageProvider.java b/plugins/junit/src/com/intellij/execution/junit2/inspection/JunitEnumSourceImplicitUsageProvider.java deleted file mode 100644 index 7711e93a3e66..000000000000 --- a/plugins/junit/src/com/intellij/execution/junit2/inspection/JunitEnumSourceImplicitUsageProvider.java +++ /dev/null @@ -1,67 +0,0 @@ -// Copyright 2000-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. -package com.intellij.execution.junit2.inspection; - -import com.intellij.codeInsight.daemon.ImplicitUsageProvider; -import com.intellij.psi.PsiAnnotation; -import com.intellij.psi.PsiClass; -import com.intellij.psi.PsiElement; -import com.intellij.psi.impl.source.PsiEnumConstantImpl; -import com.intellij.psi.search.GlobalSearchScope; -import com.intellij.psi.search.LocalSearchScope; -import com.intellij.psi.search.PsiSearchHelper; -import com.intellij.psi.search.SearchScope; -import com.intellij.psi.search.searches.ReferencesSearch; -import com.intellij.psi.util.PsiTreeUtil; -import org.jetbrains.annotations.NotNull; - -public class JunitEnumSourceImplicitUsageProvider implements ImplicitUsageProvider { - - private static final String ENUM_SOURCE = "org.junit.jupiter.params.provider.EnumSource"; - - @Override - public boolean isImplicitUsage(@NotNull PsiElement element) { - if (element instanceof PsiEnumConstantImpl) { - PsiClass psiClass = ((PsiEnumConstantImpl)element).getContainingClass(); - String className = psiClass != null ? psiClass.getName() : null; - if (className == null) return false; - SearchScope useScope = psiClass.getUseScope(); - - if (!(useScope instanceof LocalSearchScope)) { - PsiSearchHelper searchHelper = PsiSearchHelper.getInstance(psiClass.getProject()); - PsiSearchHelper.SearchCostResult cheapEnough = searchHelper.isCheapEnoughToSearch(className, (GlobalSearchScope)useScope, null, - null); - if (cheapEnough == PsiSearchHelper.SearchCostResult.ZERO_OCCURRENCES || - cheapEnough == PsiSearchHelper.SearchCostResult.TOO_MANY_OCCURRENCES) { - return false; - } - } - return ReferencesSearch.search(psiClass, useScope, false) - .anyMatch(reference -> { - PsiElement referenceElement = reference.getElement(); - return isReferencedInsideEnumSourceAnnotation(referenceElement); - }); - } - return false; - } - - private static boolean isReferencedInsideEnumSourceAnnotation(PsiElement referenceElement) { - PsiAnnotation annotation = PsiTreeUtil.getParentOfType(referenceElement, PsiAnnotation.class); - if (annotation != null) { - String annotationName = annotation.getQualifiedName(); - if (ENUM_SOURCE.equals(annotationName) && annotation.getAttributes().size() == 1) { - return true; - } - } - return false; - } - - @Override - public boolean isImplicitRead(@NotNull PsiElement element) { - return false; - } - - @Override - public boolean isImplicitWrite(@NotNull PsiElement element) { - return false; - } -}