mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
testdata navigation: replace home made cache with cached value cleared on structure change (IDEA-131018)
This commit is contained in:
@@ -21,6 +21,7 @@ import com.intellij.openapi.extensions.Extensions;
|
||||
import com.intellij.openapi.progress.ProgressManager;
|
||||
import com.intellij.openapi.roots.ProjectFileIndex;
|
||||
import com.intellij.openapi.roots.ProjectRootManager;
|
||||
import com.intellij.openapi.util.ModificationTracker;
|
||||
import com.intellij.openapi.util.Pair;
|
||||
import com.intellij.openapi.util.Trinity;
|
||||
import com.intellij.openapi.util.io.FileUtil;
|
||||
@@ -31,6 +32,9 @@ import com.intellij.psi.PsiElement;
|
||||
import com.intellij.psi.PsiFile;
|
||||
import com.intellij.psi.PsiMethod;
|
||||
import com.intellij.psi.codeStyle.NameUtil;
|
||||
import com.intellij.psi.util.CachedValueProvider;
|
||||
import com.intellij.psi.util.CachedValuesManager;
|
||||
import com.intellij.psi.util.PsiModificationTracker;
|
||||
import com.intellij.psi.util.PsiTreeUtil;
|
||||
import com.intellij.testIntegration.TestFramework;
|
||||
import com.intellij.util.PathUtil;
|
||||
@@ -57,11 +61,6 @@ import java.util.concurrent.TimeUnit;
|
||||
*/
|
||||
public class TestDataGuessByExistingFilesUtil {
|
||||
|
||||
private static final long CACHE_ENTRY_TTL_MS = TimeUnit.MILLISECONDS.convert(5, TimeUnit.MINUTES);
|
||||
|
||||
private static final Map<String, Pair<TestDataDescriptor, Long>> CACHE = new ConcurrentHashMap<String, Pair<TestDataDescriptor, Long>>();
|
||||
private static final Set<String> CLASSES_WITHOUT_TEST_DATA = new java.util.HashSet<String>();
|
||||
|
||||
private TestDataGuessByExistingFilesUtil() {
|
||||
}
|
||||
|
||||
@@ -157,20 +156,20 @@ public class TestDataGuessByExistingFilesUtil {
|
||||
return null;
|
||||
}
|
||||
|
||||
final String qualifiedName = psiClass.getQualifiedName();
|
||||
if (CLASSES_WITHOUT_TEST_DATA.contains(qualifiedName)) {
|
||||
final TestDataDescriptor cachedValue = CachedValuesManager.getCachedValue(psiClass, new CachedValueProvider<TestDataDescriptor>() {
|
||||
@Nullable
|
||||
@Override
|
||||
public Result<TestDataDescriptor> compute() {
|
||||
return new Result<TestDataDescriptor>(buildDescriptor(psiClass), PsiModificationTracker.JAVA_STRUCTURE_MODIFICATION_COUNT);
|
||||
}
|
||||
});
|
||||
if (cachedValue == TestDataDescriptor.NOTHING_FOUND) {
|
||||
return null;
|
||||
}
|
||||
final Pair<TestDataDescriptor, Long> cached = CACHE.get(qualifiedName);
|
||||
if (cached != null) {
|
||||
if (cached.first.isComplete()) {
|
||||
return cached.first;
|
||||
}
|
||||
if (cached.second > System.currentTimeMillis()) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
return cachedValue;
|
||||
}
|
||||
|
||||
private static TestDataDescriptor buildDescriptor(PsiClass psiClass) {
|
||||
TestFramework[] frameworks = Extensions.getExtensions(TestFramework.EXTENSION_NAME);
|
||||
TestFramework framework = null;
|
||||
for (TestFramework each : frameworks) {
|
||||
@@ -180,7 +179,7 @@ public class TestDataGuessByExistingFilesUtil {
|
||||
}
|
||||
}
|
||||
if (framework == null) {
|
||||
return null;
|
||||
return TestDataDescriptor.NOTHING_FOUND;
|
||||
}
|
||||
|
||||
final PsiElement setUpMethod = framework.findSetUpMethod(psiClass);
|
||||
@@ -195,14 +194,12 @@ public class TestDataGuessByExistingFilesUtil {
|
||||
}
|
||||
testNames.add(name);
|
||||
}
|
||||
|
||||
|
||||
ProjectFileIndex fileIndex = ProjectRootManager.getInstance(psiClass.getProject()).getFileIndex();
|
||||
final TestDataDescriptor descriptor = buildDescriptor(fileIndex, testNames, psiClass);
|
||||
if (isClassWithoutTestData(descriptor, testNames, psiClass)) {
|
||||
CLASSES_WITHOUT_TEST_DATA.add(qualifiedName);
|
||||
return null;
|
||||
}
|
||||
CACHE.put(qualifiedName, new Pair<TestDataDescriptor, Long>(descriptor, System.currentTimeMillis() + CACHE_ENTRY_TTL_MS));
|
||||
return TestDataDescriptor.NOTHING_FOUND;
|
||||
}
|
||||
return descriptor;
|
||||
}
|
||||
|
||||
@@ -534,6 +531,7 @@ public class TestDataGuessByExistingFilesUtil {
|
||||
}
|
||||
|
||||
private static class TestDataDescriptor {
|
||||
private static final TestDataDescriptor NOTHING_FOUND = new TestDataDescriptor(Collections.emptyList());
|
||||
|
||||
private final List<TestLocationDescriptor> myDescriptors = new ArrayList<TestLocationDescriptor>();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user