diff --git a/java/java-indexing-impl/src/com/intellij/codeInsight/javadoc/index/JavaDocFragmentAnchorCache.kt b/java/java-indexing-impl/src/com/intellij/codeInsight/javadoc/index/JavaDocFragmentAnchorCache.kt index bdbd6a5e4495..dbf8807b7ada 100644 --- a/java/java-indexing-impl/src/com/intellij/codeInsight/javadoc/index/JavaDocFragmentAnchorCache.kt +++ b/java/java-indexing-impl/src/com/intellij/codeInsight/javadoc/index/JavaDocFragmentAnchorCache.kt @@ -10,8 +10,10 @@ import com.intellij.psi.PsiClass import com.intellij.psi.impl.source.javadoc.PsiDocFragmentName import com.intellij.psi.javadoc.PsiDocComment import com.intellij.psi.search.GlobalSearchScope +import com.intellij.psi.util.CachedValueProvider.Result +import com.intellij.psi.util.CachedValuesManager +import com.intellij.psi.util.PsiModificationTracker import com.intellij.util.indexing.ID -import java.util.concurrent.ConcurrentHashMap import java.util.regex.Pattern @JvmField @@ -27,26 +29,22 @@ data class JavaDocFragmentData(val name: String, val offset: Int) @Service(Service.Level.PROJECT) private class JavaDocFragmentCacheService { - private data class Entry(val stamp: Long, val data: LinkedHashSet) - private val cache: ConcurrentHashMap = ConcurrentHashMap() - // Matches any HTML opening tag with an id attribute private val ID_PATTERN: Pattern = Pattern.compile("<[a-zA-Z0-9\\-]*[^>] id=[\"']?([^\"'> ]+)[\"']?[^>]*>", Pattern.CASE_INSENSITIVE) fun getAnchors(project: Project, fqn: String): LinkedHashSet { - val entry = cache[fqn] val psiClass = JavaPsiFacade.getInstance(project).findClass(fqn, GlobalSearchScope.projectScope(project)) - val file = psiClass?.containingFile ?: return LinkedHashSet() - if (entry != null && file.modificationStamp == entry.stamp) return entry.data + ?: return LinkedHashSet() - val result = LinkedHashSet().apply { - addAll(findIdsFromComment(psiClass.docComment)) - for (method in psiClass.methods) addAll(findIdsFromComment(method.docComment)) - for (field in psiClass.fields) addAll(findIdsFromComment(field.docComment)) + val manager = CachedValuesManager.getManager(project) + return manager.getCachedValue(psiClass) { + val result = LinkedHashSet().apply { + addAll(findIdsFromComment(psiClass.docComment)) + for (method in psiClass.methods) addAll(findIdsFromComment(method.docComment)) + for (field in psiClass.fields) addAll(findIdsFromComment(field.docComment)) + } + Result.create(result, PsiModificationTracker.MODIFICATION_COUNT) } - - cache[fqn] = Entry(file.modificationStamp, result) - return result } private fun findIdsFromComment(docComment: PsiDocComment?): List { diff --git a/java/java-tests/testSrc/com/intellij/java/indexing/JavaDocFragmentAnchorCacheTest.java b/java/java-tests/testSrc/com/intellij/java/indexing/JavaDocFragmentAnchorCacheTest.java index 74ed56c56b8f..e59d1e74cd12 100644 --- a/java/java-tests/testSrc/com/intellij/java/indexing/JavaDocFragmentAnchorCacheTest.java +++ b/java/java-tests/testSrc/com/intellij/java/indexing/JavaDocFragmentAnchorCacheTest.java @@ -5,14 +5,12 @@ import com.intellij.codeInsight.javadoc.index.JavaDocFragmentAnchorCacheKt; import com.intellij.codeInsight.javadoc.index.JavaDocFragmentData; import com.intellij.openapi.project.Project; import com.intellij.testFramework.LightJavaCodeInsightTestCase; -import com.intellij.testFramework.NeedsIndex; import org.intellij.lang.annotations.Language; import java.util.Collection; public class JavaDocFragmentAnchorCacheTest extends LightJavaCodeInsightTestCase { - @NeedsIndex.ForStandardLibrary public void testIndexesExplicitId() { @Language("JAVA") String text = """ package p;