diff --git a/plugins/devkit/src/testAssistant/TestDataGuessByExistingFilesUtil.java b/plugins/devkit/src/testAssistant/TestDataGuessByExistingFilesUtil.java index 6d9e2ffd8421..4ed5f706d615 100644 --- a/plugins/devkit/src/testAssistant/TestDataGuessByExistingFilesUtil.java +++ b/plugins/devkit/src/testAssistant/TestDataGuessByExistingFilesUtil.java @@ -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> CACHE = new ConcurrentHashMap>(); - private static final Set CLASSES_WITHOUT_TEST_DATA = new java.util.HashSet(); - 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() { + @Nullable + @Override + public Result compute() { + return new Result(buildDescriptor(psiClass), PsiModificationTracker.JAVA_STRUCTURE_MODIFICATION_COUNT); + } + }); + if (cachedValue == TestDataDescriptor.NOTHING_FOUND) { return null; } - final Pair 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(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 myDescriptors = new ArrayList();