IDEA-206125 refactoring enum values highlighted as used in case its class is @EnumSource value

GitOrigin-RevId: 0e7567f2a12efc80780f7a293fe0ecc30c6b7617
This commit is contained in:
Olga.Klisho
2020-06-17 16:09:39 +03:00
committed by intellij-monorepo-bot
parent 0c17ceb518
commit ca2ab3483c
3 changed files with 41 additions and 71 deletions
-1
View File
@@ -77,7 +77,6 @@
<testDiscoveryProducer implementation="com.intellij.execution.testDiscovery.LocalTestDiscoveryProducer"/>
<testDiscoveryProducer implementation="com.intellij.execution.testDiscovery.IntellijTestDiscoveryProducer"/>
<implicitUsageProvider implementation="com.intellij.execution.junit2.inspection.JUnitImplicitUsageProvider"/>
<implicitUsageProvider implementation="com.intellij.execution.junit2.inspection.JunitEnumSourceImplicitUsageProvider"/>
<predefinedMigrationMapProvider implementation="com.intellij.execution.junit2.refactoring.JUnit5Migration"/>
<psi.referenceContributor implementation="com.intellij.execution.junit.codeInsight.references.JUnitReferenceContributor"/>
@@ -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<String> 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;
}
@@ -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;
}
}