testdata navigation: replace home made cache with cached value cleared on structure change (IDEA-131018)

This commit is contained in:
Anna Kozlova
2014-10-21 21:05:03 +02:00
parent 9419caba50
commit d5fa259ad8
@@ -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>();