mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
[javadoc] Use CachedValuesManager for the fragment reference cache
IJ-MR-174748 GitOrigin-RevId: f9448f71f6bb602f43e846c3f4f8b03f5034d048
This commit is contained in:
committed by
intellij-monorepo-bot
parent
c4c3151607
commit
981fbe43a4
+12
-14
@@ -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<JavaDocFragmentData>)
|
||||
private val cache: ConcurrentHashMap<String, Entry> = 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<JavaDocFragmentData> {
|
||||
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<JavaDocFragmentData>().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<JavaDocFragmentData>().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<JavaDocFragmentData> {
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user